/* * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection.Direction.Out; import static org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.EndpointPolicyParticipation.PROVIDER; import static org.powermock.api.support.membermodification.MemberMatcher.method; import static org.powermock.api.support.membermodification.MemberModifier.stub; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import java.util.Collections; import java.util.List; import java.util.Optional; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.util.PolicyManagerUtil; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.util.RendererPolicyUtil; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.util.ServiceChainingUtil; import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPToSgtMapper; import org.opendaylight.groupbasedpolicy.util.IetfModelCodec; import org.opendaylight.sfc.provider.api.SfcProviderServiceForwarderAPI; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.RspName; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SfName; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SffName; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SfpName; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.RenderedServicePath; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.RenderedServicePathBuilder; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.RenderedServicePathKey; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.rendered.service.path.RenderedServicePathHopBuilder; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarder; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarderBuilder; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarderKey; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPath; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPathBuilder; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPathKey; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.AbsoluteLocation; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.AbsoluteLocationBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.absolute.location.location.type.ExternalLocationCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionDefinitionId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContextId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubjectName; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.IpPrefixType; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.L2BridgeDomain; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.EndpointPolicyParticipation; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.rule.group.with.renderer.endpoint.participation.RuleGroupWithRendererEndpointParticipation; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.rule.group.with.renderer.endpoint.participation.RuleGroupWithRendererEndpointParticipationBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.rule.group.with.renderer.endpoint.participation.RuleGroupWithRendererEndpointParticipationKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.Configuration; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.ConfigurationBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.EndpointsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RendererEndpointsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RendererForwarding; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RuleGroupsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocation; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocationBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocationKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpoint; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpointBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpointKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpointBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpointKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.rule.groups.RuleGroup; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.rule.groups.RuleGroupBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.rule.groups.RuleGroupKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.actions.ActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.classifiers.ClassifierBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.resolved.rules.ResolvedRule; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.resolved.rules.ResolvedRuleBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.AddressEndpointWithLocationAug; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.AddressEndpointWithLocationAugBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.IpSgtDistributionService; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest({RendererPolicyUtil.class, PolicyManagerUtil.class, SfcProviderServiceForwarderAPI.class}) public class PolicyManagerImplTest { private final String address = "10.11.12.42/32"; private final String connector = "connector"; private final SfpName servicePath = new SfpName("service-path"); private final RspName renderedPath = new RspName("rendered-path"); private final SffName forwarderName = new SffName("service-forwarder"); private final ContextId contextId_1 = new ContextId("context-id-1"); private final ContextId contextId_2 = new ContextId("context-id-2"); private final ContextId contextId_3 = new ContextId("context-id-3"); private final ContextId contextId_4 = new ContextId("context-id-4"); private final ContractId contractId = new ContractId("contract-id"); private final String ipAddress = "192.168.50.1"; private final NodeId nodeId = new NodeId("node-id"); private final SubjectName subjectName = new SubjectName("subject-name"); private final TenantId tenantId = new TenantId("tenant-id"); private final TopologyId topologyId = new TopologyId("topology-id"); private final ActionDefinitionId chainActionDefinitionId = new ActionDefinitionId("Action-Chain"); private final ActionDefinitionId otherActionDefinitionId = new ActionDefinitionId("Action-Other"); private final SfName functionName = new SfName("service-function"); private PolicyManagerImpl policyManager; private DataBroker mountpoint; private NodeManager nodeManager; private EPToSgtMapper epToSgtMapper; @Mock private IpSgtDistributionService ipSgtDistributor; @Before public void init() { mountpoint = mock(DataBroker.class); ReadWriteTransaction readWriteTransaction = mock(ReadWriteTransaction.class); nodeManager = mock(NodeManager.class); epToSgtMapper = mock(EPToSgtMapper.class); policyManager = new PolicyManagerImpl(mountpoint, nodeManager, epToSgtMapper, ipSgtDistributor); when(mountpoint.newReadWriteTransaction()).thenReturn(readWriteTransaction); when(readWriteTransaction.submit()).thenReturn(Futures.immediateCheckedFuture(null)); } @Test public void testSyncPolicy_emptyConfiguration() throws Exception { Configuration policyConfiguration = createTestConfiguration(null, null, null, null); ListenableFuture result = policyManager.syncPolicy(policyConfiguration, null, 0); assertTrue((boolean) result.get()); } @Test public void testSyncPolicy_noEndpointsInConfiguration() throws Exception { RendererEndpoint rendererEndpoint = createRendererEndpoint(contextId_1, contextId_2, null); Configuration policyConfiguration = createTestConfiguration(null, Collections.singletonList(rendererEndpoint), null, null); ListenableFuture result = policyManager.syncPolicy(policyConfiguration, null, 0); assertTrue((boolean) result.get()); } @Test public void testSyncPolicy_noMountPoint() throws Exception { AddressEndpointWithLocation endpointWithLocation = createAddressEndpointWithLocation(contextId_1, null, false); RendererEndpoint rendererEndpoint = createRendererEndpoint(contextId_2, contextId_3, null); Configuration policyConfiguration = createTestConfiguration(Collections.singletonList(endpointWithLocation), Collections.singletonList(rendererEndpoint), null, null); AbsoluteLocation location = createAbsoluteLocationExternal(connector, createMountpointIid()); AddressEndpointWithLocation lookupEndpoint = createAddressEndpointWithLocation(contextId_4, location, false); stub(method(RendererPolicyUtil.class, "lookupEndpoint")).toReturn(lookupEndpoint); when(nodeManager.getNodeMountPoint(eq(createMountpointIid()))).thenReturn(null); ListenableFuture result = policyManager.syncPolicy(policyConfiguration, null, 0); assertTrue((boolean) result.get()); } @Test public void testSyncPolicy_nullSgtTags() throws Exception { AddressEndpointWithLocation endpointWithLocation = createAddressEndpointWithLocation(contextId_1, null, false); RendererEndpoint rendererEndpoint = createRendererEndpoint(contextId_2, contextId_3, null); Configuration policyConfiguration = createTestConfiguration(Collections.singletonList(endpointWithLocation), Collections.singletonList(rendererEndpoint), null, null); AbsoluteLocation location = createAbsoluteLocationExternal(connector, createMountpointIid()); AddressEndpointWithLocation lookupEndpoint = createAddressEndpointWithLocation(contextId_4, location, false); stub(method(RendererPolicyUtil.class, "lookupEndpoint")).toReturn(lookupEndpoint); when(nodeManager.getNodeMountPoint(eq(createMountpointIid()))).thenReturn(mountpoint); when(nodeManager.getNodeIdByMountpointIid(eq(createMountpointIid()))).thenReturn(nodeId); when(nodeManager.getNodeManagementIpByMountPointIid(eq(createMountpointIid()))).thenReturn(Optional.of(ipAddress)); ListenableFuture result = policyManager.syncPolicy(policyConfiguration, null, 0); assertTrue((boolean) result.get()); } @Test public void testSyncPolicy_emptyRuleGroup() throws Exception { AddressEndpointWithLocation endpointWithLocation = createAddressEndpointWithLocation(contextId_1, null, false); RuleGroupWithRendererEndpointParticipation ruleGroupWithParticipation = createRuleGroupWithRendererEpParticipation(PROVIDER); RendererEndpoint rendererEndpoint = createRendererEndpoint(contextId_2, contextId_3, ruleGroupWithParticipation); RuleGroup ruleGroup = createRuleGroup(null); Configuration policyConfiguration = createTestConfiguration(Collections.singletonList(endpointWithLocation), Collections.singletonList(rendererEndpoint), null, ruleGroup); AbsoluteLocation location = createAbsoluteLocationExternal(connector, createMountpointIid()); AddressEndpointWithLocation lookupEndpoint = createAddressEndpointWithLocation(contextId_4, location, true); stub(method(RendererPolicyUtil.class, "lookupEndpoint")).toReturn(lookupEndpoint); when(nodeManager.getNodeMountPoint(eq(createMountpointIid()))).thenReturn(mountpoint); when(nodeManager.getNodeIdByMountpointIid(eq(createMountpointIid()))).thenReturn(nodeId); when(nodeManager.getNodeManagementIpByMountPointIid(eq(createMountpointIid()))).thenReturn(Optional.of(ipAddress)); ListenableFuture result = policyManager.syncPolicy(policyConfiguration, null, 0); assertTrue((boolean) result.get()); } @Test public void testSyncPolicy_noActionDefinition() throws Exception { AddressEndpointWithLocation endpointWithLocation = createAddressEndpointWithLocation(contextId_1, null, false); RuleGroupWithRendererEndpointParticipation ruleGroupWithParticipation = createRuleGroupWithRendererEpParticipation(PROVIDER); RendererEndpoint rendererEndpoint = createRendererEndpoint(contextId_2, contextId_3, ruleGroupWithParticipation); RuleGroup ruleGroup = createRuleGroup(createRule(Out, null)); Configuration policyConfiguration = createTestConfiguration(Collections.singletonList(endpointWithLocation), Collections.singletonList(rendererEndpoint), null, ruleGroup); AbsoluteLocation location = createAbsoluteLocationExternal(connector, createMountpointIid()); AddressEndpointWithLocation lookupEndpoint = createAddressEndpointWithLocation(contextId_4, location, true); stub(method(RendererPolicyUtil.class, "lookupEndpoint")).toReturn(lookupEndpoint); when(nodeManager.getNodeMountPoint(eq(createMountpointIid()))).thenReturn(mountpoint); when(nodeManager.getNodeIdByMountpointIid(eq(createMountpointIid()))).thenReturn(nodeId); when(nodeManager.getNodeManagementIpByMountPointIid(eq(createMountpointIid()))).thenReturn(Optional.of(ipAddress)); ListenableFuture result = policyManager.syncPolicy(policyConfiguration, null, 0); assertTrue((boolean) result.get()); } @Test public void testSyncPolicy_otherAction() throws Exception { AddressEndpointWithLocation endpointWithLocation = createAddressEndpointWithLocation(contextId_1, null, false); RuleGroupWithRendererEndpointParticipation ruleGroupWithParticipation = createRuleGroupWithRendererEpParticipation(PROVIDER); RendererEndpoint rendererEndpoint = createRendererEndpoint(contextId_2, contextId_3, ruleGroupWithParticipation); RuleGroup ruleGroup = createRuleGroup(createRule(Out, otherActionDefinitionId)); Configuration policyConfiguration = createTestConfiguration(Collections.singletonList(endpointWithLocation), Collections.singletonList(rendererEndpoint), null, ruleGroup); AbsoluteLocation location = createAbsoluteLocationExternal(connector, createMountpointIid()); AddressEndpointWithLocation lookupEndpoint = createAddressEndpointWithLocation(contextId_4, location, true); stub(method(RendererPolicyUtil.class, "lookupEndpoint")).toReturn(lookupEndpoint); when(nodeManager.getNodeMountPoint(eq(createMountpointIid()))).thenReturn(mountpoint); when(nodeManager.getNodeIdByMountpointIid(eq(createMountpointIid()))).thenReturn(nodeId); when(nodeManager.getNodeManagementIpByMountPointIid(eq(createMountpointIid()))).thenReturn(Optional.of(ipAddress)); ListenableFuture result = policyManager.syncPolicy(policyConfiguration, null, 0); assertTrue((boolean) result.get()); } @Test public void testSyncPolicy_asymmetricChain() throws Exception { AddressEndpointWithLocation endpointWithLocation = createAddressEndpointWithLocation(contextId_1, null, false); RuleGroupWithRendererEndpointParticipation ruleGroupWithParticipation = createRuleGroupWithRendererEpParticipation(PROVIDER); RendererEndpoint rendererEndpoint = createRendererEndpoint(contextId_2, contextId_3, ruleGroupWithParticipation); RuleGroup ruleGroup = createRuleGroup(createRule(Out, chainActionDefinitionId)); Configuration policyConfiguration = createTestConfiguration(Collections.singletonList(endpointWithLocation), Collections.singletonList(rendererEndpoint), null, ruleGroup); AbsoluteLocation location = createAbsoluteLocationExternal(connector, createMountpointIid()); AddressEndpointWithLocation lookupEndpoint = createAddressEndpointWithLocation(contextId_4, location, true); stub(method(RendererPolicyUtil.class, "lookupEndpoint")).toReturn(lookupEndpoint); when(nodeManager.getNodeMountPoint(eq(createMountpointIid()))).thenReturn(mountpoint); when(nodeManager.getNodeIdByMountpointIid(eq(createMountpointIid()))).thenReturn(nodeId); when(nodeManager.getNodeManagementIpByMountPointIid(eq(createMountpointIid()))).thenReturn(Optional.of(ipAddress)); ServiceFunctionPath sfp = createServiceFunctionPath(); stub(method(ServiceChainingUtil.class, "findServicePathFromParameterValues")).toReturn(sfp); RenderedServicePath rsp = createRenderedServicePath(); stub(method(ServiceChainingUtil.class, "resolveRenderedServicePath")).toReturn(rsp); ServiceFunctionForwarder serviceFunctionForwarder = createServiceForwarder(); stub(method(SfcProviderServiceForwarderAPI.class, "readServiceFunctionForwarder")) .toReturn(serviceFunctionForwarder); ListenableFuture result = policyManager.syncPolicy(policyConfiguration, null, 0); assertTrue((boolean) result.get()); } private ServiceFunctionForwarder createServiceForwarder() { ServiceFunctionForwarderBuilder serviceFunctionForwarderBuilder = new ServiceFunctionForwarderBuilder(); serviceFunctionForwarderBuilder.setName(new SffName(forwarderName)) .setKey(new ServiceFunctionForwarderKey(new SffName(forwarderName))) .setIpMgmtAddress(IetfModelCodec.ipAddress2013(new IpAddress(new Ipv4Address(ipAddress)))); return serviceFunctionForwarderBuilder.build(); } // Utility methods private InstanceIdentifier createMountpointIid() { return InstanceIdentifier.builder(NetworkTopology.class) .child(Topology.class, new TopologyKey(topologyId)) .child(Node.class, new NodeKey(nodeId)).build(); } private ResolvedRule createRule(HasDirection.Direction direction, ActionDefinitionId actionDefinitionId) { ResolvedRuleBuilder resolvedRuleBuilder = new ResolvedRuleBuilder(); ClassifierBuilder classifierBuilder = new ClassifierBuilder(); classifierBuilder.setDirection(direction); ActionBuilder actionBuilder = new ActionBuilder(); actionBuilder.setActionDefinitionId(actionDefinitionId); resolvedRuleBuilder.setClassifier(Collections.singletonList(classifierBuilder.build())) .setAction(Collections.singletonList(actionBuilder.build())); return resolvedRuleBuilder.build(); } private RuleGroupWithRendererEndpointParticipation createRuleGroupWithRendererEpParticipation(final EndpointPolicyParticipation participation) { RuleGroupWithRendererEndpointParticipationBuilder ruleGroupBuilder = new RuleGroupWithRendererEndpointParticipationBuilder(); ruleGroupBuilder.setKey(new RuleGroupWithRendererEndpointParticipationKey(contractId, participation, subjectName, tenantId)); return ruleGroupBuilder.build(); } private AbsoluteLocation createAbsoluteLocationExternal(String connector, InstanceIdentifier mountpoint) { ExternalLocationCaseBuilder externalLocationCaseBuilder = new ExternalLocationCaseBuilder(); externalLocationCaseBuilder.setExternalNodeConnector(connector) .setExternalNodeMountPoint(mountpoint); AbsoluteLocationBuilder absoluteLocationBuilder = new AbsoluteLocationBuilder(); absoluteLocationBuilder.setLocationType(externalLocationCaseBuilder.build()); return absoluteLocationBuilder.build(); } private ServiceFunctionPath createServiceFunctionPath() { ServiceFunctionPathBuilder serviceFunctionPathBuilder = new ServiceFunctionPathBuilder(); serviceFunctionPathBuilder.setKey(new ServiceFunctionPathKey(servicePath)) .setSymmetric(false); return serviceFunctionPathBuilder.build(); } private RenderedServicePath createRenderedServicePath() { RenderedServicePathHopBuilder renderedServicePathHopBuilder = new RenderedServicePathHopBuilder(); renderedServicePathHopBuilder.setServiceFunctionForwarder(forwarderName); renderedServicePathHopBuilder.setServiceFunctionName(functionName); renderedServicePathHopBuilder.build(); RenderedServicePathBuilder renderedServicePathBuilder = new RenderedServicePathBuilder(); renderedServicePathBuilder.setKey(new RenderedServicePathKey(renderedPath)) .setRenderedServicePathHop(Collections.singletonList(renderedServicePathHopBuilder.build())); return renderedServicePathBuilder.build(); } private AddressEndpointWithLocation createAddressEndpointWithLocation(final ContextId contextId, final AbsoluteLocation location, boolean augmentation) { AddressEndpointWithLocationAugBuilder augmentationBuilder = new AddressEndpointWithLocationAugBuilder(); augmentationBuilder.setSgt(new Sgt(1)); AddressEndpointWithLocationBuilder addressEndpointBuilder = new AddressEndpointWithLocationBuilder(); addressEndpointBuilder.setKey(new AddressEndpointWithLocationKey(address, IpPrefixType.class, contextId, L2BridgeDomain.class)) .setAbsoluteLocation(location); if (augmentation) { addressEndpointBuilder.addAugmentation(AddressEndpointWithLocationAug.class, augmentationBuilder.build()); } return addressEndpointBuilder.build(); } private RendererEndpoint createRendererEndpoint(ContextId contextId_1, ContextId contextId_2, RuleGroupWithRendererEndpointParticipation ruleGroup) { PeerEndpointBuilder PeerEndpointBuilder = new PeerEndpointBuilder(); PeerEndpointBuilder.setKey(new PeerEndpointKey(address, IpPrefixType.class, contextId_1, L2BridgeDomain.class)) .setRuleGroupWithRendererEndpointParticipation(Collections.singletonList(ruleGroup)); RendererEndpointBuilder rendererEndpointBuilder = new RendererEndpointBuilder(); rendererEndpointBuilder.setKey(new RendererEndpointKey(address, IpPrefixType.class, contextId_2, L2BridgeDomain.class)) .setPeerEndpoint(Collections.singletonList(PeerEndpointBuilder.build())); return rendererEndpointBuilder.build(); } private RuleGroup createRuleGroup(ResolvedRule rule) { RuleGroupBuilder ruleGroupBuilder = new RuleGroupBuilder(); ruleGroupBuilder.setKey(new RuleGroupKey(contractId, subjectName, tenantId)) .setResolvedRule(Collections.singletonList(rule)); return ruleGroupBuilder.build(); } private Configuration createTestConfiguration(final List<AddressEndpointWithLocation> endpointsWithLocation, final List<RendererEndpoint> rendererEndpoints, final RendererForwarding rendererForwarding, final RuleGroup ruleGroup) { // Set endpoints EndpointsBuilder endpointsBuilder = new EndpointsBuilder(); endpointsBuilder.setAddressEndpointWithLocation(endpointsWithLocation); // Set renderer endpoints RendererEndpointsBuilder rendererEndpointsBuilder = new RendererEndpointsBuilder(); rendererEndpointsBuilder.setRendererEndpoint(rendererEndpoints); // Set rule group RuleGroupsBuilder ruleGroupsBuilder = new RuleGroupsBuilder(); ruleGroupsBuilder.setRuleGroup(Collections.singletonList(ruleGroup)); // Build configuration ConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); configurationBuilder.setEndpoints(endpointsBuilder.build()) .setRendererEndpoints(rendererEndpointsBuilder.build()) .setRendererForwarding(rendererForwarding) .setRuleGroups(ruleGroupsBuilder.build()); return configurationBuilder.build(); } }