ios-xe-renderer version reporting
[groupbasedpolicy.git] / renderers / ios-xe / src / test / java / org / opendaylight / groupbasedpolicy / renderer / ios_xe_provider / impl / manager / PolicyManagerImplTest.java
1 package org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager;
2
3 import static org.junit.Assert.assertTrue;
4 import static org.mockito.Matchers.eq;
5 import static org.mockito.Mockito.mock;
6 import static org.mockito.Mockito.when;
7 import static org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection.Direction.Out;
8 import static org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.EndpointPolicyParticipation.PROVIDER;
9 import static org.powermock.api.support.membermodification.MemberMatcher.method;
10 import static org.powermock.api.support.membermodification.MemberModifier.stub;
11
12 import java.util.Collections;
13 import java.util.List;
14
15 import org.junit.Before;
16 import org.junit.Test;
17 import org.junit.runner.RunWith;
18 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
19 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
20 import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.util.PolicyManagerUtil;
21 import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.util.RendererPolicyUtil;
22 import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.util.ServiceChainingUtil;
23 import org.opendaylight.sfc.provider.api.SfcProviderServiceForwarderAPI;
24 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.RspName;
25 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SfName;
26 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SffName;
27 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SfpName;
28 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.RenderedServicePath;
29 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.RenderedServicePathBuilder;
30 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.RenderedServicePathKey;
31 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.rendered.service.path.RenderedServicePathHopBuilder;
32 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarder;
33 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarderBuilder;
34 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarderKey;
35 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPath;
36 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPathBuilder;
37 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPathKey;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.AbsoluteLocation;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.AbsoluteLocationBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.absolute.location.location.type.ExternalLocationCaseBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionDefinitionId;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContextId;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubjectName;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.IpPrefixType;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.L2BridgeDomain;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection;
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.has.rule.group.with.renderer.endpoint.participation.RuleGroupWithRendererEndpointParticipationKey;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.Configuration;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.ConfigurationBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.EndpointsBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RendererEndpointsBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RendererForwarding;
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.endpoints.AddressEndpointWithLocationKey;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpoint;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpointBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpointKey;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpointWithPolicyBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpointWithPolicyKey;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.rule.groups.RuleGroup;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.rule.groups.RuleGroupBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.rule.groups.RuleGroupKey;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.actions.ActionBuilder;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.classifiers.ClassifierBuilder;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.resolved.rules.ResolvedRule;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.resolved.rules.ResolvedRuleBuilder;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.mapper.model.rev160302.AddressEndpointWithLocationAug;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.mapper.model.rev160302.AddressEndpointWithLocationAugBuilder;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt;
79 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
80 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
81 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
82 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
83 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
84 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
85 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
86 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
87 import org.powermock.core.classloader.annotations.PrepareForTest;
88 import org.powermock.modules.junit4.PowerMockRunner;
89
90 import com.google.common.util.concurrent.ListenableFuture;
91
92 @RunWith(PowerMockRunner.class)
93 @PrepareForTest({RendererPolicyUtil.class, PolicyManagerUtil.class, SfcProviderServiceForwarderAPI.class})
94 public class PolicyManagerImplTest {
95
96     private final String address = "address";
97     private final String connector = "connector";
98     private final SfpName servicePath = new SfpName("service-path");
99     private final RspName renderedPath = new RspName("rendered-path");
100     private final SffName forwarderName = new SffName("service-forwarder");
101     private final ContextId contextId_1 = new ContextId("context-id-1");
102     private final ContextId contextId_2 = new ContextId("context-id-2");
103     private final ContextId contextId_3 = new ContextId("context-id-3");
104     private final ContextId contextId_4 = new ContextId("context-id-4");
105     private final ContractId contractId = new ContractId("contract-id");
106     private final String ipAddress = "192.168.50.1";
107     private final NodeId nodeId = new NodeId("node-id");
108     private final SubjectName subjectName = new SubjectName("subject-name");
109     private final TenantId tenantId = new TenantId("tenant-id");
110     private final TopologyId topologyId = new TopologyId("topology-id");
111     private final ActionDefinitionId chainActionDefinitionId = new ActionDefinitionId("Action-Chain");
112     private final ActionDefinitionId otherActionDefinitionId = new ActionDefinitionId("Action-Other");
113     private final SfName functionName = new SfName("service-function");
114     private PolicyManagerImpl policyManager;
115     private DataBroker mountpoint;
116     private NodeManager nodeManager;
117     private WriteTransaction writeTransaction;
118
119     @Before
120     public void init() {
121         mountpoint = mock(DataBroker.class);
122         writeTransaction = mock(WriteTransaction.class);
123         nodeManager = mock(NodeManager.class);
124         policyManager = new PolicyManagerImpl(mountpoint, nodeManager);
125         when(mountpoint.newWriteOnlyTransaction()).thenReturn(writeTransaction);
126     }
127
128     @Test
129     public void testSyncPolicy_emptyConfiguration() throws Exception {
130         Configuration policyConfiguration = createTestConfiguration(null, null, null, null);
131         ListenableFuture result = policyManager.syncPolicy(policyConfiguration, null, 0);
132         assertTrue((boolean) result.get());
133     }
134
135     @Test
136     public void testSyncPolicy_noEndpointsInConfiguration() throws Exception {
137         RendererEndpoint rendererEndpoint = createRendererEndpoint(contextId_1, contextId_2, null);
138         Configuration policyConfiguration = createTestConfiguration(null, Collections.singletonList(rendererEndpoint),
139                 null, null);
140         ListenableFuture result = policyManager.syncPolicy(policyConfiguration, null, 0);
141         assertTrue((boolean) result.get());
142     }
143
144     @Test
145     public void testSyncPolicy_noMountPoint() throws Exception {
146         AddressEndpointWithLocation endpointWithLocation = createAddressEndpointWithLocation(contextId_1, null, false);
147         RendererEndpoint rendererEndpoint = createRendererEndpoint(contextId_2, contextId_3, null);
148         Configuration policyConfiguration = createTestConfiguration(Collections.singletonList(endpointWithLocation),
149                 Collections.singletonList(rendererEndpoint), null, null);
150
151         AbsoluteLocation location = createAbsoluteLocationExternal(connector, createMountpointIid());
152         AddressEndpointWithLocation lookupEndpoint = createAddressEndpointWithLocation(contextId_4, location, false);
153         stub(method(RendererPolicyUtil.class, "lookupEndpoint")).toReturn(lookupEndpoint);
154         when(nodeManager.getNodeMountPoint(eq(createMountpointIid()))).thenReturn(null);
155
156         ListenableFuture result = policyManager.syncPolicy(policyConfiguration, null, 0);
157         assertTrue((boolean) result.get());
158     }
159
160     @Test
161     public void testSyncPolicy_nullSgtTags() throws Exception {
162         AddressEndpointWithLocation endpointWithLocation = createAddressEndpointWithLocation(contextId_1, null, false);
163         RendererEndpoint rendererEndpoint = createRendererEndpoint(contextId_2, contextId_3, null);
164         Configuration policyConfiguration = createTestConfiguration(Collections.singletonList(endpointWithLocation),
165                 Collections.singletonList(rendererEndpoint), null, null);
166
167         AbsoluteLocation location = createAbsoluteLocationExternal(connector, createMountpointIid());
168         AddressEndpointWithLocation lookupEndpoint = createAddressEndpointWithLocation(contextId_4, location, false);
169         stub(method(RendererPolicyUtil.class, "lookupEndpoint")).toReturn(lookupEndpoint);
170         when(nodeManager.getNodeMountPoint(eq(createMountpointIid()))).thenReturn(mountpoint);
171         when(nodeManager.getNodeIdByMountpointIid(eq(createMountpointIid()))).thenReturn(nodeId);
172         when(nodeManager.getNodeManagementIpByMountPointIid(eq(createMountpointIid()))).thenReturn(ipAddress);
173
174         ListenableFuture result = policyManager.syncPolicy(policyConfiguration, null, 0);
175         assertTrue((boolean) result.get());
176     }
177
178     @Test
179     public void testSyncPolicy_emptyRuleGroup() throws Exception {
180         AddressEndpointWithLocation endpointWithLocation = createAddressEndpointWithLocation(contextId_1, null, false);
181         RuleGroupWithRendererEndpointParticipation ruleGroupWithParticipation =
182                 createRuleGroupWithRendererEpParticipation(PROVIDER);
183         RendererEndpoint rendererEndpoint = createRendererEndpoint(contextId_2, contextId_3,
184                 ruleGroupWithParticipation);
185         RuleGroup ruleGroup = createRuleGroup(null);
186         Configuration policyConfiguration = createTestConfiguration(Collections.singletonList(endpointWithLocation),
187                 Collections.singletonList(rendererEndpoint), null, ruleGroup);
188
189         AbsoluteLocation location = createAbsoluteLocationExternal(connector, createMountpointIid());
190         AddressEndpointWithLocation lookupEndpoint = createAddressEndpointWithLocation(contextId_4, location, true);
191         stub(method(RendererPolicyUtil.class, "lookupEndpoint")).toReturn(lookupEndpoint);
192         when(nodeManager.getNodeMountPoint(eq(createMountpointIid()))).thenReturn(mountpoint);
193         when(nodeManager.getNodeIdByMountpointIid(eq(createMountpointIid()))).thenReturn(nodeId);
194         when(nodeManager.getNodeManagementIpByMountPointIid(eq(createMountpointIid()))).thenReturn(ipAddress);
195
196         ListenableFuture result = policyManager.syncPolicy(policyConfiguration, null, 0);
197         assertTrue((boolean) result.get());
198     }
199
200     @Test
201     public void testSyncPolicy_noActionDefinition() throws Exception {
202         AddressEndpointWithLocation endpointWithLocation = createAddressEndpointWithLocation(contextId_1, null, false);
203         RuleGroupWithRendererEndpointParticipation ruleGroupWithParticipation =
204                 createRuleGroupWithRendererEpParticipation(PROVIDER);
205         RendererEndpoint rendererEndpoint = createRendererEndpoint(contextId_2, contextId_3,
206                 ruleGroupWithParticipation);
207
208         RuleGroup ruleGroup = createRuleGroup(createRule(Out, null));
209         Configuration policyConfiguration = createTestConfiguration(Collections.singletonList(endpointWithLocation),
210                 Collections.singletonList(rendererEndpoint), null, ruleGroup);
211
212         AbsoluteLocation location = createAbsoluteLocationExternal(connector, createMountpointIid());
213         AddressEndpointWithLocation lookupEndpoint = createAddressEndpointWithLocation(contextId_4, location, true);
214         stub(method(RendererPolicyUtil.class, "lookupEndpoint")).toReturn(lookupEndpoint);
215         when(nodeManager.getNodeMountPoint(eq(createMountpointIid()))).thenReturn(mountpoint);
216         when(nodeManager.getNodeIdByMountpointIid(eq(createMountpointIid()))).thenReturn(nodeId);
217         when(nodeManager.getNodeManagementIpByMountPointIid(eq(createMountpointIid()))).thenReturn(ipAddress);
218
219         ListenableFuture result = policyManager.syncPolicy(policyConfiguration, null, 0);
220         assertTrue((boolean) result.get());
221     }
222
223     @Test
224     public void testSyncPolicy_otherAction() throws Exception {
225         AddressEndpointWithLocation endpointWithLocation = createAddressEndpointWithLocation(contextId_1, null, false);
226         RuleGroupWithRendererEndpointParticipation ruleGroupWithParticipation =
227                 createRuleGroupWithRendererEpParticipation(PROVIDER);
228         RendererEndpoint rendererEndpoint = createRendererEndpoint(contextId_2, contextId_3,
229                 ruleGroupWithParticipation);
230
231         RuleGroup ruleGroup = createRuleGroup(createRule(Out, otherActionDefinitionId));
232         Configuration policyConfiguration = createTestConfiguration(Collections.singletonList(endpointWithLocation),
233                 Collections.singletonList(rendererEndpoint), null, ruleGroup);
234
235         AbsoluteLocation location = createAbsoluteLocationExternal(connector, createMountpointIid());
236         AddressEndpointWithLocation lookupEndpoint = createAddressEndpointWithLocation(contextId_4, location, true);
237         stub(method(RendererPolicyUtil.class, "lookupEndpoint")).toReturn(lookupEndpoint);
238         when(nodeManager.getNodeMountPoint(eq(createMountpointIid()))).thenReturn(mountpoint);
239         when(nodeManager.getNodeIdByMountpointIid(eq(createMountpointIid()))).thenReturn(nodeId);
240         when(nodeManager.getNodeManagementIpByMountPointIid(eq(createMountpointIid()))).thenReturn(ipAddress);
241
242         ListenableFuture result = policyManager.syncPolicy(policyConfiguration, null, 0);
243         assertTrue((boolean) result.get());
244     }
245
246     @Test
247     public void testSyncPolicy_asymmetricChain() throws Exception {
248         AddressEndpointWithLocation endpointWithLocation = createAddressEndpointWithLocation(contextId_1, null, false);
249         RuleGroupWithRendererEndpointParticipation ruleGroupWithParticipation =
250                 createRuleGroupWithRendererEpParticipation(PROVIDER);
251         RendererEndpoint rendererEndpoint = createRendererEndpoint(contextId_2, contextId_3,
252                 ruleGroupWithParticipation);
253
254         RuleGroup ruleGroup = createRuleGroup(createRule(Out, chainActionDefinitionId));
255         Configuration policyConfiguration = createTestConfiguration(Collections.singletonList(endpointWithLocation),
256                 Collections.singletonList(rendererEndpoint), null, ruleGroup);
257
258         AbsoluteLocation location = createAbsoluteLocationExternal(connector, createMountpointIid());
259         AddressEndpointWithLocation lookupEndpoint = createAddressEndpointWithLocation(contextId_4, location, true);
260         stub(method(RendererPolicyUtil.class, "lookupEndpoint")).toReturn(lookupEndpoint);
261         when(nodeManager.getNodeMountPoint(eq(createMountpointIid()))).thenReturn(mountpoint);
262         when(nodeManager.getNodeIdByMountpointIid(eq(createMountpointIid()))).thenReturn(nodeId);
263         when(nodeManager.getNodeManagementIpByMountPointIid(eq(createMountpointIid()))).thenReturn(ipAddress);
264         ServiceFunctionPath sfp = createServiceFunctionPath();
265         stub(method(ServiceChainingUtil.class, "getServicePath")).toReturn(sfp);
266         RenderedServicePath rsp = createRenderedServicePath();
267         stub(method(ServiceChainingUtil.class, "createRenderedPath")).toReturn(rsp);
268         ServiceFunctionForwarder serviceFunctionForwarder = createServiceForwarder();
269         stub(method(SfcProviderServiceForwarderAPI.class, "readServiceFunctionForwarder"))
270                 .toReturn(serviceFunctionForwarder);
271
272         ListenableFuture result = policyManager.syncPolicy(policyConfiguration, null, 0);
273         assertTrue((boolean) result.get());
274     }
275
276     private ServiceFunctionForwarder createServiceForwarder() {
277         ServiceFunctionForwarderBuilder serviceFunctionForwarderBuilder = new ServiceFunctionForwarderBuilder();
278         serviceFunctionForwarderBuilder.setName(new SffName(forwarderName))
279                 .setKey(new ServiceFunctionForwarderKey(new SffName(forwarderName)))
280                 .setIpMgmtAddress(new IpAddress(new Ipv4Address(ipAddress)));
281         return serviceFunctionForwarderBuilder.build();
282     }
283
284     // Utility methods
285
286     private InstanceIdentifier createMountpointIid() {
287         return InstanceIdentifier.builder(NetworkTopology.class)
288                 .child(Topology.class, new TopologyKey(topologyId))
289                 .child(Node.class, new NodeKey(nodeId)).build();
290     }
291
292     private ResolvedRule createRule(HasDirection.Direction direction, ActionDefinitionId actionDefinitionId) {
293         ResolvedRuleBuilder resolvedRuleBuilder = new ResolvedRuleBuilder();
294         ClassifierBuilder classifierBuilder = new ClassifierBuilder();
295         classifierBuilder.setDirection(direction);
296         ActionBuilder actionBuilder = new ActionBuilder();
297         actionBuilder.setActionDefinitionId(actionDefinitionId);
298         resolvedRuleBuilder.setClassifier(Collections.singletonList(classifierBuilder.build()))
299                 .setAction(Collections.singletonList(actionBuilder.build()));
300         return resolvedRuleBuilder.build();
301     }
302
303     private RuleGroupWithRendererEndpointParticipation createRuleGroupWithRendererEpParticipation(final EndpointPolicyParticipation participation) {
304         RuleGroupWithRendererEndpointParticipationBuilder ruleGroupBuilder = new RuleGroupWithRendererEndpointParticipationBuilder();
305         ruleGroupBuilder.setKey(new RuleGroupWithRendererEndpointParticipationKey(contractId, participation, subjectName,
306                 tenantId));
307         return ruleGroupBuilder.build();
308     }
309
310     private AbsoluteLocation createAbsoluteLocationExternal(String connector, InstanceIdentifier mountpoint) {
311         ExternalLocationCaseBuilder externalLocationCaseBuilder = new ExternalLocationCaseBuilder();
312         externalLocationCaseBuilder.setExternalNodeConnector(connector)
313                 .setExternalNodeMountPoint(mountpoint);
314         AbsoluteLocationBuilder absoluteLocationBuilder = new AbsoluteLocationBuilder();
315         absoluteLocationBuilder.setLocationType(externalLocationCaseBuilder.build());
316         return absoluteLocationBuilder.build();
317     }
318
319     private ServiceFunctionPath createServiceFunctionPath() {
320         ServiceFunctionPathBuilder serviceFunctionPathBuilder = new ServiceFunctionPathBuilder();
321         serviceFunctionPathBuilder.setKey(new ServiceFunctionPathKey(servicePath))
322                 .setSymmetric(false);
323         return serviceFunctionPathBuilder.build();
324     }
325
326     private RenderedServicePath createRenderedServicePath() {
327         RenderedServicePathHopBuilder renderedServicePathHopBuilder = new RenderedServicePathHopBuilder();
328         renderedServicePathHopBuilder.setServiceFunctionForwarder(forwarderName);
329         renderedServicePathHopBuilder.setServiceFunctionName(functionName);
330         renderedServicePathHopBuilder.build();
331
332         RenderedServicePathBuilder renderedServicePathBuilder = new RenderedServicePathBuilder();
333         renderedServicePathBuilder.setKey(new RenderedServicePathKey(renderedPath))
334                 .setRenderedServicePathHop(Collections.singletonList(renderedServicePathHopBuilder.build()));
335         return renderedServicePathBuilder.build();
336     }
337
338
339     private AddressEndpointWithLocation createAddressEndpointWithLocation(final ContextId contextId,
340                                                                           final AbsoluteLocation location,
341                                                                           boolean augmentation) {
342         AddressEndpointWithLocationAugBuilder augmentationBuilder = new AddressEndpointWithLocationAugBuilder();
343         augmentationBuilder.setSgt(new Sgt(1));
344         AddressEndpointWithLocationBuilder addressEndpointBuilder = new AddressEndpointWithLocationBuilder();
345         addressEndpointBuilder.setKey(new AddressEndpointWithLocationKey(address, IpPrefixType.class,
346                 contextId, L2BridgeDomain.class))
347                 .setAbsoluteLocation(location);
348         if (augmentation) {
349             addressEndpointBuilder.addAugmentation(AddressEndpointWithLocationAug.class, augmentationBuilder.build());
350         }
351         return addressEndpointBuilder.build();
352     }
353
354     private RendererEndpoint createRendererEndpoint(ContextId contextId_1, ContextId contextId_2,
355                                                     RuleGroupWithRendererEndpointParticipation ruleGroup) {
356         PeerEndpointWithPolicyBuilder peerEndpointWithPolicyBuilder = new PeerEndpointWithPolicyBuilder();
357         peerEndpointWithPolicyBuilder.setKey(new PeerEndpointWithPolicyKey(address, IpPrefixType.class, contextId_1,
358                 L2BridgeDomain.class))
359                 .setRuleGroupWithRendererEndpointParticipation(Collections.singletonList(ruleGroup));
360         RendererEndpointBuilder rendererEndpointBuilder = new RendererEndpointBuilder();
361         rendererEndpointBuilder.setKey(new RendererEndpointKey(address, IpPrefixType.class, contextId_2,
362                 L2BridgeDomain.class))
363                 .setPeerEndpointWithPolicy(Collections.singletonList(peerEndpointWithPolicyBuilder.build()));
364         return rendererEndpointBuilder.build();
365     }
366
367     private RuleGroup createRuleGroup(ResolvedRule rule) {
368         RuleGroupBuilder ruleGroupBuilder = new RuleGroupBuilder();
369         ruleGroupBuilder.setKey(new RuleGroupKey(contractId, subjectName, tenantId))
370                 .setResolvedRule(Collections.singletonList(rule));
371         return ruleGroupBuilder.build();
372     }
373
374     private Configuration createTestConfiguration(final List<AddressEndpointWithLocation> endpointsWithLocation,
375                                                   final List<RendererEndpoint> rendererEndpoints,
376                                                   final RendererForwarding rendererForwarding,
377                                                   final RuleGroup ruleGroup) {
378         // Set endpoints
379         EndpointsBuilder endpointsBuilder = new EndpointsBuilder();
380         endpointsBuilder.setAddressEndpointWithLocation(endpointsWithLocation);
381         // Set renderer endpoints
382         RendererEndpointsBuilder rendererEndpointsBuilder = new RendererEndpointsBuilder();
383         rendererEndpointsBuilder.setRendererEndpoint(rendererEndpoints);
384         // Set rule group
385         RuleGroupsBuilder ruleGroupsBuilder = new RuleGroupsBuilder();
386         ruleGroupsBuilder.setRuleGroup(Collections.singletonList(ruleGroup));
387         // Build configuration
388         ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
389         configurationBuilder.setEndpoints(endpointsBuilder.build())
390                 .setRendererEndpoints(rendererEndpointsBuilder.build())
391                 .setRendererForwarding(rendererForwarding)
392                 .setRuleGroups(ruleGroupsBuilder.build());
393         return configurationBuilder.build();
394     }
395
396
397 }