// // 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.nicira; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.List; import java.util.UUID; import org.junit.Before; import org.junit.Test; import com.cloud.utils.PropertiesUtil; import com.cloud.utils.rest.HttpClientHelper; public class NiciraNvpApiIT { protected NiciraNvpApi api; protected long timestamp = System.currentTimeMillis(); @Before public void setup() throws Exception { PropertiesUtil.loadFromFile(PropertiesUtil.findConfigFile("config.properties")); final String host = System.getProperty("nvp.host"); final String user = System.getProperty("nvp.admin.user"); final String pass = System.getProperty("nvp.admin.pwd"); api = NiciraNvpApi.create() .host(host) .username(user) .password(pass) .httpClient(HttpClientHelper.createHttpClient(5)) .build(); } @Test public void testCRUDSecurityProfile() { SecurityProfile sProfile = new SecurityProfile(); sProfile.setDisplayName("SecProfile" + timestamp); final List<SecurityRule> egressRules = new ArrayList<SecurityRule>(); sProfile.setLogicalPortEgressRules(egressRules); egressRules.add(new SecurityRule(SecurityRule.ETHERTYPE_IPV4, "1.10.10.0", null, 80, 88, 6)); egressRules.add(new SecurityRule(SecurityRule.ETHERTYPE_IPV6, "2a80:34ac::1", null, 90, 98, 6)); final List<SecurityRule> ingressRules = new ArrayList<SecurityRule>(); sProfile.setLogicalPortIngressRules(ingressRules); ingressRules.add(new SecurityRule(SecurityRule.ETHERTYPE_IPV4, "1.10.10.0", null, 50, 58, 6)); ingressRules.add(new SecurityRule(SecurityRule.ETHERTYPE_IPV6, "280a:3ac4::1", null, 60, 68, 6)); final List<NiciraNvpTag> tags = new ArrayList<NiciraNvpTag>(); sProfile.setTags(tags); tags.add(new NiciraNvpTag("nvp", "MyTag1")); tags.add(new NiciraNvpTag("nicira", "MyTag2")); // In the creation we don't get to specify UUID, href or schema: they don't exist yet try { sProfile = api.createSecurityProfile(sProfile); // We can now update the new entity sProfile.setDisplayName("UpdatedSecProfile" + timestamp); api.updateSecurityProfile(sProfile, sProfile.getUuid()); // Read them all List<SecurityProfile> profiles = api.findSecurityProfile(); SecurityProfile scInList = null; for (final SecurityProfile iProfile : profiles) { if (iProfile.getUuid().equalsIgnoreCase(sProfile.getUuid())) { scInList = iProfile; } } assertEquals("Read a Security Profile different from the one just created and updated", sProfile, scInList); // Read them filtered by uuid (get one) profiles = api.findSecurityProfile(sProfile.getUuid()); assertEquals("Read a Security Profile different from the one just created and updated", sProfile, profiles.get(0)); assertEquals("Read a Security Profile filtered by unique id (UUID) with more than one item", 1, profiles.size()); // We can now delete the new entity api.deleteSecurityProfile(sProfile.getUuid()); } catch (final NiciraNvpApiException e) { e.printStackTrace(); assertTrue("Errors in Security Profile CRUD", false); } } @Test public void testCRUDAcl() { Acl acl = new Acl(); acl.setDisplayName("Acl" + timestamp); // Note that if the protocol is 6 (TCP) then you cannot put ICMP code and type // Note that if the protocol is 1 (ICMP) then you cannot put ports final List<AclRule> egressRules = new ArrayList<AclRule>(); acl.setLogicalPortEgressRules(egressRules); egressRules.add(new AclRule(AclRule.ETHERTYPE_IPV4, 1, "allow", null, null, "1.10.10.0", "1.10.10.1", null, null, null, null, 0, 0, 5)); egressRules.add(new AclRule(AclRule.ETHERTYPE_IPV4, 6, "allow", null, null, "1.10.10.6", "1.10.10.7", 80, 80, 80, 80, 1, null, null)); final List<AclRule> ingressRules = new ArrayList<AclRule>(); acl.setLogicalPortIngressRules(ingressRules); ingressRules.add(new AclRule(AclRule.ETHERTYPE_IPV4, 1, "allow", null, null, "1.10.10.0", "1.10.10.1", null, null, null, null, 0, 0, 5)); ingressRules.add(new AclRule(AclRule.ETHERTYPE_IPV4, 6, "allow", null, null, "1.10.10.6", "1.10.10.7", 80, 80, 80, 80, 1, null, null)); final List<NiciraNvpTag> tags = new ArrayList<NiciraNvpTag>(); acl.setTags(tags); tags.add(new NiciraNvpTag("nvp", "MyTag1")); tags.add(new NiciraNvpTag("nicira", "MyTag2")); // In the creation we don't get to specify UUID, href or schema: they don't exist yet try { acl = api.createAcl(acl); // We can now update the new entity acl.setDisplayName("UpdatedAcl" + timestamp); api.updateAcl(acl, acl.getUuid()); // Read them all List<Acl> acls = api.findAcl(); Acl scInList = null; for (final Acl iAcl : acls) { if (iAcl.getUuid().equalsIgnoreCase(acl.getUuid())) { scInList = iAcl; } } assertEquals("Read a ACL different from the one just created and updated", acl, scInList); // Read them filtered by uuid (get one) acls = api.findAcl(acl.getUuid()); assertEquals("Read a ACL different from the one just created and updated", acl, acls.get(0)); assertEquals("Read a ACL filtered by unique id (UUID) with more than one item", 1, acls.size()); // We can now delete the new entity api.deleteAcl(acl.getUuid()); } catch (final NiciraNvpApiException e) { e.printStackTrace(); assertTrue("Errors in ACL CRUD", false); } } @Test public void testCRUDLogicalSwitch() throws Exception { LogicalSwitch logicalSwitch = new LogicalSwitch(); logicalSwitch.setDisplayName("LogicalSwitch" + timestamp); logicalSwitch.setPortIsolationEnabled(true); logicalSwitch.setReplicationMode("service"); logicalSwitch.setTags(new ArrayList<NiciraNvpTag>()); logicalSwitch.getTags().add(new NiciraNvpTag("anto", "hugo")); // In the creation we don't get to specify UUID, href or schema: they don't exist yet logicalSwitch = api.createLogicalSwitch(logicalSwitch); // We can now update the new entity logicalSwitch.setDisplayName("UpdatedLogicalSwitch" + timestamp); api.updateLogicalSwitch(logicalSwitch, logicalSwitch.getUuid()); // Read them all List<LogicalSwitch> logicalSwitches = api.findLogicalSwitch(); for (final LogicalSwitch iLogicalSwitch : logicalSwitches) { if (iLogicalSwitch.getUuid().equalsIgnoreCase(logicalSwitch.getUuid())) { assertEquals("Read a LogicalSwitch different from the one just created and updated", logicalSwitch, iLogicalSwitch); } } // Read them filtered by uuid (get one) logicalSwitches = api.findLogicalSwitch(logicalSwitch.getUuid()); assertEquals("Read a LogicalSwitch different from the one just created and updated", logicalSwitch, logicalSwitches.get(0)); assertEquals("Read a LogicalSwitch filtered by unique id (UUID) with more than one item", 1, logicalSwitches.size()); // Before deleting the test LogicalSwitch, test its ports final List<NiciraNvpTag> tags = new ArrayList<NiciraNvpTag>(); tags.add(new NiciraNvpTag("cs_account", "OwnerName")); LogicalSwitchPort logicalSwitchPort = new LogicalSwitchPort("LSwitchPort" + timestamp, tags, true); logicalSwitchPort = api.createLogicalSwitchPort(logicalSwitch.getUuid(), logicalSwitchPort); logicalSwitchPort.setDisplayName("UpdatedLSwitchPort" + timestamp); api.updateLogicalSwitchPort(logicalSwitch.getUuid(), logicalSwitchPort); final List<LogicalSwitchPort> logicalSwitchePorts = api.findLogicalSwitchPortsByUuid(logicalSwitch.getUuid(), logicalSwitchPort.getUuid()); for (final LogicalSwitchPort iLSwitchPort : logicalSwitchePorts) { if (iLSwitchPort.getUuid().equalsIgnoreCase(logicalSwitchPort.getUuid())) { assertEquals("Read a LogicalSwitchPort different from the one just created and updated", logicalSwitchPort, iLSwitchPort); } } // And finally test attachments final String attachmentUuid = UUID.randomUUID().toString(); final VifAttachment vifAttachment = new VifAttachment(attachmentUuid); api.updateLogicalSwitchPortAttachment(logicalSwitch.getUuid(), logicalSwitchPort.getUuid(), vifAttachment); assertEquals("Read a LogicalSwitchPort by vifAttachment different than expected", api.findLogicalSwitchPortUuidByVifAttachmentUuid(logicalSwitch.getUuid(), vifAttachment.getVifUuid()), logicalSwitchPort.getUuid()); api.deleteLogicalSwitchPort(logicalSwitch.getUuid(), logicalSwitchPort.getUuid()); // We can now delete the new entity api.deleteLogicalSwitch(logicalSwitch.getUuid()); } @Test public void testCRUDLogicalRouter() { LogicalRouter logicalRouter = new LogicalRouter(); logicalRouter.setDisplayName("LogicalRouter" + timestamp); logicalRouter.setDistributed(true); logicalRouter.setNatSynchronizationEnabled(true); logicalRouter.setReplicationMode(LogicalRouter.REPLICATION_MODE_SERVICE); final RoutingConfig routingConfig = new SingleDefaultRouteImplicitRoutingConfig( new RouterNextHop("192.168.10.20")); logicalRouter.setRoutingConfig(routingConfig); // In the creation we don't get to specify UUID, href or schema: they don't exist yet try { logicalRouter = api.createLogicalRouter(logicalRouter); // We can now update the new entity logicalRouter.setDisplayName("UpdatedLogicalSwitch" + timestamp); api.updateLogicalRouter(logicalRouter, logicalRouter.getUuid()); // Read them all List<LogicalRouter> logicalRouters = api.findLogicalRouter(); LogicalRouter lsInList = null; for (final LogicalRouter iLogicalRouter : logicalRouters) { if (iLogicalRouter.getUuid().equalsIgnoreCase(logicalRouter.getUuid())) { lsInList = iLogicalRouter; } } assertEquals("Read a LogicalRouter different from the one just created and updated", logicalRouter, lsInList); // Read them filtered by uuid (get one) logicalRouters = api.findLogicalRouter(logicalRouter.getUuid()); assertEquals("Read a LogicalRouter different from the one just created and updated", logicalRouter, logicalRouters.get(0)); assertEquals("Read a LogicalRouter filtered by unique id (UUID) with more than one item", 1, logicalRouters.size()); assertEquals(logicalRouters.get(0), api.findOneLogicalRouterByUuid(logicalRouter.getUuid())); // Before deleting the test LogicalRouter, test its ports final List<NiciraNvpTag> tags = new ArrayList<NiciraNvpTag>(); tags.add(new NiciraNvpTag("cs_account", "OwnerName")); LogicalRouterPort logicalRouterPort = new LogicalRouterPort(); logicalRouterPort.setDisplayName("LRouterPort" + timestamp); logicalRouterPort.setTags(tags); logicalRouterPort.setAdminStatusEnabled(true); logicalRouterPort.setPortno(1024); logicalRouterPort.setMacAddress("00:00:00:00:00:00"); final List<String> ipAddresses = new ArrayList<String>(); // Add some ips to this list logicalRouterPort.setIpAddresses(ipAddresses); logicalRouterPort = api.createLogicalRouterPort(logicalRouter.getUuid(), logicalRouterPort); logicalRouterPort.setDisplayName("UpdatedLRouterPort" + timestamp); api.updateLogicalRouterPort(logicalRouter.getUuid(), logicalRouterPort); final List<LogicalRouterPort> logicalRouterePorts = api.findLogicalRouterPortsByUuid(logicalRouter.getUuid(), logicalRouterPort.getUuid()); for (final LogicalRouterPort iLRouterPort : logicalRouterePorts) { if (iLRouterPort.getUuid().equalsIgnoreCase(logicalRouterPort.getUuid())) { assertEquals("Read a LogicalRouterPort different from the one just created and updated", logicalRouterPort, iLRouterPort); } } UUID.randomUUID().toString(); // Test CRUD for Nat Rules SourceNatRule snr = new SourceNatRule(); snr.setToSourceIpAddressMin("192.168.10.10"); snr.setToSourceIpAddressMax("192.168.10.20"); snr.setOrder(200); final Match match = new Match(); match.setSourceIpAddresses("192.168.150.150"); snr.setMatch(match); snr = (SourceNatRule) api.createLogicalRouterNatRule(logicalRouter.getUuid(), snr); snr.setToSourceIpAddressMax("192.168.10.30"); api.updateLogicalRouterNatRule(logicalRouter.getUuid(), snr); api.findNatRulesByLogicalRouterUuid(logicalRouter.getUuid()); api.deleteLogicalRouterNatRule(logicalRouter.getUuid(), snr.getUuid()); api.deleteLogicalRouterPort(logicalRouter.getUuid(), logicalRouterPort.getUuid()); // We can now delete the new entity api.deleteLogicalRouter(logicalRouter.getUuid()); } catch (final NiciraNvpApiException e) { e.printStackTrace(); assertTrue("Errors in LogicalRouter CRUD", false); } } @Test public void testGetControlClusterStatus() throws NiciraNvpApiException { final ControlClusterStatus controlClusterStatus = api.getControlClusterStatus(); final String clusterStatus = controlClusterStatus.getClusterStatus(); final boolean correctStatus = clusterStatus.equalsIgnoreCase("stable") || clusterStatus.equalsIgnoreCase("joining") || clusterStatus.equalsIgnoreCase("unstable"); assertTrue("Not recognizable cluster status", correctStatus); } }