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