2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.groupbasedpolicy.renderer.vpp.policy;
11 import java.util.Collections;
12 import java.util.List;
14 import java.util.Objects;
15 import java.util.Optional;
16 import java.util.TreeSet;
17 import java.util.function.Supplier;
18 import java.util.stream.Collectors;
20 import javax.annotation.Nonnull;
22 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.KeyFactory;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoints.address.endpoints.AddressEndpointKey;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.RendererPolicy;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.Configuration;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocation;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpoint;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpointKey;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpointKey;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererForwardingContext;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererForwardingContextKey;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererNetworkDomain;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererNetworkDomainKey;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.rule.groups.RuleGroup;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.rule.groups.RuleGroupKey;
38 import com.google.common.base.Preconditions;
39 import com.google.common.collect.ImmutableMap;
40 import com.google.common.collect.ImmutableSortedSet;
41 import com.google.common.collect.ImmutableTable;
42 import com.google.common.collect.ImmutableTable.Builder;
43 import com.google.common.collect.Maps;
45 public class PolicyContext {
47 private final RendererPolicy policy;
48 private final ImmutableTable<RendererEndpointKey, PeerEndpointKey, ImmutableSortedSet<RendererResolvedPolicy>> policyTable;
49 private final ImmutableMap<RuleGroupKey, ResolvedRuleGroup> ruleGroupByKey;
50 private final ImmutableMap<AddressEndpointKey, AddressEndpointWithLocation> addrEpByKey;
51 private final ImmutableTable<TenantId, RendererForwardingContextKey, RendererForwardingContext> forwardingCtxTable;
52 private final ImmutableTable<TenantId, RendererNetworkDomainKey, RendererNetworkDomain> networkDomainTable;
54 public PolicyContext(@Nonnull RendererPolicy policy) {
55 this.policy = Preconditions.checkNotNull(policy);
56 Optional<Configuration> optConfig = resolveValidConfig(policy);
57 if (optConfig.isPresent()) {
58 Configuration config = optConfig.get();
59 this.ruleGroupByKey = resolveRuleGroups(config);
60 List<RendererEndpoint> rendererEps = resolveRendererEndpoints(config);
61 this.policyTable = resolvePolicy(rendererEps, ruleGroupByKey);
62 addrEpByKey = resolveAddrEpWithLoc(config);
63 this.forwardingCtxTable = resolveForwardingCtxTable(config);
64 this.networkDomainTable = resolveNetworkDomainTable(config);
66 this.ruleGroupByKey = ImmutableMap.of();
67 this.policyTable = ImmutableTable.of();
68 this.addrEpByKey = ImmutableMap.of();
69 this.forwardingCtxTable = ImmutableTable.of();
70 this.networkDomainTable = ImmutableTable.of();
74 private static List<RendererEndpoint> resolveRendererEndpoints(Configuration config) {
75 if (config.getRendererEndpoints() == null) {
76 return Collections.emptyList();
78 List<RendererEndpoint> rendererEndpoints = config.getRendererEndpoints().getRendererEndpoint();
79 if (rendererEndpoints == null) {
80 return Collections.emptyList();
82 return rendererEndpoints;
85 private static ImmutableTable<RendererEndpointKey, PeerEndpointKey, ImmutableSortedSet<RendererResolvedPolicy>> resolvePolicy(
86 List<RendererEndpoint> rendererEps, Map<RuleGroupKey, ResolvedRuleGroup> ruleGroupInfoByRuleGroupKey) {
87 Builder<RendererEndpointKey, PeerEndpointKey, ImmutableSortedSet<RendererResolvedPolicy>> resultBuilder =
89 Supplier<TreeSet<RendererResolvedPolicy>> rendererPolicySupplier = () -> new TreeSet<>();
90 rendererEps.stream().forEach(rEp -> {
93 .filter(Objects::nonNull)
94 .filter(peer -> peer.getRuleGroupWithRendererEndpointParticipation() != null)
96 ImmutableSortedSet<RendererResolvedPolicy> rPolicy =
97 peer.getRuleGroupWithRendererEndpointParticipation()
99 .map(ruleGroup -> new RendererResolvedPolicy(ruleGroup.getRendererEndpointParticipation(),
100 ruleGroupInfoByRuleGroupKey.get(KeyFactory.ruleGroupKey(ruleGroup.getKey()))))
101 .collect(Collectors.collectingAndThen(Collectors.toCollection(rendererPolicySupplier),
102 ImmutableSortedSet::copyOfSorted));
103 resultBuilder.put(rEp.getKey(), KeyFactory.peerEndpointKey(peer.getKey()),
104 ImmutableSortedSet.copyOfSorted(rPolicy));
107 return resultBuilder.build();
110 private static ImmutableMap<RuleGroupKey, ResolvedRuleGroup> resolveRuleGroups(Configuration config) {
111 return config.getRuleGroups().getRuleGroup().stream().collect(Collectors
112 .collectingAndThen(Collectors.toMap(RuleGroup::getKey, ResolvedRuleGroup::new), ImmutableMap::copyOf));
115 private static ImmutableTable<TenantId, RendererForwardingContextKey, RendererForwardingContext> resolveForwardingCtxTable(
116 Configuration config) {
117 Builder<TenantId, RendererForwardingContextKey, RendererForwardingContext> resultBuilder = new Builder<>();
118 Optional.ofNullable(config.getRendererForwarding()).map(x -> x.getRendererForwardingByTenant()).ifPresent(x -> {
119 x.forEach(fwdByTenant -> {
120 Optional.ofNullable(fwdByTenant.getRendererForwardingContext()).ifPresent(fwdCtxs -> {
121 fwdCtxs.forEach(fwdCtx -> {
122 resultBuilder.put(fwdByTenant.getTenantId(), fwdCtx.getKey(), fwdCtx);
127 return resultBuilder.build();
130 private static ImmutableTable<TenantId, RendererNetworkDomainKey, RendererNetworkDomain> resolveNetworkDomainTable(
131 Configuration config) {
132 Builder<TenantId, RendererNetworkDomainKey, RendererNetworkDomain> resultBuilder = new Builder<>();
133 Optional.ofNullable(config.getRendererForwarding()).map(x -> x.getRendererForwardingByTenant()).ifPresent(x -> {
134 x.forEach(fwdByTenant -> {
135 Optional.ofNullable(fwdByTenant.getRendererNetworkDomain()).ifPresent(netDomains -> {
136 netDomains.forEach(netDomain -> {
137 resultBuilder.put(fwdByTenant.getTenantId(), netDomain.getKey(), netDomain);
142 return resultBuilder.build();
145 private static ImmutableMap<AddressEndpointKey, AddressEndpointWithLocation> resolveAddrEpWithLoc(
146 Configuration config) {
147 return Maps.uniqueIndex(config.getEndpoints().getAddressEndpointWithLocation(),
148 new com.google.common.base.Function<AddressEndpointWithLocation, AddressEndpointKey>() {
151 public AddressEndpointKey apply(AddressEndpointWithLocation input) {
152 return new AddressEndpointKey(input.getAddress(), input.getAddressType(), input.getContextId(),
153 input.getContextType());
158 private static Optional<Configuration> resolveValidConfig(RendererPolicy policy) {
159 Configuration config = policy.getConfiguration();
160 if (config == null) {
161 return Optional.empty();
163 if (config.getRendererEndpoints() == null) {
164 return Optional.empty();
166 return Optional.of(config);
169 public @Nonnull RendererPolicy getPolicy() {
173 public @Nonnull ImmutableTable<RendererEndpointKey, PeerEndpointKey, ImmutableSortedSet<RendererResolvedPolicy>> getPolicyTable() {
177 public @Nonnull ImmutableMap<RuleGroupKey, ResolvedRuleGroup> getRuleGroupByKey() {
178 return ruleGroupByKey;
181 public @Nonnull ImmutableMap<AddressEndpointKey, AddressEndpointWithLocation> getAddrEpByKey() {
185 public @Nonnull ImmutableTable<TenantId, RendererForwardingContextKey, RendererForwardingContext> getForwardingCtxTable() {
186 return forwardingCtxTable;
189 public @Nonnull ImmutableTable<TenantId, RendererNetworkDomainKey, RendererNetworkDomain> getNetworkDomainTable() {
190 return networkDomainTable;
194 public String toString() {
195 return "PolicyContext [policyTable=" + policyTable + ", ruleGroupByKey=" + ruleGroupByKey + ", addrEpByKey="
196 + addrEpByKey + ", forwardingCtxTable=" + forwardingCtxTable + ", networkDomainTable="
197 + networkDomainTable + "]";