Merge "Resolved policy sidepanel"
[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 java.util.Collections;
12 import java.util.List;
13 import java.util.Map;
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;
19
20 import javax.annotation.Nonnull;
21
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.renderer.rev151103.has.peer.endpoints.PeerEndpointKey;
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.rule.groups.RuleGroup;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.rule.groups.RuleGroupKey;
32
33 import com.google.common.base.Preconditions;
34 import com.google.common.collect.ImmutableMap;
35 import com.google.common.collect.ImmutableSortedSet;
36 import com.google.common.collect.ImmutableTable;
37 import com.google.common.collect.ImmutableTable.Builder;
38 import com.google.common.collect.Maps;
39
40 public class PolicyContext {
41
42     private final RendererPolicy policy;
43     private final ImmutableTable<RendererEndpointKey, PeerEndpointKey, ImmutableSortedSet<RendererResolvedPolicy>> policyTable;
44     private final ImmutableMap<RuleGroupKey, ResolvedRuleGroup> ruleGroupByKey;
45     private final ImmutableMap<AddressEndpointKey, AddressEndpointWithLocation> addrEpByKey;
46
47     public PolicyContext(@Nonnull RendererPolicy policy) {
48         this.policy = Preconditions.checkNotNull(policy);
49         Optional<Configuration> optConfig = resolveValidConfig(policy);
50         if (optConfig.isPresent()) {
51             Configuration config = optConfig.get();
52             this.ruleGroupByKey = resolveRuleGroups(config);
53             List<RendererEndpoint> rendererEps = resolveRendererEndpoints(config);
54             this.policyTable = resolvePolicy(rendererEps, ruleGroupByKey);
55             addrEpByKey = resolveAddrEpWithLoc(config);
56         } else {
57             this.ruleGroupByKey = ImmutableMap.of();
58             this.policyTable = ImmutableTable.of();
59             this.addrEpByKey = ImmutableMap.of();
60         }
61     }
62
63     private static List<RendererEndpoint> resolveRendererEndpoints(Configuration config) {
64         if (config.getRendererEndpoints() == null) {
65             return Collections.emptyList();
66         }
67         List<RendererEndpoint> rendererEndpoints = config.getRendererEndpoints().getRendererEndpoint();
68         if (rendererEndpoints == null) {
69             return Collections.emptyList();
70         }
71         return rendererEndpoints;
72     }
73
74     private static ImmutableTable<RendererEndpointKey, PeerEndpointKey, ImmutableSortedSet<RendererResolvedPolicy>> resolvePolicy(
75             List<RendererEndpoint> rendererEps, Map<RuleGroupKey, ResolvedRuleGroup> ruleGroupInfoByRuleGroupKey) {
76         Builder<RendererEndpointKey, PeerEndpointKey, ImmutableSortedSet<RendererResolvedPolicy>> resultBuilder =
77                 new Builder<>();
78         Supplier<TreeSet<RendererResolvedPolicy>> rendererPolicySupplier = () -> new TreeSet<>();
79         rendererEps.stream().forEach(rEp -> {
80             rEp.getPeerEndpointWithPolicy().stream().filter(Objects::nonNull).forEach(peer -> {
81                 ImmutableSortedSet<RendererResolvedPolicy> rPolicy =
82                         peer.getRuleGroupWithRendererEndpointParticipation()
83                             .stream()
84                             .map(ruleGroup -> new RendererResolvedPolicy(ruleGroup.getRendererEndpointParticipation(),
85                                     ruleGroupInfoByRuleGroupKey.get(KeyFactory.ruleGroupKey(ruleGroup.getKey()))))
86                             .collect(Collectors.collectingAndThen(Collectors.toCollection(rendererPolicySupplier),
87                                     ImmutableSortedSet::copyOfSorted));
88                 resultBuilder.put(rEp.getKey(), KeyFactory.peerEndpointKey(peer.getKey()),
89                         ImmutableSortedSet.copyOfSorted(rPolicy));
90             });
91         });
92         return resultBuilder.build();
93     }
94
95     private static ImmutableMap<RuleGroupKey, ResolvedRuleGroup> resolveRuleGroups(Configuration config) {
96         return config.getRuleGroups().getRuleGroup().stream().collect(Collectors
97             .collectingAndThen(Collectors.toMap(RuleGroup::getKey, ResolvedRuleGroup::new), ImmutableMap::copyOf));
98     }
99
100     private static ImmutableMap<AddressEndpointKey, AddressEndpointWithLocation> resolveAddrEpWithLoc(
101             Configuration config) {
102         return Maps.uniqueIndex(config.getEndpoints().getAddressEndpointWithLocation(),
103                 new com.google.common.base.Function<AddressEndpointWithLocation, AddressEndpointKey>() {
104
105                     @Override
106                     public AddressEndpointKey apply(AddressEndpointWithLocation input) {
107                         return new AddressEndpointKey(input.getAddress(), input.getAddressType(), input.getContextId(),
108                                 input.getContextType());
109                     }
110                 });
111     }
112
113     private static Optional<Configuration> resolveValidConfig(RendererPolicy policy) {
114         Configuration config = policy.getConfiguration();
115         if (config == null) {
116             return Optional.empty();
117         }
118         if (config.getRendererEndpoints() == null) {
119             return Optional.empty();
120         }
121         return Optional.of(config);
122     }
123
124     public @Nonnull RendererPolicy getPolicy() {
125         return policy;
126     }
127
128     public @Nonnull ImmutableTable<RendererEndpointKey, PeerEndpointKey, ImmutableSortedSet<RendererResolvedPolicy>> getPolicyTable() {
129         return policyTable;
130     }
131
132     public @Nonnull ImmutableMap<RuleGroupKey, ResolvedRuleGroup> getRuleGroupByKey() {
133         return ruleGroupByKey;
134     }
135
136     public @Nonnull ImmutableMap<AddressEndpointKey, AddressEndpointWithLocation> getAddrEpByKey() {
137         return addrEpByKey;
138     }
139
140     @Override
141     public String toString() {
142         return "PolicyContext [policy=" + policy + ", policyTable=" + policyTable + ", ruleGroupByKey=" + ruleGroupByKey
143                 + ", addrEpByKey=" + addrEpByKey + "]";
144     }
145
146 }