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