Upgrading ACL implementation
[groupbasedpolicy.git] / renderers / vpp / src / test / java / org / opendaylight / groupbasedpolicy / renderer / vpp / policy / acl / TestResources.java
1 /*
2  * Copyright (c) 2017 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.Collection;
13 import java.util.List;
14
15 import org.opendaylight.groupbasedpolicy.api.sf.AllowActionDefinition;
16 import org.opendaylight.groupbasedpolicy.api.sf.EtherTypeClassifierDefinition;
17 import org.opendaylight.groupbasedpolicy.api.sf.IpProtoClassifierDefinition;
18 import org.opendaylight.groupbasedpolicy.api.sf.L4ClassifierDefinition;
19 import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.PolicyContext;
20 import org.opendaylight.groupbasedpolicy.renderer.vpp.sf.L4Classifier;
21 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
22 import org.opendaylight.groupbasedpolicy.test.CustomDataBrokerTest;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.AccessLists;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.AbsoluteLocationBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.absolute.location.location.type.ExternalLocationCase;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.absolute.location.location.type.ExternalLocationCaseBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.child.endpoints.ChildEndpoint;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.child.endpoints.ChildEndpointBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.parent.child.endpoints.parent.endpoint.choice.ParentEndpointCaseBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.parent.child.endpoints.parent.endpoint.choice.parent.endpoint._case.ParentEndpoint;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.parent.child.endpoints.parent.endpoint.choice.parent.endpoint._case.ParentEndpointBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionName;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierDefinitionId;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierName;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContextId;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Name;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.NetworkDomainId;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.RuleName;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubjectName;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.IpPrefixType;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.L2BridgeDomain;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.L2FloodDomain;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.L3Context;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.MacAddressType;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.Subnet;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.SubnetAugmentRenderer;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.SubnetAugmentRendererBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.has.subnet.SubnetBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.ContextType;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.fields.Parent;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.fields.ParentBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection.Direction;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValue;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValueBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.EndpointPolicyParticipation;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.rule.group.with.renderer.endpoint.participation.RuleGroupWithRendererEndpointParticipation;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.rule.group.with.renderer.endpoint.participation.RuleGroupWithRendererEndpointParticipationBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.RendererPolicyBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.ConfigurationBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.EndpointsBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RendererEndpointsBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RendererForwardingBuilder;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RuleGroups;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RuleGroupsBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocation;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocationBuilder;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocationKey;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpoint;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpointBuilder;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpointKey;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpoint;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpointBuilder;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpointKey;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.RendererForwardingByTenant;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.RendererForwardingByTenantBuilder;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererForwardingContext;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererForwardingContextBuilder;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererNetworkDomain;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererNetworkDomainBuilder;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.rule.groups.RuleGroup;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.rule.groups.RuleGroupBuilder;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.actions.Action;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.actions.ActionBuilder;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.classifiers.Classifier;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.classifiers.ClassifierBuilder;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.resolved.rules.ResolvedRule;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.resolved.rules.ResolvedRuleBuilder;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.VppAce;
96 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
97
98 import com.google.common.collect.ImmutableList;
99
100 public class TestResources extends CustomDataBrokerTest {
101
102     protected enum SECURITY_GROUP {
103         CLIENT, SERVER;
104     }
105
106     private static final String EP1_IP = "10.0.0.10/32";
107     private static final String EP2_EP = "10.0.0.20/32";
108     private static final String EP3_IP = "10.0.0.30/32";
109     private static final String EP1_MAC = "aa:bb:cc:dd:ee:ff";
110     private static final String EP2_MAC = "ff:ee:dd:cc:bb:aa";
111     private static final String EP3_MAC = "11:11:22:22:33:33";
112     protected static final NodeId NODE1 = new NodeId("node1");
113     protected static final String NODE1_CONNECTOR_1 =
114             "/ietf-interfaces:interfaces/ietf-interfaces:interface[ietf-interfaces:name='nodeConnector1']";
115     protected static final String NODE1_CONNECTOR_2 =
116             "/ietf-interfaces:interfaces/ietf-interfaces:interface[ietf-interfaces:name='nodeConnector2']";
117     protected static final String NODE1_CONNECTOR_3 =
118             "/ietf-interfaces:interfaces/ietf-interfaces:interface[ietf-interfaces:name='nodeConnector3']";
119     private static final ContextId L2_FD_ID = new ContextId("l2FdId");
120     protected static final ContextId L2_BD_ID = new ContextId("l2BridgeDomainId");
121     protected static final ContextId L3_CTX_ID = new ContextId("l3CtxId");
122     protected static final SubjectName SUBJECT_NAME = new SubjectName("subject");
123     protected static final SubjectName SUBJECT_NAME2 = new SubjectName("subject2");
124     protected static final ContractId CONTRACT_ID = new ContractId("contract");
125
126     private static final NetworkDomainId SUBNET_ID = new NetworkDomainId("subnet");
127     private static final IpPrefix SUBNET_PREFIX = new IpPrefix(new Ipv4Prefix("10.0.0.0/24"));
128     private static final IpAddress VIRTUAL_ROUTER_IP = new IpAddress(new Ipv4Address("10.0.0.1"));
129
130     protected static final TenantId TENANT_ID = new TenantId("tenant1");
131
132     public final AddressEndpointWithLocation l2AddrEp1 =
133             l2AddressEndpointWithLocation(EP1_MAC, L2_BD_ID, EP1_IP, L3_CTX_ID);
134     public final AddressEndpointWithLocation l3AddrEp1 = appendLocationToEndpoint(
135             l3AddressEndpointWithLocation(EP1_MAC, L2_BD_ID, EP1_IP, L3_CTX_ID), NODE1, NODE1_CONNECTOR_1);
136     public final AddressEndpointWithLocation l2AddrEp2 =
137             l2AddressEndpointWithLocation(EP2_MAC, L2_BD_ID, EP2_EP, L3_CTX_ID);
138     public final AddressEndpointWithLocation l3AddrEp2 = appendLocationToEndpoint(
139             l3AddressEndpointWithLocation(EP2_MAC, L2_BD_ID, EP2_EP, L3_CTX_ID), NODE1, NODE1_CONNECTOR_2);
140
141     public final AddressEndpointWithLocation l2AddrEp3 =
142             l2AddressEndpointWithLocation(EP3_MAC, L2_BD_ID, EP3_IP, L3_CTX_ID);
143     public final AddressEndpointWithLocation l3AddrEp3 = appendLocationToEndpoint(
144             l3AddressEndpointWithLocation(EP3_MAC, L2_BD_ID, EP3_IP, L3_CTX_ID), NODE1, NODE1_CONNECTOR_3);
145
146     protected AddressEndpointWithLocation appendLocationToEndpoint(AddressEndpointWithLocationBuilder builder,
147             NodeId nodeId, String nodeConnector) {
148         ExternalLocationCase extLocation = new ExternalLocationCaseBuilder().setExternalNodeConnector(nodeConnector)
149             .setExternalNodeMountPoint(VppIidFactory.getNetconfNodeIid(nodeId))
150             .build();
151         return builder.setAbsoluteLocation(new AbsoluteLocationBuilder().setLocationType(extLocation).build()).build();
152     }
153
154     protected AddressEndpointWithLocation l2AddressEndpointWithLocation(String macAddress, ContextId macAddrContextId,
155             String ipAddress, ContextId ipAddressContextId) {
156         ParentEndpoint parentEndpoint = new ParentEndpointBuilder().setAddress(ipAddress)
157             .setAddressType(IpPrefixType.class)
158             .setContextType(L3Context.class)
159             .setContextId(ipAddressContextId)
160             .build();
161         return new AddressEndpointWithLocationBuilder().setAddress(macAddress)
162             .setAddressType(MacAddressType.class)
163             .setContextId(macAddrContextId)
164             .setContextType(L2BridgeDomain.class)
165             .setParentEndpointChoice(new ParentEndpointCaseBuilder()
166                 .setParentEndpoint(ImmutableList.<ParentEndpoint>of(parentEndpoint)).build())
167             .build();
168     }
169
170     protected AddressEndpointWithLocationBuilder l3AddressEndpointWithLocation(String macAddress,
171             ContextId macAddrContextId, String ipAddress, ContextId ipAddressContextId) {
172         ChildEndpoint childEndpoint = new ChildEndpointBuilder().setAddress(macAddress)
173             .setAddressType(MacAddressType.class)
174             .setContextType(L2BridgeDomain.class)
175             .setContextId(macAddrContextId)
176             .build();
177         return new AddressEndpointWithLocationBuilder().setAddress(ipAddress)
178             .setAddressType(IpPrefixType.class)
179             .setContextId(ipAddressContextId)
180             .setContextType(L3Context.class)
181             .setChildEndpoint(ImmutableList.<ChildEndpoint>of(childEndpoint));
182     }
183
184     PolicyContext createPolicyContext(List<AddressEndpointWithLocation> addrEps,
185             List<RendererEndpoint> rendererEndpoints, RuleGroups ruleGroups, RendererForwardingByTenant fwdng) {
186         ConfigurationBuilder config = new ConfigurationBuilder();
187         config.setEndpoints(new EndpointsBuilder().setAddressEndpointWithLocation(addrEps).build()).build();
188         config.setRendererEndpoints(new RendererEndpointsBuilder().setRendererEndpoint(rendererEndpoints).build());
189         config.setRuleGroups(ruleGroups);
190         config.setRendererForwarding(new RendererForwardingBuilder()
191             .setRendererForwardingByTenant(ImmutableList.<RendererForwardingByTenant>of(fwdng)).build());
192         return new PolicyContext(new RendererPolicyBuilder().setConfiguration(config.build()).build());
193     }
194
195     @Override
196     public Collection<Class<?>> getClassesFromModules() {
197         return ImmutableList.<Class<?>>of(AccessLists.class, VppAce.class);
198     }
199
200     public List<AddressEndpointWithLocation> createAddressEndpoints() {
201         List<AddressEndpointWithLocation> addrEps = new ArrayList<>();
202         addrEps.add(l2AddrEp1);
203         addrEps.add(l3AddrEp1);
204         addrEps.add(l2AddrEp2);
205         addrEps.add(l3AddrEp2);
206         addrEps.add(l2AddrEp3);
207         addrEps.add(l3AddrEp3);
208         return addrEps;
209     }
210
211     public List<RendererEndpoint> createRendEps() {
212         List<RendererEndpoint> rEps = new ArrayList<>();
213         rEps.add(createRendEndpoint(rendererEndpointKey(l3AddrEp1.getKey()), SECURITY_GROUP.SERVER,
214                 peerEndpointKey(l3AddrEp2.getKey()), peerEndpointKey(l3AddrEp3.getKey())));
215         rEps.add(createRendEndpoint(rendererEndpointKey(l3AddrEp2.getKey()), SECURITY_GROUP.CLIENT,
216                 peerEndpointKey(l3AddrEp1.getKey())));
217         rEps.add(createRendEndpoint(rendererEndpointKey(l3AddrEp3.getKey()), SECURITY_GROUP.CLIENT,
218                 peerEndpointKey(l3AddrEp1.getKey())));
219         return rEps;
220     }
221
222     protected RendererEndpointKey rendererEndpointKey(AddressEndpointWithLocationKey addrEp) {
223         return new RendererEndpointKey(addrEp.getAddress(), addrEp.getAddressType(), addrEp.getContextId(),
224                 addrEp.getContextType());
225     }
226
227     protected PeerEndpointKey peerEndpointKey(AddressEndpointWithLocationKey addrEp) {
228         return new PeerEndpointKey(addrEp.getAddress(), addrEp.getAddressType(), addrEp.getContextId(),
229                 addrEp.getContextType());
230     }
231
232     public RendererEndpoint createRendEndpoint(RendererEndpointKey key, SECURITY_GROUP sg,
233             PeerEndpointKey... peerKeys) {
234         EndpointPolicyParticipation participation;
235         if (sg.equals(SECURITY_GROUP.SERVER)) {
236             participation = EndpointPolicyParticipation.PROVIDER;
237         } else if (sg.equals(SECURITY_GROUP.CLIENT)) {
238             participation = EndpointPolicyParticipation.CONSUMER;
239         } else {
240             throw new IllegalStateException("Specify proper endpoint group participation");
241         }
242         List<PeerEndpoint> peers = new ArrayList<>();
243         for (PeerEndpointKey peer : peerKeys) {
244             PeerEndpoint pEp1 = new PeerEndpointBuilder().setKey(peer)
245                 .setRuleGroupWithRendererEndpointParticipation(
246                         ImmutableList.<RuleGroupWithRendererEndpointParticipation>of(
247                                 createRuleGroup(CONTRACT_ID, SUBJECT_NAME, TENANT_ID, participation),
248                                 createRuleGroup(CONTRACT_ID, SUBJECT_NAME2, TENANT_ID, participation)))
249                 .build();
250             peers.add(pEp1);
251         }
252         return new RendererEndpointBuilder().setKey(key).setPeerEndpoint(peers).build();
253     }
254
255     private RuleGroupWithRendererEndpointParticipation createRuleGroup(ContractId ctrctId, SubjectName sn,
256             TenantId tnntId, EndpointPolicyParticipation participation) {
257         return new RuleGroupWithRendererEndpointParticipationBuilder().setRendererEndpointParticipation(participation)
258             .setContractId(ctrctId)
259             .setSubjectName(sn)
260             .setTenantId(tnntId)
261             .build();
262     }
263
264     public RuleGroups createRuleGroups() {
265         ParameterValue ipv4Param = new ParameterValueBuilder().setIntValue(EtherTypeClassifierDefinition.IPv4_VALUE)
266             .setName(new ParameterName(EtherTypeClassifierDefinition.ETHERTYPE_PARAM))
267             .build();
268         ParameterValue tcpParam = new ParameterValueBuilder().setIntValue(IpProtoClassifierDefinition.TCP_VALUE)
269             .setName(new ParameterName(IpProtoClassifierDefinition.PROTO_PARAM))
270             .build();
271         ParameterValue udpParam = new ParameterValueBuilder().setIntValue(IpProtoClassifierDefinition.UDP_VALUE)
272             .setName(new ParameterName(IpProtoClassifierDefinition.PROTO_PARAM))
273             .build();
274         RuleGroup rg1 = createSimpleRuleGroups(ImmutableList.of(ipv4Param, tcpParam), IpProtoClassifierDefinition.ID,
275                 SUBJECT_NAME);
276         RuleGroup rg2 = createSimpleRuleGroups(ImmutableList.of(ipv4Param, udpParam), IpProtoClassifierDefinition.ID,
277                 SUBJECT_NAME2);
278         return new RuleGroupsBuilder().setRuleGroup(ImmutableList.<RuleGroup>of(rg1, rg2)).build();
279     }
280
281     public RuleGroups createRuleGroupsDhcpTest() {
282         ParameterValue ipv4Param = new ParameterValueBuilder().setIntValue(EtherTypeClassifierDefinition.IPv4_VALUE)
283             .setName(new ParameterName(EtherTypeClassifierDefinition.ETHERTYPE_PARAM))
284             .build();
285         ParameterValue tcpParam = new ParameterValueBuilder().setIntValue(IpProtoClassifierDefinition.TCP_VALUE)
286             .setName(new ParameterName(IpProtoClassifierDefinition.PROTO_PARAM))
287             .build();
288         ParameterValue udpParam = new ParameterValueBuilder().setIntValue(IpProtoClassifierDefinition.UDP_VALUE)
289             .setName(new ParameterName(IpProtoClassifierDefinition.PROTO_PARAM))
290             .build();
291         ParameterValue srcDhcp = new ParameterValueBuilder().setIntValue(Long.valueOf(68))
292                 .setName(new ParameterName(L4ClassifierDefinition.SRC_PORT_PARAM))
293                 .build();
294         ParameterValue dstDhcp = new ParameterValueBuilder().setIntValue(Long.valueOf(67))
295                 .setName(new ParameterName(L4ClassifierDefinition.DST_PORT_PARAM))
296                 .build();
297         RuleGroup rg1 = createSimpleRuleGroups(ImmutableList.of(ipv4Param, tcpParam), IpProtoClassifierDefinition.ID,
298                 SUBJECT_NAME);
299         RuleGroup rg2 = createSimpleRuleGroups(ImmutableList.of(ipv4Param, udpParam, srcDhcp, dstDhcp), L4ClassifierDefinition.ID,
300                 SUBJECT_NAME2);
301         return new RuleGroupsBuilder().setRuleGroup(ImmutableList.<RuleGroup>of(rg1, rg2)).build();
302     }
303
304     private RuleGroup createSimpleRuleGroups(List<ParameterValue> pv, ClassifierDefinitionId id,
305             SubjectName subjectName) {
306         final ClassifierName classifierName = new ClassifierName("cl-name");
307         Classifier classifIn = new ClassifierBuilder().setClassifierDefinitionId(id)
308             .setDirection(Direction.In)
309             .setName(classifierName)
310             .setParameterValue(pv)
311             .build();
312         Classifier classifOut = new ClassifierBuilder().setClassifierDefinitionId(id)
313             .setDirection(Direction.Out)
314             .setName(classifierName)
315             .setParameterValue(pv)
316             .build();
317         Action action = new ActionBuilder().setActionDefinitionId(AllowActionDefinition.ID)
318             .setName(new ActionName("Allow"))
319             .build();
320         final RuleName ruleNameIn = new RuleName("rule_in" + subjectName.getValue());
321         final RuleName ruleNameOut = new RuleName("rule_out" + subjectName.getValue());
322         ResolvedRule ruleIn =
323                 resolveRule(ruleNameIn, ImmutableList.<Classifier>of(classifIn), ImmutableList.<Action>of(action), 0);
324         ResolvedRule ruleOut =
325                 resolveRule(ruleNameOut, ImmutableList.<Classifier>of(classifOut), ImmutableList.<Action>of(action), 1);
326         return new RuleGroupBuilder().setOrder(0)
327             .setTenantId(TENANT_ID)
328             .setSubjectName(subjectName)
329             .setContractId(CONTRACT_ID)
330             .setResolvedRule(ImmutableList.<ResolvedRule>of(ruleIn, ruleOut))
331             .build();
332     }
333
334     private ResolvedRule resolveRule(RuleName ruleName, List<Classifier> classifs, List<Action> actions,
335             Integer order) {
336         ResolvedRuleBuilder rrBuilder = new ResolvedRuleBuilder();
337         rrBuilder.setClassifier(classifs);
338         rrBuilder.setAction(actions);
339         rrBuilder.setName(ruleName);
340         rrBuilder.setOrder(order);
341         return rrBuilder.build();
342     }
343
344     protected RendererForwardingByTenant createForwarding() {
345         RendererForwardingContext l2Fd = createRendererForwardingCtx(L2_FD_ID, new Name("l2fd"), L2FloodDomain.class)
346             .setParent(createParent(L2_BD_ID, L2BridgeDomain.class)).build();
347         RendererForwardingContext l2Bd = createRendererForwardingCtx(L3_CTX_ID, new Name("l3ctx"), L3Context.class)
348             .setParent(createParent(L3_CTX_ID, L3Context.class)).build();
349         RendererForwardingContext l3Ctx =
350                 createRendererForwardingCtx(L2_BD_ID, new Name("l2bd"), L2BridgeDomain.class).build();
351         RendererNetworkDomain subnet =
352                 new RendererNetworkDomainBuilder().setNetworkDomainId(SUBNET_ID)
353                     .setName(new Name("subnet"))
354                     .setNetworkDomainType(Subnet.class)
355                     .setParent(createParent(L2_FD_ID, L2FloodDomain.class))
356                     .addAugmentation(SubnetAugmentRenderer.class,
357                             new SubnetAugmentRendererBuilder().setSubnet(new SubnetBuilder().setIsTenant(true)
358                                 .setIpPrefix(SUBNET_PREFIX)
359                                 .setVirtualRouterIp(VIRTUAL_ROUTER_IP)
360                                 .build()).build())
361                     .build();
362         return new RendererForwardingByTenantBuilder().setTenantId(TENANT_ID)
363             .setRendererForwardingContext(ImmutableList.<RendererForwardingContext>of(l2Fd, l2Bd, l3Ctx))
364             .setRendererNetworkDomain(ImmutableList.<RendererNetworkDomain>of(subnet))
365             .build();
366     }
367
368     private RendererForwardingContextBuilder createRendererForwardingCtx(ContextId id, Name name,
369             Class<? extends ContextType> type) {
370         return new RendererForwardingContextBuilder().setName(name).setContextId(id).setContextType(type);
371     }
372
373     private Parent createParent(ContextId ctxId, Class<? extends ContextType> type) {
374         return new ParentBuilder().setContextId(ctxId).setContextType(type).build();
375     }
376 }