Fixed NAT in OFOverlay based on EIG
[groupbasedpolicy.git] / renderers / ofoverlay / src / test / java / org / opendaylight / groupbasedpolicy / renderer / ofoverlay / flow / SourceMapperTest.java
index 772071fc976b3469932d4607a9a149e0553c3cd4..7a0dedb5ecdd4cb6d726aff3956015cd5f37221a 100755 (executable)
-/*\r
- * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.\r
- * \r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-\r
-package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow;\r
-\r
-import java.math.BigInteger;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-import java.util.Objects;\r
-\r
-import org.junit.Before;\r
-import org.junit.Test;\r
-import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.PolicyManager.FlowMap;\r
-import org.opendaylight.groupbasedpolicy.resolver.ConditionGroup;\r
-import org.opendaylight.groupbasedpolicy.resolver.EgKey;\r
-import org.opendaylight.groupbasedpolicy.resolver.PolicyInfo;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionName;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.NetworkDomainId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg0;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg1;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg4;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg5;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg6;\r
-import org.slf4j.Logger;\r
-import org.slf4j.LoggerFactory;\r
-\r
-import com.google.common.collect.ImmutableList;\r
-\r
-import static org.junit.Assert.*;\r
-\r
-public class SourceMapperTest extends FlowTableTest {\r
-\r
-    protected static final Logger LOG = LoggerFactory.getLogger(SourceMapperTest.class);\r
-\r
-    @Before\r
-    public void setup() throws Exception {\r
-        initCtx();\r
-        table = new SourceMapper(ctx);\r
-        super.setup();\r
-    }\r
-\r
-    @Test\r
-    public void testNoPolicy() throws Exception {\r
-        endpointManager.addEndpoint(localEP().build());\r
-        FlowMap fm = dosync(null);\r
-        assertEquals(1, fm.getTableForNode(nodeId, (short) 1).getFlow().size());\r
-    }\r
-\r
-    @Test\r
-    public void testMap() throws Exception {\r
-        Endpoint ep = localEP().build();\r
-        endpointManager.addEndpoint(ep);\r
-        policyResolver.addTenant(baseTenant().build());\r
-\r
-        FlowMap fm = dosync(null);\r
-        assertEquals(2, fm.getTableForNode(nodeId, (short) 1).getFlow().size());\r
-\r
-        int count = 0;\r
-        HashMap<String, Flow> flowMap = new HashMap<>();\r
-        for (Flow f : fm.getTableForNode(nodeId, (short) 1).getFlow()) {\r
-            flowMap.put(f.getId().getValue(), f);\r
-            if (f.getMatch() == null) {\r
-                assertEquals(FlowUtils.dropInstructions(), f.getInstructions());\r
-                count += 1;\r
-            } else if (Objects.equals(ep.getMacAddress(), f.getMatch()\r
-                .getEthernetMatch()\r
-                .getEthernetSource()\r
-                .getAddress())) {\r
-                PolicyInfo pi = policyResolver.getCurrentPolicy();\r
-                List<ConditionName> cset = endpointManager.getCondsForEndpoint(ep);\r
-                ConditionGroup cg = pi.getEgCondGroup(new EgKey(tid, eg), cset);\r
-\r
-                Instruction ins = f.getInstructions().getInstruction().get(0);\r
-                assertTrue(ins.getInstruction() instanceof ApplyActionsCase);\r
-                List<Action> actions = ((ApplyActionsCase) ins.getInstruction()).getApplyActions().getAction();\r
-                NetworkDomainId networkContainement = policyResolver.getTenant(tid)\r
-                    .getEndpointGroup(eg)\r
-                    .getNetworkDomain();\r
-                int v = OrdinalFactory.getContextOrdinal(ep, networkContainement);\r
-                assertEquals(FlowUtils.nxLoadRegAction(NxmNxReg0.class, BigInteger.valueOf(v)), actions.get(0)\r
-                    .getAction());\r
-                v = OrdinalFactory.getCondGroupOrdinal(cg);\r
-                assertEquals(FlowUtils.nxLoadRegAction(NxmNxReg1.class, BigInteger.valueOf(v)), actions.get(1)\r
-                    .getAction());\r
-                v = OrdinalFactory.getContextOrdinal(tid, bd);\r
-                assertEquals(FlowUtils.nxLoadRegAction(NxmNxReg4.class, BigInteger.valueOf(v)), actions.get(2)\r
-                    .getAction());\r
-                v = OrdinalFactory.getContextOrdinal(tid, fd);\r
-                assertEquals(FlowUtils.nxLoadRegAction(NxmNxReg5.class, BigInteger.valueOf(v)), actions.get(3)\r
-                    .getAction());\r
-                v = OrdinalFactory.getContextOrdinal(tid, l3c);\r
-                assertEquals(FlowUtils.nxLoadRegAction(NxmNxReg6.class, BigInteger.valueOf(v)), actions.get(4)\r
-                    .getAction());\r
-                count += 1;\r
-            }\r
-        }\r
-        assertEquals(2, count);\r
-        int numberOfFlows = fm.getTableForNode(nodeId, (short) 1).getFlow().size();\r
-        fm = dosync(flowMap);\r
-        assertEquals(numberOfFlows, fm.getTableForNode(nodeId, (short) 1).getFlow().size());\r
-    }\r
-\r
-}\r
+/*
+ * 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.flow;
+
+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 java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.groupbasedpolicy.dto.EgKey;
+import org.opendaylight.groupbasedpolicy.dto.IndexedTenant;
+import org.opendaylight.groupbasedpolicy.dto.PolicyInfo;
+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.node.SwitchManager;
+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.EndpointGroupId;
+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.ofoverlay.rev140528.OfOverlayContext;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.EndpointGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.overlay.rev150105.TunnelTypeVxlan;
+
+public class SourceMapperTest {
+
+    private SourceMapper mapper;
+
+    private OfContext ctx;
+    private short tableId;
+    private NodeId nodeId;
+    private PolicyInfo policyInfo;
+    private OfWriter ofWriter;
+    private Endpoint endpoint;
+    private EndpointManager endpointManager;
+    private IndexedTenant tenant;
+    private TenantId tenantId;
+    private PolicyManager policyManager;
+    private OfOverlayContext ofOverlayContext;
+    private NodeConnectorId nodeConnectorId;
+    private EndpointGroupId endpointGroupIdSingle;
+    private EndpointGroupId endpointGroupIdList;
+    private EndpointGroup endpointGroup;
+    private SwitchManager switchManager;
+
+    @Before
+    public void initialisation() {
+        ctx = mock(OfContext.class);
+        tableId = 5;
+        nodeId = mock(NodeId.class);
+        ofWriter = mock(OfWriter.class);
+
+        mapper = new SourceMapper(ctx, tableId);
+
+        endpointManager = mock(EndpointManager.class);
+        when(ctx.getEndpointManager()).thenReturn(endpointManager);
+        endpoint = mock(Endpoint.class);
+        List<Endpoint> endpointsForNode = Arrays.asList(endpoint);
+        when(endpointManager.getEndpointsForNode(nodeId)).thenReturn(endpointsForNode);
+
+        ofOverlayContext = mock(OfOverlayContext.class);
+        when(endpoint.getAugmentation(OfOverlayContext.class)).thenReturn(ofOverlayContext);
+        nodeConnectorId = mock(NodeConnectorId.class);
+        when(ofOverlayContext.getNodeConnectorId()).thenReturn(nodeConnectorId);
+
+        tenantId = mock(TenantId.class);
+        when(endpoint.getTenant()).thenReturn(tenantId);
+        tenant = mock(IndexedTenant.class);
+        when(ctx.getTenant(tenantId)).thenReturn(tenant);
+        policyManager = mock(PolicyManager.class);
+        when(ctx.getPolicyManager()).thenReturn(policyManager);
+        policyInfo = mock(PolicyInfo.class);
+        when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
+
+        endpointGroup = mock(EndpointGroup.class);
+        when(tenant.getEndpointGroup(any(EndpointGroupId.class))).thenReturn(endpointGroup);
+
+        Set<NodeId> nodeIdPeers = new HashSet<NodeId>(Arrays.asList(nodeId));
+        when(endpointManager.getNodesForGroup(any(EgKey.class))).thenReturn(nodeIdPeers);
+
+        switchManager = mock(SwitchManager.class);
+        when(ctx.getSwitchManager()).thenReturn(switchManager);
+        when(switchManager.getTunnelPort(nodeId, TunnelTypeVxlan.class)).thenReturn(nodeConnectorId);
+    }
+
+    @Test
+    public void constructorTest() {
+        Assert.assertEquals(tableId, mapper.getTableId());
+    }
+
+    @Test
+    public void syncTestEndpointGroup() throws Exception {
+        endpointGroupIdSingle = mock(EndpointGroupId.class);
+        when(endpoint.getEndpointGroup()).thenReturn(endpointGroupIdSingle);
+        when(endpoint.getEndpointGroups()).thenReturn(null);
+
+        mapper.sync(nodeId, ofWriter);
+        verify(ofWriter, times(4)).writeFlow(any(NodeId.class), any(Short.class), any(Flow.class));
+    }
+
+    @Test
+    public void syncTestEndpointGroups() throws Exception {
+        endpointGroupIdList = mock(EndpointGroupId.class);
+        List<EndpointGroupId> endpointGroups = Arrays.asList(endpointGroupIdList);
+        when(endpoint.getEndpointGroups()).thenReturn(endpointGroups);
+
+        mapper.sync(nodeId, ofWriter);
+        verify(ofWriter, times(4)).writeFlow(any(NodeId.class), any(Short.class), any(Flow.class));
+    }
+
+    @Test
+    public void syncTestEndpointGroupPeers() throws Exception {
+        endpointGroupIdSingle = mock(EndpointGroupId.class);
+        when(endpoint.getEndpointGroup()).thenReturn(endpointGroupIdSingle);
+        when(endpoint.getEndpointGroups()).thenReturn(null);
+
+        mapper.sync(nodeId, ofWriter);
+        verify(ofWriter, times(4)).writeFlow(any(NodeId.class), any(Short.class), any(Flow.class));
+    }
+
+    @Test
+    public void syncTestEndpointGroupTunPortNull() throws Exception {
+        endpointGroupIdSingle = mock(EndpointGroupId.class);
+        when(endpoint.getEndpointGroup()).thenReturn(endpointGroupIdSingle);
+        when(endpoint.getEndpointGroups()).thenReturn(null);
+        when(switchManager.getTunnelPort(nodeId, TunnelTypeVxlan.class)).thenReturn(null);
+
+        mapper.sync(nodeId, ofWriter);
+        verify(ofWriter, times(2)).writeFlow(any(NodeId.class), any(Short.class), any(Flow.class));
+    }
+
+    @Test
+    public void syncTestTenantNull() throws Exception {
+        when(ctx.getTenant(tenantId)).thenReturn(null);
+
+        mapper.sync(nodeId, ofWriter);
+        verify(ofWriter, times(1)).writeFlow(any(NodeId.class), any(Short.class), any(Flow.class));
+    }
+}