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;
11 import java.util.ArrayList;
12 import java.util.Collections;
13 import java.util.HashMap;
14 import java.util.HashSet;
15 import java.util.List;
17 import java.util.Map.Entry;
20 import javax.annotation.Nonnull;
21 import javax.annotation.Nullable;
23 import org.opendaylight.groupbasedpolicy.api.EndpointAugmentor;
24 import org.opendaylight.groupbasedpolicy.api.NetworkDomainAugmentor;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoint.locations.AddressEndpointLocation;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoint.locations.ContainmentEndpointLocation;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoints.address.endpoints.AddressEndpoint;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoints.address.endpoints.AddressEndpointKey;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoints.containment.endpoints.ContainmentEndpoint;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoints.containment.endpoints.ContainmentEndpointKey;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.Forwarding;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.ForwardingByTenant;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.forwarding.by.tenant.ForwardingContext;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.forwarding.by.tenant.NetworkDomain;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.EndpointPolicyParticipation;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.RendererName;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.peer.endpoints.PeerEndpointKey;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.peer.external.containment.endpoints.PeerExternalContainmentEndpointKey;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.peer.external.endpoints.PeerExternalEndpointKey;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.rule.group.with.renderer.endpoint.participation.RuleGroupWithRendererEndpointParticipation;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.rule.group.with.renderer.endpoint.participation.RuleGroupWithRendererEndpointParticipationBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.Endpoints;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.EndpointsBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RendererEndpoints;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RendererEndpointsBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RendererForwarding;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RendererForwardingBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RuleGroups;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RuleGroupsBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocation;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocationBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.ContainmentEndpointWithLocation;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.ContainmentEndpointWithLocationBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpoint;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpointBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpointKey;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpointWithPolicy;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpointWithPolicyBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpointWithPolicyKey;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerExternalContainmentEndpointWithPolicy;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerExternalContainmentEndpointWithPolicyBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerExternalContainmentEndpointWithPolicyKey;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerExternalEndpointWithPolicy;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerExternalEndpointWithPolicyBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerExternalEndpointWithPolicyKey;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.RendererForwardingByTenant;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.RendererForwardingByTenantBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererForwardingContext;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererForwardingContextBuilder;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererNetworkDomain;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererNetworkDomainBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.rule.groups.RuleGroup;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.rule.groups.RuleGroupBuilder;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.resolved.policy.policy.rule.group.with.endpoint.constraints.PolicyRuleGroup;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.resolved.policy.policy.rule.group.with.endpoint.constraints.PolicyRuleGroupKey;
76 import org.opendaylight.yangtools.yang.binding.Augmentation;
77 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
79 import com.google.common.base.Function;
80 import com.google.common.base.Optional;
81 import com.google.common.base.Preconditions;
82 import com.google.common.collect.FluentIterable;
83 import com.google.common.collect.HashBasedTable;
84 import com.google.common.collect.ImmutableSet;
85 import com.google.common.collect.ImmutableTable;
86 import com.google.common.collect.Table;
88 public class RendererConfigurationBuilder {
90 private final Table<RendererEndpointKey, PeerEndpointKey, Set<RuleGroupWithRendererEndpointParticipation>> policiesByEpAndPeerEp =
91 HashBasedTable.create();
92 private final Table<RendererEndpointKey, PeerExternalEndpointKey, Set<RuleGroupWithRendererEndpointParticipation>> policiesByEpAndPeerExtEp =
93 HashBasedTable.create();
94 private final Table<RendererEndpointKey, PeerExternalContainmentEndpointKey, Set<RuleGroupWithRendererEndpointParticipation>> policiesByEpAndPeerExtCtxEp =
95 HashBasedTable.create();
96 private final Set<AddressEndpointKey> adrEpKeys = new HashSet<>();
97 private final Set<ContainmentEndpointKey> contEpKeys = new HashSet<>();
98 private final Set<PolicyRuleGroupKey> policyRuleGrpKeys = new HashSet<>();
100 public void add(RendererEndpointKey rendererEpKey, PeerEndpointKey peerEpKey, PolicyRuleGroupKey ruleGrpKey,
101 EndpointPolicyParticipation rendererEpParticipation) {
102 Set<RuleGroupWithRendererEndpointParticipation> ruleGrpWithRendererEpParticipation =
103 policiesByEpAndPeerEp.get(rendererEpKey, peerEpKey);
104 if (ruleGrpWithRendererEpParticipation == null) {
105 ruleGrpWithRendererEpParticipation = new HashSet<>();
106 policiesByEpAndPeerEp.put(rendererEpKey, peerEpKey, ruleGrpWithRendererEpParticipation);
107 adrEpKeys.add(AddressEndpointUtils.fromRendererEpKey(rendererEpKey));
108 adrEpKeys.add(AddressEndpointUtils.fromPeerEpKey(peerEpKey));
110 policyRuleGrpKeys.add(ruleGrpKey);
111 ruleGrpWithRendererEpParticipation
112 .add(toRuleGroupWithRendererEndpointParticipation(ruleGrpKey, rendererEpParticipation));
115 public void add(RendererEndpointKey rendererEpKey, PeerExternalEndpointKey peerExtEpKey,
116 PolicyRuleGroupKey ruleGrpKey, EndpointPolicyParticipation rendererEpParticipation) {
117 Set<RuleGroupWithRendererEndpointParticipation> ruleGrpWithRendererEpParticipation =
118 policiesByEpAndPeerExtEp.get(rendererEpKey, peerExtEpKey);
119 if (ruleGrpWithRendererEpParticipation == null) {
120 ruleGrpWithRendererEpParticipation = new HashSet<>();
121 policiesByEpAndPeerExtEp.put(rendererEpKey, peerExtEpKey, ruleGrpWithRendererEpParticipation);
122 adrEpKeys.add(AddressEndpointUtils.fromRendererEpKey(rendererEpKey));
123 adrEpKeys.add(AddressEndpointUtils.fromPeerExtEpKey(peerExtEpKey));
125 policyRuleGrpKeys.add(ruleGrpKey);
126 ruleGrpWithRendererEpParticipation
127 .add(toRuleGroupWithRendererEndpointParticipation(ruleGrpKey, rendererEpParticipation));
130 public void add(RendererEndpointKey rendererEpKey, PeerExternalContainmentEndpointKey peerExtContainmentEpKey,
131 PolicyRuleGroupKey ruleGrpKey, EndpointPolicyParticipation rendererEpParticipation) {
132 Set<RuleGroupWithRendererEndpointParticipation> ruleGrpWithRendererEpParticipation =
133 policiesByEpAndPeerExtCtxEp.get(rendererEpKey, peerExtContainmentEpKey);
134 if (ruleGrpWithRendererEpParticipation == null) {
135 ruleGrpWithRendererEpParticipation = new HashSet<>();
136 policiesByEpAndPeerExtCtxEp.put(rendererEpKey, peerExtContainmentEpKey, ruleGrpWithRendererEpParticipation);
137 adrEpKeys.add(AddressEndpointUtils.fromRendererEpKey(rendererEpKey));
138 contEpKeys.add(ContainmentEndpointUtils.fromPeerExtContEpKey(peerExtContainmentEpKey));
140 policyRuleGrpKeys.add(ruleGrpKey);
141 ruleGrpWithRendererEpParticipation
142 .add(toRuleGroupWithRendererEndpointParticipation(ruleGrpKey, rendererEpParticipation));
145 public static RuleGroupWithRendererEndpointParticipation toRuleGroupWithRendererEndpointParticipation(
146 PolicyRuleGroupKey ruleGrpKey, EndpointPolicyParticipation rendererEpParticipation) {
147 return new RuleGroupWithRendererEndpointParticipationBuilder().setTenantId(ruleGrpKey.getTenantId())
148 .setContractId(ruleGrpKey.getContractId())
149 .setSubjectName(ruleGrpKey.getSubjectName())
150 .setRendererEndpointParticipation(rendererEpParticipation)
154 public ImmutableTable<RendererEndpointKey, PeerEndpointKey, Set<RuleGroupWithRendererEndpointParticipation>> getPoliciesByEpAndPeerEp() {
155 return ImmutableTable.copyOf(policiesByEpAndPeerEp);
158 public ImmutableTable<RendererEndpointKey, PeerExternalEndpointKey, Set<RuleGroupWithRendererEndpointParticipation>> getPoliciesByEpAndPeerExtEp() {
159 return ImmutableTable.copyOf(policiesByEpAndPeerExtEp);
162 public ImmutableTable<RendererEndpointKey, PeerExternalContainmentEndpointKey, Set<RuleGroupWithRendererEndpointParticipation>> getPoliciesByEpAndPeerExtConEp() {
163 return ImmutableTable.copyOf(policiesByEpAndPeerExtCtxEp);
166 public ImmutableSet<AddressEndpointKey> getAddressEndpointKeys() {
167 return ImmutableSet.copyOf(adrEpKeys);
170 public ImmutableSet<ContainmentEndpointKey> getContainmentEndpointKeys() {
171 return ImmutableSet.copyOf(contEpKeys);
174 public ImmutableSet<PolicyRuleGroupKey> getPolicyRuleGroupKeys() {
175 return ImmutableSet.copyOf(policyRuleGrpKeys);
178 public @Nonnull RendererEndpoints buildRendererEndpoints() {
179 Map<RendererEndpointKey, RendererEndpointBuilder> rendererEpBuilderByKey = new HashMap<>();
180 for (RendererEndpointKey rendererEpKey : policiesByEpAndPeerEp.rowKeySet()) {
181 RendererEndpointBuilder rendererEpBuilder =
182 resolveRendererEndpointBuilder(rendererEpKey, rendererEpBuilderByKey);
183 List<PeerEndpointWithPolicy> peerEpsWithPolicy =
184 toListPeerEndpointWithPolicy(policiesByEpAndPeerEp.row(rendererEpKey));
185 rendererEpBuilder.setPeerEndpointWithPolicy(peerEpsWithPolicy);
186 rendererEpBuilderByKey.put(rendererEpKey, rendererEpBuilder);
188 for (RendererEndpointKey rendererEpKey : policiesByEpAndPeerExtEp.rowKeySet()) {
189 RendererEndpointBuilder rendererEpBuilder =
190 resolveRendererEndpointBuilder(rendererEpKey, rendererEpBuilderByKey);
191 List<PeerExternalEndpointWithPolicy> peerExtEpsWithPolicy =
192 toListPeerExternalEndpointWithPolicy(policiesByEpAndPeerExtEp.row(rendererEpKey));
193 rendererEpBuilder.setPeerExternalEndpointWithPolicy(peerExtEpsWithPolicy);
194 rendererEpBuilderByKey.put(rendererEpKey, rendererEpBuilder);
196 for (RendererEndpointKey rendererEpKey : policiesByEpAndPeerExtCtxEp.rowKeySet()) {
197 RendererEndpointBuilder rendererEpBuilder =
198 resolveRendererEndpointBuilder(rendererEpKey, rendererEpBuilderByKey);
199 List<PeerExternalContainmentEndpointWithPolicy> peerExtContEpsWithPolicy =
200 toListPeerExternalContainmentEndpointWithPolicy(policiesByEpAndPeerExtCtxEp.row(rendererEpKey));
201 rendererEpBuilder.setPeerExternalContainmentEndpointWithPolicy(peerExtContEpsWithPolicy);
202 rendererEpBuilderByKey.put(rendererEpKey, rendererEpBuilder);
204 List<RendererEndpoint> rendererEps = new ArrayList<>();
205 for (RendererEndpointBuilder builder : rendererEpBuilderByKey.values()) {
206 rendererEps.add(builder.build());
208 return new RendererEndpointsBuilder().setRendererEndpoint(rendererEps).build();
211 private static RendererEndpointBuilder resolveRendererEndpointBuilder(RendererEndpointKey rendererEpKey,
212 Map<RendererEndpointKey, RendererEndpointBuilder> rendererEpBuilderByKey) {
213 RendererEndpointBuilder rendererEpBuilder = rendererEpBuilderByKey.get(rendererEpKey);
214 if (rendererEpBuilder == null) {
215 rendererEpBuilder = new RendererEndpointBuilder();
216 rendererEpBuilder.setKey(rendererEpKey);
218 return rendererEpBuilder;
221 private static List<PeerEndpointWithPolicy> toListPeerEndpointWithPolicy(
222 Map<PeerEndpointKey, Set<RuleGroupWithRendererEndpointParticipation>> policiesByPeerEp) {
223 List<PeerEndpointWithPolicy> peerEpsWithPolicy = new ArrayList<>();
224 for (Entry<PeerEndpointKey, Set<RuleGroupWithRendererEndpointParticipation>> entry : policiesByPeerEp
226 PeerEndpointKey peerEpKey = entry.getKey();
227 PeerEndpointWithPolicyKey peerEndpointWithPolicyKey = new PeerEndpointWithPolicyKey(peerEpKey.getAddress(),
228 peerEpKey.getAddressType(), peerEpKey.getContextId(), peerEpKey.getContextType());
229 PeerEndpointWithPolicy peerEndpointWithPolicy =
230 new PeerEndpointWithPolicyBuilder().setKey(peerEndpointWithPolicyKey)
231 .setRuleGroupWithRendererEndpointParticipation(new ArrayList<>(entry.getValue()))
233 peerEpsWithPolicy.add(peerEndpointWithPolicy);
235 return peerEpsWithPolicy;
238 private static List<PeerExternalEndpointWithPolicy> toListPeerExternalEndpointWithPolicy(
239 Map<PeerExternalEndpointKey, Set<RuleGroupWithRendererEndpointParticipation>> policiesByPeerExtEp) {
240 List<PeerExternalEndpointWithPolicy> peerExtEpsWithPolicy = new ArrayList<>();
241 for (Entry<PeerExternalEndpointKey, Set<RuleGroupWithRendererEndpointParticipation>> entry : policiesByPeerExtEp
243 PeerExternalEndpointKey peerEpKey = entry.getKey();
244 PeerExternalEndpointWithPolicyKey peerExternalEpWithPolicyKey =
245 new PeerExternalEndpointWithPolicyKey(peerEpKey.getAddress(), peerEpKey.getAddressType(),
246 peerEpKey.getContextId(), peerEpKey.getContextType());
247 PeerExternalEndpointWithPolicy peerExternalEpWithPolicy =
248 new PeerExternalEndpointWithPolicyBuilder().setKey(peerExternalEpWithPolicyKey)
249 .setRuleGroupWithRendererEndpointParticipation(new ArrayList<>(entry.getValue()))
251 peerExtEpsWithPolicy.add(peerExternalEpWithPolicy);
253 return peerExtEpsWithPolicy;
256 private static List<PeerExternalContainmentEndpointWithPolicy> toListPeerExternalContainmentEndpointWithPolicy(
257 Map<PeerExternalContainmentEndpointKey, Set<RuleGroupWithRendererEndpointParticipation>> policiesByPeerExtContEp) {
258 List<PeerExternalContainmentEndpointWithPolicy> peerExtContEpsWithPolicy = new ArrayList<>();
259 for (Entry<PeerExternalContainmentEndpointKey, Set<RuleGroupWithRendererEndpointParticipation>> entry : policiesByPeerExtContEp
261 PeerExternalContainmentEndpointKey peerEpKey = entry.getKey();
262 PeerExternalContainmentEndpointWithPolicyKey peerExternalContEpWithPolicyKey =
263 new PeerExternalContainmentEndpointWithPolicyKey(peerEpKey.getContextId(),
264 peerEpKey.getContextType());
265 PeerExternalContainmentEndpointWithPolicy peerExternalContEpWithPolicy =
266 new PeerExternalContainmentEndpointWithPolicyBuilder().setKey(peerExternalContEpWithPolicyKey)
267 .setRuleGroupWithRendererEndpointParticipation(new ArrayList<>(entry.getValue()))
269 peerExtContEpsWithPolicy.add(peerExternalContEpWithPolicy);
271 return peerExtContEpsWithPolicy;
274 public Endpoints buildEndoints(EndpointInfo epInfo, EndpointLocationInfo epLocInfo,
275 Map<InstanceIdentifier<?>, RendererName> rendererByNode, Set<EndpointAugmentor> augmentors) {
276 List<AddressEndpointWithLocation> epsWithLoc =
277 resolveEpsWithLoc(getAddressEndpointKeys(), epInfo, epLocInfo, rendererByNode, augmentors);
278 List<ContainmentEndpointWithLocation> contEpsWithLoc =
279 resolveContEpsWithLoc(getContainmentEndpointKeys(), epInfo, epLocInfo, augmentors);
280 return new EndpointsBuilder().setAddressEndpointWithLocation(epsWithLoc)
281 .setContainmentEndpointWithLocation(contEpsWithLoc)
285 private static List<AddressEndpointWithLocation> resolveEpsWithLoc(Set<AddressEndpointKey> epKeys,
286 EndpointInfo epInfo, EndpointLocationInfo epLocInfo,
287 Map<InstanceIdentifier<?>, RendererName> rendererByNode, Set<EndpointAugmentor> augmentors) {
288 List<AddressEndpointWithLocation> result = new ArrayList<>();
289 for (AddressEndpointKey epKey : epKeys) {
290 Optional<AddressEndpoint> potentialEp = epInfo.getEndpoint(epKey);
291 Preconditions.checkArgument(potentialEp.isPresent());
292 Optional<AddressEndpointLocation> potentionalEpLoc = epLocInfo.getAdressEndpointLocation(epKey);
293 Preconditions.checkArgument(potentionalEpLoc.isPresent());
294 RendererName rendererName = resolveRendererName(potentionalEpLoc.get(), rendererByNode);
295 result.add(createEpWithLoc(potentialEp.get(), potentionalEpLoc.get(), rendererName, augmentors));
300 private static RendererName resolveRendererName(AddressEndpointLocation epLoc,
301 Map<InstanceIdentifier<?>, RendererName> rendererByNode) {
302 Optional<InstanceIdentifier<?>> potentialAbsNodeLoc = EndpointLocationUtils.resolveAbsoluteNodeLocation(epLoc);
303 if (potentialAbsNodeLoc.isPresent()) {
304 return rendererByNode.get(potentialAbsNodeLoc.get());
309 private static AddressEndpointWithLocation createEpWithLoc(AddressEndpoint ep, AddressEndpointLocation epLoc,
310 RendererName rendererName, Set<EndpointAugmentor> augmentors) {
311 AddressEndpointWithLocationBuilder addrEpWithLoc = new AddressEndpointWithLocationBuilder()
312 .setAddress(ep.getAddress())
313 .setAddressType(ep.getAddressType())
314 .setContextId(ep.getContextId())
315 .setContextType(ep.getContextType())
316 .setTenant(ep.getTenant())
317 .setChildEndpoint(ep.getChildEndpoint())
318 .setParentEndpointChoice(ep.getParentEndpointChoice())
319 .setEndpointGroup(ep.getEndpointGroup())
320 .setCondition(ep.getCondition())
321 .setNetworkContainment(ep.getNetworkContainment())
322 .setTimestamp(ep.getTimestamp())
323 .setAbsoluteLocation(epLoc.getAbsoluteLocation())
324 .setRelativeLocations(epLoc.getRelativeLocations())
325 .setRendererName(rendererName);
326 for (EndpointAugmentor augmentor : augmentors) {
327 Entry<Class<? extends Augmentation<AddressEndpointWithLocation>>, Augmentation<AddressEndpointWithLocation>> addrEpWithLocAug =
328 augmentor.buildAddressEndpointWithLocationAugmentation(ep);
329 if (addrEpWithLocAug != null) {
330 addrEpWithLoc.addAugmentation(addrEpWithLocAug.getKey(), addrEpWithLocAug.getValue());
333 return addrEpWithLoc.build();
336 private static List<ContainmentEndpointWithLocation> resolveContEpsWithLoc(Set<ContainmentEndpointKey> contEpKeys,
337 EndpointInfo epInfo, EndpointLocationInfo epLocInfo, Set<EndpointAugmentor> augmentors) {
338 List<ContainmentEndpointWithLocation> result = new ArrayList<>();
339 for (ContainmentEndpointKey contEpKey : contEpKeys) {
340 Optional<ContainmentEndpoint> potentialContEp = epInfo.getContainmentEndpoint(contEpKey);
341 Preconditions.checkArgument(potentialContEp.isPresent());
342 Optional<ContainmentEndpointLocation> potentialContEpLoc =
343 epLocInfo.getContainmentEndpointLocation(contEpKey);
344 Preconditions.checkArgument(potentialContEpLoc.isPresent());
345 result.add(createContEpWithLoc(potentialContEp.get(), potentialContEpLoc.get(), augmentors));
350 private static ContainmentEndpointWithLocation createContEpWithLoc(ContainmentEndpoint contEp,
351 ContainmentEndpointLocation contEpLoc, Set<EndpointAugmentor> augmentors) {
352 ContainmentEndpointWithLocationBuilder contEpWithLoc = new ContainmentEndpointWithLocationBuilder()
353 .setContextId(contEp.getContextId())
354 .setContextType(contEp.getContextType())
355 .setTenant(contEp.getTenant())
356 .setChildEndpoint(contEp.getChildEndpoint())
357 .setEndpointGroup(contEp.getEndpointGroup())
358 .setCondition(contEp.getCondition())
359 .setNetworkContainment(contEp.getNetworkContainment())
360 .setTimestamp(contEp.getTimestamp())
361 .setRelativeLocations(contEpLoc.getRelativeLocations());
362 for (EndpointAugmentor augmentor : augmentors) {
363 Entry<Class<? extends Augmentation<ContainmentEndpointWithLocation>>, Augmentation<ContainmentEndpointWithLocation>> contEpWithLocAug =
364 augmentor.buildContainmentEndpointWithLocationAugmentation(contEp);
365 if (contEpWithLocAug != null) {
366 contEpWithLoc.addAugmentation(contEpWithLocAug.getKey(), contEpWithLocAug.getValue());
369 return contEpWithLoc.build();
372 public RuleGroups buildRuluGroups(ResolvedPolicyInfo policyInfo) {
373 List<RuleGroup> ruleGroups = resolveRuleGroups(getPolicyRuleGroupKeys(), policyInfo);
374 return new RuleGroupsBuilder().setRuleGroup(ruleGroups).build();
377 private List<RuleGroup> resolveRuleGroups(Set<PolicyRuleGroupKey> policyRuleGrpKeys,
378 ResolvedPolicyInfo policyInfo) {
379 List<RuleGroup> result = new ArrayList<>();
380 for (PolicyRuleGroupKey policyRuleGrpKey : policyRuleGrpKeys) {
381 Optional<PolicyRuleGroup> potentialPolicyRuleGrp = policyInfo.getPolicyRuleGroup(policyRuleGrpKey);
382 Preconditions.checkArgument(potentialPolicyRuleGrp.isPresent());
383 result.add(createRuleGroup(potentialPolicyRuleGrp.get()));
388 private RuleGroup createRuleGroup(PolicyRuleGroup policyRuleGrp) {
389 return new RuleGroupBuilder().setTenantId(policyRuleGrp.getTenantId())
390 .setContractId(policyRuleGrp.getContractId())
391 .setSubjectName(policyRuleGrp.getSubjectName())
392 .setResolvedRule(policyRuleGrp.getResolvedRule())
393 .setOrder(policyRuleGrp.getOrder())
397 // TODO this copies entire Forwarding to RendererForwarding - it could copy only forwarding used
398 // in EPs (renderer EPs + peers)
399 public RendererForwarding buildRendererForwarding(Forwarding forwarding, Set<NetworkDomainAugmentor> augmentors) {
400 List<RendererForwardingByTenant> forwardingContextByTenant =
401 resolveForwardingContextByTenant(forwarding.getForwardingByTenant(), augmentors);
402 return new RendererForwardingBuilder().setRendererForwardingByTenant(forwardingContextByTenant).build();
405 private static List<RendererForwardingByTenant> resolveForwardingContextByTenant(
406 List<ForwardingByTenant> forwardingByTenant, Set<NetworkDomainAugmentor> augmentors) {
407 List<RendererForwardingByTenant> result = new ArrayList<>();
408 for (ForwardingByTenant fwdByTenant : forwardingByTenant) {
409 result.add(resolveRendererForwardingByTenant(fwdByTenant, augmentors));
414 private static RendererForwardingByTenant resolveRendererForwardingByTenant(ForwardingByTenant fwdByTenant,
415 Set<NetworkDomainAugmentor> augmentors) {
416 List<RendererForwardingContext> rendererForwardingContexts =
417 resolveRendererForwardingContexts(fwdByTenant.getForwardingContext());
418 List<RendererNetworkDomain> rendererNetworkDomains =
419 resolveRendererNetworkDomains(fwdByTenant.getNetworkDomain(), augmentors);
420 return new RendererForwardingByTenantBuilder().setTenantId(fwdByTenant.getTenantId())
421 .setRendererForwardingContext(rendererForwardingContexts)
422 .setRendererNetworkDomain(rendererNetworkDomains)
426 private static List<RendererForwardingContext> resolveRendererForwardingContexts(
427 @Nullable List<ForwardingContext> fwdCtx) {
428 if (fwdCtx == null) {
429 return Collections.emptyList();
431 return FluentIterable.from(fwdCtx).transform(new Function<ForwardingContext, RendererForwardingContext>() {
434 public RendererForwardingContext apply(ForwardingContext input) {
435 return new RendererForwardingContextBuilder().setContextId(input.getContextId())
436 .setContextType(input.getContextType())
437 .setName(input.getName())
438 .setParent(input.getParent())
444 private static List<RendererNetworkDomain> resolveRendererNetworkDomains(@Nullable List<NetworkDomain> netDomains,
445 Set<NetworkDomainAugmentor> augmentors) {
446 if (netDomains == null) {
447 return Collections.emptyList();
449 return FluentIterable.from(netDomains).transform(new Function<NetworkDomain, RendererNetworkDomain>() {
452 public RendererNetworkDomain apply(NetworkDomain input) {
453 RendererNetworkDomainBuilder rendererNetworkDomainBuilder =
454 new RendererNetworkDomainBuilder().setNetworkDomainId(input.getNetworkDomainId())
455 .setNetworkDomainType(input.getNetworkDomainType())
456 .setName(input.getName())
457 .setParent(input.getParent());
458 for (NetworkDomainAugmentor augmentor : augmentors) {
459 Entry<Class<? extends Augmentation<RendererNetworkDomain>>, Augmentation<RendererNetworkDomain>> networkDomainAugmentation =
460 augmentor.buildRendererNetworkDomainAugmentation(input);
461 if (networkDomainAugmentation != null) {
462 rendererNetworkDomainBuilder.addAugmentation(networkDomainAugmentation.getKey(),
463 networkDomainAugmentation.getValue());
466 return rendererNetworkDomainBuilder.build();