Implement SFC integration
[groupbasedpolicy.git] / renderers / ofoverlay / src / test / java / org / opendaylight / groupbasedpolicy / renderer / ofoverlay / flow / SourceMapperTest.java
1 /*\r
2  * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 \r
9 package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow;\r
10 \r
11 import java.math.BigInteger;\r
12 import java.util.Collections;\r
13 import java.util.HashMap;\r
14 import java.util.List;\r
15 import java.util.Objects;\r
16 \r
17 import org.junit.Before;\r
18 import org.junit.Test;\r
19 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.PolicyManager.FlowMap;\r
20 import org.opendaylight.groupbasedpolicy.resolver.ConditionGroup;\r
21 import org.opendaylight.groupbasedpolicy.resolver.EgKey;\r
22 import org.opendaylight.groupbasedpolicy.resolver.PolicyInfo;\r
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;\r
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCase;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionName;\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.NetworkDomainId;\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayNodeConfigBuilder;\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.nodes.node.TunnelBuilder;\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg0;\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg1;\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg4;\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg5;\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg6;\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.overlay.rev150105.TunnelTypeVxlan;\r
41 import org.slf4j.Logger;\r
42 import org.slf4j.LoggerFactory;\r
43 \r
44 import com.google.common.collect.ImmutableList;\r
45 \r
46 import static org.junit.Assert.*;\r
47 \r
48 public class SourceMapperTest extends FlowTableTest {\r
49 \r
50     protected static final Logger LOG = LoggerFactory.getLogger(SourceMapperTest.class);\r
51 \r
52     NodeConnectorId remoteTunnelId =\r
53             new NodeConnectorId(remoteNodeId.getValue() + ":101");\r
54 \r
55     @Override\r
56     @Before\r
57     public void setup() throws Exception {\r
58         initCtx();\r
59         table = new SourceMapper(ctx);\r
60         super.setup();\r
61     }\r
62 \r
63     private void addSwitches() {\r
64         switchManager.addSwitch(\r
65                 nodeId,\r
66                 tunnelId,\r
67                 Collections.<NodeConnectorId>emptySet(),\r
68                 new OfOverlayNodeConfigBuilder().setTunnel(\r
69                         ImmutableList.of(new TunnelBuilder().setIp(new IpAddress(new Ipv4Address("1.2.3.4")))\r
70                             .setTunnelType(TunnelTypeVxlan.class)\r
71                             .setNodeConnectorId(tunnelId)\r
72                             .build())).build());\r
73         switchManager.addSwitch(\r
74                 remoteNodeId,\r
75                 remoteTunnelId,\r
76                 Collections.<NodeConnectorId>emptySet(),\r
77                 new OfOverlayNodeConfigBuilder().setTunnel(\r
78                         ImmutableList.of(new TunnelBuilder().setIp(new IpAddress(new Ipv4Address("1.2.3.5")))\r
79                             .setTunnelType(TunnelTypeVxlan.class)\r
80                             .setNodeConnectorId(tunnelId)\r
81                             .build())).build());\r
82     }\r
83 \r
84     @Test\r
85     public void testNoPolicy() throws Exception {\r
86         endpointManager.addEndpoint(localEP().build());\r
87         FlowMap fm = dosync(null);\r
88         assertEquals(1, fm.getTableForNode(nodeId, (short) 1).getFlow().size());\r
89     }\r
90 \r
91     @Test\r
92     public void testMap() throws Exception {\r
93         switchManager.addSwitch(\r
94                 nodeId,\r
95                 tunnelId,\r
96                 Collections.<NodeConnectorId>emptySet(),\r
97                 new OfOverlayNodeConfigBuilder().setTunnel(\r
98                         ImmutableList.of(new TunnelBuilder().setIp(new IpAddress(new Ipv4Address("1.2.3.4")))\r
99                             .setTunnelType(TunnelTypeVxlan.class)\r
100                             .setNodeConnectorId(tunnelId)\r
101                             .build())).build());\r
102         Endpoint ep = localEP().build();\r
103         switchManager.addSwitch(nodeId, null,\r
104                 Collections.<NodeConnectorId> emptySet(),\r
105                 null);\r
106         endpointManager.addEndpoint(ep);\r
107         policyResolver.addTenant(baseTenant().build());\r
108 \r
109         FlowMap fm = dosync(null);\r
110         assertEquals(2, fm.getTableForNode(nodeId, (short) 1).getFlow().size());\r
111 \r
112         int count = 0;\r
113         HashMap<String, Flow> flowMap = new HashMap<>();\r
114         for (Flow f : fm.getTableForNode(nodeId, (short) 1).getFlow()) {\r
115             flowMap.put(f.getId().getValue(), f);\r
116             if (f.getMatch() == null || f.getMatch().getEthernetMatch() == null) {\r
117                 assertEquals(FlowUtils.dropInstructions(), f.getInstructions());\r
118                 count += 1;\r
119             } else if ((f.getMatch() !=null && f.getMatch().getEthernetMatch() != null)\r
120              && (Objects.equals(ep.getMacAddress(), f.getMatch()\r
121                 .getEthernetMatch()\r
122                 .getEthernetSource()\r
123                 .getAddress()))) {\r
124                 PolicyInfo pi = policyResolver.getCurrentPolicy();\r
125                 List<ConditionName> cset = endpointManager.getCondsForEndpoint(ep);\r
126                 ConditionGroup cg = pi.getEgCondGroup(new EgKey(tid, eg), cset);\r
127 \r
128                 Instruction ins = f.getInstructions().getInstruction().get(0);\r
129                 assertTrue(ins.getInstruction() instanceof ApplyActionsCase);\r
130                 List<Action> actions = ((ApplyActionsCase) ins.getInstruction()).getApplyActions().getAction();\r
131                 int v = OrdinalFactory.getContextOrdinal(ep);\r
132                 assertEquals(FlowUtils.nxLoadRegAction(NxmNxReg0.class, BigInteger.valueOf(v)), actions.get(0)\r
133                     .getAction());\r
134                 v = OrdinalFactory.getCondGroupOrdinal(cg);\r
135                 assertEquals(FlowUtils.nxLoadRegAction(NxmNxReg1.class, BigInteger.valueOf(v)), actions.get(1)\r
136                     .getAction());\r
137                 v = OrdinalFactory.getContextOrdinal(tid, bd);\r
138                 assertEquals(FlowUtils.nxLoadRegAction(NxmNxReg4.class, BigInteger.valueOf(v)), actions.get(2)\r
139                     .getAction());\r
140                 v = OrdinalFactory.getContextOrdinal(tid, fd);\r
141                 assertEquals(FlowUtils.nxLoadRegAction(NxmNxReg5.class, BigInteger.valueOf(v)), actions.get(3)\r
142                     .getAction());\r
143                 v = OrdinalFactory.getContextOrdinal(tid, l3c);\r
144                 assertEquals(FlowUtils.nxLoadRegAction(NxmNxReg6.class, BigInteger.valueOf(v)), actions.get(4)\r
145                     .getAction());\r
146                 count += 1;\r
147             }\r
148         }\r
149         assertEquals(2, count);\r
150         int numberOfFlows = fm.getTableForNode(nodeId, (short) 1).getFlow().size();\r
151         fm = dosync(flowMap);\r
152         assertEquals(numberOfFlows, fm.getTableForNode(nodeId, (short) 1).getFlow().size());\r
153     }\r
154 \r
155 }\r