3eb2c406340798a0a763e78c860295da3e0ce299
[groupbasedpolicy.git] / renderers / vpp / src / main / java / org / opendaylight / groupbasedpolicy / renderer / vpp / policy / PolicyContext.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.groupbasedpolicy.renderer.vpp.policy;
10
11 import com.google.common.base.Preconditions;
12 import com.google.common.collect.ImmutableMap;
13 import com.google.common.collect.ImmutableSortedSet;
14 import com.google.common.collect.ImmutableTable;
15 import com.google.common.collect.ImmutableTable.Builder;
16 import com.google.common.collect.Maps;
17 import java.util.Collections;
18 import java.util.List;
19 import java.util.Map;
20 import java.util.Objects;
21 import java.util.Optional;
22 import java.util.TreeSet;
23 import java.util.function.Supplier;
24 import java.util.stream.Collectors;
25 import javax.annotation.Nonnull;
26 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.KeyFactory;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoints.address.endpoints.AddressEndpointKey;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.Policy;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.RendererPolicy;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.Configuration;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocation;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpoint;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpointKey;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpointKey;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererForwardingContext;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererForwardingContextKey;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererNetworkDomain;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererNetworkDomainKey;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.rule.groups.RuleGroup;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.rule.groups.RuleGroupKey;
42
43 public class PolicyContext {
44
45     private final RendererPolicy policy;
46     private final ImmutableTable<RendererEndpointKey, PeerEndpointKey, ImmutableSortedSet<RendererResolvedPolicy>> policyTable;
47     private final ImmutableMap<RuleGroupKey, ResolvedRuleGroup> ruleGroupByKey;
48     private final ImmutableMap<AddressEndpointKey, AddressEndpointWithLocation> addrEpByKey;
49     private final ImmutableTable<TenantId, RendererForwardingContextKey, RendererForwardingContext> forwardingCtxTable;
50     private final ImmutableTable<TenantId, RendererNetworkDomainKey, RendererNetworkDomain> networkDomainTable;
51
52     public PolicyContext(@Nonnull RendererPolicy policy) {
53         this.policy = Preconditions.checkNotNull(policy);
54         Optional<Configuration> optConfig = resolveValidConfig(policy);
55         if (optConfig.isPresent()) {
56             Configuration config = optConfig.get();
57             this.ruleGroupByKey = resolveRuleGroups(config);
58             List<RendererEndpoint> rendererEps = resolveRendererEndpoints(config);
59             this.policyTable = resolvePolicy(rendererEps, ruleGroupByKey);
60             addrEpByKey = resolveAddrEpWithLoc(config);
61             this.forwardingCtxTable = resolveForwardingCtxTable(config);
62             this.networkDomainTable = resolveNetworkDomainTable(config);
63         } else {
64             this.ruleGroupByKey = ImmutableMap.of();
65             this.policyTable = ImmutableTable.of();
66             this.addrEpByKey = ImmutableMap.of();
67             this.forwardingCtxTable = ImmutableTable.of();
68             this.networkDomainTable = ImmutableTable.of();
69         }
70     }
71
72     private static List<RendererEndpoint> resolveRendererEndpoints(Configuration config) {
73         if (config.getRendererEndpoints() == null) {
74             return Collections.emptyList();
75         }
76         List<RendererEndpoint> rendererEndpoints = config.getRendererEndpoints().getRendererEndpoint();
77         if (rendererEndpoints == null) {
78             return Collections.emptyList();
79         }
80         return rendererEndpoints;
81     }
82
83     private static ImmutableTable<RendererEndpointKey, PeerEndpointKey, ImmutableSortedSet<RendererResolvedPolicy>> resolvePolicy(
84             List<RendererEndpoint> rendererEps, Map<RuleGroupKey, ResolvedRuleGroup> ruleGroupInfoByRuleGroupKey) {
85         Builder<RendererEndpointKey, PeerEndpointKey, ImmutableSortedSet<RendererResolvedPolicy>> resultBuilder =
86                 new Builder<>();
87         Supplier<TreeSet<RendererResolvedPolicy>> rendererPolicySupplier = () -> new TreeSet<>();
88         rendererEps.stream().forEach(rEp -> {
89             rEp.getPeerEndpoint().stream().filter(Objects::nonNull).forEach(peer -> {
90                 ImmutableSortedSet<RendererResolvedPolicy> rPolicy =
91                         peer.getRuleGroupWithRendererEndpointParticipation()
92                             .stream()
93                             .map(ruleGroup -> new RendererResolvedPolicy(ruleGroup.getRendererEndpointParticipation(),
94                                     ruleGroupInfoByRuleGroupKey.get(KeyFactory.ruleGroupKey(ruleGroup.getKey()))))
95                             .collect(Collectors.collectingAndThen(Collectors.toCollection(rendererPolicySupplier),
96                                     ImmutableSortedSet::copyOfSorted));
97                 resultBuilder.put(rEp.getKey(), KeyFactory.peerEndpointKey(peer.getKey()),
98                         ImmutableSortedSet.copyOfSorted(rPolicy));
99             });
100         });
101         return resultBuilder.build();
102     }
103
104     private static ImmutableMap<RuleGroupKey, ResolvedRuleGroup> resolveRuleGroups(Configuration config) {
105         return config.getRuleGroups().getRuleGroup().stream().collect(Collectors
106             .collectingAndThen(Collectors.toMap(RuleGroup::getKey, ResolvedRuleGroup::new), ImmutableMap::copyOf));
107     }
108
109     private static ImmutableTable<TenantId, RendererForwardingContextKey, RendererForwardingContext> resolveForwardingCtxTable(
110             Configuration config) {
111         Builder<TenantId, RendererForwardingContextKey, RendererForwardingContext> resultBuilder = new Builder<>();
112         Optional.ofNullable(config.getRendererForwarding()).map(x -> x.getRendererForwardingByTenant()).ifPresent(x -> {
113             x.forEach(fwdByTenant -> {
114                 Optional.ofNullable(fwdByTenant.getRendererForwardingContext()).ifPresent(fwdCtxs -> {
115                     fwdCtxs.forEach(fwdCtx -> {
116                         resultBuilder.put(fwdByTenant.getTenantId(), fwdCtx.getKey(), fwdCtx);
117                     });
118                 });
119             });
120         });
121         return resultBuilder.build();
122     }
123
124     private static ImmutableTable<TenantId, RendererNetworkDomainKey, RendererNetworkDomain> resolveNetworkDomainTable(
125             Configuration config) {
126         Builder<TenantId, RendererNetworkDomainKey, RendererNetworkDomain> resultBuilder = new Builder<>();
127         Optional.ofNullable(config.getRendererForwarding()).map(x -> x.getRendererForwardingByTenant()).ifPresent(x -> {
128             x.forEach(fwdByTenant -> {
129                 Optional.ofNullable(fwdByTenant.getRendererNetworkDomain()).ifPresent(netDomains -> {
130                     netDomains.forEach(netDomain -> {
131                         resultBuilder.put(fwdByTenant.getTenantId(), netDomain.getKey(), netDomain);
132                     });
133                 });
134             });
135         });
136         return resultBuilder.build();
137     }
138
139     private static ImmutableMap<AddressEndpointKey, AddressEndpointWithLocation> resolveAddrEpWithLoc(
140             Configuration config) {
141         return Maps.uniqueIndex(config.getEndpoints().getAddressEndpointWithLocation(),
142                 new com.google.common.base.Function<AddressEndpointWithLocation, AddressEndpointKey>() {
143
144                     @Override
145                     public AddressEndpointKey apply(AddressEndpointWithLocation input) {
146                         return new AddressEndpointKey(input.getAddress(), input.getAddressType(), input.getContextId(),
147                                 input.getContextType());
148                     }
149                 });
150     }
151
152     private static Optional<Configuration> resolveValidConfig(RendererPolicy policy) {
153         Configuration config = policy.getConfiguration();
154         if (config == null) {
155             return Optional.empty();
156         }
157         if (config.getRendererEndpoints() == null) {
158             return Optional.empty();
159         }
160         return Optional.of(config);
161     }
162
163     public @Nonnull RendererPolicy getPolicy() {
164         return policy;
165     }
166
167     public @Nonnull ImmutableTable<RendererEndpointKey, PeerEndpointKey, ImmutableSortedSet<RendererResolvedPolicy>> getPolicyTable() {
168         return policyTable;
169     }
170
171     public @Nonnull ImmutableMap<RuleGroupKey, ResolvedRuleGroup> getRuleGroupByKey() {
172         return ruleGroupByKey;
173     }
174
175     public @Nonnull ImmutableMap<AddressEndpointKey, AddressEndpointWithLocation> getAddrEpByKey() {
176         return addrEpByKey;
177     }
178
179     public @Nonnull ImmutableTable<TenantId, RendererForwardingContextKey, RendererForwardingContext> getForwardingCtxTable() {
180         return forwardingCtxTable;
181     }
182
183     public @Nonnull ImmutableTable<TenantId, RendererNetworkDomainKey, RendererNetworkDomain> getNetworkDomainTable() {
184         return networkDomainTable;
185     }
186
187     @Override
188     public String toString() {
189         return "PolicyContext [policyTable=" + policyTable + ", ruleGroupByKey=" + ruleGroupByKey + ", addrEpByKey="
190                 + addrEpByKey + ", forwardingCtxTable=" + forwardingCtxTable + ", networkDomainTable="
191                 + networkDomainTable + "]";
192     }
193
194 }