/* * 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; import java.util.Arrays; import java.util.Collections; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; import org.opendaylight.groupbasedpolicy.base_endpoint.EndpointAugmentorRegistryImpl; import org.opendaylight.groupbasedpolicy.forwarding.NetworkDomainAugmentorRegistryImpl; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.EndpointLocations; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.EndpointLocationsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.EndpointsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoint.locations.AddressEndpointLocation; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoint.locations.ContainmentEndpointLocation; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoints.AddressEndpointsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoints.ContainmentEndpointsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoints.address.endpoints.AddressEndpoint; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoints.containment.endpoints.ContainmentEndpoint; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.absolute.location.location.type.ExternalLocationCase; 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.base_endpoint.rev160427.has.absolute.location.absolute.location.location.type.InternalLocationCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.absolute.location.location.type.InternalLocationCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.relative.location.relative.locations.InternalLocation; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.relative.location.relative.locations.InternalLocationBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.RuleName; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubjectName; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.ContextType; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.ForwardingBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.ForwardingByTenantBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.forwarding.by.tenant.ForwardingContextBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.Tenants; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.RendererName; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.Renderers; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.RenderersBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.Renderer; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.RendererBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.RendererNodesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.RendererPolicy; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.RendererPolicyBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.nodes.RendererNodeBuilder; 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.configuration.Endpoints; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RendererEndpoints; 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.RuleGroups; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.ResolvedPolicies; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.ResolvedPoliciesBuilder; 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.resolved.policies.ResolvedPolicy; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.ResolvedPolicy.ExternalImplicitGroup; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.resolved.policy.policy.rule.group.with.endpoint.constraints.PolicyRuleGroup; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import com.google.common.collect.ImmutableList; import com.google.common.util.concurrent.CheckedFuture; @RunWith(MockitoJUnitRunner.class) public class RendererManagerDataBrokerTest { private static final RendererName RENDERER_NAME_R1 = new RendererName("R1"); private static final EndpointGroupId EPG_BLUE = new EndpointGroupId("blue_epg"); private static final EndpointGroupId EPG_PURPLE = new EndpointGroupId("purple_epg"); private static final ContractId CONTRACT_1 = new ContractId("contract_1"); private static final SubjectName SUBJECT_1 = new SubjectName("subject_1"); private static final RuleName RULE_1 = new RuleName("rule_1"); private static final String ADR_1 = "adr_1"; private static final String ADR_2 = "adr_2"; private static final InstanceIdentifier<?> NODE_PATH_1 = InstanceIdentifier.create(Tenants.class); private static final InternalLocationCase INT_LOC_CASE_NODE_PATH_1 = new InternalLocationCaseBuilder().setInternalNode(NODE_PATH_1).build(); private static final InternalLocation INT_LOC_NODE_PATH_1 = new InternalLocationBuilder().setInternalNode(NODE_PATH_1).build(); private static final ExternalLocationCase EXT_LOC_CASE_NODE_PATH_1 = new ExternalLocationCaseBuilder().setExternalNodeMountPoint(NODE_PATH_1).build(); @Mock private DataBroker dataProvider; @Mock private NetworkDomainAugmentorRegistryImpl netDomainAugmentorRegistry; @Mock private EndpointAugmentorRegistryImpl epAugmentorRegistry; @Mock private WriteTransaction wTx; @Mock private CheckedFuture<Void, TransactionCommitFailedException> submitFuture; private RendererManager rendererManager; @Before public void init() { Mockito.when(dataProvider.newWriteOnlyTransaction()).thenReturn(wTx); Mockito.when(wTx.submit()).thenReturn(submitFuture); Mockito.when(netDomainAugmentorRegistry.getNetworkDomainAugmentors()).thenReturn(Collections.emptySet()); Mockito.when(epAugmentorRegistry.getEndpointAugmentors()).thenReturn(Collections.emptySet()); rendererManager = new RendererManager(dataProvider, netDomainAugmentorRegistry, epAugmentorRegistry); RendererManager.resetVersion(); } /** * EP1--EPG_BLUE---SUBJECT_1---(P)EPG_PURPLE--EP2 */ @Test public void testProcessState_dispatchOnePolicy_rendererFeedbackPositive() throws Exception { ArgumentCaptor<Renderers> acRenderers = ArgumentCaptor.forClass(Renderers.class); ResolvedRule rule1 = TestDataFactory.defaultResolvedRule(RULE_1).build(); PolicyRuleGroup ruleGrp1 = TestDataFactory.defaultPolicyRuleGrp(CONTRACT_1, SUBJECT_1, rule1).build(); ResolvedPolicy resolvedPolicy = TestDataFactory.defaultResolvedPolicy(EPG_BLUE, EPG_PURPLE, ruleGrp1).build(); ResolvedPolicies resolvedPolicies = new ResolvedPoliciesBuilder().setResolvedPolicy(ImmutableList.of(resolvedPolicy)).build(); rendererManager.resolvedPoliciesUpdated(resolvedPolicies); AddressEndpoint ep1 = TestDataFactory.defaultAdrEp(ADR_1, EPG_BLUE).build(); AddressEndpoint ep2 = TestDataFactory.defaultAdrEp(ADR_2, EPG_PURPLE).build(); rendererManager.endpointsUpdated(new EndpointsBuilder() .setAddressEndpoints(new AddressEndpointsBuilder().setAddressEndpoint(ImmutableList.of(ep1, ep2)).build()) .build()); AddressEndpointLocation ep1Loc = TestDataFactory.defaultAdrEpLoc(ep1.getKey(), INT_LOC_CASE_NODE_PATH_1).build(); AddressEndpointLocation ep2Loc = TestDataFactory.defaultAdrEpLoc(ep2.getKey(), INT_LOC_CASE_NODE_PATH_1).build(); EndpointLocations endpointLocations = new EndpointLocationsBuilder().setAddressEndpointLocation(ImmutableList.of(ep1Loc, ep2Loc)).build(); rendererManager.endpointLocationsUpdated(endpointLocations); rendererManager .forwardingUpdated(new ForwardingBuilder() .setForwardingByTenant( Arrays.asList(new ForwardingByTenantBuilder().setTenantId(TestDataFactory.TENANT_ID) .setForwardingContext(Arrays.asList(new ForwardingContextBuilder() .setContextType(ContextType.class) .setContextId(TestDataFactory.CTX_1) .build())) .build())) .build()); rendererManager.renderersUpdated(new RenderersBuilder() .setRenderer(Arrays.asList(new RendererBuilder().setName(RENDERER_NAME_R1) .setRendererNodes(new RendererNodesBuilder() .setRendererNode(Arrays.asList(new RendererNodeBuilder().setNodePath(NODE_PATH_1).build())).build()) .build())) .build()); // assert dispatch one policy Assert.assertEquals(1, rendererManager.getProcessingRenderers().size()); Mockito.verify(wTx).put(Mockito.eq(LogicalDatastoreType.CONFIGURATION), Mockito.eq(InstanceIdentifier.create(Renderers.class)), acRenderers.capture()); Renderers renderers = acRenderers.getValue(); Assert.assertNotNull(renderers); Assert.assertNotNull(renderers.getRenderer()); Assert.assertEquals(1, renderers.getRenderer().size()); Renderer renderer = renderers.getRenderer().get(0); Assert.assertEquals(RENDERER_NAME_R1, renderer.getName()); RendererPolicy rendererPolicy = renderer.getRendererPolicy(); Assert.assertNotNull(rendererPolicy); Assert.assertEquals(1, rendererPolicy.getVersion().longValue()); Configuration configuration = rendererPolicy.getConfiguration(); Assert.assertNotNull(configuration); RendererEndpoints rendererEndpoints = configuration.getRendererEndpoints(); Assert.assertNotNull(rendererEndpoints); Assert.assertEquals(2, rendererEndpoints.getRendererEndpoint().size()); RendererForwarding rendererForwarding = configuration.getRendererForwarding(); Assert.assertNotNull(rendererForwarding); Assert.assertEquals(1, rendererForwarding.getRendererForwardingByTenant().size()); Endpoints endpoints = configuration.getEndpoints(); Assert.assertNotNull(endpoints); Assert.assertEquals(2, endpoints.getAddressEndpointWithLocation().size()); RuleGroups ruleGroups = configuration.getRuleGroups(); Assert.assertNotNull(ruleGroups); Assert.assertEquals(1, ruleGroups.getRuleGroup().size()); rendererManager .renderersUpdated( new RenderersBuilder() .setRenderer( Arrays.asList(new RendererBuilder().setName(RENDERER_NAME_R1) .setRendererNodes(new RendererNodesBuilder() .setRendererNode(Arrays .asList(new RendererNodeBuilder().setNodePath(NODE_PATH_1).build())) .build()) .setRendererPolicy(new RendererPolicyBuilder().setVersion(1L).build()) .build())) .build()); Assert.assertEquals(0, rendererManager.getProcessingRenderers().size()); } /** * EP1--EPG_BLUE---SUBJECT_1---(P)EPG_PURPLE(EIG)--EP2(containment) */ @Test public void testProcessState_dispatchOneExternalPolicyWithContainmentEp_noRendererFeedback() throws Exception { ArgumentCaptor<Renderers> acRenderers = ArgumentCaptor.forClass(Renderers.class); ResolvedRule rule1 = TestDataFactory.defaultResolvedRule(RULE_1).build(); PolicyRuleGroup ruleGrp1 = TestDataFactory.defaultPolicyRuleGrp(CONTRACT_1, SUBJECT_1, rule1).build(); ResolvedPolicy resolvedPolicy = TestDataFactory.defaultResolvedPolicy(EPG_BLUE, EPG_PURPLE, ruleGrp1) .setExternalImplicitGroup(ExternalImplicitGroup.ProviderEpg) .build(); ResolvedPolicies resolvedPolicies = new ResolvedPoliciesBuilder().setResolvedPolicy(ImmutableList.of(resolvedPolicy)).build(); rendererManager.resolvedPoliciesUpdated(resolvedPolicies); AddressEndpoint ep1 = TestDataFactory.defaultAdrEp(ADR_1, EPG_BLUE).build(); ContainmentEndpoint ep2 = TestDataFactory.defaultContEp(EPG_PURPLE).build(); rendererManager .endpointsUpdated(new EndpointsBuilder() .setAddressEndpoints(new AddressEndpointsBuilder().setAddressEndpoint(ImmutableList.of(ep1)).build()) .setContainmentEndpoints( new ContainmentEndpointsBuilder().setContainmentEndpoint(ImmutableList.of(ep2)).build()) .build()); AddressEndpointLocation ep1Loc = TestDataFactory.defaultAdrEpLoc(ep1.getKey(), INT_LOC_CASE_NODE_PATH_1).build(); ContainmentEndpointLocation ep2Loc = TestDataFactory.defaultContEpLoc(ep2.getKey(), INT_LOC_NODE_PATH_1).build(); EndpointLocations endpointLocations = new EndpointLocationsBuilder().setAddressEndpointLocation(ImmutableList.of(ep1Loc)) .setContainmentEndpointLocation(ImmutableList.of(ep2Loc)) .build(); rendererManager.endpointLocationsUpdated(endpointLocations); rendererManager .forwardingUpdated(new ForwardingBuilder() .setForwardingByTenant( Arrays.asList(new ForwardingByTenantBuilder().setTenantId(TestDataFactory.TENANT_ID) .setForwardingContext(Arrays.asList(new ForwardingContextBuilder() .setContextType(ContextType.class) .setContextId(TestDataFactory.CTX_1) .build())) .build())) .build()); rendererManager.renderersUpdated(new RenderersBuilder() .setRenderer(Arrays.asList(new RendererBuilder().setName(RENDERER_NAME_R1) .setRendererNodes(new RendererNodesBuilder() .setRendererNode(Arrays.asList(new RendererNodeBuilder().setNodePath(NODE_PATH_1).build())).build()) .build())) .build()); // assert dispatch one policy Assert.assertEquals(1, rendererManager.getProcessingRenderers().size()); Mockito.verify(wTx).put(Mockito.eq(LogicalDatastoreType.CONFIGURATION), Mockito.eq(InstanceIdentifier.create(Renderers.class)), acRenderers.capture()); Renderers renderers = acRenderers.getValue(); Assert.assertNotNull(renderers); Assert.assertNotNull(renderers.getRenderer()); Assert.assertEquals(1, renderers.getRenderer().size()); Renderer renderer = renderers.getRenderer().get(0); Assert.assertEquals(RENDERER_NAME_R1, renderer.getName()); RendererPolicy rendererPolicy = renderer.getRendererPolicy(); Assert.assertNotNull(rendererPolicy); Assert.assertEquals(1, rendererPolicy.getVersion().longValue()); Configuration configuration = rendererPolicy.getConfiguration(); Assert.assertNotNull(configuration); RendererEndpoints rendererEndpoints = configuration.getRendererEndpoints(); Assert.assertNotNull(rendererEndpoints); Assert.assertEquals(1, rendererEndpoints.getRendererEndpoint().size()); RendererForwarding rendererForwarding = configuration.getRendererForwarding(); Assert.assertNotNull(rendererForwarding); Assert.assertEquals(1, rendererForwarding.getRendererForwardingByTenant().size()); Endpoints endpoints = configuration.getEndpoints(); Assert.assertNotNull(endpoints); Assert.assertEquals(1, endpoints.getAddressEndpointWithLocation().size()); Assert.assertEquals(1, endpoints.getContainmentEndpointWithLocation().size()); RuleGroups ruleGroups = configuration.getRuleGroups(); Assert.assertNotNull(ruleGroups); Assert.assertEquals(1, ruleGroups.getRuleGroup().size()); } /** * EP1--EPG_BLUE---SUBJECT_1---(P)EPG_PURPLE(EIG)--EP2() */ @Test public void testProcessState_dispatchOneExternalPolicyWithEp_noRendererFeedback() { ArgumentCaptor<Renderers> acRenderers = ArgumentCaptor.forClass(Renderers.class); ResolvedRule rule1 = TestDataFactory.defaultResolvedRule(RULE_1).build(); PolicyRuleGroup ruleGrp1 = TestDataFactory.defaultPolicyRuleGrp(CONTRACT_1, SUBJECT_1, rule1).build(); ResolvedPolicy resolvedPolicy = TestDataFactory.defaultResolvedPolicy(EPG_BLUE, EPG_PURPLE, ruleGrp1) .setExternalImplicitGroup(ExternalImplicitGroup.ProviderEpg) .build(); ResolvedPolicies resolvedPolicies = new ResolvedPoliciesBuilder().setResolvedPolicy(ImmutableList.of(resolvedPolicy)).build(); rendererManager.resolvedPoliciesUpdated(resolvedPolicies); AddressEndpoint ep1 = TestDataFactory.defaultAdrEp(ADR_1, EPG_BLUE).build(); AddressEndpoint ep2 = TestDataFactory.defaultAdrEp(ADR_2, EPG_PURPLE).build(); rendererManager.endpointsUpdated(new EndpointsBuilder() .setAddressEndpoints(new AddressEndpointsBuilder().setAddressEndpoint(ImmutableList.of(ep1, ep2)).build()) .build()); AddressEndpointLocation ep1Loc = TestDataFactory.defaultAdrEpLoc(ep1.getKey(), INT_LOC_CASE_NODE_PATH_1).build(); AddressEndpointLocation ep2Loc = TestDataFactory.defaultAdrEpLoc(ep2.getKey(), EXT_LOC_CASE_NODE_PATH_1).build(); EndpointLocations endpointLocations = new EndpointLocationsBuilder().setAddressEndpointLocation(ImmutableList.of(ep1Loc, ep2Loc)).build(); rendererManager.endpointLocationsUpdated(endpointLocations); rendererManager .forwardingUpdated(new ForwardingBuilder() .setForwardingByTenant( Arrays.asList(new ForwardingByTenantBuilder().setTenantId(TestDataFactory.TENANT_ID) .setForwardingContext(Arrays.asList(new ForwardingContextBuilder() .setContextType(ContextType.class) .setContextId(TestDataFactory.CTX_1) .build())) .build())) .build()); rendererManager.renderersUpdated(new RenderersBuilder() .setRenderer(Arrays.asList(new RendererBuilder().setName(RENDERER_NAME_R1) .setRendererNodes(new RendererNodesBuilder() .setRendererNode(Arrays.asList(new RendererNodeBuilder().setNodePath(NODE_PATH_1).build())).build()) .build())) .build()); // assert dispatch one policy Assert.assertEquals(1, rendererManager.getProcessingRenderers().size()); Mockito.verify(wTx).put(Mockito.eq(LogicalDatastoreType.CONFIGURATION), Mockito.eq(InstanceIdentifier.create(Renderers.class)), acRenderers.capture()); Renderers renderers = acRenderers.getValue(); Assert.assertNotNull(renderers); Assert.assertNotNull(renderers.getRenderer()); Assert.assertEquals(1, renderers.getRenderer().size()); Renderer renderer = renderers.getRenderer().get(0); Assert.assertEquals(RENDERER_NAME_R1, renderer.getName()); RendererPolicy rendererPolicy = renderer.getRendererPolicy(); Assert.assertNotNull(rendererPolicy); Assert.assertEquals(1, rendererPolicy.getVersion().longValue()); Configuration configuration = rendererPolicy.getConfiguration(); Assert.assertNotNull(configuration); RendererEndpoints rendererEndpoints = configuration.getRendererEndpoints(); Assert.assertNotNull(rendererEndpoints); Assert.assertEquals(1, rendererEndpoints.getRendererEndpoint().size()); RendererForwarding rendererForwarding = configuration.getRendererForwarding(); Assert.assertNotNull(rendererForwarding); Assert.assertEquals(1, rendererForwarding.getRendererForwardingByTenant().size()); Endpoints endpoints = configuration.getEndpoints(); Assert.assertNotNull(endpoints); Assert.assertEquals(2, endpoints.getAddressEndpointWithLocation().size()); RuleGroups ruleGroups = configuration.getRuleGroups(); Assert.assertNotNull(ruleGroups); Assert.assertEquals(1, ruleGroups.getRuleGroup().size()); } }