// // 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()); } }