af4eeed590c6674cd1f65a1aa256cbeea4eeeda7
[groupbasedpolicy.git] / renderers / ofoverlay / src / test / java / org / opendaylight / groupbasedpolicy / renderer / ofoverlay / flow / OfTableTest.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.util.ArrayList;\r
12 import java.util.List;\r
13 import java.util.Map;\r
14 \r
15 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.endpoint.MockEndpointManager;\r
16 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.MockPolicyManager;\r
17 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfContext;\r
18 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.node.MockSwitchManager;\r
19 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sf.AllowAction;\r
20 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sf.Classifier;\r
21 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sf.L4Classifier;\r
22 import org.opendaylight.groupbasedpolicy.resolver.MockPolicyResolver;\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.IpPrefix;\r
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;\r
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;\r
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionName;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierName;\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClauseName;\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId;\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2BridgeDomainId;\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2FloodDomainId;\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L3ContextId;\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName;\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SelectorName;\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubjectName;\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubnetId;\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointBuilder;\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContext;\r
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContextBuilder;\r
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection.Direction;\r
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.action.refs.ActionRefBuilder;\r
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.classifier.refs.ClassifierRef;\r
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.classifier.refs.ClassifierRefBuilder;\r
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValueBuilder;\r
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.TenantBuilder;\r
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.ContractBuilder;\r
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.EndpointGroupBuilder;\r
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.L2BridgeDomainBuilder;\r
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.L2FloodDomainBuilder;\r
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.L3ContextBuilder;\r
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.SubjectFeatureInstancesBuilder;\r
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.SubnetBuilder;\r
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.ClauseBuilder;\r
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.Subject;\r
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.SubjectBuilder;\r
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.subject.Rule;\r
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.subject.RuleBuilder;\r
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerNamedSelectorBuilder;\r
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderNamedSelectorBuilder;\r
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.subject.feature.instances.ActionInstanceBuilder;\r
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.subject.feature.instances.ClassifierInstanceBuilder;\r
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;\r
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;\r
68 \r
69 import com.google.common.collect.ImmutableList;\r
70 \r
71 public class OfTableTest {\r
72     OfContext ctx;\r
73 \r
74     MockEndpointManager endpointManager;\r
75     MockPolicyResolver policyResolver;\r
76     MockPolicyManager policyManager;\r
77     MockSwitchManager switchManager;\r
78     NodeId nodeId = new NodeId("openflow:1");\r
79     NodeId remoteNodeId = new NodeId("openflow:2");\r
80     NodeConnectorId nodeConnectorId =\r
81             new NodeConnectorId(nodeId.getValue() + ":4");\r
82 \r
83     NodeConnectorId tunnelId =\r
84             new NodeConnectorId(nodeId.getValue() + ":42");\r
85 \r
86     L3ContextId l3c = new L3ContextId("2cf51ee4-e996-467e-a277-2d380334a91d");\r
87     L2BridgeDomainId bd = new L2BridgeDomainId("c95182ba-7807-43f8-98f7-6c7c720b7639");\r
88     L2FloodDomainId fd = new L2FloodDomainId("98e1439e-52d2-46f8-bd69-5136e6088771");\r
89     SubnetId sub = new SubnetId("4fcf8dfc-53b5-4aef-84d3-6b5586992fcb");\r
90     SubnetId sub2 = new SubnetId("c285a59f-fcb8-42e6-bf29-87ea522fd626");\r
91     SubnetId sub3 = new SubnetId("a0380d52-2a25-48ef-882c-a4d4cd9e00ec");\r
92     TenantId tid = new TenantId("1118c691-8520-47ad-80b8-4cf5e3fe3302");\r
93     EndpointGroupId eg = new EndpointGroupId("36dec84a-08c7-497b-80b6-a0035af72a12");\r
94     EndpointGroupId eg2 = new EndpointGroupId("632e5e11-7988-4eb5-8fe6-6c182d890276");\r
95     ContractId cid = new ContractId("a5874893-bcd5-46de-96af-3c8d99bedf9f");\r
96 \r
97     protected void initCtx() {\r
98         endpointManager = new MockEndpointManager();\r
99         policyResolver = new MockPolicyResolver();\r
100         policyManager = new MockPolicyManager(policyResolver, endpointManager);\r
101         switchManager = new MockSwitchManager();\r
102         ctx = new OfContext(null,\r
103                              null,\r
104                              policyManager,\r
105                              policyResolver,\r
106                              switchManager,\r
107                              endpointManager,\r
108                              null);\r
109     }\r
110 \r
111     protected TenantBuilder baseTenant() {\r
112         return new TenantBuilder()\r
113             .setId(tid)\r
114             .setEndpointGroup(ImmutableList.of(new EndpointGroupBuilder()\r
115                     .setId(eg)\r
116                     .setNetworkDomain(sub)\r
117                     .setConsumerNamedSelector(ImmutableList.of(new ConsumerNamedSelectorBuilder()\r
118                         .setName(new SelectorName("cns1"))\r
119                         .setContract(ImmutableList.of(cid))\r
120                         .build()))\r
121                     .build(),\r
122                 new EndpointGroupBuilder()\r
123                     .setId(eg2)\r
124                     .setNetworkDomain(sub2)\r
125                     .setProviderNamedSelector(ImmutableList.of(new ProviderNamedSelectorBuilder()\r
126                         .setName(new SelectorName("pns1"))\r
127                         .setContract(ImmutableList.of(cid))\r
128                         .build()))\r
129                     .build()))\r
130             .setL3Context(ImmutableList.of(new L3ContextBuilder()\r
131                 .setId(l3c)\r
132                 .build()))\r
133             .setL2BridgeDomain(ImmutableList.of(new L2BridgeDomainBuilder()\r
134                 .setId(bd)\r
135                 .setParent(l3c)\r
136                 .build()))\r
137             .setL2FloodDomain(ImmutableList.of(new L2FloodDomainBuilder()\r
138                 .setId(fd)\r
139                 .setParent(bd)\r
140                 .build()))\r
141             .setSubnet(ImmutableList.of(new SubnetBuilder()\r
142                     .setId(sub2)\r
143                     .setParent(fd)\r
144                     .setIpPrefix(new IpPrefix(new Ipv4Prefix("10.0.1.0/24")))\r
145                     .setVirtualRouterIp(new IpAddress(new Ipv4Address("10.0.1.1")))\r
146                     .build(),\r
147                 new SubnetBuilder()\r
148                     .setId(sub)\r
149                     .setParent(fd)\r
150                     .setIpPrefix(new IpPrefix(new Ipv4Prefix("10.0.0.0/24")))\r
151                     .setVirtualRouterIp(new IpAddress(new Ipv4Address("10.0.0.1")))\r
152                     .build(),\r
153                 new SubnetBuilder()\r
154                     .setId(sub3)\r
155                     .setParent(bd)\r
156                     .setIpPrefix(new IpPrefix(new Ipv4Prefix("10.0.2.0/24")))\r
157                     .setVirtualRouterIp(new IpAddress(new Ipv4Address("10.0.2.1")))\r
158                     .build()))\r
159             .setSubjectFeatureInstances(new SubjectFeatureInstancesBuilder()\r
160                 .setClassifierInstance(ImmutableList.of(new ClassifierInstanceBuilder()\r
161                      .setName(new ClassifierName("tcp_dst_80"))\r
162                      .setClassifierDefinitionId(L4Classifier.DEFINITION.getId())\r
163                      .setParameterValue(ImmutableList.of(new ParameterValueBuilder()\r
164                               .setName(new ParameterName("destport"))\r
165                               .setIntValue(Long.valueOf(80))\r
166                               .build(),\r
167                           new ParameterValueBuilder()\r
168                              .setName(new ParameterName("proto"))\r
169                              .setIntValue(Long.valueOf(6))\r
170                              .build()))\r
171                      .build(),\r
172                      new ClassifierInstanceBuilder()\r
173                      .setName(new ClassifierName("tcp_src_80"))\r
174                      .setClassifierDefinitionId(Classifier.L4_CL.getId())\r
175                      .setParameterValue(ImmutableList.of(new ParameterValueBuilder()\r
176                               .setName(new ParameterName("sourceport"))\r
177                               .setIntValue(Long.valueOf(80))\r
178                               .build(),\r
179                           new ParameterValueBuilder()\r
180                              .setName(new ParameterName("proto"))\r
181                              .setIntValue(Long.valueOf(6))\r
182                              .build()))\r
183                      .build(),\r
184                      new ClassifierInstanceBuilder()\r
185                      .setName(new ClassifierName("ether_type"))\r
186                      .setClassifierDefinitionId(Classifier.ETHER_TYPE_CL.getId())\r
187                      .setParameterValue(ImmutableList.of(new ParameterValueBuilder()\r
188                               .setName(new ParameterName("ethertype"))\r
189                               .setIntValue(Long.valueOf(FlowUtils.IPv4))\r
190                               .build()))\r
191                      .build()))\r
192                 .setActionInstance(ImmutableList.of(new ActionInstanceBuilder()\r
193                     .setName(new ActionName("allow"))\r
194                     .setActionDefinitionId(new AllowAction().getId())\r
195                     .build()))\r
196                 .build());\r
197     }\r
198 \r
199     protected ContractBuilder baseContract(List<Subject> subjects) {\r
200         ContractBuilder contractBuilder = new ContractBuilder().setId(cid).setSubject(subjects);\r
201         // TODO refactor\r
202         if (subjects == null) {\r
203             return contractBuilder.setClause(ImmutableList.of(new ClauseBuilder().setName(new ClauseName("test"))\r
204                 .setSubjectRefs(ImmutableList.<SubjectName>of(new SubjectName("s1")))\r
205                 .build()));\r
206         }\r
207         List<SubjectName> subjectNames = new ArrayList<>();\r
208         for (Subject subject : subjects) {\r
209             subjectNames.add(subject.getName());\r
210         }\r
211         return contractBuilder.setClause(ImmutableList.of(new ClauseBuilder().setName(new ClauseName("test"))\r
212             .setSubjectRefs(subjectNames)\r
213             .build()));\r
214     }\r
215 \r
216     protected SubjectBuilder baseSubject(Direction direction) {\r
217         return new SubjectBuilder()\r
218             .setName(new SubjectName("s1"))\r
219             .setRule(ImmutableList.of(new RuleBuilder()\r
220                 .setActionRef(ImmutableList.of(new ActionRefBuilder()\r
221                     .setName(new ActionName("allow"))\r
222                     .build()))\r
223                 .setClassifierRef(ImmutableList.of(new ClassifierRefBuilder()\r
224                     .setName(new ClassifierName("tcp_dst_80"))\r
225                     .setDirection(direction)\r
226                     .setInstanceName(new ClassifierName("tcp_dst_80"))\r
227                     .build()))\r
228                 .build()));\r
229     }\r
230 \r
231 \r
232     protected Subject createSubject(String name, List<Rule> rules){\r
233         return new SubjectBuilder().setName(new SubjectName(name)).setRule(rules).build();\r
234     }\r
235 \r
236     protected List<ClassifierRef> createClassifierRefs(Map<String, Direction> refNamesAndDirections) {\r
237         List<ClassifierRef> refs = new ArrayList<>();\r
238         for (String refName : refNamesAndDirections.keySet()) {\r
239             refs.add(new ClassifierRefBuilder().setName(new ClassifierName(refName))\r
240                 .setDirection(refNamesAndDirections.get(refName))\r
241                 .setInstanceName(new ClassifierName(refName))\r
242                 .build());\r
243         }\r
244         return refs;\r
245     }\r
246 \r
247     protected EndpointBuilder baseEP() {\r
248         return new EndpointBuilder()\r
249             .setL2Context(bd)\r
250             .setTenant(tid)\r
251             .setEndpointGroup(eg)\r
252             .setMacAddress(new MacAddress("00:00:00:00:00:01"));\r
253     }\r
254 \r
255     protected EndpointBuilder localEP() {\r
256         OfOverlayContext ofc = new OfOverlayContextBuilder()\r
257             .setNodeId(nodeId)\r
258             .setNodeConnectorId(nodeConnectorId)\r
259             .build();\r
260         return baseEP()\r
261             .addAugmentation(OfOverlayContext.class, ofc);\r
262     }\r
263 \r
264     protected EndpointBuilder remoteEP(NodeId id) {\r
265         OfOverlayContext ofc = new OfOverlayContextBuilder()\r
266             .setNodeId(id)\r
267             .setNodeConnectorId(new NodeConnectorId(id.getValue() + ":5"))\r
268             .build();\r
269         return baseEP()\r
270             .setMacAddress(new MacAddress("00:00:00:00:00:02"))\r
271             .addAugmentation(OfOverlayContext.class, ofc);\r
272     }\r
273 \r
274 }\r