blob: c8feb87cc9a5c8fbafbb6073821dc0f9ffb418d7 [file] [log] [blame]
Hyunsun Moon090d77d2017-07-05 17:48:37 +09001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
Hyunsun Moon090d77d2017-07-05 17:48:37 +09003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Jian Li5a38ab62018-07-02 22:34:11 +090016package org.onosproject.openstacknode.api;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090017
Jian Li55276912018-10-08 12:58:54 +090018import com.google.common.collect.ImmutableList;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090019import com.google.common.testing.EqualsTester;
Jian Li55276912018-10-08 12:58:54 +090020import org.junit.Before;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090021import org.junit.Test;
22import org.onlab.packet.IpAddress;
23import org.onosproject.net.Device;
Jian Li55276912018-10-08 12:58:54 +090024import org.onosproject.net.DeviceId;
25import org.onosproject.net.behaviour.ControllerInfo;
26
27import java.util.List;
28
29import static junit.framework.TestCase.assertEquals;
30import static org.onosproject.openstacknode.api.DpdkConfig.DatapathType.NETDEV;
31import static org.onosproject.openstacknode.api.DpdkInterface.Type.DPDK_VHOST_USER;
32import static org.onosproject.openstacknode.api.NodeState.COMPLETE;
33import static org.onosproject.openstacknode.api.NodeState.DEVICE_CREATED;
34import static org.onosproject.openstacknode.api.OpenstackAuth.Perspective.PUBLIC;
35import static org.onosproject.openstacknode.api.OpenstackAuth.Protocol.HTTP;
Hyunsun Moon090d77d2017-07-05 17:48:37 +090036
37/**
38 * Unit tests for DefaultOpenstackNode.
39 */
Jian Li55276912018-10-08 12:58:54 +090040public final class DefaultOpenstackNodeTest extends OpenstackNodeTest {
Hyunsun Moon090d77d2017-07-05 17:48:37 +090041
42 private static final IpAddress TEST_IP = IpAddress.valueOf("10.100.0.3");
43
44 private static final String HOSTNAME_1 = "hostname_1";
45 private static final String HOSTNAME_2 = "hostname_2";
46 private static final Device DEVICE_1 = createDevice(1);
47 private static final Device DEVICE_2 = createDevice(2);
Jian Li55276912018-10-08 12:58:54 +090048
49 private static final IpAddress MANAGEMENT_IP = IpAddress.valueOf("10.10.10.10");
50 private static final IpAddress DATA_IP = IpAddress.valueOf("20.20.20.20");
51
52 private static final String VLAN_INTF = "eth0";
53 private static final String UPLINK_PORT = "eth1";
54
55 private static final String SSH_AUTH_ID = "admin";
56 private static final String SSH_AUTH_PASSWORD = "nova";
57
58 private static final String OS_AUTH_USERNAME = "admin";
59 private static final String OS_AUTH_PASSWORD = "nova";
60 private static final String OS_AUTH_PROJECT = "admin";
61 private static final String OS_AUTH_VERSION = "v2.0";
62 private static final OpenstackAuth.Protocol OS_AUTH_PROTOCOL = HTTP;
63 private static final OpenstackAuth.Perspective OS_AUTH_PERSPECTIVE = PUBLIC;
64 private static final String OS_ENDPOINT = "keystone:35357/v2.0";
65
66 private static final String META_PROXY_SECRET = "nova";
67 private static final boolean META_USE_SERVICE = true;
68 private static final String META_IP = "30.30.30.30";
69 private static final int META_PORT = 8775;
70
71 private static final String DPDK_INTF_NAME = "dpdk1";
72 private static final Long DPDK_INTF_MTU = 1500L;
73 private static final String DPDK_INTF_DEV_NAME = "br-int";
74 private static final String DPDK_INTF_PCI_ADDRESS = "0000:85:00.0";
75 private static final DpdkInterface.Type DPDK_INTF_TYPE = DPDK_VHOST_USER;
76
77 private static final DpdkConfig.DatapathType DPDK_DATAPATH_TYPE = NETDEV;
78 private static final String DPDK_SOCKET_DIR = "/var/lib/libvirt/qemu";
79
80 private static final String PHY_INTF_NETWORK = "mgmtnetwork";
81 private static final String PHY_INTF_NAME = "eth3";
82
83 private static final IpAddress CONTROLLER_IP = IpAddress.valueOf("40.40.40.40");
84 private static final int CONTROLLER_PORT = 6653;
85 private static final String TCP = "tcp";
86
87 private static final OpenstackSshAuth SSH_AUTH = initSshAuth();
88 private static final OpenstackAuth AUTH = initAuth();
89 private static final KeystoneConfig KEYSTONE_CONFIG = initKeystoneConfig();
90 private static final NeutronConfig NEUTRON_CONFIG = initNeutronConfig();
91 private static final DpdkConfig DPDK_CONFIG = initDpdkConfig();
92 private static final List<OpenstackPhyInterface> PHY_INTFS = initPhyIntfs();
93 private static final List<ControllerInfo> CONTROLLERS = initControllers();
94
95 private OpenstackNode refNode;
96
Hyunsun Moon090d77d2017-07-05 17:48:37 +090097 private static final OpenstackNode OS_NODE_1 = createNode(
98 HOSTNAME_1,
99 OpenstackNode.NodeType.COMPUTE,
100 DEVICE_1,
101 TEST_IP,
102 NodeState.INIT);
103 private static final OpenstackNode OS_NODE_2 = createNode(
104 HOSTNAME_1,
105 OpenstackNode.NodeType.COMPUTE,
106 DEVICE_1,
107 TEST_IP,
108 NodeState.COMPLETE);
109 private static final OpenstackNode OS_NODE_3 = createNode(
110 HOSTNAME_2,
111 OpenstackNode.NodeType.COMPUTE,
112 DEVICE_2,
113 TEST_IP,
114 NodeState.INIT);
115
116 /**
Jian Li55276912018-10-08 12:58:54 +0900117 * Initial setup for this unit test.
118 */
119 @Before
120 public void setUp() {
121 refNode = DefaultOpenstackNode.builder()
122 .hostname(HOSTNAME_1)
123 .type(OpenstackNode.NodeType.COMPUTE)
124 .managementIp(MANAGEMENT_IP)
125 .dataIp(DATA_IP)
126 .intgBridge(DEVICE_1.id())
127 .vlanIntf(VLAN_INTF)
128 .uplinkPort(UPLINK_PORT)
129 .state(NodeState.COMPLETE)
130 .sshAuthInfo(SSH_AUTH)
131 .keystoneConfig(KEYSTONE_CONFIG)
132 .neutronConfig(NEUTRON_CONFIG)
133 .dpdkConfig(DPDK_CONFIG)
134 .phyIntfs(PHY_INTFS)
135 .controllers(CONTROLLERS)
136 .build();
137 }
138
139 /**
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900140 * Checks equals method works as expected.
141 */
142 @Test
143 public void testEquality() {
144 new EqualsTester().addEqualityGroup(OS_NODE_1, OS_NODE_2)
145 .addEqualityGroup(OS_NODE_3)
146 .testEquals();
147 }
148
149 /**
Jian Li55276912018-10-08 12:58:54 +0900150 * Test object construction.
151 */
152 @Test
153 public void testConstruction() {
154 checkCommonProperties(refNode);
155 assertEquals(refNode.state(), COMPLETE);
156 assertEquals(refNode.intgBridge(), DEVICE_1.id());
157 }
158
159 /**
160 * Checks the functionality of update state method.
161 */
162 @Test
163 public void testUpdateState() {
164 OpenstackNode updatedNode = refNode.updateState(DEVICE_CREATED);
165
166 checkCommonProperties(updatedNode);
167 assertEquals(updatedNode.state(), DEVICE_CREATED);
168 }
169
170 /**
171 * Checks the functionality of update int bridge method.
172 */
173 @Test
174 public void testUpdateIntBridge() {
175 OpenstackNode updatedNode = refNode.updateIntbridge(DeviceId.deviceId("br-tun"));
176
177 checkCommonProperties(updatedNode);
178 assertEquals(updatedNode.intgBridge(), DeviceId.deviceId("br-tun"));
179 }
180
181 /**
182 * Checks the functionality of from method.
183 */
184 @Test
185 public void testFrom() {
186 OpenstackNode updatedNode = DefaultOpenstackNode.from(refNode).build();
187
188 assertEquals(updatedNode, refNode);
189 }
190
191 /**
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900192 * Checks building a node without hostname fails with proper exception.
193 */
194 @Test(expected = IllegalArgumentException.class)
195 public void testBuildWithoutHostname() {
196 DefaultOpenstackNode.builder()
197 .type(OpenstackNode.NodeType.COMPUTE)
198 .intgBridge(DEVICE_1.id())
199 .managementIp(TEST_IP)
200 .dataIp(TEST_IP)
201 .state(NodeState.INIT)
202 .build();
203 }
204
205 /**
206 * Checks building a node without type fails with proper exception.
207 */
208 @Test(expected = IllegalArgumentException.class)
209 public void testBuildWithoutType() {
210 DefaultOpenstackNode.builder()
211 .hostname(HOSTNAME_1)
212 .intgBridge(DEVICE_1.id())
213 .managementIp(TEST_IP)
214 .dataIp(TEST_IP)
215 .state(NodeState.INIT)
216 .build();
217 }
218
219 /**
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900220 * Checks building a node without management IP address fails with
221 * proper exception.
222 */
223 @Test(expected = IllegalArgumentException.class)
224 public void testBuildWithoutManagementIp() {
225 DefaultOpenstackNode.builder()
226 .hostname(HOSTNAME_1)
227 .type(OpenstackNode.NodeType.COMPUTE)
228 .intgBridge(DEVICE_1.id())
229 .dataIp(TEST_IP)
230 .state(NodeState.INIT)
231 .build();
232 }
233
234 /**
235 * Checks building a node without data IP nor VLAN interface name
236 * fails with proper exception.
237 */
238 @Test(expected = IllegalArgumentException.class)
239 public void testBuildWithoutDataIpNorVlanIntf() {
240 DefaultOpenstackNode.builder()
241 .hostname(HOSTNAME_1)
242 .type(OpenstackNode.NodeType.COMPUTE)
243 .intgBridge(DEVICE_1.id())
244 .state(NodeState.INIT)
245 .build();
246 }
Jian Li55276912018-10-08 12:58:54 +0900247
248
249 private static OpenstackSshAuth initSshAuth() {
250 return DefaultOpenstackSshAuth.builder()
251 .id(SSH_AUTH_ID)
252 .password(SSH_AUTH_PASSWORD)
253 .build();
254 }
255
256 private static OpenstackAuth initAuth() {
257 return DefaultOpenstackAuth.builder()
258 .username(OS_AUTH_USERNAME)
259 .password(OS_AUTH_PASSWORD)
260 .project(OS_AUTH_PROJECT)
261 .protocol(OS_AUTH_PROTOCOL)
262 .version(OS_AUTH_VERSION)
263 .perspective(OS_AUTH_PERSPECTIVE)
264 .build();
265 }
266
267 private static KeystoneConfig initKeystoneConfig() {
268 return DefaultKeystoneConfig.builder()
269 .authentication(AUTH)
270 .endpoint(OS_ENDPOINT)
271 .build();
272 }
273
274 private static NeutronConfig initNeutronConfig() {
275 return DefaultNeutronConfig.builder()
276 .metadataProxySecret(META_PROXY_SECRET)
277 .novaMetadataIp(META_IP)
278 .novaMetadataPort(META_PORT)
279 .useMetadataProxy(META_USE_SERVICE)
280 .build();
281 }
282
283 private static DpdkConfig initDpdkConfig() {
284 DpdkInterface dpdkIntf = DefaultDpdkInterface.builder()
285 .intf(DPDK_INTF_NAME)
286 .deviceName(DPDK_INTF_DEV_NAME)
287 .mtu(DPDK_INTF_MTU)
288 .pciAddress(DPDK_INTF_PCI_ADDRESS)
289 .type(DPDK_INTF_TYPE)
290 .build();
291 List<DpdkInterface> dpdkIntfs = ImmutableList.of(dpdkIntf);
292
293 return DefaultDpdkConfig.builder()
294 .dpdkIntfs(dpdkIntfs)
295 .datapathType(DPDK_DATAPATH_TYPE)
296 .socketDir(DPDK_SOCKET_DIR)
297 .build();
298 }
299
300 private static List<OpenstackPhyInterface> initPhyIntfs() {
301 OpenstackPhyInterface phyIntf = DefaultOpenstackPhyInterface.builder()
302 .intf(PHY_INTF_NAME)
303 .network(PHY_INTF_NETWORK)
304 .build();
305
306 return ImmutableList.of(phyIntf);
307 }
308
309 private static List<ControllerInfo> initControllers() {
310 ControllerInfo controller = new ControllerInfo(CONTROLLER_IP, CONTROLLER_PORT, TCP);
311
312 return ImmutableList.of(controller);
313 }
314
315
316 private void checkCommonProperties(OpenstackNode node) {
317 assertEquals(node.hostname(), HOSTNAME_1);
318 assertEquals(node.type(), OpenstackNode.NodeType.COMPUTE);
319 assertEquals(node.managementIp(), MANAGEMENT_IP);
320 assertEquals(node.dataIp(), DATA_IP);
321 assertEquals(node.vlanIntf(), VLAN_INTF);
322 assertEquals(node.uplinkPort(), UPLINK_PORT);
323 assertEquals(node.sshAuthInfo(), SSH_AUTH);
324 assertEquals(node.keystoneConfig(), KEYSTONE_CONFIG);
325 assertEquals(node.neutronConfig(), NEUTRON_CONFIG);
326 assertEquals(node.dpdkConfig(), DPDK_CONFIG);
327 assertEquals(node.phyIntfs(), PHY_INTFS);
328 assertEquals(node.controllers(), CONTROLLERS);
329 }
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900330}