From bff6c01ebb0b82b4b1d9068fa5e29b4f482757ca Mon Sep 17 00:00:00 2001 From: Matej Perina Date: Fri, 24 Jun 2016 15:54:28 +0200 Subject: [PATCH] policy configuration status - status model changed - is now more similar to configuration - renderer.yang cleanup (groupings) - fixed classes where broken because of model cleanup - status collecting and storing - dramatic rebase Change-Id: Ic2e2d3552b880c7ee0bad26c9388340e53067a94 Signed-off-by: Matej Perina Signed-off-by: Michal Rehak --- .../renderer/AddressEndpointUtils.java | 4 +- .../renderer/ContainmentEndpointUtils.java | 2 +- .../RendererConfigurationBuilder.java | 104 ++++++------ .../renderer/RendererManager.java | 27 ++- .../src/main/yang/model/renderer.yang | 83 +++++----- .../renderer/RendererManagerTest.java | 8 +- .../manager/PolicyConfigurationContext.java | 77 +++++++++ .../impl/manager/PolicyManagerImpl.java | 134 ++++++++------- .../impl/util/PolicyManagerUtil.java | 38 ++--- .../impl/util/ServiceChainingUtil.java | 30 ++-- .../ios_xe_provider/impl/util/StatusUtil.java | 92 +++++++++++ .../impl/manager/PolicyManagerImplTest.java | 14 +- .../impl/util/ServiceChainingUtilTest.java | 76 ++++++--- .../impl/util/StatusUtilTest.java | 154 ++++++++++++++++++ .../renderer/vpp/policy/PolicyContext.java | 19 +-- .../renderer/vpp/util/KeyFactory.java | 9 +- .../policy/VppRendererPolicyManagerTest.java | 28 ++-- 17 files changed, 632 insertions(+), 267 deletions(-) create mode 100644 renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/manager/PolicyConfigurationContext.java create mode 100644 renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/StatusUtil.java create mode 100644 renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/StatusUtilTest.java diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/AddressEndpointUtils.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/AddressEndpointUtils.java index 1675bb803..8342f579e 100644 --- a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/AddressEndpointUtils.java +++ b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/AddressEndpointUtils.java @@ -9,9 +9,9 @@ package org.opendaylight.groupbasedpolicy.renderer; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoints.address.endpoints.AddressEndpointKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.peer.endpoints.PeerEndpointKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.peer.external.endpoints.PeerExternalEndpointKey; 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.PeerEndpointKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerExternalEndpointKey; public class AddressEndpointUtils { diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ContainmentEndpointUtils.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ContainmentEndpointUtils.java index 86a5d0cfb..de3f9681c 100644 --- a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ContainmentEndpointUtils.java +++ b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ContainmentEndpointUtils.java @@ -9,7 +9,7 @@ package org.opendaylight.groupbasedpolicy.renderer; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoints.containment.endpoints.ContainmentEndpointKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.peer.external.containment.endpoints.PeerExternalContainmentEndpointKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerExternalContainmentEndpointKey; public class ContainmentEndpointUtils { diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/RendererConfigurationBuilder.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/RendererConfigurationBuilder.java index 33908b4b1..00b343670 100644 --- a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/RendererConfigurationBuilder.java +++ b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/RendererConfigurationBuilder.java @@ -8,6 +8,14 @@ package org.opendaylight.groupbasedpolicy.renderer; +import com.google.common.base.Function; +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; +import com.google.common.collect.FluentIterable; +import com.google.common.collect.HashBasedTable; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableTable; +import com.google.common.collect.Table; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -16,10 +24,8 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; - import javax.annotation.Nonnull; import javax.annotation.Nullable; - import org.opendaylight.groupbasedpolicy.api.EndpointAugmentor; import org.opendaylight.groupbasedpolicy.api.NetworkDomainAugmentor; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoint.locations.AddressEndpointLocation; @@ -34,9 +40,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.forwarding.by.tenant.NetworkDomain; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.EndpointPolicyParticipation; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.RendererName; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.peer.endpoints.PeerEndpointKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.peer.external.containment.endpoints.PeerExternalContainmentEndpointKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.peer.external.endpoints.PeerExternalEndpointKey; 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.renderers.renderer.renderer.policy.configuration.Endpoints; @@ -54,15 +57,15 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.r 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.PeerEndpointWithPolicy; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpointWithPolicyBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpointWithPolicyKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerExternalContainmentEndpointWithPolicy; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerExternalContainmentEndpointWithPolicyBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerExternalContainmentEndpointWithPolicyKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerExternalEndpointWithPolicy; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerExternalEndpointWithPolicyBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerExternalEndpointWithPolicyKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpoint; +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.renderer.endpoints.renderer.endpoint.PeerExternalContainmentEndpoint; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerExternalContainmentEndpointBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerExternalContainmentEndpointKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerExternalEndpoint; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerExternalEndpointBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerExternalEndpointKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.RendererForwardingByTenant; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.RendererForwardingByTenantBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererForwardingContext; @@ -76,15 +79,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.p import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import com.google.common.base.Function; -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; -import com.google.common.collect.FluentIterable; -import com.google.common.collect.HashBasedTable; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.ImmutableTable; -import com.google.common.collect.Table; - public class RendererConfigurationBuilder { private final Table> policiesByEpAndPeerEp = @@ -180,25 +174,25 @@ public class RendererConfigurationBuilder { for (RendererEndpointKey rendererEpKey : policiesByEpAndPeerEp.rowKeySet()) { RendererEndpointBuilder rendererEpBuilder = resolveRendererEndpointBuilder(rendererEpKey, rendererEpBuilderByKey); - List peerEpsWithPolicy = - toListPeerEndpointWithPolicy(policiesByEpAndPeerEp.row(rendererEpKey)); - rendererEpBuilder.setPeerEndpointWithPolicy(peerEpsWithPolicy); + List peerEps = + toListPeerEndpoint(policiesByEpAndPeerEp.row(rendererEpKey)); + rendererEpBuilder.setPeerEndpoint(peerEps); rendererEpBuilderByKey.put(rendererEpKey, rendererEpBuilder); } for (RendererEndpointKey rendererEpKey : policiesByEpAndPeerExtEp.rowKeySet()) { RendererEndpointBuilder rendererEpBuilder = resolveRendererEndpointBuilder(rendererEpKey, rendererEpBuilderByKey); - List peerExtEpsWithPolicy = - toListPeerExternalEndpointWithPolicy(policiesByEpAndPeerExtEp.row(rendererEpKey)); - rendererEpBuilder.setPeerExternalEndpointWithPolicy(peerExtEpsWithPolicy); + List peerExtEps = + toListPeerExternalEndpoint(policiesByEpAndPeerExtEp.row(rendererEpKey)); + rendererEpBuilder.setPeerExternalEndpoint(peerExtEps); rendererEpBuilderByKey.put(rendererEpKey, rendererEpBuilder); } for (RendererEndpointKey rendererEpKey : policiesByEpAndPeerExtCtxEp.rowKeySet()) { RendererEndpointBuilder rendererEpBuilder = resolveRendererEndpointBuilder(rendererEpKey, rendererEpBuilderByKey); - List peerExtContEpsWithPolicy = - toListPeerExternalContainmentEndpointWithPolicy(policiesByEpAndPeerExtCtxEp.row(rendererEpKey)); - rendererEpBuilder.setPeerExternalContainmentEndpointWithPolicy(peerExtContEpsWithPolicy); + List peerExtContEps = + toListPeerExternalContainmentEndpoint(policiesByEpAndPeerExtCtxEp.row(rendererEpKey)); + rendererEpBuilder.setPeerExternalContainmentEndpoint(peerExtContEps); rendererEpBuilderByKey.put(rendererEpKey, rendererEpBuilder); } List rendererEps = new ArrayList<>(); @@ -218,57 +212,57 @@ public class RendererConfigurationBuilder { return rendererEpBuilder; } - private static List toListPeerEndpointWithPolicy( + private static List toListPeerEndpoint( Map> policiesByPeerEp) { - List peerEpsWithPolicy = new ArrayList<>(); + List peerEps = new ArrayList<>(); for (Entry> entry : policiesByPeerEp .entrySet()) { PeerEndpointKey peerEpKey = entry.getKey(); - PeerEndpointWithPolicyKey peerEndpointWithPolicyKey = new PeerEndpointWithPolicyKey(peerEpKey.getAddress(), + PeerEndpointKey peerEndpointKey = new PeerEndpointKey(peerEpKey.getAddress(), peerEpKey.getAddressType(), peerEpKey.getContextId(), peerEpKey.getContextType()); - PeerEndpointWithPolicy peerEndpointWithPolicy = - new PeerEndpointWithPolicyBuilder().setKey(peerEndpointWithPolicyKey) + PeerEndpoint peerEndpoint = + new PeerEndpointBuilder().setKey(peerEndpointKey) .setRuleGroupWithRendererEndpointParticipation(new ArrayList<>(entry.getValue())) .build(); - peerEpsWithPolicy.add(peerEndpointWithPolicy); + peerEps.add(peerEndpoint); } - return peerEpsWithPolicy; + return peerEps; } - private static List toListPeerExternalEndpointWithPolicy( + private static List toListPeerExternalEndpoint( Map> policiesByPeerExtEp) { - List peerExtEpsWithPolicy = new ArrayList<>(); + List peerExtEps = new ArrayList<>(); for (Entry> entry : policiesByPeerExtEp .entrySet()) { PeerExternalEndpointKey peerEpKey = entry.getKey(); - PeerExternalEndpointWithPolicyKey peerExternalEpWithPolicyKey = - new PeerExternalEndpointWithPolicyKey(peerEpKey.getAddress(), peerEpKey.getAddressType(), + PeerExternalEndpointKey peerExternalEpKey = + new PeerExternalEndpointKey(peerEpKey.getAddress(), peerEpKey.getAddressType(), peerEpKey.getContextId(), peerEpKey.getContextType()); - PeerExternalEndpointWithPolicy peerExternalEpWithPolicy = - new PeerExternalEndpointWithPolicyBuilder().setKey(peerExternalEpWithPolicyKey) + PeerExternalEndpoint peerExternalEp = + new PeerExternalEndpointBuilder().setKey(peerExternalEpKey) .setRuleGroupWithRendererEndpointParticipation(new ArrayList<>(entry.getValue())) .build(); - peerExtEpsWithPolicy.add(peerExternalEpWithPolicy); + peerExtEps.add(peerExternalEp); } - return peerExtEpsWithPolicy; + return peerExtEps; } - private static List toListPeerExternalContainmentEndpointWithPolicy( + private static List toListPeerExternalContainmentEndpoint( Map> policiesByPeerExtContEp) { - List peerExtContEpsWithPolicy = new ArrayList<>(); + List peerExtContEps = new ArrayList<>(); for (Entry> entry : policiesByPeerExtContEp .entrySet()) { PeerExternalContainmentEndpointKey peerEpKey = entry.getKey(); - PeerExternalContainmentEndpointWithPolicyKey peerExternalContEpWithPolicyKey = - new PeerExternalContainmentEndpointWithPolicyKey(peerEpKey.getContextId(), + PeerExternalContainmentEndpointKey peerExternalContEpKey = + new PeerExternalContainmentEndpointKey(peerEpKey.getContextId(), peerEpKey.getContextType()); - PeerExternalContainmentEndpointWithPolicy peerExternalContEpWithPolicy = - new PeerExternalContainmentEndpointWithPolicyBuilder().setKey(peerExternalContEpWithPolicyKey) + PeerExternalContainmentEndpoint peerExternalContEp = + new PeerExternalContainmentEndpointBuilder().setKey(peerExternalContEpKey) .setRuleGroupWithRendererEndpointParticipation(new ArrayList<>(entry.getValue())) .build(); - peerExtContEpsWithPolicy.add(peerExternalContEpWithPolicy); + peerExtContEps.add(peerExternalContEp); } - return peerExtContEpsWithPolicy; + return peerExtContEps; } public Endpoints buildEndoints(EndpointInfo epInfo, EndpointLocationInfo epLocInfo, diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/RendererManager.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/RendererManager.java index 772d0583c..6200db755 100644 --- a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/RendererManager.java +++ b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/RendererManager.java @@ -10,6 +10,14 @@ package org.opendaylight.groupbasedpolicy.renderer; import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Function; +import com.google.common.base.Optional; +import com.google.common.collect.FluentIterable; +import com.google.common.collect.ImmutableCollection; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.ImmutableSet; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -17,9 +25,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; - import javax.annotation.Nullable; - 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; @@ -46,9 +52,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.r 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.has.peer.endpoints.PeerEndpointKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.peer.external.containment.endpoints.PeerExternalContainmentEndpointKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.peer.external.endpoints.PeerExternalEndpointKey; 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.RendererPolicy; @@ -60,6 +63,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.r 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.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.PeerEndpointKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerExternalContainmentEndpointKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerExternalEndpointKey; 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.resolved.policies.ResolvedPolicy; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.ResolvedPolicy.ExternalImplicitGroup; @@ -69,15 +75,6 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Function; -import com.google.common.base.Optional; -import com.google.common.collect.FluentIterable; -import com.google.common.collect.ImmutableCollection; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.ImmutableSet; - public class RendererManager implements AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(RendererManager.class); @@ -235,7 +232,7 @@ public class RendererManager implements AutoCloseable { && renderer.getRendererPolicy().getVersion().equals(version)) { processingRenderers.remove(configuredRenderer); Status status = rendererPolicy.getStatus(); - if (status != null && status.getUnconfiguredRule() != null) { + if (status != null && status.getUnconfiguredEndpoints() != null) { LOG.warn("Renderer {} did not configure policy with version {} successfully. \n{}", configuredRenderer.getValue(), version, status); } else { diff --git a/groupbasedpolicy/src/main/yang/model/renderer.yang b/groupbasedpolicy/src/main/yang/model/renderer.yang index 444a1c5e5..20990c044 100755 --- a/groupbasedpolicy/src/main/yang/model/renderer.yang +++ b/groupbasedpolicy/src/main/yang/model/renderer.yang @@ -100,27 +100,6 @@ module renderer { } } - grouping has-peer-endpoints { - list peer-endpoint { - key "context-type context-id address-type address"; - uses base-endpoint:address-endpoint-key; - } - } - - grouping has-peer-external-endpoints { - list peer-external-endpoint { - key "context-type context-id address-type address"; - uses base-endpoint:address-endpoint-key; - } - } - - grouping has-peer-external-containment-endpoints { - list peer-external-containment-endpoint { - key "context-type context-id"; - uses forwarding:context-key; - } - } - grouping has-renderer-name { leaf renderer-name { type renderer-name; @@ -140,6 +119,22 @@ module renderer { } } + grouping has-unconfigured-rule-groups { + list unconfigured-rule-group { + key "tenant-id contract-id subject-name renderer-endpoint-participation"; + uses resolved-policy:has-subject-key; + leaf renderer-endpoint-participation { + type endpoint-policy-participation; + } + list unconfigured-resolved-rule { + key "rule-name"; + leaf rule-name { + type gbp-common:rule-name; + } + } + } + } + container renderers { list renderer { description @@ -191,19 +186,22 @@ module renderer { key "context-type context-id address-type address"; uses base-endpoint:address-endpoint-key; - list peer-endpoint-with-policy { + list peer-endpoint { + description "peer endpoint with-policy - keys"; key "context-type context-id address-type address"; uses base-endpoint:address-endpoint-key; uses has-rule-group-with-renderer-endpoint-participation; } - list peer-external-endpoint-with-policy { + list peer-external-endpoint { + description "peer external endpoint with-policy - keys"; key "context-type context-id address-type address"; uses base-endpoint:address-endpoint-key; uses has-rule-group-with-renderer-endpoint-participation; } - list peer-external-containment-endpoint-with-policy { + list peer-external-containment-endpoint { + description "peer external endpoint with containment and policy - keys"; key "context-type context-id"; uses forwarding:context-key; uses has-rule-group-with-renderer-endpoint-participation; @@ -272,24 +270,33 @@ module renderer { description "The renderer exposes status of policy here."; config false; - list unconfigured-rule { - key "tenant-id contract-id subject-name renderer-endpoint-participation rule-name"; - uses resolved-policy:has-subject-key; - leaf renderer-endpoint-participation { - type endpoint-policy-participation; - } - leaf rule-name { - type gbp-common:rule-name; - } + container unconfigured-endpoints { + list unconfigured-renderer-endpoint { + description "Renderer-endpoint with unconfigured rules."; + key "context-type context-id address-type address"; + uses base-endpoint:address-endpoint-key; + + list unconfigured-peer-endpoint { + key "context-type context-id address-type address"; + uses base-endpoint:address-endpoint-key; + uses has-unconfigured-rule-groups; + } - container renderer-endpoints-with-peers { - list renderer-endpoint-with-peers { + list unconfigured-peer-external-endpoint { key "context-type context-id address-type address"; uses base-endpoint:address-endpoint-key; + uses has-unconfigured-rule-groups; + } + + list unconfigured-peer-external-containment-endpoint { + key "context-type context-id"; + uses forwarding:context-key; + uses has-unconfigured-rule-groups; + } - uses has-peer-endpoints; - uses has-peer-external-endpoints; - uses has-peer-external-containment-endpoints; + leaf info { + description "More details on reason for configuration failure."; + type string; } } } diff --git a/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/RendererManagerTest.java b/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/RendererManagerTest.java index 84973e308..801c2bbeb 100644 --- a/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/RendererManagerTest.java +++ b/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/RendererManagerTest.java @@ -12,9 +12,10 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableTable; import java.util.Collections; import java.util.Set; - import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -39,9 +40,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubjectName; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.Tenants; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.EndpointPolicyParticipation; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.peer.endpoints.PeerEndpointKey; 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.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.PeerEndpointKey; 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; @@ -49,9 +50,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.p 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.collect.ImmutableTable; - @RunWith(MockitoJUnitRunner.class) public class RendererManagerTest { diff --git a/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/manager/PolicyConfigurationContext.java b/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/manager/PolicyConfigurationContext.java new file mode 100644 index 000000000..a6c7bc83d --- /dev/null +++ b/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/manager/PolicyConfigurationContext.java @@ -0,0 +1,77 @@ +/* + * 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 java.util.ArrayList; +import java.util.List; +import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.writer.PolicyWriter; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.Status; +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.status.unconfigured.endpoints.UnconfiguredRendererEndpoint; + +/** + * Purpose: placeholder for + *
    + *
  • {@link PolicyWriter}
  • + *
  • {@link Status} parts
  • + *
+ */ +public class PolicyConfigurationContext { + + private final List unconfiguredRendererEPBag; + private PolicyWriter policyWriter; + private RendererEndpoint currentRendererEP; + + public PolicyConfigurationContext() { + unconfiguredRendererEPBag = new ArrayList<>(); + } + + /** + * @return policyWriter for mountpoint currently being configured + */ + public PolicyWriter getPolicyWriter() { + return policyWriter; + } + + /** + * @param policyWriter for mountpoint currently being configured + */ + public void setPolicyWriter(final PolicyWriter policyWriter) { + this.policyWriter = policyWriter; + } + + /** + * @return list of not configurable policies + */ + public List getUnconfiguredRendererEPBag() { + return unconfiguredRendererEPBag; + } + + /** + * append given endpoint to collection of not configurable policies + * @param endpoint not configurable endpoint + */ + public void appendUnconfiguredRendererEP(UnconfiguredRendererEndpoint endpoint) { + unconfiguredRendererEPBag.add(endpoint); + } + + /** + * @param currentRendererEP endpoint currently being configured + */ + public void setCurrentRendererEP(final RendererEndpoint currentRendererEP) { + this.currentRendererEP = currentRendererEP; + } + + /** + * @return endpoint currently being configured + */ + public RendererEndpoint getCurrentRendererEP() { + return currentRendererEP; + } +} diff --git a/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/manager/PolicyManagerImpl.java b/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/manager/PolicyManagerImpl.java index 2b78c3077..6873c6e05 100644 --- a/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/manager/PolicyManagerImpl.java +++ b/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/manager/PolicyManagerImpl.java @@ -8,19 +8,25 @@ package org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager; -import com.google.common.base.Function; -import com.google.common.base.Preconditions; -import com.google.common.util.concurrent.AsyncFunction; -import com.google.common.util.concurrent.CheckedFuture; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.ListenableFuture; +import static org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl.DsAction.Create; +import static org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl.DsAction.Delete; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; -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.renderer.ios_xe_provider.api.manager.PolicyManager; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.util.PolicyManagerUtil; +import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.util.StatusUtil; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.writer.NetconfTransactionCreator; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.writer.PolicyWriter; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.Renderers; @@ -29,25 +35,24 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.r 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.policy.Configuration; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.Status; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.StatusBuilder; 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.renderer.endpoints.RendererEndpoint; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpointWithPolicy; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpoint; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.status.UnconfiguredEndpointsBuilder; 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.NodeId; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -import static org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl.DsAction.Create; -import static org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl.DsAction.Delete; - +import com.google.common.base.Function; +import com.google.common.base.Preconditions; +import com.google.common.util.concurrent.AsyncFunction; +import com.google.common.util.concurrent.CheckedFuture; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; public class PolicyManagerImpl implements PolicyManager { private static final Logger LOG = LoggerFactory.getLogger(PolicyManagerImpl.class); @@ -62,9 +67,10 @@ public class PolicyManagerImpl implements PolicyManager { } @Override - public ListenableFuture syncPolicy(final Configuration dataAfter, final Configuration dataBefore, + @Nonnull + public ListenableFuture syncPolicy(@Nullable final Configuration dataAfter, @Nullable final Configuration dataBefore, final long version) { - final ListenableFuture result; + final ListenableFuture> result; if (dataBefore == null && dataAfter != null) { result = syncPolicy(dataAfter, Create); } else if (dataBefore != null && dataAfter == null) { @@ -72,41 +78,39 @@ public class PolicyManagerImpl implements PolicyManager { } else { syncPolicy(dataBefore, Delete); syncPolicy(dataAfter, Create); - result = Futures.immediateFuture(false); + result = Futures.immediateFuture(Optional.empty()); } - reportVersion(version); - - // chain version update (TODO: status) - return Futures.transform(result, new AsyncFunction() { + return Futures.transform(result, new AsyncFunction, Boolean>() { @Override - public ListenableFuture apply(final Boolean input) throws Exception { - if (input != null && input) { - return Futures.transform(reportVersion(version), new Function() { - @Nullable - @Override - public Boolean apply(@Nullable final Void input) { - return Boolean.TRUE; - } - }); - } else { - return Futures.immediateFuture(input); - } + public ListenableFuture apply(@Nullable final Optional statusValue) throws Exception { + Preconditions.checkArgument(statusValue != null, "provided status must not be null"); + return Futures.transform(reportPolicy(version, statusValue), new Function() { + @Override + public Boolean apply(@Nullable final Void input) { + return Boolean.TRUE; + } + }); } }); } - private ListenableFuture syncPolicy(final Configuration dataAfter, DsAction action) { + private ListenableFuture> syncPolicy(final Configuration dataAfter, DsAction action) { if (dataAfter.getRendererEndpoints() == null || dataAfter.getRendererEndpoints().getRendererEndpoint() == null) { LOG.debug("no configuration obtained - skipping"); - return Futures.immediateFuture(true); + return Futures.immediateFuture(Optional.empty()); } + + final PolicyConfigurationContext context = new PolicyConfigurationContext(); final Map policyWriterPerDeviceCache = new HashMap<>(); for (RendererEndpoint rendererEndpoint : dataAfter.getRendererEndpoints().getRendererEndpoint()) { + // store the endpoint currently being configured + context.setCurrentRendererEP(rendererEndpoint); + if (dataAfter.getEndpoints() == null || dataAfter.getEndpoints().getAddressEndpointWithLocation() == null) { - LOG.debug("renderer-endpoint: missing address-endpoint-with-location"); - //TODO: dump all resolvedRule-rule-peerEP-EP combinantions to status + final String info = "renderer-endpoint: missing address-endpoint-with-location"; + context.appendUnconfiguredRendererEP(StatusUtil.assembleFullyNotConfigurableRendererEP(context, info)); continue; } final List endpointsWithLocation = dataAfter.getEndpoints() @@ -114,8 +118,8 @@ public class PolicyManagerImpl implements PolicyManager { final InstanceIdentifier mountpointIid = PolicyManagerUtil.getAbsoluteLocationMountpoint(rendererEndpoint, endpointsWithLocation); final DataBroker mountpoint = nodeManager.getNodeMountPoint(mountpointIid); if (mountpoint == null) { - LOG.debug("no data-broker for mount-point [{}] available", mountpointIid); - //TODO: dump all resolvedRule-rule-peerEP-EP combinantions to status + final String info = String.format("no data-broker for mount-point [%s] available", mountpointIid); + context.appendUnconfiguredRendererEP(StatusUtil.assembleFullyNotConfigurableRendererEP(context, info)); continue; } @@ -127,54 +131,65 @@ public class PolicyManagerImpl implements PolicyManager { final NodeId nodeId = nodeManager.getNodeIdByMountpointIid(mountpointIid); final String managementIpAddress = nodeManager.getNodeManagementIpByMountPointIid(mountpointIid); if (interfaceName == null || managementIpAddress == null) { - LOG.debug("can not create policyWriter: interface={}, managementIpAddress={}", + final String info = String.format("can not create policyWriter: interface=%s, managementIpAddress=%s", interfaceName, managementIpAddress); - //TODO: dump all resolvedRule-rule-peerEP-EP combinantions to status + context.appendUnconfiguredRendererEP(StatusUtil.assembleFullyNotConfigurableRendererEP(context, info)); continue; } policyWriter = new PolicyWriter(mountpoint, interfaceName, managementIpAddress, policyMapName, nodeId); policyWriterPerDeviceCache.put(mountpoint, policyWriter); } + // assign policyWriter for current mount-point + context.setPolicyWriter(policyWriter); + final Sgt sourceSgt = PolicyManagerUtil.findSgtTag(rendererEndpoint, dataAfter.getEndpoints() .getAddressEndpointWithLocation()); // Peer Endpoint - for (PeerEndpointWithPolicy peerEndpoint : rendererEndpoint.getPeerEndpointWithPolicy()) { + for (PeerEndpoint peerEndpoint : rendererEndpoint.getPeerEndpoint()) { final Sgt destinationSgt = PolicyManagerUtil.findSgtTag(peerEndpoint, dataAfter.getEndpoints() .getAddressEndpointWithLocation()); if (sourceSgt == null || destinationSgt == null) { - LOG.debug("endpoint-policy: missing sgt value(sourceSgt={}, destinationSgt={})", + final String info = String.format("endpoint-policy: missing sgt value(sourceSgt=%s, destinationSgt=%s)", sourceSgt, destinationSgt); - //TODO: dump particular resolvedRule-rule-peerEP-EP combinantions to status + context.appendUnconfiguredRendererEP( + StatusUtil.assembleNotConfigurableRendererEPForPeer(context, peerEndpoint, info)); continue; } - PolicyManagerUtil.syncPolicyEntities(sourceSgt, destinationSgt, policyWriter, dataAfter, peerEndpoint, + PolicyManagerUtil.syncPolicyEntities(sourceSgt, destinationSgt, context, dataAfter, peerEndpoint, dataBroker, action); } } - //TODO: return real (cumulated) future final List> allFutureResults = new ArrayList<>(); if (action.equals(Create)) { - policyWriterPerDeviceCache.values().forEach(pw -> allFutureResults.add(pw.commitToDatastore())); + policyWriterPerDeviceCache.values().forEach((pw) -> allFutureResults.add(pw.commitToDatastore())); } else if (action.equals(Delete)) { - policyWriterPerDeviceCache.values().forEach(pw -> allFutureResults.add(pw.removeFromDatastore())); + policyWriterPerDeviceCache.values().forEach((pw) -> allFutureResults.add(pw.removeFromDatastore())); } else { LOG.info("unsupported policy manage action: {}", action); } final ListenableFuture> cumulativeResult = Futures.allAsList(allFutureResults); - return Futures.transform(cumulativeResult, new Function, Boolean>() { + return Futures.transform(cumulativeResult, new Function, Optional>() { @Nullable @Override - public Boolean apply(@Nullable final List input) { + public Optional apply(@Nullable final List input) { + //TODO: inspect if all booleans are true + LOG.trace("considering all submits as successful - otherwise there will be exception"); - return Boolean.TRUE; + final Status status = new StatusBuilder() + .setUnconfiguredEndpoints(new UnconfiguredEndpointsBuilder() + .setUnconfiguredRendererEndpoint(context.getUnconfiguredRendererEPBag()) + .build()) + .build(); + + return Optional.of(status); } }); } - private CheckedFuture reportVersion(long version) { + private CheckedFuture reportPolicy(long version, @Nonnull final Optional statusValue) { final Optional optionalReadWriteTransaction = NetconfTransactionCreator.netconfReadWriteTransaction(dataBroker); if (!optionalReadWriteTransaction.isPresent()) { @@ -185,8 +200,11 @@ public class PolicyManagerImpl implements PolicyManager { final InstanceIdentifier iid = InstanceIdentifier.create(Renderers.class) .child(Renderer.class, new RendererKey(NodeManager.iosXeRenderer)) .child(RendererPolicy.class); - readWriteTransaction.merge(LogicalDatastoreType.OPERATIONAL, iid, - new RendererPolicyBuilder().setVersion(version).build()); + final RendererPolicy rendererPolicy = new RendererPolicyBuilder() + .setVersion(version) + .setStatus(statusValue.orElse(null)) + .build(); + readWriteTransaction.merge(LogicalDatastoreType.OPERATIONAL, iid, rendererPolicy); return readWriteTransaction.submit(); } diff --git a/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/PolicyManagerUtil.java b/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/PolicyManagerUtil.java index 1d00aca03..520784b41 100644 --- a/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/PolicyManagerUtil.java +++ b/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/PolicyManagerUtil.java @@ -8,10 +8,20 @@ package org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.util; +import static org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl.ActionCase.CHAIN; +import static org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl.DsAction.Create; +import static org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl.DsAction.Delete; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.groupbasedpolicy.api.sf.ChainActionDefinition; +import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyConfigurationContext; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl; -import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.writer.PolicyWriter; 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.ios.rev160308.ClassNameType; import org.opendaylight.yang.gen.v1.urn.ios.rev160308.PolicyActionType; @@ -57,7 +67,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.r 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.AddressEndpointWithLocation; 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.renderer.endpoint.PeerEndpointWithPolicy; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpoint; 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.resolved.policy.rev150828.has.actions.Action; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.resolved.rules.ResolvedRule; @@ -67,24 +77,13 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import static org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl.ActionCase.CHAIN; -import static org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl.DsAction.Create; -import static org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl.DsAction.Delete; - public class PolicyManagerUtil { private static final Logger LOG = LoggerFactory.getLogger(PolicyManagerUtil.class); private static final String DEFAULT = "class-default"; - public static void syncPolicyEntities(final Sgt sourceSgt, final Sgt destinationSgt, PolicyWriter policyWriter, - final Configuration dataAfter, final PeerEndpointWithPolicy peerEndpoint, + public static void syncPolicyEntities(final Sgt sourceSgt, final Sgt destinationSgt, final PolicyConfigurationContext context, + final Configuration dataAfter, final PeerEndpoint peerEndpoint, final DataBroker dataBroker, final PolicyManagerImpl.DsAction action) { // Action final Map actionMap = PolicyManagerUtil.getActionInDirection(dataAfter, peerEndpoint); @@ -98,11 +97,12 @@ public class PolicyManagerUtil { // Resolve chain action - create if (actionMap.containsKey(PolicyManagerImpl.ActionCase.CHAIN) && action.equals(Create)) { - ServiceChainingUtil.resolveNewChainAction(peerEndpoint, sourceSgt, destinationSgt, actionMap, policyWriter, + ServiceChainingUtil.resolveNewChainAction(peerEndpoint, sourceSgt, destinationSgt, actionMap, context, dataBroker); } if (actionMap.containsKey(PolicyManagerImpl.ActionCase.CHAIN) && action.equals(Delete)) { - ServiceChainingUtil.removeChainAction(peerEndpoint, sourceSgt, destinationSgt, actionMap, policyWriter); + ServiceChainingUtil.removeChainAction(peerEndpoint, sourceSgt, destinationSgt, actionMap, + context.getPolicyWriter()); } } @@ -142,7 +142,7 @@ public class PolicyManagerUtil { return cmBuilder.build(); } - static TenantId getTenantId(final PeerEndpointWithPolicy peer) { + static TenantId getTenantId(final PeerEndpoint peer) { for (RuleGroupWithRendererEndpointParticipation ruleGroup : peer.getRuleGroupWithRendererEndpointParticipation()) { if (ruleGroup.getTenantId() != null) { @@ -255,7 +255,7 @@ public class PolicyManagerUtil { } - private static Map getActionInDirection(final Configuration data, final PeerEndpointWithPolicy peer) { + private static Map getActionInDirection(final Configuration data, final PeerEndpoint peer) { final Set rulesInDirection = new HashSet<>(); // Find all rules in desired direction for (RuleGroupWithRendererEndpointParticipation ruleGroupKey : diff --git a/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/ServiceChainingUtil.java b/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/ServiceChainingUtil.java index 48de2c22e..757c2e933 100644 --- a/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/ServiceChainingUtil.java +++ b/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/ServiceChainingUtil.java @@ -16,6 +16,7 @@ import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; import org.opendaylight.groupbasedpolicy.api.sf.ChainActionDefinition; +import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyConfigurationContext; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.writer.NetconfTransactionCreator; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.writer.PolicyWriter; @@ -64,7 +65,7 @@ import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.serv import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.service.path.config.service.chain.path.mode.service.index.services.service.type.choice.ServiceFunctionForwarderBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValue; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpointWithPolicy; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpoint; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.actions.Action; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; @@ -119,19 +120,23 @@ public class ServiceChainingUtil { return serviceFunctionPath; } - static void resolveNewChainAction(final PeerEndpointWithPolicy peerEndpoint, final Sgt sourceSgt, + static void resolveNewChainAction(final PeerEndpoint peerEndpoint, final Sgt sourceSgt, final Sgt destinationSgt, final Map actionMap, - PolicyWriter policyWriter, final DataBroker dataBroker) { + final PolicyConfigurationContext context, final DataBroker dataBroker) { final List policyMapEntries = new ArrayList<>(); final Action action = actionMap.get(PolicyManagerImpl.ActionCase.CHAIN); final ServiceFunctionPath servicePath = ServiceChainingUtil.getServicePath(action.getParameterValue()); if (servicePath == null || servicePath.getName() == null) { - //TODO: dump particular resolvedRule-rule-peerEP-EP combinantions to status + final String info = String.format("service-path not found (sourceSgt=%s, destinationSgt=%s)", + sourceSgt, destinationSgt); + context.appendUnconfiguredRendererEP(StatusUtil.assembleNotConfigurableRendererEPForPeer(context, peerEndpoint, info)); return; } final TenantId tenantId = PolicyManagerUtil.getTenantId(peerEndpoint); if (tenantId == null) { - //TODO: dump particular resolvedRule-rule-peerEP-EP combinantions to status + final String info = String.format("tenant-id not found (sourceSgt=%s, destinationSgt=%s)", + sourceSgt, destinationSgt); + context.appendUnconfiguredRendererEP(StatusUtil.assembleNotConfigurableRendererEPForPeer(context, peerEndpoint, info)); return; } final RenderedServicePath directPath = ServiceChainingUtil.createRenderedPath(servicePath, tenantId, dataBroker); @@ -149,19 +154,22 @@ public class ServiceChainingUtil { final Match oppositeMatch = PolicyManagerUtil.createSecurityGroupMatch(destinationSgt.getValue(), sourceSgt.getValue()); final ClassMap oppositeClassMap = PolicyManagerUtil.createClassMap(oppositeClassMapName, oppositeMatch); policyMapEntries.add(PolicyManagerUtil.createPolicyEntry(oppositeClassMapName, reversedPath, PolicyManagerImpl.ActionCase.CHAIN)); - policyWriter.cache(oppositeClassMap); + context.getPolicyWriter().cache(oppositeClassMap); } // Create appropriate service path && remote forwarder - final boolean sfcPartSuccessful = setSfcPart(servicePath, directPath, reversedPath, policyWriter); + final boolean sfcPartSuccessful = setSfcPart(servicePath, directPath, reversedPath, context.getPolicyWriter()); if (!sfcPartSuccessful) { - //TODO: dump particular resolvedRule-rule-peerEP-EP combinantions to status + //TODO: extract resolved-rule name + final String info = String.format("failed during sfc-part execution (sourceSgt=%s, destinationSgt=%s)", + sourceSgt, destinationSgt); + //context.appendUnconfiguredRendererEP(StatusUtil.assembleNotConfigurableRendererEPForPeerAndAction(context, peerEndpoint, info)); return; } - policyWriter.cache(classMap); - policyWriter.cache(policyMapEntries); + context.getPolicyWriter().cache(classMap); + context.getPolicyWriter().cache(policyMapEntries); } - static void removeChainAction(final PeerEndpointWithPolicy peerEndpoint, final Sgt sourceSgt, final Sgt destinationSgt, + static void removeChainAction(final PeerEndpoint peerEndpoint, final Sgt sourceSgt, final Sgt destinationSgt, final Map actionMap, PolicyWriter policyWriter) { final Action action = actionMap.get(PolicyManagerImpl.ActionCase.CHAIN); final ServiceFunctionPath servicePath = ServiceChainingUtil.getServicePath(action.getParameterValue()); diff --git a/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/StatusUtil.java b/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/StatusUtil.java new file mode 100644 index 000000000..8f8cb2086 --- /dev/null +++ b/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/StatusUtil.java @@ -0,0 +1,92 @@ +/* + * 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.util; + +import com.google.common.annotations.VisibleForTesting; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyConfigurationContext; +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.unconfigured.rule.groups.UnconfiguredRuleGroup; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.unconfigured.rule.groups.UnconfiguredRuleGroupBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.Status; +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.renderer.endpoint.PeerEndpoint; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.status.unconfigured.endpoints.UnconfiguredRendererEndpoint; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.status.unconfigured.endpoints.UnconfiguredRendererEndpointBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.status.unconfigured.endpoints.unconfigured.renderer.endpoint.UnconfiguredPeerEndpoint; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.status.unconfigured.endpoints.unconfigured.renderer.endpoint.UnconfiguredPeerEndpointBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Purpose: assembly methods for {@link Status}. + */ +public class StatusUtil { + + private static final Logger LOG = LoggerFactory.getLogger(StatusUtil.class); + + private StatusUtil() { + throw new IllegalAccessError("instance of util class not supported"); + } + + /** + * @param context holder of actual configuration state + * @param info detailed message for not configurable item + * @return ful collection of not configurable items under given endpoint + */ + public static UnconfiguredRendererEndpoint assembleFullyNotConfigurableRendererEP(final PolicyConfigurationContext context, + final String info) { + final RendererEndpoint rendererEndpoint = context.getCurrentRendererEP(); + LOG.trace("fully not configurable EP: {}", info); + return new UnconfiguredRendererEndpointBuilder(rendererEndpoint) + .setUnconfiguredPeerEndpoint(assemblePeerEndpoint(rendererEndpoint.getPeerEndpoint().stream())) + .setInfo(info) + .build(); + } + + /** + * @param context holder of actual configuration state + * @param info detailed message for not configurable item + * @return filtered collection of not configurable items under given endpoint and peer + */ + public static UnconfiguredRendererEndpoint assembleNotConfigurableRendererEPForPeer(final PolicyConfigurationContext context, + final PeerEndpoint peerEndpoint, + final String info) { + final RendererEndpoint rendererEndpoint = context.getCurrentRendererEP(); + LOG.trace("not configurable EP for peer: {}", info); + return new UnconfiguredRendererEndpointBuilder(rendererEndpoint) + .setUnconfiguredPeerEndpoint(assemblePeerEndpoint(Stream.of(peerEndpoint))) + .setInfo(info) + .build(); + } + + @VisibleForTesting + static List assemblePeerEndpoint(final Stream peerEndpoint) { + return peerEndpoint + .map((peerEP) -> new UnconfiguredPeerEndpointBuilder(peerEP) + .setUnconfiguredRuleGroup( + assembleRuleGroups(peerEP.getRuleGroupWithRendererEndpointParticipation().stream()) + ).build()) + .collect(Collectors.toList()); + } + + @VisibleForTesting + static List assembleRuleGroups(final Stream stream) { + return stream + .filter(Objects::nonNull) + .map((ruleGroup) -> new UnconfiguredRuleGroupBuilder(ruleGroup) + .setRendererEndpointParticipation(ruleGroup.getRendererEndpointParticipation()) + // TODO: find rule-group and append names of resolved rules ...setUnconfiguredResolvedRule() + .build()) + .collect(Collectors.toList()); + } +} diff --git a/renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/manager/PolicyManagerImplTest.java b/renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/manager/PolicyManagerImplTest.java index 100ba97ec..5ce6a8605 100644 --- a/renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/manager/PolicyManagerImplTest.java +++ b/renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/manager/PolicyManagerImplTest.java @@ -10,9 +10,9 @@ 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 org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -65,8 +65,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.r 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.PeerEndpointWithPolicyBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpointWithPolicyKey; +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; @@ -88,8 +88,6 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; -import com.google.common.util.concurrent.ListenableFuture; - @RunWith(PowerMockRunner.class) @PrepareForTest({RendererPolicyUtil.class, PolicyManagerUtil.class, SfcProviderServiceForwarderAPI.class}) public class PolicyManagerImplTest { @@ -355,14 +353,14 @@ public class PolicyManagerImplTest { private RendererEndpoint createRendererEndpoint(ContextId contextId_1, ContextId contextId_2, RuleGroupWithRendererEndpointParticipation ruleGroup) { - PeerEndpointWithPolicyBuilder peerEndpointWithPolicyBuilder = new PeerEndpointWithPolicyBuilder(); - peerEndpointWithPolicyBuilder.setKey(new PeerEndpointWithPolicyKey(address, IpPrefixType.class, contextId_1, + 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)) - .setPeerEndpointWithPolicy(Collections.singletonList(peerEndpointWithPolicyBuilder.build())); + .setPeerEndpoint(Collections.singletonList(PeerEndpointBuilder.build())); return rendererEndpointBuilder.build(); } diff --git a/renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/ServiceChainingUtilTest.java b/renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/ServiceChainingUtilTest.java index 9e3096e5c..cef31b34a 100644 --- a/renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/ServiceChainingUtilTest.java +++ b/renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/ServiceChainingUtilTest.java @@ -27,13 +27,11 @@ import org.mockito.Captor; import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.internal.verification.Times; import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; import org.opendaylight.groupbasedpolicy.api.sf.ChainActionDefinition; +import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyConfigurationContext; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.writer.NetconfTransactionCreator; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.writer.PolicyWriter; @@ -59,22 +57,24 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types. import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address; import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.ClassMap; import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.ServiceChain; -import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.ServiceChainBuilder; import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.policy.map.Class; -import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.ServicePathBuilder; import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.service.function.forwarder.Local; -import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.service.function.forwarder.LocalBuilder; import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.service.function.forwarder.ServiceFfName; import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.service.path.config.service.chain.path.mode.service.index.services.ServiceTypeChoice; import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.service.path.config.service.chain.path.mode.service.index.services.service.type.choice.ServiceFunction; import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.service.path.config.service.chain.path.mode.service.index.services.service.type.choice.ServiceFunctionForwarder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContextId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName; 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.L3Context; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValue; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValueBuilder; 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.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpointWithPolicy; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpointWithPolicyBuilder; +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.renderer.endpoint.PeerEndpoint; +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.resolved.policy.rev150828.has.actions.Action; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.actions.ActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt; @@ -118,6 +118,8 @@ public class ServiceChainingUtilTest { @Mock private ReadWriteTransaction rwTx; + private PolicyConfigurationContext policyConfigurationContext; + @Before public void setUp() throws Exception { final NodeId currentNodeId = new NodeId("unit-node-01"); @@ -128,6 +130,9 @@ public class ServiceChainingUtilTest { Mockito.when(policyWriter.getCurrentMountpoint()).thenReturn(dataBroker); Mockito.when(dataBroker.newReadWriteTransaction()).thenReturn(rwTx); + + policyConfigurationContext = new PolicyConfigurationContext(); + policyConfigurationContext.setPolicyWriter(policyWriter); } @Test @@ -152,7 +157,7 @@ public class ServiceChainingUtilTest { @Test public void testResolveChainAction_full() throws Exception { - final PeerEndpointWithPolicy peerEndpoint = createPeerEndpointWithPolicy(); + final PeerEndpoint peerEndpoint = createPeerEndpoint(); final Sgt sourceSgt = new Sgt(1); final Sgt destinationSgt = new Sgt(2); final Map actionMap = createActionMap(); @@ -170,7 +175,7 @@ public class ServiceChainingUtilTest { stub(method(SfcProviderRenderedPathAPI.class, "readRenderedServicePath")).toReturn(rsp); stub(method(ServiceChainingUtil.class, "setSfcPart")).toReturn(true); - ServiceChainingUtil.resolveNewChainAction(peerEndpoint, sourceSgt, destinationSgt, actionMap, policyWriter, dataBroker); + ServiceChainingUtil.resolveNewChainAction(peerEndpoint, sourceSgt, destinationSgt, actionMap, policyConfigurationContext, dataBroker); Mockito.verify(policyWriter).cache(classMapCaptor.capture()); Mockito.verify(policyWriter).cache(listClassCaptor.capture()); @@ -180,7 +185,7 @@ public class ServiceChainingUtilTest { @Test public void testResolveChainAction_fullSymmetric() throws Exception { - final PeerEndpointWithPolicy peerEndpoint = createPeerEndpointWithPolicy(); + final PeerEndpoint peerEndpoint = createPeerEndpoint(); final Sgt sourceSgt = new Sgt(1); final Sgt destinationSgt = new Sgt(2); final Map actionMap = createActionMap(); @@ -198,7 +203,7 @@ public class ServiceChainingUtilTest { stub(method(SfcProviderRenderedPathAPI.class, "readRenderedServicePath")).toReturn(rsp); stub(method(ServiceChainingUtil.class, "setSfcPart")).toReturn(true); - ServiceChainingUtil.resolveNewChainAction(peerEndpoint, sourceSgt, destinationSgt, actionMap, policyWriter, dataBroker); + ServiceChainingUtil.resolveNewChainAction(peerEndpoint, sourceSgt, destinationSgt, actionMap, policyConfigurationContext, dataBroker); Mockito.verify(policyWriter, Mockito.times(2)).cache(classMapCaptor.capture()); Mockito.verify(policyWriter).cache(listClassCaptor.capture()); @@ -208,7 +213,7 @@ public class ServiceChainingUtilTest { @Test public void testResolveChainAction_partial01() throws Exception { - final PeerEndpointWithPolicy peerEndpoint = createPeerEndpointWithPolicy(); + final PeerEndpoint peerEndpoint = createPeerEndpoint(); final Sgt sourceSgt = new Sgt(1); final Sgt destinationSgt = new Sgt(2); final Map actionMap = createActionMap(); @@ -227,7 +232,12 @@ public class ServiceChainingUtilTest { stub(method(ServiceChainingUtil.class, "setSfcPart")).toReturn(true); stub(method(ServiceChainingUtil.class, "createSymmetricRenderedPath")).toReturn(null); - ServiceChainingUtil.resolveNewChainAction(peerEndpoint, sourceSgt, destinationSgt, actionMap, policyWriter, dataBroker); + policyConfigurationContext.setCurrentRendererEP(createRendererEP( + "unit-address", new ContextId("unit-conext-1"), Collections.emptyList()) + ); + + ServiceChainingUtil.resolveNewChainAction(peerEndpoint, sourceSgt, destinationSgt, actionMap, + policyConfigurationContext, dataBroker); Mockito.verify(policyWriter, Mockito.times(2)).cache(classMapCaptor.capture()); Mockito.verify(policyWriter).cache(listClassCaptor.capture()); Mockito.verifyNoMoreInteractions(policyWriter); @@ -235,7 +245,7 @@ public class ServiceChainingUtilTest { @Test public void testResolveChainAction_partial02() throws Exception { - final PeerEndpointWithPolicy peerEndpoint = createPeerEndpointWithPolicy(); + final PeerEndpoint peerEndpoint = createPeerEndpoint(); final Sgt sourceSgt = new Sgt(1); final Sgt destinationSgt = new Sgt(2); final Map actionMap = createActionMap(); @@ -253,14 +263,14 @@ public class ServiceChainingUtilTest { stub(method(SfcProviderRenderedPathAPI.class, "readRenderedServicePath")).toReturn(rsp); stub(method(ServiceChainingUtil.class, "setSfcPart")).toReturn(false); - ServiceChainingUtil.resolveNewChainAction(peerEndpoint, sourceSgt, destinationSgt, actionMap, policyWriter, dataBroker); + ServiceChainingUtil.resolveNewChainAction(peerEndpoint, sourceSgt, destinationSgt, actionMap, policyConfigurationContext, dataBroker); Mockito.verifyNoMoreInteractions(policyWriter); } @Test public void testResolveChainAction_partial03() throws Exception { - final PeerEndpointWithPolicy peerEndpoint = createPeerEndpointWithPolicy(null); + final PeerEndpoint peerEndpoint = createPeerEndpoint(null); final Sgt sourceSgt = new Sgt(1); final Sgt destinationSgt = new Sgt(2); final Map actionMap = createActionMap(); @@ -277,20 +287,28 @@ public class ServiceChainingUtilTest { final RenderedServicePath rsp = createRsp("unit-rsp-02"); stub(method(SfcProviderRenderedPathAPI.class, "readRenderedServicePath")).toReturn(rsp); - ServiceChainingUtil.resolveNewChainAction(peerEndpoint, sourceSgt, destinationSgt, actionMap, policyWriter, dataBroker); + policyConfigurationContext.setCurrentRendererEP(createRendererEP( + "unit-address", new ContextId("unit-conext-1"), Collections.emptyList()) + ); + + ServiceChainingUtil.resolveNewChainAction(peerEndpoint, sourceSgt, destinationSgt, actionMap, policyConfigurationContext, dataBroker); Mockito.verifyNoMoreInteractions(policyWriter); } @Test public void testResolveChainAction_partial04() throws Exception { - final PeerEndpointWithPolicy peerEndpoint = createPeerEndpointWithPolicy(null); + final PeerEndpoint peerEndpoint = createPeerEndpoint(null); final Sgt sourceSgt = new Sgt(1); final Sgt destinationSgt = new Sgt(2); final Map actionMap = createActionMap(false); final String classMapName = "unit-class-map-name-01"; - ServiceChainingUtil.resolveNewChainAction(peerEndpoint, sourceSgt, destinationSgt, actionMap, policyWriter, dataBroker); + policyConfigurationContext.setCurrentRendererEP(createRendererEP( + "unit-address", new ContextId("unit-conext-1"), Collections.emptyList()) + ); + + ServiceChainingUtil.resolveNewChainAction(peerEndpoint, sourceSgt, destinationSgt, actionMap, policyConfigurationContext, dataBroker); Mockito.verifyNoMoreInteractions(policyWriter); } @@ -312,12 +330,22 @@ public class ServiceChainingUtilTest { return actionMap; } - private PeerEndpointWithPolicy createPeerEndpointWithPolicy() { - return createPeerEndpointWithPolicy(new TenantId("unit-tenant-06")); + private RendererEndpoint createRendererEP(final String address, final ContextId contextId, final List peerEndpoints) { + return new RendererEndpointBuilder() + .setAddress(address) + .setAddressType(IpPrefixType.class) + .setContextId(contextId) + .setContextType(L3Context.class) + .setPeerEndpoint(peerEndpoints) + .build(); + } + + private PeerEndpoint createPeerEndpoint() { + return createPeerEndpoint(new TenantId("unit-tenant-06")); } - private PeerEndpointWithPolicy createPeerEndpointWithPolicy(final TenantId tenantId) { - return new PeerEndpointWithPolicyBuilder() + private PeerEndpoint createPeerEndpoint(final TenantId tenantId) { + return new PeerEndpointBuilder() .setRuleGroupWithRendererEndpointParticipation(Collections.singletonList( new RuleGroupWithRendererEndpointParticipationBuilder() .setTenantId(tenantId) diff --git a/renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/StatusUtilTest.java b/renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/StatusUtilTest.java new file mode 100644 index 000000000..9b1fdb022 --- /dev/null +++ b/renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/StatusUtilTest.java @@ -0,0 +1,154 @@ +/* + * 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.util; + +import com.google.common.collect.Lists; +import java.util.Collections; +import java.util.List; +import java.util.stream.Stream; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyConfigurationContext; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.AddressEndpointKey; +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.L3Context; +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.unconfigured.rule.groups.UnconfiguredRuleGroup; +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.renderer.endpoint.PeerEndpoint; +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.status.unconfigured.endpoints.UnconfiguredRendererEndpoint; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.status.unconfigured.endpoints.unconfigured.renderer.endpoint.UnconfiguredPeerEndpoint; + +/** + * Test for {@link StatusUtil}. + */ +public class StatusUtilTest { + + public static final TenantId TENANT_ID = new TenantId("unit-tenant-1"); + public static final SubjectName SUBJECT_NAME = new SubjectName("unit-subject-1"); + public static final ContractId CONTRACT_ID = new ContractId("unit-contract-1"); + public static final String ADDRESS_1 = "unit-address-1"; + public static final ContextId CONTEXT_ID_1 = new ContextId("unit-context-1"); + public static final String ADDRESS_2 = "unit-address-2"; + public static final ContextId CONTEXT_ID_2 = new ContextId("unit-context-2"); + public static final String INFO_MESSAGE = "unit-info-1"; + private PolicyConfigurationContext context; + + @Before + public void setUp() throws Exception { + context = new PolicyConfigurationContext(); + } + + @Test + public void testAssembleFullyNotConfigurableRendererEP() throws Exception { + final PeerEndpoint peer1 = createPeer(ADDRESS_1, CONTEXT_ID_1); + final PeerEndpoint peer2 = createPeer(ADDRESS_2, CONTEXT_ID_2); + final RendererEndpoint rendererEP = createRendererEP(ADDRESS_1, CONTEXT_ID_1, + Lists.newArrayList(peer1, peer2) + ); + context.setCurrentRendererEP(rendererEP); + + final UnconfiguredRendererEndpoint actual = StatusUtil.assembleFullyNotConfigurableRendererEP(context, INFO_MESSAGE); + + compareEPs(rendererEP, actual); + Assert.assertNull(actual.getUnconfiguredPeerExternalEndpoint()); + Assert.assertNull(actual.getUnconfiguredPeerExternalContainmentEndpoint()); + + final List unconfiguredPeerEndpoints = actual.getUnconfiguredPeerEndpoint(); + Assert.assertEquals(2, unconfiguredPeerEndpoints.size()); + compareEPs(peer1, unconfiguredPeerEndpoints.get(0)); + Assert.assertTrue(unconfiguredPeerEndpoints.get(0).getUnconfiguredRuleGroup().isEmpty()); + compareEPs(peer2, unconfiguredPeerEndpoints.get(1)); + Assert.assertTrue(unconfiguredPeerEndpoints.get(1).getUnconfiguredRuleGroup().isEmpty()); + } + + private PeerEndpoint createPeer(final String address, final ContextId contextId) { + return new PeerEndpointBuilder(createRendererEP(address, contextId, Collections.emptyList())) + .setRuleGroupWithRendererEndpointParticipation(Collections.emptyList()) + .build(); + } + + private RendererEndpoint createRendererEP(final String address, final ContextId contextId, final List peerEndpoints) { + return new RendererEndpointBuilder() + .setAddress(address) + .setAddressType(IpPrefixType.class) + .setContextId(contextId) + .setContextType(L3Context.class) + .setPeerEndpoint(peerEndpoints) + .build(); + } + + @Test + public void testAssembleNotConfigurableRendererEPForPeer() throws Exception { + final PeerEndpoint peer1 = createPeer(ADDRESS_1, CONTEXT_ID_1); + final PeerEndpoint peer2 = createPeer(ADDRESS_2, CONTEXT_ID_2); + final RendererEndpoint rendererEP = createRendererEP(ADDRESS_1, CONTEXT_ID_1, + Lists.newArrayList(peer1, peer2) + ); + context.setCurrentRendererEP(rendererEP); + + final UnconfiguredRendererEndpoint actual = StatusUtil.assembleNotConfigurableRendererEPForPeer(context, peer1, INFO_MESSAGE); + + compareEPs(rendererEP, actual); + Assert.assertNull(actual.getUnconfiguredPeerExternalEndpoint()); + Assert.assertNull(actual.getUnconfiguredPeerExternalContainmentEndpoint()); + + final List unconfiguredPeerEndpoints = actual.getUnconfiguredPeerEndpoint(); + Assert.assertEquals(1, unconfiguredPeerEndpoints.size()); + compareEPs(peer1, unconfiguredPeerEndpoints.get(0)); + Assert.assertTrue(unconfiguredPeerEndpoints.get(0).getUnconfiguredRuleGroup().isEmpty()); + } + + @Test + public void testAssemblePeerEndpoint() throws Exception { + final PeerEndpoint peerEndpoint = createPeer(ADDRESS_1, CONTEXT_ID_1); + final List gatheredPeers = StatusUtil.assemblePeerEndpoint(Stream.of(peerEndpoint)); + + Assert.assertEquals(1, gatheredPeers.size()); + final UnconfiguredPeerEndpoint actual = gatheredPeers.get(0); + compareEPs(peerEndpoint, actual); + Assert.assertTrue(actual.getUnconfiguredRuleGroup().isEmpty()); + } + + private void compareEPs(final AddressEndpointKey peerEndpoint, final AddressEndpointKey actual) { + Assert.assertEquals(peerEndpoint.getAddress(), actual.getAddress()); + Assert.assertEquals(peerEndpoint.getAddressType(), actual.getAddressType()); + Assert.assertEquals(peerEndpoint.getContextId(), actual.getContextId()); + Assert.assertEquals(peerEndpoint.getContextType(), actual.getContextType()); + } + + @Test + public void testAssembleRuleGroups() throws Exception { + final RuleGroupWithRendererEndpointParticipation ruleGroup = + new RuleGroupWithRendererEndpointParticipationBuilder() + .setTenantId(TENANT_ID) + .setSubjectName(SUBJECT_NAME) + .setContractId(CONTRACT_ID) + .setRendererEndpointParticipation(EndpointPolicyParticipation.CONSUMER) + .build(); + final List gatheredRuleGroups = StatusUtil.assembleRuleGroups(Stream.of(ruleGroup)); + + Assert.assertEquals(1, gatheredRuleGroups.size()); + final UnconfiguredRuleGroup actual = gatheredRuleGroups.get(0); + Assert.assertEquals(TENANT_ID, actual.getTenantId()); + Assert.assertEquals(SUBJECT_NAME, actual.getSubjectName()); + Assert.assertEquals(CONTRACT_ID, actual.getContractId()); + Assert.assertEquals(null, actual.getUnconfiguredResolvedRule()); + Assert.assertEquals(EndpointPolicyParticipation.CONSUMER, actual.getRendererEndpointParticipation()); + } +} \ No newline at end of file diff --git a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/PolicyContext.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/PolicyContext.java index 815fecacf..b6b1ae363 100644 --- a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/PolicyContext.java +++ b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/PolicyContext.java @@ -8,6 +8,12 @@ package org.opendaylight.groupbasedpolicy.renderer.vpp.policy; +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSortedSet; +import com.google.common.collect.ImmutableTable; +import com.google.common.collect.ImmutableTable.Builder; +import com.google.common.collect.Maps; import java.util.Collections; import java.util.List; import java.util.Map; @@ -16,18 +22,16 @@ import java.util.Optional; import java.util.TreeSet; import java.util.function.Supplier; import java.util.stream.Collectors; - import javax.annotation.Nonnull; - import org.opendaylight.groupbasedpolicy.renderer.vpp.util.KeyFactory; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoints.address.endpoints.AddressEndpointKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.peer.endpoints.PeerEndpointKey; 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.renderer.policy.Configuration; 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.renderer.endpoints.RendererEndpoint; 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.PeerEndpointKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererForwardingContext; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererForwardingContextKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererNetworkDomain; @@ -35,13 +39,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.r 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.RuleGroupKey; -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSortedSet; -import com.google.common.collect.ImmutableTable; -import com.google.common.collect.ImmutableTable.Builder; -import com.google.common.collect.Maps; - public class PolicyContext { private final RendererPolicy policy; @@ -88,7 +85,7 @@ public class PolicyContext { new Builder<>(); Supplier> rendererPolicySupplier = () -> new TreeSet<>(); rendererEps.stream().forEach(rEp -> { - rEp.getPeerEndpointWithPolicy().stream().filter(Objects::nonNull).forEach(peer -> { + rEp.getPeerEndpoint().stream().filter(Objects::nonNull).forEach(peer -> { ImmutableSortedSet rPolicy = peer.getRuleGroupWithRendererEndpointParticipation() .stream() diff --git a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/util/KeyFactory.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/util/KeyFactory.java index 6484686f0..6024bac5b 100644 --- a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/util/KeyFactory.java +++ b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/util/KeyFactory.java @@ -10,11 +10,10 @@ package org.opendaylight.groupbasedpolicy.renderer.vpp.util; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoints.address.endpoints.AddressEndpointKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint_location_provider.rev160419.location.providers.location.provider.ProviderAddressEndpointLocationKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.peer.endpoints.PeerEndpointKey; 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.endpoints.AddressEndpointWithLocationKey; 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.PeerEndpointWithPolicyKey; +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.RuleGroupKey; public class KeyFactory { @@ -26,7 +25,7 @@ public class KeyFactory { fromKey.getContextId(), fromKey.getContextType()); } - public static PeerEndpointKey peerEndpointKey(PeerEndpointWithPolicyKey fromKey) { + public static PeerEndpointKey peerEndpointKey(PeerEndpointKey fromKey) { return new PeerEndpointKey(fromKey.getAddress(), fromKey.getAddressType(), fromKey.getContextId(), fromKey.getContextType()); } @@ -51,8 +50,8 @@ public class KeyFactory { fromKey.getContextType()); } - public static PeerEndpointWithPolicyKey peerEndpointWithPolicyKey(AddressEndpointWithLocationKey fromKey) { - return new PeerEndpointWithPolicyKey(fromKey.getAddress(), fromKey.getAddressType(), fromKey.getContextId(), + public static PeerEndpointKey peerEndpointKey(AddressEndpointWithLocationKey fromKey) { + return new PeerEndpointKey(fromKey.getAddress(), fromKey.getAddressType(), fromKey.getContextId(), fromKey.getContextType()); } diff --git a/renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/VppRendererPolicyManagerTest.java b/renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/VppRendererPolicyManagerTest.java index 25c9db47b..e4665e9f1 100644 --- a/renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/VppRendererPolicyManagerTest.java +++ b/renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/VppRendererPolicyManagerTest.java @@ -8,12 +8,14 @@ package org.opendaylight.groupbasedpolicy.renderer.vpp.policy; +import com.google.common.base.Optional; +import com.google.common.base.Strings; +import com.google.common.util.concurrent.MoreExecutors; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; - import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -70,8 +72,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.r 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.renderer.endpoint.PeerEndpointWithPolicy; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpointWithPolicyBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpoint; +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.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.resolved.policy.rev150828.has.resolved.rules.ResolvedRuleBuilder; @@ -98,10 +100,6 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology. 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 com.google.common.base.Optional; -import com.google.common.base.Strings; -import com.google.common.util.concurrent.MoreExecutors; - @RunWith(MockitoJUnitRunner.class) public class VppRendererPolicyManagerTest extends CustomDataBrokerTest { @@ -403,25 +401,25 @@ public class VppRendererPolicyManagerTest extends CustomDataBrokerTest { Stream.concat(consumers.stream(), providers.stream()).collect(Collectors.toList()); Endpoints endpoints = new EndpointsBuilder().setAddressEndpointWithLocation(eps).build(); List consumersAsRendererEps = consumers.stream().map(cons -> { - List peers = providers.stream() - .map(web -> new PeerEndpointWithPolicyBuilder() - .setKey(KeyFactory.peerEndpointWithPolicyKey(web.getKey())) + List peers = providers.stream() + .map(web -> new PeerEndpointBuilder() + .setKey(KeyFactory.peerEndpointKey(web.getKey())) .setRuleGroupWithRendererEndpointParticipation(Arrays.asList(RULE_GROUP_WITH_CONSUMER)) .build()) .collect(Collectors.toList()); return new RendererEndpointBuilder().setKey(KeyFactory.rendererEndpointKey(cons.getKey())) - .setPeerEndpointWithPolicy(peers) + .setPeerEndpoint(peers) .build(); }).collect(Collectors.toList()); List providersAsRendererEps = providers.stream().map(prov -> { - List peers = consumers.stream() - .map(client -> new PeerEndpointWithPolicyBuilder() - .setKey(KeyFactory.peerEndpointWithPolicyKey(client.getKey())) + List peers = consumers.stream() + .map(client -> new PeerEndpointBuilder() + .setKey(KeyFactory.peerEndpointKey(client.getKey())) .setRuleGroupWithRendererEndpointParticipation(Arrays.asList(RULE_GROUP_WITH_PROVIDER)) .build()) .collect(Collectors.toList()); return new RendererEndpointBuilder().setKey(KeyFactory.rendererEndpointKey(prov.getKey())) - .setPeerEndpointWithPolicy(peers) + .setPeerEndpoint(peers) .build(); }).collect(Collectors.toList()); List rendererEps = Stream -- 2.36.6