2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.groupbasedpolicy.renderer.vpp.policy.acl;
11 import java.util.ArrayList;
12 import java.util.List;
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;
82 import com.google.common.collect.ImmutableList;
84 public class TestResources {
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");
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"));
103 protected static final TenantId TENANT_ID = new TenantId("tenant1");
105 public final AddressEndpointWithLocation l2AddrEp1 = l2AddressEndpointWithLocation(EP1_MAC, L2_BD_ID,
107 public final AddressEndpointWithLocation l3AddrEp1 = l3AddressEndpointWithLocation(EP1_MAC, L2_BD_ID,
109 public final AddressEndpointWithLocation l2AddrEp2 = l2AddressEndpointWithLocation(EP2_MAC, L2_BD_ID,
111 public final AddressEndpointWithLocation l3AddrEp2 = l3AddressEndpointWithLocation(EP2_MAC, L2_BD_ID,
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());
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());
146 private RuleGroupWithRendererEndpointParticipation createRuleGroup(ContractId ctrctId, SubjectName sn,
147 TenantId tnntId, EndpointPolicyParticipation participation) {
148 return new RuleGroupWithRendererEndpointParticipationBuilder().setRendererEndpointParticipation(participation)
149 .setContractId(ctrctId)
155 public RuleGroups createRuleGroups() {
156 ParameterValue param = new ParameterValueBuilder().setIntValue(EtherTypeClassifierDefinition.IPv4_VALUE)
157 .setName(new ParameterName(EtherTypeClassifierDefinition.ETHERTYPE_PARAM))
159 Classifier classif_in = new ClassifierBuilder().setClassifierDefinitionId(EtherTypeClassifierDefinition.ID)
160 .setDirection(Direction.In)
161 .setName(CLASSIF_NAME)
162 .setParameterValue(ImmutableList.<ParameterValue>of(param))
164 Classifier classif_out = new ClassifierBuilder().setClassifierDefinitionId(EtherTypeClassifierDefinition.ID)
165 .setDirection(Direction.Out)
166 .setName(CLASSIF_NAME)
167 .setParameterValue(ImmutableList.<ParameterValue>of(param))
169 Action action = new ActionBuilder().setActionDefinitionId(AllowActionDefinition.ID)
170 .setName(new ActionName("Allow"))
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)
178 .setSubjectName(SUBJECT_NAME)
179 .setContractId(CONTRACT_ID)
180 .setResolvedRule(ImmutableList.<ResolvedRule>of(ruleIn, ruleOut))
182 return new RuleGroupsBuilder().setRuleGroup(ImmutableList.<RuleGroup>of(ruleGroup)).build();
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();
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)
212 return new RendererForwardingByTenantBuilder().setTenantId(TENANT_ID)
213 .setRendererForwardingContext(ImmutableList.<RendererForwardingContext>of(l2Fd, l2Bd, l3Ctx))
214 .setRendererNetworkDomain(ImmutableList.<RendererNetworkDomain>of(subnet))
218 RendererForwardingContextBuilder createRendererForwardingCtx(ContextId id, Name name,
219 Class<? extends ContextType> type) {
220 return new RendererForwardingContextBuilder().setName(name).setContextId(id).setContextType(type);
223 Parent createParent(ContextId ctxId, Class<? extends ContextType> type) {
224 return new ParentBuilder().setContextId(ctxId).setContextType(type).build();
227 RendererEndpointBuilder rendererEndpoint(AddressEndpointWithLocation addrEp) {
228 return new RendererEndpointBuilder().setAddress(addrEp.getAddress())
229 .setAddressType(addrEp.getAddressType())
230 .setContextId(addrEp.getContextId())
231 .setContextType(addrEp.getContextType());
235 PeerEndpointBuilder peerEndpoint(AddressEndpointWithLocation addrEp) {
236 return new PeerEndpointBuilder().setAddress(addrEp.getAddress())
237 .setAddressType(addrEp.getAddressType())
238 .setContextId(addrEp.getContextId())
239 .setContextType(addrEp.getContextType());
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)
249 return new AddressEndpointWithLocationBuilder().setAddress(ipAddress)
250 .setAddressType(IpPrefixType.class)
251 .setContextId(ipAddressContextId)
252 .setContextType(L3Context.class)
253 .setChildEndpoint(ImmutableList.<ChildEndpoint>of(childEndpoint))
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)
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))