Bug 8220 - fixing ACE entry in VPP renderer
[groupbasedpolicy.git] / renderers / vpp / src / test / java / org / opendaylight / groupbasedpolicy / renderer / vpp / policy / acl / TestResources.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.groupbasedpolicy.renderer.vpp.policy.acl;
10
11 import java.util.ArrayList;
12 import java.util.List;
13
14 import org.opendaylight.groupbasedpolicy.api.sf.AllowActionDefinition;
15 import org.opendaylight.groupbasedpolicy.api.sf.EtherTypeClassifierDefinition;
16 import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.PolicyContext;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.child.endpoints.ChildEndpoint;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.child.endpoints.ChildEndpointBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.parent.child.endpoints.parent.endpoint.choice.ParentEndpointCaseBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.parent.child.endpoints.parent.endpoint.choice.parent.endpoint._case.ParentEndpoint;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.parent.child.endpoints.parent.endpoint.choice.parent.endpoint._case.ParentEndpointBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionName;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierName;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContextId;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Name;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.NetworkDomainId;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.RuleName;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubjectName;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.IpPrefixType;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.L2BridgeDomain;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.L2FloodDomain;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.L3Context;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.MacAddressType;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.Subnet;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.SubnetAugmentRenderer;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.SubnetAugmentRendererBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.has.subnet.SubnetBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.ContextType;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.fields.Parent;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.fields.ParentBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection.Direction;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValue;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValueBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.EndpointPolicyParticipation;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.rule.group.with.renderer.endpoint.participation.RuleGroupWithRendererEndpointParticipation;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.rule.group.with.renderer.endpoint.participation.RuleGroupWithRendererEndpointParticipationBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.RendererPolicyBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.ConfigurationBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.EndpointsBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RendererEndpointsBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RendererForwardingBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RuleGroups;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RuleGroupsBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocation;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocationBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpoint;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpointBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpoint;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpointBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.RendererForwardingByTenant;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.RendererForwardingByTenantBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererForwardingContext;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererForwardingContextBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererNetworkDomain;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererNetworkDomainBuilder;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.rule.groups.RuleGroup;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.rule.groups.RuleGroupBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.actions.Action;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.actions.ActionBuilder;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.classifiers.Classifier;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.classifiers.ClassifierBuilder;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.resolved.rules.ResolvedRule;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.resolved.rules.ResolvedRuleBuilder;
81
82 import com.google.common.collect.ImmutableList;
83
84 public class TestResources {
85
86     private static final String EP1_IP = "10.0.0.10/32";
87     private static final String EP2_EP = "10.0.0.20/32";
88     private static final String EP1_MAC = "aa:bb:cc:dd:ee:ff";
89     private static final String EP2_MAC = "ff:ee:dd:cc:bb:aa";
90     private static final ContextId L2_FD_ID = new ContextId("l2FdId");
91     private static final ContextId L2_BD_ID = new ContextId("l2BridgeDomainId");
92     private static final ContextId L3_CTX_ID = new ContextId("l3CtxId");
93     private static final SubjectName SUBJECT_NAME = new SubjectName("subject");
94     private static final ContractId CONTRACT_ID = new ContractId("contract");
95     private static final RuleName RULE_NAME_IN = new RuleName("rule_in");
96     private static final RuleName RULE_NAME_OUT = new RuleName("rule_out");
97     private static final ClassifierName CLASSIF_NAME = new ClassifierName("cl-name");
98
99     private static final NetworkDomainId SUBNET_ID = new NetworkDomainId("subnet");
100     private static final IpPrefix SUBNET_PREFIX = new IpPrefix(new Ipv4Prefix("10.0.0.0/24"));
101     private static final IpAddress VIRTUAL_ROUTER_IP = new IpAddress(new Ipv4Address("10.0.0.1"));
102
103     protected static final  TenantId TENANT_ID = new TenantId("tenant1");
104
105     public final AddressEndpointWithLocation l2AddrEp1 = l2AddressEndpointWithLocation(EP1_MAC, L2_BD_ID,
106             EP1_IP, L3_CTX_ID);
107     public final AddressEndpointWithLocation l3AddrEp1 = l3AddressEndpointWithLocation(EP1_MAC, L2_BD_ID,
108             EP1_IP, L3_CTX_ID);
109     public final AddressEndpointWithLocation l2AddrEp2 = l2AddressEndpointWithLocation(EP2_MAC, L2_BD_ID,
110             EP2_EP, L3_CTX_ID);
111     public final AddressEndpointWithLocation l3AddrEp2 = l3AddressEndpointWithLocation(EP2_MAC, L2_BD_ID,
112             EP2_EP, L3_CTX_ID);
113
114     PolicyContext createPolicyContext() {
115         List<AddressEndpointWithLocation> addrEps = new ArrayList<>();
116         addrEps.add(l2AddrEp1);
117         addrEps.add(l3AddrEp1);
118         addrEps.add(l2AddrEp2);
119         addrEps.add(l3AddrEp2);
120         ConfigurationBuilder config = new ConfigurationBuilder();
121         config.setEndpoints(new EndpointsBuilder().setAddressEndpointWithLocation(addrEps).build()).build();
122         config.setRendererEndpoints(new RendererEndpointsBuilder().setRendererEndpoint(createRendEps()).build());
123         config.setRuleGroups(createRuleGroups());
124         config.setRendererForwarding(new RendererForwardingBuilder().setRendererForwardingByTenant(
125                 ImmutableList.<RendererForwardingByTenant>of(createForwarding())).build());
126         return new PolicyContext(new RendererPolicyBuilder().setConfiguration(config.build()).build());
127     }
128
129     private List<RendererEndpoint> createRendEps() {
130         List<RendererEndpoint> rEps = new ArrayList<>();
131         PeerEndpointBuilder pEp1 = peerEndpoint(l2AddrEp1).setRuleGroupWithRendererEndpointParticipation(
132                 ImmutableList.<RuleGroupWithRendererEndpointParticipation>of(createRuleGroup(CONTRACT_ID, SUBJECT_NAME,
133                         TENANT_ID, EndpointPolicyParticipation.PROVIDER)));
134         PeerEndpointBuilder pEp2 = peerEndpoint(l2AddrEp2).setRuleGroupWithRendererEndpointParticipation(
135                 ImmutableList.<RuleGroupWithRendererEndpointParticipation>of(createRuleGroup(CONTRACT_ID, SUBJECT_NAME,
136                         TENANT_ID, EndpointPolicyParticipation.CONSUMER)));
137         RendererEndpointBuilder l2RendEp1 = rendererEndpoint(l2AddrEp1);
138         l2RendEp1.setPeerEndpoint(ImmutableList.<PeerEndpoint>of(pEp2.build()));
139         RendererEndpointBuilder l2RendEp2 = rendererEndpoint(l2AddrEp2);
140         l2RendEp2.setPeerEndpoint(ImmutableList.<PeerEndpoint>of(pEp1.build()));
141         rEps.add(l2RendEp1.build());
142         rEps.add(l2RendEp2.build());
143         return rEps;
144     }
145
146     private RuleGroupWithRendererEndpointParticipation createRuleGroup(ContractId ctrctId, SubjectName sn,
147             TenantId tnntId, EndpointPolicyParticipation participation) {
148         return new RuleGroupWithRendererEndpointParticipationBuilder().setRendererEndpointParticipation(participation)
149             .setContractId(ctrctId)
150             .setSubjectName(sn)
151             .setTenantId(tnntId)
152             .build();
153     }
154
155     public RuleGroups createRuleGroups() {
156         ParameterValue param = new ParameterValueBuilder().setIntValue(EtherTypeClassifierDefinition.IPv4_VALUE)
157             .setName(new ParameterName(EtherTypeClassifierDefinition.ETHERTYPE_PARAM))
158             .build();
159         Classifier classif_in = new ClassifierBuilder().setClassifierDefinitionId(EtherTypeClassifierDefinition.ID)
160             .setDirection(Direction.In)
161             .setName(CLASSIF_NAME)
162             .setParameterValue(ImmutableList.<ParameterValue>of(param))
163             .build();
164         Classifier classif_out = new ClassifierBuilder().setClassifierDefinitionId(EtherTypeClassifierDefinition.ID)
165             .setDirection(Direction.Out)
166             .setName(CLASSIF_NAME)
167             .setParameterValue(ImmutableList.<ParameterValue>of(param))
168             .build();
169         Action action = new ActionBuilder().setActionDefinitionId(AllowActionDefinition.ID)
170             .setName(new ActionName("Allow"))
171             .build();
172         ResolvedRule ruleIn = resolveRule(RULE_NAME_IN, ImmutableList.<Classifier>of(classif_in),
173                 ImmutableList.<Action>of(action), 0);
174         ResolvedRule ruleOut = resolveRule(RULE_NAME_OUT, ImmutableList.<Classifier>of(classif_out),
175                 ImmutableList.<Action>of(action), 1);
176         RuleGroup ruleGroup = new RuleGroupBuilder().setTenantId(TENANT_ID)
177             .setOrder(0)
178             .setSubjectName(SUBJECT_NAME)
179             .setContractId(CONTRACT_ID)
180             .setResolvedRule(ImmutableList.<ResolvedRule>of(ruleIn, ruleOut))
181             .build();
182         return new RuleGroupsBuilder().setRuleGroup(ImmutableList.<RuleGroup>of(ruleGroup)).build();
183     }
184
185     private ResolvedRule resolveRule(RuleName ruleName, List<Classifier> classifs, List<Action> actions, Integer order) {
186         ResolvedRuleBuilder rrBuilder = new ResolvedRuleBuilder();
187         rrBuilder.setClassifier(classifs);
188         rrBuilder.setAction(actions);
189         rrBuilder.setName(ruleName);
190         rrBuilder.setOrder(order);
191         return rrBuilder.build();
192     }
193
194     private RendererForwardingByTenant createForwarding() {
195         RendererForwardingContext l2Fd = createRendererForwardingCtx(L2_FD_ID, new Name("l2fd"), L2FloodDomain.class)
196             .setParent(createParent(L2_BD_ID, L2BridgeDomain.class)).build();
197         RendererForwardingContext l2Bd = createRendererForwardingCtx(L3_CTX_ID, new Name("l3ctx"), L3Context.class)
198             .setParent(createParent(L3_CTX_ID, L3Context.class)).build();
199         RendererForwardingContext l3Ctx =
200                 createRendererForwardingCtx(L2_BD_ID, new Name("l2bd"), L2BridgeDomain.class).build();
201         RendererNetworkDomain subnet =
202                 new RendererNetworkDomainBuilder().setNetworkDomainId(SUBNET_ID)
203                     .setName(new Name("subnet"))
204                     .setNetworkDomainType(Subnet.class)
205                     .setParent(createParent(L2_FD_ID, L2FloodDomain.class))
206                     .addAugmentation(SubnetAugmentRenderer.class,
207                             new SubnetAugmentRendererBuilder().setSubnet(new SubnetBuilder().setIsTenant(true)
208                                 .setIpPrefix(SUBNET_PREFIX)
209                                 .setVirtualRouterIp(VIRTUAL_ROUTER_IP)
210                                 .build()).build())
211                     .build();
212         return new RendererForwardingByTenantBuilder().setTenantId(TENANT_ID)
213             .setRendererForwardingContext(ImmutableList.<RendererForwardingContext>of(l2Fd, l2Bd, l3Ctx))
214             .setRendererNetworkDomain(ImmutableList.<RendererNetworkDomain>of(subnet))
215             .build();
216     }
217
218     RendererForwardingContextBuilder createRendererForwardingCtx(ContextId id, Name name,
219             Class<? extends ContextType> type) {
220         return new RendererForwardingContextBuilder().setName(name).setContextId(id).setContextType(type);
221     }
222
223     Parent createParent(ContextId ctxId, Class<? extends ContextType> type) {
224         return new ParentBuilder().setContextId(ctxId).setContextType(type).build();
225     }
226
227     RendererEndpointBuilder rendererEndpoint(AddressEndpointWithLocation addrEp) {
228         return new RendererEndpointBuilder().setAddress(addrEp.getAddress())
229             .setAddressType(addrEp.getAddressType())
230             .setContextId(addrEp.getContextId())
231             .setContextType(addrEp.getContextType());
232
233     }
234
235     PeerEndpointBuilder peerEndpoint(AddressEndpointWithLocation addrEp) {
236         return new PeerEndpointBuilder().setAddress(addrEp.getAddress())
237             .setAddressType(addrEp.getAddressType())
238             .setContextId(addrEp.getContextId())
239             .setContextType(addrEp.getContextType());
240     }
241
242     AddressEndpointWithLocation l3AddressEndpointWithLocation(String macAddress, ContextId macAddrContextId,
243             String ipAddress, ContextId ipAddressContextId) {
244         ChildEndpoint childEndpoint = new ChildEndpointBuilder().setAddress(macAddress)
245             .setAddressType(MacAddressType.class)
246             .setContextType(L2BridgeDomain.class)
247             .setContextId(macAddrContextId)
248             .build();
249         return new AddressEndpointWithLocationBuilder().setAddress(ipAddress)
250             .setAddressType(IpPrefixType.class)
251             .setContextId(ipAddressContextId)
252             .setContextType(L3Context.class)
253             .setChildEndpoint(ImmutableList.<ChildEndpoint>of(childEndpoint))
254             .build();
255     }
256
257     AddressEndpointWithLocation l2AddressEndpointWithLocation(String macAddress, ContextId macAddrContextId,
258             String ipAddress, ContextId ipAddressContextId) {
259         ParentEndpoint parentEndpoint = new ParentEndpointBuilder().setAddress(ipAddress)
260             .setAddressType(IpPrefixType.class)
261             .setContextType(L3Context.class)
262             .setContextId(ipAddressContextId)
263             .build();
264         return new AddressEndpointWithLocationBuilder().setAddress(macAddress)
265             .setAddressType(MacAddressType.class)
266             .setContextId(macAddrContextId)
267             .setContextType(L2BridgeDomain.class)
268             .setParentEndpointChoice(
269                     new ParentEndpointCaseBuilder().setParentEndpoint(ImmutableList.<ParentEndpoint>of(parentEndpoint))
270                         .build())
271             .build();
272     }
273 }