/* * Copyright (c) 2015 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.renderer.ofoverlay.mapper.external; import static org.mockito.Matchers.any; 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 org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.opendaylight.groupbasedpolicy.dto.IndexedTenant; import org.opendaylight.groupbasedpolicy.dto.PolicyInfo; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.MockOfContext; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.MockPolicyManager; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfContext; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfWriter; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.PolicyManager; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.endpoint.EndpointManager; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.endpoint.MockEndpointManager; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.mapper.MapperUtilsTest; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.node.MockSwitchManager; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.node.SwitchManager; 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.Ipv4Address; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Builder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.l3endpoint.rev151217.NatAddress; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.l3endpoint.rev151217.NatAddressBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContext; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContextBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.TenantBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.ForwardingContextBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import com.google.common.collect.ImmutableSet; import java.util.Collection; import java.util.HashSet; import java.util.Set; @RunWith(PowerMockRunner.class) @PrepareForTest({PolicyManager.class}) public class ExternalMapperTest extends MapperUtilsTest { private ExternalMapper mapper; private short tableId; private Ipv4Address natAddr = new Ipv4Address("192.168.111.52"); @Before public void initialisation() { PowerMockito.stub(PowerMockito.method(PolicyManager.class, "setSfcTableOffset")).toReturn(true); endpointManager = mock(EndpointManager.class); policyManager = mock(PolicyManager.class); switchManager = mock(SwitchManager.class); policyInfo = mock(PolicyInfo.class); ctx = mock(OfContext.class); tableId = 6; ofWriter = mock(OfWriter.class); mapper = new ExternalMapper(ctx, tableId); } @Test public void constructorTest() { Assert.assertEquals(tableId, mapper.getTableId()); } @Test public void testSync() throws Exception { //External Ports Set<Long> externalPorts = new HashSet<>(); externalPorts.add(Long.valueOf(CONNECTOR_1.getValue())); // Modified tenant TenantBuilder tenantBuilder = buildTenant(); tenantBuilder.setForwardingContext(new ForwardingContextBuilder() .setL2FloodDomain(getL2FloodDomainList(true)) .setL2BridgeDomain(getL2BridgeDomainList()) .setL3Context(getL3ContextList()) .setSubnet(getSubnetList()).build()) .build().getId(); Tenant tenant = tenantBuilder.build(); // L2 Endpoint EndpointBuilder endpointBuilder = buildEndpoint(IPV4_0, MAC_0, CONNECTOR_0) .setL2Context(L2BD_ID); // L3 Endpoint with Nat EndpointL3Builder endpointL3Builder = buildL3Endpoint(natAddr, IPV4_1, MAC_0, null) .setL2Context(L2BD_ID); endpointL3Builder.setTenant(tenant.getId()); Collection<EndpointL3> l3EndpointsWithNat = new HashSet<>(); l3EndpointsWithNat.add(endpointL3Builder.build()); when(ctx.getTenant(any(TenantId.class))).thenReturn(new IndexedTenant(tenant)); when(ctx.getEndpointManager()).thenReturn(endpointManager); when(ctx.getSwitchManager()).thenReturn(switchManager); when(ctx.getCurrentPolicy()).thenReturn(policyInfo); when(endpointManager.getEndpointNodeId(any(Endpoint.class))).thenReturn(NODE_ID); when(endpointManager.getL3EndpointsWithNat()).thenReturn(l3EndpointsWithNat); when(switchManager.getExternalPortNumbers(any(NodeId.class))).thenReturn(externalPorts); mapper.sync(endpointBuilder.build(), ofWriter); verify(ofWriter, times(3)).writeFlow(any(NodeId.class), any(Short.class), any(Flow.class)); } @Test public void testSync_NoExternalPorts() throws Exception { // we still need ExternalMapper flows (default output and default drop) to be generated EndpointBuilder endpointBuilder = buildEndpoint(IPV4_0, MAC_0, CONNECTOR_0); when(ctx.getEndpointManager()).thenReturn(endpointManager); when(ctx.getTenant(any(TenantId.class))).thenReturn(getTestIndexedTenant()); when(ctx.getCurrentPolicy()).thenReturn(policyInfo); when(ctx.getSwitchManager()).thenReturn(switchManager); when(endpointManager.getEndpointNodeId(any(Endpoint.class))).thenReturn(NODE_ID); mapper.sync(endpointBuilder.build(), ofWriter); verify(ofWriter, times(2)).writeFlow(any(NodeId.class), any(Short.class), any(Flow.class)); } }