| // |
| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| // |
| |
| package com.cloud.network.resource; |
| |
| import static org.junit.Assert.assertFalse; |
| import static org.junit.Assert.assertTrue; |
| import static org.mockito.Matchers.any; |
| import static org.mockito.Mockito.doThrow; |
| import static org.mockito.Mockito.mock; |
| import static org.mockito.Mockito.times; |
| import static org.mockito.Mockito.verify; |
| import static org.mockito.Mockito.when; |
| |
| import java.util.Collections; |
| import java.util.HashMap; |
| import java.util.Map; |
| import java.util.UUID; |
| |
| import javax.naming.ConfigurationException; |
| |
| import org.junit.Before; |
| import org.junit.Test; |
| |
| import com.cloud.agent.api.BcfAnswer; |
| import com.cloud.agent.api.CreateBcfRouterCommand; |
| import com.cloud.agent.api.CreateBcfSegmentCommand; |
| import com.cloud.agent.api.CreateBcfAttachmentCommand; |
| import com.cloud.agent.api.CreateBcfStaticNatCommand; |
| import com.cloud.agent.api.DeleteBcfSegmentCommand; |
| import com.cloud.agent.api.DeleteBcfAttachmentCommand; |
| import com.cloud.agent.api.DeleteBcfStaticNatCommand; |
| import com.cloud.agent.api.PingCommand; |
| import com.cloud.agent.api.StartupCommand; |
| import com.cloud.agent.api.SyncBcfTopologyCommand; |
| import com.cloud.agent.api.UpdateBcfAttachmentCommand; |
| import com.cloud.agent.api.UpdateBcfRouterCommand; |
| import com.cloud.host.Host; |
| import com.cloud.network.bigswitch.BigSwitchBcfApi; |
| import com.cloud.network.bigswitch.BigSwitchBcfApiException; |
| import com.cloud.network.bigswitch.Capabilities; |
| import com.cloud.network.bigswitch.ControlClusterStatus; |
| import com.cloud.network.bigswitch.FloatingIpData; |
| import com.cloud.network.bigswitch.NetworkData; |
| import com.cloud.network.bigswitch.AttachmentData; |
| import com.cloud.network.bigswitch.RouterData; |
| import com.cloud.network.bigswitch.TopologyData; |
| |
| public class BigSwitchBcfResourceTest { |
| BigSwitchBcfApi _bigswitchBcfApi = mock(BigSwitchBcfApi.class); |
| BigSwitchBcfResource _resource; |
| Map<String, Object> _parameters; |
| |
| String bcfAddress = "127.0.0.1"; |
| String bcfUserName = "myname"; |
| String bcfPassword = "mypassword"; |
| |
| @Before |
| public void setUp() throws ConfigurationException { |
| _resource = new BigSwitchBcfResource() { |
| @Override |
| protected BigSwitchBcfApi createBigSwitchBcfApi() { |
| return _bigswitchBcfApi; |
| } |
| }; |
| |
| _parameters = new HashMap<String, Object>(); |
| _parameters.put("name", "bigswitchbcftestdevice"); |
| _parameters.put("hostname", bcfAddress); |
| _parameters.put("guid", "aaaaa-bbbbb-ccccc"); |
| _parameters.put("zoneId", "blublub"); |
| _parameters.put("username", bcfUserName); |
| _parameters.put("password", bcfPassword); |
| } |
| |
| @Test(expected = ConfigurationException.class) |
| public void resourceConfigureFailure() throws ConfigurationException { |
| _resource.configure("BigSwitchBcfResource", Collections.<String, Object> emptyMap()); |
| } |
| |
| @Test |
| public void resourceConfigure() throws ConfigurationException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| |
| verify(_bigswitchBcfApi).setControllerAddress(bcfAddress); |
| verify(_bigswitchBcfApi).setControllerUsername(bcfUserName); |
| verify(_bigswitchBcfApi).setControllerPassword(bcfPassword); |
| |
| assertTrue("bigswitchbcftestdevice".equals(_resource.getName())); |
| |
| /* Pretty lame test, but here to assure this plugin fails |
| * if the type name ever changes from L2Networking |
| */ |
| assertTrue(_resource.getType() == Host.Type.L2Networking); |
| } |
| |
| @Test |
| public void testInitialization() throws ConfigurationException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| |
| StartupCommand[] sc = _resource.initialize(); |
| assertTrue(sc.length == 1); |
| assertTrue("aaaaa-bbbbb-ccccc".equals(sc[0].getGuid())); |
| assertTrue("bigswitchbcftestdevice".equals(sc[0].getName())); |
| assertTrue("blublub".equals(sc[0].getDataCenter())); |
| } |
| |
| @Test |
| public void testPingCommandStatusOk() throws ConfigurationException, BigSwitchBcfApiException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| |
| ControlClusterStatus ccs = mock(ControlClusterStatus.class); |
| when(ccs.getStatus()).thenReturn(true); |
| when(_bigswitchBcfApi.getControlClusterStatus()).thenReturn(ccs); |
| |
| Capabilities cap = mock(Capabilities.class); |
| when(_bigswitchBcfApi.getCapabilities()).thenReturn(cap); |
| |
| PingCommand ping = _resource.getCurrentStatus(42); |
| assertTrue(ping != null); |
| assertTrue(ping.getHostId() == 42); |
| assertTrue(ping.getHostType() == Host.Type.L2Networking); |
| } |
| |
| @Test |
| public void testPingCommandStatusFail() throws ConfigurationException, BigSwitchBcfApiException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| |
| ControlClusterStatus ccs = mock(ControlClusterStatus.class); |
| when(ccs.getStatus()).thenReturn(false); |
| when(_bigswitchBcfApi.getControlClusterStatus()).thenReturn(ccs); |
| |
| PingCommand ping = _resource.getCurrentStatus(42); |
| assertTrue(ping == null); |
| } |
| |
| @Test |
| public void testPingCommandStatusApiException() throws ConfigurationException, BigSwitchBcfApiException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| |
| ControlClusterStatus ccs = mock(ControlClusterStatus.class); |
| when(ccs.getStatus()).thenReturn(false); |
| when(_bigswitchBcfApi.getControlClusterStatus()).thenThrow(new BigSwitchBcfApiException()); |
| |
| PingCommand ping = _resource.getCurrentStatus(42); |
| assertTrue(ping == null); |
| } |
| |
| @Test |
| public void testCreateNetworkRetryOnce() throws ConfigurationException, BigSwitchBcfApiException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| |
| NetworkData networkdata = mock(NetworkData.class); |
| NetworkData.Network network = mock(NetworkData.Network.class); |
| when(networkdata.getNetwork()).thenReturn(network); |
| when(network.getId()).thenReturn("cccc"); |
| when(_bigswitchBcfApi.createNetwork((NetworkData)any())).thenThrow(new BigSwitchBcfApiException()) |
| .thenReturn(UUID.randomUUID().toString()); |
| |
| CreateBcfSegmentCommand cmd = new CreateBcfSegmentCommand("tenantid", "tenantname", |
| (String)_parameters.get("guid"), "networkName", 0); |
| BcfAnswer ans = (BcfAnswer)_resource.executeRequest(cmd); |
| assertTrue(ans.getResult()); |
| } |
| |
| @Test |
| public void testCreateNetworkApiException() throws ConfigurationException, BigSwitchBcfApiException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| |
| NetworkData networkdata = mock(NetworkData.class); |
| NetworkData.Network network = mock(NetworkData.Network.class); |
| when(networkdata.getNetwork()).thenReturn(network); |
| when(network.getId()).thenReturn("cccc"); |
| doThrow(new BigSwitchBcfApiException()).when(_bigswitchBcfApi).createNetwork((NetworkData)any()); |
| |
| CreateBcfSegmentCommand cmd = new CreateBcfSegmentCommand("tenantid", "tenantname", |
| (String)_parameters.get("guid"), "networkName", 0); |
| BcfAnswer ans = (BcfAnswer)_resource.executeRequest(cmd); |
| assertFalse(ans.getResult()); |
| verify(_bigswitchBcfApi, times(3)).createNetwork((NetworkData)any()); |
| } |
| |
| @Test |
| public void testDeleteNetworkRetryOnce() throws ConfigurationException, BigSwitchBcfApiException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| when(_bigswitchBcfApi.deleteNetwork((String)any(), (String)any())).thenThrow(new BigSwitchBcfApiException()) |
| .thenReturn(UUID.randomUUID().toString()); |
| |
| DeleteBcfSegmentCommand cmd = new DeleteBcfSegmentCommand("tenantid", "networkid"); |
| BcfAnswer ans = (BcfAnswer)_resource.executeRequest(cmd); |
| assertTrue(ans.getResult()); |
| } |
| |
| @Test |
| public void testDeleteNetworkApiException() throws ConfigurationException, BigSwitchBcfApiException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| |
| doThrow(new BigSwitchBcfApiException()).when(_bigswitchBcfApi).deleteNetwork((String)any(), (String)any()); |
| |
| DeleteBcfSegmentCommand cmd = new DeleteBcfSegmentCommand("tenantid", "networkid"); |
| BcfAnswer ans = (BcfAnswer)_resource.executeRequest(cmd); |
| assertFalse(ans.getResult()); |
| verify(_bigswitchBcfApi, times(3)).deleteNetwork((String)any(), (String)any()); |
| } |
| |
| @Test |
| public void testCreateAttachmentRetryOnce() throws ConfigurationException, BigSwitchBcfApiException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| |
| AttachmentData attachmentData = mock(AttachmentData.class); |
| AttachmentData.Attachment attachment = mock(AttachmentData.Attachment.class); |
| when(attachmentData.getAttachment()).thenReturn(attachment); |
| when(attachment.getId()).thenReturn("eeee"); |
| when(_bigswitchBcfApi.createAttachment((String)any(), (String)any(), (AttachmentData)any())).thenThrow(new BigSwitchBcfApiException()) |
| .thenReturn(UUID.randomUUID().toString()); |
| |
| CreateBcfAttachmentCommand cmd = new CreateBcfAttachmentCommand("tenantid", "tenantname", |
| "networkid", "portid", "nicId", 100, "1.2.3.4", "aa:bb:cc:dd:ee:ff"); |
| BcfAnswer ans = (BcfAnswer)_resource.executeRequest(cmd); |
| assertTrue(ans.getResult()); |
| } |
| |
| @Test |
| public void testCreateAttachmentApiException() throws ConfigurationException, BigSwitchBcfApiException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| |
| AttachmentData attachmentData = mock(AttachmentData.class); |
| AttachmentData.Attachment attachment = mock(AttachmentData.Attachment.class); |
| when(attachmentData.getAttachment()).thenReturn(attachment); |
| when(attachment.getId()).thenReturn("eeee"); |
| doThrow(new BigSwitchBcfApiException()).when(_bigswitchBcfApi).createAttachment((String)any(), (String)any(), (AttachmentData)any()); |
| |
| CreateBcfAttachmentCommand cmd = new CreateBcfAttachmentCommand("tenantid", "tenantname", |
| "networkid", "portid", "nicId", 100, "1.2.3.4", "aa:bb:cc:dd:ee:ff"); |
| BcfAnswer ans = (BcfAnswer)_resource.executeRequest(cmd); |
| assertFalse(ans.getResult()); |
| verify(_bigswitchBcfApi, times(3)).createAttachment((String)any(), (String)any(), (AttachmentData)any()); |
| } |
| |
| @Test |
| public void testDeleteAttachmentRetryOnce() throws ConfigurationException, BigSwitchBcfApiException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| |
| when(_bigswitchBcfApi.deleteAttachment((String)any(), (String)any(), (String)any())).thenThrow(new BigSwitchBcfApiException()) |
| .thenReturn(UUID.randomUUID().toString()); |
| BcfAnswer ans = (BcfAnswer)_resource.executeRequest(new DeleteBcfAttachmentCommand("networkId", "portid", "tenantid")); |
| assertTrue(ans.getResult()); |
| } |
| |
| @Test |
| public void testDeleteAttachmentException() throws ConfigurationException, BigSwitchBcfApiException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| |
| doThrow(new BigSwitchBcfApiException()).when(_bigswitchBcfApi).deleteAttachment((String)any(), (String)any(), (String)any()); |
| BcfAnswer ans = (BcfAnswer)_resource.executeRequest(new DeleteBcfAttachmentCommand("networkId", "portid", "tenantid")); |
| assertFalse(ans.getResult()); |
| verify(_bigswitchBcfApi, times(3)).deleteAttachment((String)any(), (String)any(), (String)any()); |
| } |
| |
| @Test |
| public void testUpdateAttachmentRetryOnce() throws ConfigurationException, BigSwitchBcfApiException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| |
| when(_bigswitchBcfApi.modifyAttachment((String)any(), (String)any(), (AttachmentData)any())).thenThrow(new BigSwitchBcfApiException()) |
| .thenReturn(UUID.randomUUID().toString()); |
| BcfAnswer ans = (BcfAnswer)_resource.executeRequest(new UpdateBcfAttachmentCommand("networkId", "portId", "tenantId", "portname")); |
| assertTrue(ans.getResult()); |
| } |
| |
| @Test |
| public void testUpdateAttachmentException() throws ConfigurationException, BigSwitchBcfApiException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| |
| doThrow(new BigSwitchBcfApiException()).when(_bigswitchBcfApi).modifyAttachment((String)any(), (String)any(), (AttachmentData)any()); |
| BcfAnswer ans = (BcfAnswer)_resource.executeRequest(new UpdateBcfAttachmentCommand("networkId", "portId", "tenantId", "portname")); |
| assertFalse(ans.getResult()); |
| verify(_bigswitchBcfApi, times(3)).modifyAttachment((String)any(), (String)any(), (AttachmentData)any()); |
| } |
| |
| @Test |
| public void testCreateStaticNatRetryOnce() throws ConfigurationException, BigSwitchBcfApiException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| |
| when(_bigswitchBcfApi.createFloatingIp((String)any(), (FloatingIpData)any())).thenThrow(new BigSwitchBcfApiException()) |
| .thenReturn(UUID.randomUUID().toString()); |
| |
| CreateBcfStaticNatCommand cmd = new CreateBcfStaticNatCommand("tenantid", |
| "networkid", "192.168.0.10", "10.4.4.100", "90:b1:1c:49:d8:56"); |
| BcfAnswer ans = (BcfAnswer)_resource.executeRequest(cmd); |
| assertTrue(ans.getResult()); |
| } |
| |
| @Test |
| public void testCreateStaticNatApiException() throws ConfigurationException, BigSwitchBcfApiException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| |
| doThrow(new BigSwitchBcfApiException()).when(_bigswitchBcfApi).createFloatingIp((String)any(), (FloatingIpData)any()); |
| |
| CreateBcfStaticNatCommand cmd = new CreateBcfStaticNatCommand("tenantid", |
| "networkid", "192.168.0.10", "10.4.4.100", "90:b1:1c:49:d8:56"); |
| BcfAnswer ans = (BcfAnswer)_resource.executeRequest(cmd); |
| assertFalse(ans.getResult()); |
| verify(_bigswitchBcfApi, times(3)).createFloatingIp((String)any(), (FloatingIpData)any()); |
| } |
| |
| @Test |
| public void testDeleteStaticNatRetryOnce() throws ConfigurationException, BigSwitchBcfApiException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| |
| when(_bigswitchBcfApi.deleteFloatingIp((String)any(), (String)any())).thenThrow(new BigSwitchBcfApiException()) |
| .thenReturn(UUID.randomUUID().toString()); |
| |
| DeleteBcfStaticNatCommand cmd = new DeleteBcfStaticNatCommand("tenantid", |
| "10.4.4.100"); |
| BcfAnswer ans = (BcfAnswer)_resource.executeRequest(cmd); |
| assertTrue(ans.getResult()); |
| } |
| |
| @Test |
| public void testDeleteStaticNatApiException() throws ConfigurationException, BigSwitchBcfApiException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| |
| doThrow(new BigSwitchBcfApiException()).when(_bigswitchBcfApi).deleteFloatingIp((String)any(), (String)any()); |
| |
| DeleteBcfStaticNatCommand cmd = new DeleteBcfStaticNatCommand("tenantid", |
| "10.4.4.100"); |
| BcfAnswer ans = (BcfAnswer)_resource.executeRequest(cmd); |
| assertFalse(ans.getResult()); |
| verify(_bigswitchBcfApi, times(3)).deleteFloatingIp((String)any(), (String)any()); |
| } |
| |
| @Test |
| public void testCreateRouterRetryOnce() throws ConfigurationException, BigSwitchBcfApiException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| |
| when(_bigswitchBcfApi.createRouter((String)any(), (RouterData)any())).thenThrow(new BigSwitchBcfApiException()) |
| .thenReturn(UUID.randomUUID().toString()); |
| |
| CreateBcfRouterCommand cmd = new CreateBcfRouterCommand("tenantid"); |
| BcfAnswer ans = (BcfAnswer)_resource.executeRequest(cmd); |
| assertTrue(ans.getResult()); |
| } |
| |
| @Test |
| public void testCreateRouterApiException() throws ConfigurationException, BigSwitchBcfApiException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| |
| doThrow(new BigSwitchBcfApiException()).when(_bigswitchBcfApi).createRouter((String)any(), (RouterData)any()); |
| |
| CreateBcfRouterCommand cmd = new CreateBcfRouterCommand("tenantid"); |
| BcfAnswer ans = (BcfAnswer)_resource.executeRequest(cmd); |
| assertFalse(ans.getResult()); |
| verify(_bigswitchBcfApi, times(3)).createRouter((String)any(), (RouterData)any()); |
| } |
| |
| @Test |
| public void testCreateSourceNatRetryOnce() throws ConfigurationException, BigSwitchBcfApiException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| |
| when(_bigswitchBcfApi.modifyRouter((String)any(), (RouterData)any())).thenThrow(new BigSwitchBcfApiException()) |
| .thenReturn(UUID.randomUUID().toString()); |
| |
| UpdateBcfRouterCommand cmd = new UpdateBcfRouterCommand("tenantid"); |
| BcfAnswer ans = (BcfAnswer)_resource.executeRequest(cmd); |
| assertTrue(ans.getResult()); |
| } |
| |
| @Test |
| public void testCreateSourceNatApiException() throws ConfigurationException, BigSwitchBcfApiException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| |
| doThrow(new BigSwitchBcfApiException()).when(_bigswitchBcfApi).modifyRouter((String)any(), (RouterData)any()); |
| |
| UpdateBcfRouterCommand cmd = new UpdateBcfRouterCommand("tenantid"); |
| BcfAnswer ans = (BcfAnswer)_resource.executeRequest(cmd); |
| assertFalse(ans.getResult()); |
| verify(_bigswitchBcfApi, times(3)).modifyRouter((String)any(), (RouterData)any()); |
| } |
| |
| @Test |
| public void testDeleteSourceNatRetryOnce() throws ConfigurationException, BigSwitchBcfApiException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| |
| when(_bigswitchBcfApi.modifyRouter((String)any(), (RouterData)any())).thenThrow(new BigSwitchBcfApiException()) |
| .thenReturn(UUID.randomUUID().toString()); |
| |
| UpdateBcfRouterCommand cmd = new UpdateBcfRouterCommand("tenantid"); |
| BcfAnswer ans = (BcfAnswer)_resource.executeRequest(cmd); |
| assertTrue(ans.getResult()); |
| } |
| |
| @Test |
| public void testDeleteSourceNatApiException() throws ConfigurationException, BigSwitchBcfApiException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| |
| doThrow(new BigSwitchBcfApiException()).when(_bigswitchBcfApi).modifyRouter((String)any(), (RouterData)any()); |
| |
| UpdateBcfRouterCommand cmd = new UpdateBcfRouterCommand("tenantid"); |
| BcfAnswer ans = (BcfAnswer)_resource.executeRequest(cmd); |
| assertFalse(ans.getResult()); |
| verify(_bigswitchBcfApi, times(3)).modifyRouter((String)any(), (RouterData)any()); |
| } |
| |
| @Test |
| public void testSyncTopologyRetryOnce() throws ConfigurationException, BigSwitchBcfApiException { |
| _resource.configure("BigSwitchBcfResource", _parameters); |
| _resource.setTopology(new TopologyData()); |
| |
| when(_bigswitchBcfApi.syncTopology((TopologyData)any())).thenThrow(new BigSwitchBcfApiException()) |
| .thenReturn(UUID.randomUUID().toString()); |
| BcfAnswer ans = (BcfAnswer)_resource.executeRequest(new SyncBcfTopologyCommand(true, false)); |
| assertTrue(ans.getResult()); |
| } |
| |
| } |