/*
* 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;
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;
import java.util.HashSet;
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.NatAddress;
import org.opendaylight.groupbasedpolicy.renderer.util.AddressEndpointUtils;
import org.opendaylight.groupbasedpolicy.renderer.util.ContainmentEndpointUtils;
import org.opendaylight.groupbasedpolicy.renderer.util.EndpointLocationUtils;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoint.locations.AddressEndpointLocation;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoint.locations.ContainmentEndpointLocation;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoints.address.endpoints.AddressEndpoint;
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.base_endpoint.rev160427.endpoints.containment.endpoints.ContainmentEndpoint;
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.forwarding.rev160427.Forwarding;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.ForwardingByTenant;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.forwarding.by.tenant.ForwardingContext;
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.NatAddressRenderer;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.NatAddressRendererBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.RendererName;
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;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.EndpointsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RendererEndpoints;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RendererEndpointsBuilder;
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.RendererForwardingBuilder;
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.RuleGroupsBuilder;
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.endpoints.AddressEndpointWithLocationBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.ContainmentEndpointWithLocation;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.ContainmentEndpointWithLocationBuilder;
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.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;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererForwardingContextBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererNetworkDomain;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererNetworkDomainBuilder;
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.resolved.policies.resolved.policy.policy.rule.group.with.endpoint.constraints.PolicyRuleGroup;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.resolved.policy.policy.rule.group.with.endpoint.constraints.PolicyRuleGroupKey;
import org.opendaylight.yangtools.yang.binding.Augmentation;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class RendererConfigurationBuilder {
private static final Logger LOG = LoggerFactory.getLogger(RendererConfigurationBuilder.class);
private final Table<RendererEndpointKey, PeerEndpointKey, Set<RuleGroupWithRendererEndpointParticipation>> policiesByEpAndPeerEp =
HashBasedTable.create();
private final Table<RendererEndpointKey, PeerExternalEndpointKey, Set<RuleGroupWithRendererEndpointParticipation>> policiesByEpAndPeerExtEp =
HashBasedTable.create();
private final Table<RendererEndpointKey, PeerExternalContainmentEndpointKey, Set<RuleGroupWithRendererEndpointParticipation>> policiesByEpAndPeerExtCtxEp =
HashBasedTable.create();
private final Set<AddressEndpointKey> adrEpKeys = new HashSet<>();
private final Set<ContainmentEndpointKey> contEpKeys = new HashSet<>();
private final Set<PolicyRuleGroupKey> policyRuleGrpKeys = new HashSet<>();
public void add(RendererEndpointKey rendererEpKey, PeerEndpointKey peerEpKey, PolicyRuleGroupKey ruleGrpKey,
EndpointPolicyParticipation rendererEpParticipation) {
Set<RuleGroupWithRendererEndpointParticipation> ruleGrpWithRendererEpParticipation =
policiesByEpAndPeerEp.get(rendererEpKey, peerEpKey);
if (ruleGrpWithRendererEpParticipation == null) {
ruleGrpWithRendererEpParticipation = new HashSet<>();
policiesByEpAndPeerEp.put(rendererEpKey, peerEpKey, ruleGrpWithRendererEpParticipation);
adrEpKeys.add(AddressEndpointUtils.fromRendererEpKey(rendererEpKey));
adrEpKeys.add(AddressEndpointUtils.fromPeerEpKey(peerEpKey));
}
policyRuleGrpKeys.add(ruleGrpKey);
ruleGrpWithRendererEpParticipation
.add(toRuleGroupWithRendererEndpointParticipation(ruleGrpKey, rendererEpParticipation));
}
public void add(RendererEndpointKey rendererEpKey, PeerExternalEndpointKey peerExtEpKey,
PolicyRuleGroupKey ruleGrpKey, EndpointPolicyParticipation rendererEpParticipation) {
Set<RuleGroupWithRendererEndpointParticipation> ruleGrpWithRendererEpParticipation =
policiesByEpAndPeerExtEp.get(rendererEpKey, peerExtEpKey);
if (ruleGrpWithRendererEpParticipation == null) {
ruleGrpWithRendererEpParticipation = new HashSet<>();
policiesByEpAndPeerExtEp.put(rendererEpKey, peerExtEpKey, ruleGrpWithRendererEpParticipation);
adrEpKeys.add(AddressEndpointUtils.fromRendererEpKey(rendererEpKey));
adrEpKeys.add(AddressEndpointUtils.fromPeerExtEpKey(peerExtEpKey));
}
policyRuleGrpKeys.add(ruleGrpKey);
ruleGrpWithRendererEpParticipation
.add(toRuleGroupWithRendererEndpointParticipation(ruleGrpKey, rendererEpParticipation));
}
public void add(RendererEndpointKey rendererEpKey, PeerExternalContainmentEndpointKey peerExtContainmentEpKey,
PolicyRuleGroupKey ruleGrpKey, EndpointPolicyParticipation rendererEpParticipation) {
Set<RuleGroupWithRendererEndpointParticipation> ruleGrpWithRendererEpParticipation =
policiesByEpAndPeerExtCtxEp.get(rendererEpKey, peerExtContainmentEpKey);
if (ruleGrpWithRendererEpParticipation == null) {
ruleGrpWithRendererEpParticipation = new HashSet<>();
policiesByEpAndPeerExtCtxEp.put(rendererEpKey, peerExtContainmentEpKey, ruleGrpWithRendererEpParticipation);
adrEpKeys.add(AddressEndpointUtils.fromRendererEpKey(rendererEpKey));
contEpKeys.add(ContainmentEndpointUtils.fromPeerExtContEpKey(peerExtContainmentEpKey));
}
policyRuleGrpKeys.add(ruleGrpKey);
ruleGrpWithRendererEpParticipation
.add(toRuleGroupWithRendererEndpointParticipation(ruleGrpKey, rendererEpParticipation));
}
public static RuleGroupWithRendererEndpointParticipation toRuleGroupWithRendererEndpointParticipation(
PolicyRuleGroupKey ruleGrpKey, EndpointPolicyParticipation rendererEpParticipation) {
return new RuleGroupWithRendererEndpointParticipationBuilder().setTenantId(ruleGrpKey.getTenantId())
.setContractId(ruleGrpKey.getContractId())
.setSubjectName(ruleGrpKey.getSubjectName())
.setRendererEndpointParticipation(rendererEpParticipation)
.build();
}
public ImmutableTable<RendererEndpointKey, PeerEndpointKey, Set<RuleGroupWithRendererEndpointParticipation>> getPoliciesByEpAndPeerEp() {
return ImmutableTable.copyOf(policiesByEpAndPeerEp);
}
public ImmutableTable<RendererEndpointKey, PeerExternalEndpointKey, Set<RuleGroupWithRendererEndpointParticipation>> getPoliciesByEpAndPeerExtEp() {
return ImmutableTable.copyOf(policiesByEpAndPeerExtEp);
}
public ImmutableTable<RendererEndpointKey, PeerExternalContainmentEndpointKey, Set<RuleGroupWithRendererEndpointParticipation>> getPoliciesByEpAndPeerExtConEp() {
return ImmutableTable.copyOf(policiesByEpAndPeerExtCtxEp);
}
public ImmutableSet<AddressEndpointKey> getAddressEndpointKeys() {
return ImmutableSet.copyOf(adrEpKeys);
}
public ImmutableSet<ContainmentEndpointKey> getContainmentEndpointKeys() {
return ImmutableSet.copyOf(contEpKeys);
}
public ImmutableSet<PolicyRuleGroupKey> getPolicyRuleGroupKeys() {
return ImmutableSet.copyOf(policyRuleGrpKeys);
}
public @Nonnull RendererEndpoints buildRendererEndpoints() {
Map<RendererEndpointKey, RendererEndpointBuilder> rendererEpBuilderByKey = new HashMap<>();
for (RendererEndpointKey rendererEpKey : policiesByEpAndPeerEp.rowKeySet()) {
RendererEndpointBuilder rendererEpBuilder =
resolveRendererEndpointBuilder(rendererEpKey, rendererEpBuilderByKey);
List<PeerEndpoint> peerEps =
toListPeerEndpoint(policiesByEpAndPeerEp.row(rendererEpKey));
rendererEpBuilder.setPeerEndpoint(peerEps);
rendererEpBuilderByKey.put(rendererEpKey, rendererEpBuilder);
}
for (RendererEndpointKey rendererEpKey : policiesByEpAndPeerExtEp.rowKeySet()) {
RendererEndpointBuilder rendererEpBuilder =
resolveRendererEndpointBuilder(rendererEpKey, rendererEpBuilderByKey);
List<PeerExternalEndpoint> peerExtEps =
toListPeerExternalEndpoint(policiesByEpAndPeerExtEp.row(rendererEpKey));
rendererEpBuilder.setPeerExternalEndpoint(peerExtEps);
rendererEpBuilderByKey.put(rendererEpKey, rendererEpBuilder);
}
for (RendererEndpointKey rendererEpKey : policiesByEpAndPeerExtCtxEp.rowKeySet()) {
RendererEndpointBuilder rendererEpBuilder =
resolveRendererEndpointBuilder(rendererEpKey, rendererEpBuilderByKey);
List<PeerExternalContainmentEndpoint> peerExtContEps =
toListPeerExternalContainmentEndpoint(policiesByEpAndPeerExtCtxEp.row(rendererEpKey));
rendererEpBuilder.setPeerExternalContainmentEndpoint(peerExtContEps);
rendererEpBuilderByKey.put(rendererEpKey, rendererEpBuilder);
}
List<RendererEndpoint> rendererEps = new ArrayList<>();
for (RendererEndpointBuilder builder : rendererEpBuilderByKey.values()) {
rendererEps.add(builder.build());
}
return new RendererEndpointsBuilder().setRendererEndpoint(rendererEps).build();
}
private static RendererEndpointBuilder resolveRendererEndpointBuilder(RendererEndpointKey rendererEpKey,
Map<RendererEndpointKey, RendererEndpointBuilder> rendererEpBuilderByKey) {
RendererEndpointBuilder rendererEpBuilder = rendererEpBuilderByKey.get(rendererEpKey);
if (rendererEpBuilder == null) {
rendererEpBuilder = new RendererEndpointBuilder();
rendererEpBuilder.setKey(rendererEpKey);
}
return rendererEpBuilder;
}
private static List<PeerEndpoint> toListPeerEndpoint(
Map<PeerEndpointKey, Set<RuleGroupWithRendererEndpointParticipation>> policiesByPeerEp) {
List<PeerEndpoint> peerEps = new ArrayList<>();
for (Entry<PeerEndpointKey, Set<RuleGroupWithRendererEndpointParticipation>> entry : policiesByPeerEp
.entrySet()) {
PeerEndpointKey peerEpKey = entry.getKey();
PeerEndpointKey peerEndpointKey = new PeerEndpointKey(peerEpKey.getAddress(),
peerEpKey.getAddressType(), peerEpKey.getContextId(), peerEpKey.getContextType());
PeerEndpoint peerEndpoint =
new PeerEndpointBuilder().setKey(peerEndpointKey)
.setRuleGroupWithRendererEndpointParticipation(new ArrayList<>(entry.getValue()))
.build();
peerEps.add(peerEndpoint);
}
return peerEps;
}
private static List<PeerExternalEndpoint> toListPeerExternalEndpoint(
Map<PeerExternalEndpointKey, Set<RuleGroupWithRendererEndpointParticipation>> policiesByPeerExtEp) {
List<PeerExternalEndpoint> peerExtEps = new ArrayList<>();
for (Entry<PeerExternalEndpointKey, Set<RuleGroupWithRendererEndpointParticipation>> entry : policiesByPeerExtEp
.entrySet()) {
PeerExternalEndpointKey peerEpKey = entry.getKey();
PeerExternalEndpointKey peerExternalEpKey =
new PeerExternalEndpointKey(peerEpKey.getAddress(), peerEpKey.getAddressType(),
peerEpKey.getContextId(), peerEpKey.getContextType());
PeerExternalEndpoint peerExternalEp =
new PeerExternalEndpointBuilder().setKey(peerExternalEpKey)
.setRuleGroupWithRendererEndpointParticipation(new ArrayList<>(entry.getValue()))
.build();
peerExtEps.add(peerExternalEp);
}
return peerExtEps;
}
private static List<PeerExternalContainmentEndpoint> toListPeerExternalContainmentEndpoint(
Map<PeerExternalContainmentEndpointKey, Set<RuleGroupWithRendererEndpointParticipation>> policiesByPeerExtContEp) {
List<PeerExternalContainmentEndpoint> peerExtContEps = new ArrayList<>();
for (Entry<PeerExternalContainmentEndpointKey, Set<RuleGroupWithRendererEndpointParticipation>> entry : policiesByPeerExtContEp
.entrySet()) {
PeerExternalContainmentEndpointKey peerEpKey = entry.getKey();
PeerExternalContainmentEndpointKey peerExternalContEpKey =
new PeerExternalContainmentEndpointKey(peerEpKey.getContextId(),
peerEpKey.getContextType());
PeerExternalContainmentEndpoint peerExternalContEp =
new PeerExternalContainmentEndpointBuilder().setKey(peerExternalContEpKey)
.setRuleGroupWithRendererEndpointParticipation(new ArrayList<>(entry.getValue()))
.build();
peerExtContEps.add(peerExternalContEp);
}
return peerExtContEps;
}
public Endpoints buildEndpoints(EndpointInfo epInfo, EndpointLocationInfo epLocInfo,
Map<InstanceIdentifier<?>, RendererName> rendererByNode, Set<EndpointAugmentor> augmentors) {
List<AddressEndpointWithLocation> epsWithLoc =
resolveEpsWithLoc(getAddressEndpointKeys(), epInfo, epLocInfo, rendererByNode, augmentors);
List<ContainmentEndpointWithLocation> contEpsWithLoc =
resolveContEpsWithLoc(getContainmentEndpointKeys(), epInfo, epLocInfo, augmentors);
return new EndpointsBuilder().setAddressEndpointWithLocation(epsWithLoc)
.setContainmentEndpointWithLocation(contEpsWithLoc)
.build();
}
private static List<AddressEndpointWithLocation> resolveEpsWithLoc(Set<AddressEndpointKey> epKeys,
EndpointInfo epInfo, EndpointLocationInfo epLocInfo,
Map<InstanceIdentifier<?>, RendererName> rendererByNode, Set<EndpointAugmentor> augmentors) {
List<AddressEndpointWithLocation> result = new ArrayList<>();
for (AddressEndpointKey epKey : epKeys) {
Optional<AddressEndpoint> potentialEp = epInfo.getEndpoint(epKey);
Preconditions.checkArgument(potentialEp.isPresent());
Optional<AddressEndpointLocation> potentionalEpLoc = epLocInfo.getAdressEndpointLocation(epKey);
Preconditions.checkArgument(potentionalEpLoc.isPresent());
RendererName rendererName = resolveRendererName(potentionalEpLoc.get(), rendererByNode);
if (rendererName == null) {
LOG.debug("Endpoint {} has no location, skipped", epKey);
continue;
}
result.add(createEpWithLoc(potentialEp.get(), potentionalEpLoc.get(), rendererName, augmentors));
}
return result;
}
private static RendererName resolveRendererName(AddressEndpointLocation epLoc,
Map<InstanceIdentifier<?>, RendererName> rendererByNode) {
Optional<InstanceIdentifier<?>> potentialAbsNodeLoc = EndpointLocationUtils.resolveAbsoluteNodeLocation(epLoc);
if (potentialAbsNodeLoc.isPresent()) {
return rendererByNode.get(potentialAbsNodeLoc.get());
}
return null;
}
private static AddressEndpointWithLocation createEpWithLoc(AddressEndpoint ep, AddressEndpointLocation epLoc,
RendererName rendererName, Set<EndpointAugmentor> augmentors) {
AddressEndpointWithLocationBuilder addrEpWithLoc = new AddressEndpointWithLocationBuilder()
.setAddress(ep.getAddress())
.setAddressType(ep.getAddressType())
.setContextId(ep.getContextId())
.setContextType(ep.getContextType())
.setTenant(ep.getTenant())
.setChildEndpoint(ep.getChildEndpoint())
.setParentEndpointChoice(ep.getParentEndpointChoice())
.setEndpointGroup(ep.getEndpointGroup())
.setCondition(ep.getCondition())
.setNetworkContainment(ep.getNetworkContainment())
.setTimestamp(ep.getTimestamp())
.setAbsoluteLocation(epLoc.getAbsoluteLocation())
.setRelativeLocations(epLoc.getRelativeLocations())
.setRendererName(rendererName);
for (EndpointAugmentor augmentor : augmentors) {
Entry<Class<? extends Augmentation<AddressEndpointWithLocation>>, Augmentation<AddressEndpointWithLocation>> addrEpWithLocAug =
augmentor.buildAddressEndpointWithLocationAugmentation(ep);
if (addrEpWithLocAug != null) {
addrEpWithLoc.addAugmentation(addrEpWithLocAug.getKey(), addrEpWithLocAug.getValue());
}
}
if (ep.getAugmentation(NatAddress.class) != null) {
NatAddress natAddr = ep.getAugmentation(NatAddress.class);
addrEpWithLoc.addAugmentation(NatAddressRenderer.class,
new NatAddressRendererBuilder().setNatAddress(natAddr.getNatAddress()).build());
}
return addrEpWithLoc.build();
}
private static List<ContainmentEndpointWithLocation> resolveContEpsWithLoc(Set<ContainmentEndpointKey> contEpKeys,
EndpointInfo epInfo, EndpointLocationInfo epLocInfo, Set<EndpointAugmentor> augmentors) {
List<ContainmentEndpointWithLocation> result = new ArrayList<>();
for (ContainmentEndpointKey contEpKey : contEpKeys) {
Optional<ContainmentEndpoint> potentialContEp = epInfo.getContainmentEndpoint(contEpKey);
Preconditions.checkArgument(potentialContEp.isPresent());
Optional<ContainmentEndpointLocation> potentialContEpLoc =
epLocInfo.getContainmentEndpointLocation(contEpKey);
Preconditions.checkArgument(potentialContEpLoc.isPresent());
result.add(createContEpWithLoc(potentialContEp.get(), potentialContEpLoc.get(), augmentors));
}
return result;
}
private static ContainmentEndpointWithLocation createContEpWithLoc(ContainmentEndpoint contEp,
ContainmentEndpointLocation contEpLoc, Set<EndpointAugmentor> augmentors) {
ContainmentEndpointWithLocationBuilder contEpWithLoc = new ContainmentEndpointWithLocationBuilder()
.setContextId(contEp.getContextId())
.setContextType(contEp.getContextType())
.setTenant(contEp.getTenant())
.setChildEndpoint(contEp.getChildEndpoint())
.setEndpointGroup(contEp.getEndpointGroup())
.setCondition(contEp.getCondition())
.setNetworkContainment(contEp.getNetworkContainment())
.setTimestamp(contEp.getTimestamp())
.setRelativeLocations(contEpLoc.getRelativeLocations());
for (EndpointAugmentor augmentor : augmentors) {
Entry<Class<? extends Augmentation<ContainmentEndpointWithLocation>>, Augmentation<ContainmentEndpointWithLocation>> contEpWithLocAug =
augmentor.buildContainmentEndpointWithLocationAugmentation(contEp);
if (contEpWithLocAug != null) {
contEpWithLoc.addAugmentation(contEpWithLocAug.getKey(), contEpWithLocAug.getValue());
}
}
return contEpWithLoc.build();
}
public RuleGroups buildRuleGroups(ResolvedPolicyInfo policyInfo) {
List<RuleGroup> ruleGroups = resolveRuleGroups(getPolicyRuleGroupKeys(), policyInfo);
return new RuleGroupsBuilder().setRuleGroup(ruleGroups).build();
}
private List<RuleGroup> resolveRuleGroups(Set<PolicyRuleGroupKey> policyRuleGrpKeys,
ResolvedPolicyInfo policyInfo) {
List<RuleGroup> result = new ArrayList<>();
for (PolicyRuleGroupKey policyRuleGrpKey : policyRuleGrpKeys) {
Optional<PolicyRuleGroup> potentialPolicyRuleGrp = policyInfo.getPolicyRuleGroup(policyRuleGrpKey);
Preconditions.checkArgument(potentialPolicyRuleGrp.isPresent());
result.add(createRuleGroup(potentialPolicyRuleGrp.get()));
}
return result;
}
private RuleGroup createRuleGroup(PolicyRuleGroup policyRuleGrp) {
return new RuleGroupBuilder().setTenantId(policyRuleGrp.getTenantId())
.setContractId(policyRuleGrp.getContractId())
.setSubjectName(policyRuleGrp.getSubjectName())
.setResolvedRule(policyRuleGrp.getResolvedRule())
.setOrder(policyRuleGrp.getOrder())
.build();
}
// TODO this copies entire Forwarding to RendererForwarding - it could copy only forwarding used
// in EPs (renderer EPs + peers)
public RendererForwarding buildRendererForwarding(Forwarding forwarding, Set<NetworkDomainAugmentor> augmentors) {
List<RendererForwardingByTenant> forwardingContextByTenant =
resolveForwardingContextByTenant(forwarding.getForwardingByTenant(), augmentors);
return new RendererForwardingBuilder().setRendererForwardingByTenant(forwardingContextByTenant).build();
}
private static List<RendererForwardingByTenant> resolveForwardingContextByTenant(
List<ForwardingByTenant> forwardingByTenant, Set<NetworkDomainAugmentor> augmentors) {
List<RendererForwardingByTenant> result = new ArrayList<>();
for (ForwardingByTenant fwdByTenant : forwardingByTenant) {
result.add(resolveRendererForwardingByTenant(fwdByTenant, augmentors));
}
return result;
}
private static RendererForwardingByTenant resolveRendererForwardingByTenant(ForwardingByTenant fwdByTenant,
Set<NetworkDomainAugmentor> augmentors) {
List<RendererForwardingContext> rendererForwardingContexts =
resolveRendererForwardingContexts(fwdByTenant.getForwardingContext());
List<RendererNetworkDomain> rendererNetworkDomains =
resolveRendererNetworkDomains(fwdByTenant.getNetworkDomain(), augmentors);
return new RendererForwardingByTenantBuilder().setTenantId(fwdByTenant.getTenantId())
.setRendererForwardingContext(rendererForwardingContexts)
.setRendererNetworkDomain(rendererNetworkDomains)
.build();
}
private static List<RendererForwardingContext> resolveRendererForwardingContexts(
@Nullable List<ForwardingContext> fwdCtx) {
if (fwdCtx == null) {
return Collections.emptyList();
}
return FluentIterable.from(fwdCtx).transform(new Function<ForwardingContext, RendererForwardingContext>() {
@Override
public RendererForwardingContext apply(ForwardingContext input) {
return new RendererForwardingContextBuilder().setContextId(input.getContextId())
.setContextType(input.getContextType())
.setName(input.getName())
.setParent(input.getParent())
.build();
}
}).toList();
}
private static List<RendererNetworkDomain> resolveRendererNetworkDomains(@Nullable List<NetworkDomain> netDomains,
Set<NetworkDomainAugmentor> augmentors) {
if (netDomains == null) {
return Collections.emptyList();
}
return FluentIterable.from(netDomains).transform(new Function<NetworkDomain, RendererNetworkDomain>() {
@Override
public RendererNetworkDomain apply(NetworkDomain input) {
RendererNetworkDomainBuilder rendererNetworkDomainBuilder =
new RendererNetworkDomainBuilder().setNetworkDomainId(input.getNetworkDomainId())
.setNetworkDomainType(input.getNetworkDomainType())
.setName(input.getName())
.setParent(input.getParent());
for (NetworkDomainAugmentor augmentor : augmentors) {
Entry<Class<? extends Augmentation<RendererNetworkDomain>>, Augmentation<RendererNetworkDomain>> networkDomainAugmentation =
augmentor.buildRendererNetworkDomainAugmentation(input);
if (networkDomainAugmentation != null) {
rendererNetworkDomainBuilder.addAugmentation(networkDomainAugmentation.getKey(),
networkDomainAugmentation.getValue());
}
}
return rendererNetworkDomainBuilder.build();
}
}).toList();
}
}