/* * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.groupbasedpolicy.neutron.mapper.mapping; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import com.google.common.collect.ImmutableList; import java.util.Collections; import java.util.List; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.groupbasedpolicy.neutron.mapper.EndpointRegistrator; import org.opendaylight.groupbasedpolicy.neutron.mapper.test.NeutronMapperAssert; import org.opendaylight.groupbasedpolicy.neutron.mapper.test.NeutronMapperDataBrokerTest; import org.opendaylight.groupbasedpolicy.neutron.mapper.util.PortUtils; import org.opendaylight.groupbasedpolicy.neutron.mapper.util.Utils; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.RegisterEndpointInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.UnregisterEndpointInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIps; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIpsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.Ports; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.PortsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.PortBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.Subnets; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.SubnetsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.Subnet; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.SubnetBuilder; public class NeutronPortAwareDataStoreTest extends NeutronMapperDataBrokerTest { private final Uuid tenantUuid = new Uuid("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"); private final Uuid portUuid = new Uuid("bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"); private final Uuid subnetUuid = new Uuid("cccccccc-cccc-cccc-cccc-cccccccccccc"); private final Uuid networkUuid = new Uuid("dddddddd-dddd-dddd-dddd-dddddddddddd"); private final Uuid uuidReserved3 = new Uuid("dddddddd-dddd-dddd-dddd-ddddddddddd3"); private DataBroker dataBroker; private NeutronPortAware portAware; private EndpointRegistrator epRegistrator; private Neutron neutron; @Before @SuppressWarnings("checkstyle:LineLength") // Longer lines in this method are caused by long package names, // this will be removed when deprecated classes will be cleared. public void init() { dataBroker = getDataBroker(); neutron = mock(Neutron.class); epRegistrator = mock(EndpointRegistrator.class); when(epRegistrator.registerEndpoint(any(RegisterEndpointInput.class))).thenReturn(true); when(epRegistrator.registerEndpoint( any(org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.RegisterEndpointInput.class))) .thenReturn(true); when(epRegistrator.unregisterEndpoint(any(UnregisterEndpointInput.class))).thenReturn(true); when(epRegistrator.unregisterEndpoint( any(org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.UnregisterEndpointInput.class))) .thenReturn(true); portAware = new NeutronPortAware(dataBroker, epRegistrator, new IpPrefix(new Ipv4Prefix("192.168.192.168/32"))); } @Rule public ExpectedException thrown = ExpectedException.none(); @Test public void testConstructor_invalidArgument() throws NullPointerException { thrown.expect(NullPointerException.class); new NeutronPortAware(null, null, null); } @Test public void test_createAndDeleteDhcpPort() { IpAddress ipAddress = new IpAddress(new Ipv4Address("10.0.0.2")); Subnets subnets = createSubnets(); when(neutron.getSubnets()).thenReturn(subnets); FixedIps portIpWithSubnet = createFixedIps(ipAddress); Port port = newBasePort().setDeviceOwner(PortUtils.DEVICE_OWNER_DHCP) .setFixedIps(ImmutableList.of(portIpWithSubnet)) .build(); when(neutron.getPorts()).thenReturn(new PortsBuilder().setPort(Collections.singletonList(port)).build()); portAware.onCreated(port, neutron); NeutronMapperAssert.assertPortExists(dataBroker, port.getUuid()); portAware.onDeleted(port, neutron, neutron); NeutronMapperAssert.assertPortNotExists(dataBroker, port.getUuid()); } @Test public void test_createDhcpPort_noFixedIps() { Subnets subnets = createSubnets(); when(neutron.getSubnets()).thenReturn(subnets); Port port = newBasePort().setDeviceOwner(PortUtils.DEVICE_OWNER_DHCP).build(); portAware.onCreated(port, neutron); NeutronMapperAssert.assertPortNotExists(dataBroker, port.getUuid()); } @Test public void test_createAndDeleteNormalPort() throws Exception { IpAddress ipAddress = new IpAddress(new Ipv4Address("10.0.0.2")); Subnets subnets = createSubnets(); when(neutron.getSubnets()).thenReturn(subnets); FixedIps portIpWithSubnet = createFixedIps(ipAddress); Port port = newBasePort().setDeviceOwner("owner for normal port") .setFixedIps(ImmutableList.of(portIpWithSubnet)) .build(); when(neutron.getPorts()).thenReturn(new PortsBuilder().setPort(Collections.singletonList(port)).build()); portAware.onCreated(port, neutron); NeutronMapperAssert.assertPortExists(dataBroker, port.getUuid()); portAware.onDeleted(port, neutron, neutron); NeutronMapperAssert.assertPortNotExists(dataBroker, port.getUuid()); } @Test public void test_createAndUpdateNormalPort() { IpAddress ipAddress = new IpAddress(new Ipv4Address("10.0.0.2")); Subnets subnets = createSubnets(); when(neutron.getSubnets()).thenReturn(subnets); FixedIps portIpWithSubnet = createFixedIps(ipAddress); Port port = newBasePort().setDeviceOwner("owner for normal port") .setFixedIps(ImmutableList.of(portIpWithSubnet)) .build(); portAware.onCreated(port, neutron); NeutronMapperAssert.assertPortExists(dataBroker, port.getUuid()); Port newPort = new PortBuilder(port).setName("updatedName").build(); portAware.onUpdated(port, newPort, neutron, neutron); NeutronMapperAssert.assertPortExists(dataBroker, port.getUuid()); } @Test public void test_createNormalPort_noFixedIps() { Subnets subnets = createSubnets(); when(neutron.getSubnets()).thenReturn(subnets); Port port = newBasePort().setDeviceOwner("owner for normal port").build(); portAware.onCreated(port, neutron); NeutronMapperAssert.assertPortExists(dataBroker, port.getUuid()); } @Test public void test_createAndDeleteRouterInterfacePort() { IpAddress ipAddress = new IpAddress(new Ipv4Address("10.0.0.2")); Subnets subnets = createSubnets(); when(neutron.getSubnets()).thenReturn(subnets); FixedIps portIpWithSubnet = createFixedIps(ipAddress); Port neutronPort1 = new PortBuilder().setTenantId(new Uuid(tenantUuid)) .setFixedIps(ImmutableList.of(portIpWithSubnet)) .setName("portName1") .setUuid(portUuid) .setDeviceId("deviceId") .setFixedIps(ImmutableList.of(portIpWithSubnet)) .setNetworkId(networkUuid) .setMacAddress(new MacAddress("00:00:00:00:35:02")) .build(); Port neutronPort2 = new PortBuilder().setTenantId(new Uuid(tenantUuid)) .setFixedIps(ImmutableList.of(portIpWithSubnet)) .setName("portName2") .setUuid(portUuid) .setDeviceId("deviceId") .setDeviceOwner(PortUtils.DEVICE_OWNER_DHCP) .setFixedIps(ImmutableList.of(portIpWithSubnet)) .setNetworkId(networkUuid) .setMacAddress(new MacAddress("00:00:00:00:35:02")) .build(); Ports neutronPorts = new PortsBuilder().setPort(ImmutableList.of(neutronPort1, neutronPort2)).build(); when(neutron.getPorts()).thenReturn(neutronPorts); Subnet subnet = subnets.getSubnet().get(0); Port port = newBasePort().setDeviceOwner(PortUtils.DEVICE_OWNER_ROUTER_IFACE) .setFixedIps(ImmutableList.of(portIpWithSubnet)) .setDeviceId("37ffd9b3-30c6-4d21-96df-00c04fc9552f") .build(); when(neutron.getPorts()).thenReturn(new PortsBuilder().setPort(Collections.singletonList(port)).build()); portAware.onCreated(port, neutron); NeutronMapperAssert.assertNetworkDomainExists(dataBroker, port, subnet, neutron, ipAddress); portAware.onDeleted(port, neutron, neutron); NeutronMapperAssert.assertNetworkDomainExists(dataBroker, port, subnet, neutron, ipAddress); NeutronMapperAssert.assertPortNotExists(dataBroker, port.getUuid()); } @Test public void test_createRouterInterfacePort_noFixedIps() { Subnets subnets = createSubnets(); when(neutron.getSubnets()).thenReturn(subnets); Subnet subnet = subnets.getSubnet().get(0); Port port = newBasePort().setDeviceOwner(PortUtils.DEVICE_OWNER_ROUTER_IFACE).build(); portAware.onCreated(port, neutron); NeutronMapperAssert.assertNetworkDomainNotExists(dataBroker, port, subnet, neutron, null); } @Test public void test_createAndDeleteRouterGatewayPort() { Port port = new PortBuilder().setUuid(portUuid).setDeviceOwner(PortUtils.DEVICE_OWNER_ROUTER_GATEWAY).build(); portAware.onCreated(port, neutron); portAware.onDeleted(port, neutron, neutron); // no op } @Test public void test_createAndDeleteFloatingIpPort() { Port port = new PortBuilder().setUuid(portUuid).setDeviceOwner(PortUtils.DEVICE_OWNER_FLOATING_IP).build(); portAware.onCreated(port, neutron); portAware.onDeleted(port, neutron, neutron); // no op } private PortBuilder newBasePort() { List secGroups = ImmutableList.of(uuidReserved3); return new PortBuilder().setTenantId(new Uuid(tenantUuid)) .setSecurityGroups(secGroups) .setName("portName") .setUuid(portUuid) .setDeviceId("deviceId") .setNetworkId(networkUuid) .setMacAddress(new MacAddress("00:00:00:00:35:02")); } private Subnets createSubnets() { Subnet subnet = new SubnetBuilder().setTenantId(tenantUuid) .setUuid(subnetUuid) .setName("subnetName") .setNetworkId(networkUuid) .setCidr(Utils.createIpPrefix("10.0.0.0/24")) .build(); return new SubnetsBuilder().setSubnet(ImmutableList.of(subnet)).build(); } private FixedIps createFixedIps(IpAddress ipAddress) { return new FixedIpsBuilder().setSubnetId(subnetUuid).setIpAddress(ipAddress).build(); } }