Hyunsun Moon | 090d77d | 2017-07-05 17:48:37 +0900 | [diff] [blame] | 1 | /* |
Brian O'Connor | a09fe5b | 2017-08-03 21:12:30 -0700 | [diff] [blame] | 2 | * Copyright 2017-present Open Networking Foundation |
Hyunsun Moon | 090d77d | 2017-07-05 17:48:37 +0900 | [diff] [blame] | 3 | * |
| 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 Li | 5a38ab6 | 2018-07-02 22:34:11 +0900 | [diff] [blame] | 16 | package org.onosproject.openstacknode.api; |
Hyunsun Moon | 090d77d | 2017-07-05 17:48:37 +0900 | [diff] [blame] | 17 | |
Jian Li | 5527691 | 2018-10-08 12:58:54 +0900 | [diff] [blame^] | 18 | import com.google.common.collect.ImmutableList; |
Hyunsun Moon | 090d77d | 2017-07-05 17:48:37 +0900 | [diff] [blame] | 19 | import com.google.common.testing.EqualsTester; |
Jian Li | 5527691 | 2018-10-08 12:58:54 +0900 | [diff] [blame^] | 20 | import org.junit.Before; |
Hyunsun Moon | 090d77d | 2017-07-05 17:48:37 +0900 | [diff] [blame] | 21 | import org.junit.Test; |
| 22 | import org.onlab.packet.IpAddress; |
| 23 | import org.onosproject.net.Device; |
Jian Li | 5527691 | 2018-10-08 12:58:54 +0900 | [diff] [blame^] | 24 | import org.onosproject.net.DeviceId; |
| 25 | import org.onosproject.net.behaviour.ControllerInfo; |
| 26 | |
| 27 | import java.util.List; |
| 28 | |
| 29 | import static junit.framework.TestCase.assertEquals; |
| 30 | import static org.onosproject.openstacknode.api.DpdkConfig.DatapathType.NETDEV; |
| 31 | import static org.onosproject.openstacknode.api.DpdkInterface.Type.DPDK_VHOST_USER; |
| 32 | import static org.onosproject.openstacknode.api.NodeState.COMPLETE; |
| 33 | import static org.onosproject.openstacknode.api.NodeState.DEVICE_CREATED; |
| 34 | import static org.onosproject.openstacknode.api.OpenstackAuth.Perspective.PUBLIC; |
| 35 | import static org.onosproject.openstacknode.api.OpenstackAuth.Protocol.HTTP; |
Hyunsun Moon | 090d77d | 2017-07-05 17:48:37 +0900 | [diff] [blame] | 36 | |
| 37 | /** |
| 38 | * Unit tests for DefaultOpenstackNode. |
| 39 | */ |
Jian Li | 5527691 | 2018-10-08 12:58:54 +0900 | [diff] [blame^] | 40 | public final class DefaultOpenstackNodeTest extends OpenstackNodeTest { |
Hyunsun Moon | 090d77d | 2017-07-05 17:48:37 +0900 | [diff] [blame] | 41 | |
| 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 Li | 5527691 | 2018-10-08 12:58:54 +0900 | [diff] [blame^] | 48 | |
| 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 Moon | 090d77d | 2017-07-05 17:48:37 +0900 | [diff] [blame] | 97 | 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 Li | 5527691 | 2018-10-08 12:58:54 +0900 | [diff] [blame^] | 117 | * 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 Moon | 090d77d | 2017-07-05 17:48:37 +0900 | [diff] [blame] | 140 | * 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 Li | 5527691 | 2018-10-08 12:58:54 +0900 | [diff] [blame^] | 150 | * 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 Moon | 090d77d | 2017-07-05 17:48:37 +0900 | [diff] [blame] | 192 | * 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 Moon | 090d77d | 2017-07-05 17:48:37 +0900 | [diff] [blame] | 220 | * 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 Li | 5527691 | 2018-10-08 12:58:54 +0900 | [diff] [blame^] | 247 | |
| 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 Moon | 090d77d | 2017-07-05 17:48:37 +0900 | [diff] [blame] | 330 | } |