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.ios_xe_provider.impl.util;
11 import static org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl.ActionCase.CHAIN;
13 import com.google.common.base.Preconditions;
14 import com.google.common.util.concurrent.Futures;
15 import java.util.ArrayList;
16 import java.util.Collections;
17 import java.util.HashMap;
18 import java.util.HashSet;
19 import java.util.List;
21 import java.util.Optional;
23 import javax.annotation.Nonnull;
24 import javax.annotation.Nullable;
25 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
26 import org.opendaylight.groupbasedpolicy.api.sf.ChainActionDefinition;
27 import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyConfigurationContext;
28 import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl;
29 import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl.ActionCase;
30 import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.writer.PolicyWriterUtil;
31 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.RenderedServicePath;
32 import org.opendaylight.yang.gen.v1.urn.ios.rev160308.ClassNameType;
33 import org.opendaylight.yang.gen.v1.urn.ios.rev160308.PolicyActionType;
34 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._class.map.match.grouping.SecurityGroup;
35 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._class.map.match.grouping.SecurityGroupBuilder;
36 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._class.map.match.grouping.security.group.Destination;
37 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._class.map.match.grouping.security.group.DestinationBuilder;
38 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._class.map.match.grouping.security.group.Source;
39 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._class.map.match.grouping.security.group.SourceBuilder;
40 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._interface.common.grouping.ServicePolicy;
41 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._interface.common.grouping.ServicePolicyBuilder;
42 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._interface.common.grouping.service.policy.TypeBuilder;
43 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._interface.common.grouping.service.policy.type.ServiceChain.Direction;
44 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._interface.common.grouping.service.policy.type.ServiceChainBuilder;
45 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.ClassMap;
46 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.ClassMapBuilder;
47 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.ClassMapKey;
48 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.PolicyMap;
49 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.PolicyMapBuilder;
50 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.PolicyMapKey;
51 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native._class.map.Match;
52 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native._class.map.MatchBuilder;
53 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.policy.map.Class;
54 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.policy.map.ClassBuilder;
55 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.policy.map.ClassKey;
56 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.policy.map._class.ActionList;
57 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.policy.map._class.ActionListBuilder;
58 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.policy.map._class.ActionListKey;
59 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.policy.map._class.action.list.action.param.ForwardCaseBuilder;
60 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.policy.map._class.action.list.action.param.forward._case.ForwardBuilder;
61 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.policy.map._class.action.list.action.param.forward._case.forward.ServicePath;
62 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.policy.map._class.action.list.action.param.forward._case.forward.ServicePathBuilder;
63 import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.policy.map._class.action.list.action.param.forward._case.forward.ServicePathKey;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.AddressEndpointKey;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.AbsoluteLocation;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.absolute.location.LocationType;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.absolute.location.location.type.ExternalLocationCase;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionDefinitionId;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.RuleName;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubjectName;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.EndpointPolicyParticipation;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.rule.group.with.renderer.endpoint.participation.RuleGroupWithRendererEndpointParticipation;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.Configuration;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocation;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpoint;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpoint;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.rule.groups.RuleGroup;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.actions.Action;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.classifiers.Classifier;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.resolved.rules.ResolvedRule;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.AddressEndpointWithLocationAug;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt;
86 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
87 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
88 import org.slf4j.Logger;
89 import org.slf4j.LoggerFactory;
91 public class PolicyManagerUtil {
93 private static final Logger LOG = LoggerFactory.getLogger(PolicyManagerUtil.class);
95 private PolicyManagerUtil() {
96 throw new IllegalAccessError("instance of util class not supported");
100 * Main method for policy creation which looks for all actions specified in rules between two endpoints. Whichever
101 * action has been found, it is resolved (only chain action is supported for now).
103 * @param sourceSgt - security group tag of source endpoint
104 * @param destinationSgt - security group tag of destination endpoint
105 * @param context - stores info about location of classifier/policy-map and status
106 * @param data - new data, used to found appropriate rule group
107 * @param peerEndpoint - contains info about rule groups between endpoint pairs
108 * @param dataBroker - data provider for odl controller
110 public static void syncEndpointPairCreatePolicy(final Sgt sourceSgt, final Sgt destinationSgt,
111 final PolicyConfigurationContext context, final Configuration data,
112 final PeerEndpoint peerEndpoint, final DataBroker dataBroker) {
113 // Create appropriate policy map
114 if (!PolicyManagerUtil.constructEmptyPolicyMapWithInterface(context)) {
115 final String policyMapName = context.getPolicyMapLocation().getPolicyMapName();
116 final String interfaceName = context.getPolicyMapLocation().getInterfaceName();
117 final String info = String.format("Unable to create policy-map %s on interface %s", policyMapName, interfaceName);
118 context.appendUnconfiguredRendererEP(StatusUtil.assembleFullyNotConfigurableRendererEP(context, info));
123 // Find actions from acquired data
124 final Map<ActionCase, ActionInDirection> actionMap = PolicyManagerUtil.getActionInDirection(data, peerEndpoint);
125 if (actionMap.isEmpty()) {
126 LOG.debug("No usable action found for EP-sgt[{}] | peerEP-sgt[{}]", sourceSgt, destinationSgt);
131 if (actionMap.containsKey(ActionCase.CHAIN)) {
132 ServiceChainingUtil.newChainAction(peerEndpoint, sourceSgt, destinationSgt, actionMap, context,
138 * Method for policy removal which looks for all actions specified in rules between two endpoints. Whichever
139 * action has been found, it is resolved (only chain action is supported).
141 * @param sourceSgt - security group tag of source endpoint
142 * @param destinationSgt - security group tag of destination endpoint
143 * @param context - stores info about location of classifier/policy-map and status
144 * @param data - data used to identify all elements marked to remove
145 * @param peerEndpoint - contains info about rule groups between endpoint pairs
147 public static void syncEndpointPairRemovePolicy(final Sgt sourceSgt, final Sgt destinationSgt,
148 final PolicyConfigurationContext context, final Configuration data,
149 final PeerEndpoint peerEndpoint) {
150 // Find actions from acquired data
151 final Map<ActionCase, ActionInDirection> actionMap = PolicyManagerUtil.getActionInDirection(data, peerEndpoint);
152 if (actionMap.isEmpty()) {
153 LOG.debug("no usable action found for EP-sgt[{}] | peerEP-sgt[{}]",
154 sourceSgt, destinationSgt);
159 if (actionMap.containsKey(ActionCase.CHAIN)) {
160 ServiceChainingUtil.resolveRemovedChainAction(peerEndpoint, sourceSgt, destinationSgt, actionMap,
164 // Remove policy-map if empty
165 if (!deleteEmptyPolicyMapWithInterface(context.getPolicyMapLocation())) {
166 final PolicyManagerImpl.PolicyMapLocation location = context.getPolicyMapLocation();
167 final String info = String.format("Unable to remove policy-map %s and interface %s", location.getPolicyMapName(),
168 location.getInterfaceName());
174 * According to info from {@link RuleGroupWithRendererEndpointParticipation} (composite key) finds appropriate subject
176 * @param data - contains all rule groups
177 * @param ruleGroupWithParticipation - contains info about how to find right rule group
178 * @return rule group if found, null otherwise
181 private static RuleGroup findRuleGroup(final Configuration data,
182 final RuleGroupWithRendererEndpointParticipation ruleGroupWithParticipation) {
183 final TenantId tenantId = ruleGroupWithParticipation.getTenantId();
184 final ContractId contractId = ruleGroupWithParticipation.getContractId();
185 final SubjectName subjectName = ruleGroupWithParticipation.getSubjectName();
186 for (RuleGroup ruleGroup : data.getRuleGroups().getRuleGroup()) {
187 if (!ruleGroup.getTenantId().equals(tenantId)) {
190 if (!ruleGroup.getContractId().equals(contractId)) {
193 if (ruleGroup.getSubjectName().equals(subjectName)) {
201 public static Sgt findSgtTag(final AddressEndpointKey endpointKey,
202 final List<AddressEndpointWithLocation> endpointsWithLocation) {
203 if (endpointKey == null || endpointsWithLocation == null) {
206 final AddressEndpointWithLocation endpointWithLocation = RendererPolicyUtil.lookupEndpoint(endpointKey,
207 endpointsWithLocation);
208 final AddressEndpointWithLocationAug augmentation = endpointWithLocation.getAugmentation(AddressEndpointWithLocationAug.class);
209 if (augmentation == null) {
213 return augmentation.getSgt();
217 * Creates empty policy-map if does not exist and bounds it to interface if it is not. If policy-map exists, method
218 * checks whether it is connected to correct interface and creates it if necessary. If policy-map does not exist,
219 * it is created with particular interface
221 * @param context - all data required to create/localize policy-map
222 * @return true if policy-map and interface is present/written on the device, false otherwise
224 private static boolean constructEmptyPolicyMapWithInterface(final PolicyConfigurationContext context) {
225 final PolicyManagerImpl.PolicyMapLocation policyMapLocation = context.getPolicyMapLocation();
226 final String policyMapName = policyMapLocation.getPolicyMapName();
227 final DataBroker mountpoint = policyMapLocation.getMountpoint();
228 final String interfaceName = policyMapLocation.getInterfaceName();
229 final NodeId nodeId = policyMapLocation.getNodeId();
230 final InstanceIdentifier<PolicyMap> policyMapIid = PolicyWriterUtil.policyMapInstanceIdentifier(policyMapName);
231 final Optional<PolicyMap> optionalPolicyMap =
232 Optional.ofNullable(PolicyWriterUtil.netconfRead(mountpoint, policyMapIid));
233 if (optionalPolicyMap.isPresent()) {
234 LOG.trace("Policy map with name {} on interface {} already exists", policyMapName, interfaceName);
235 final InstanceIdentifier<ServicePolicy> servicePolicyIid = PolicyWriterUtil.interfaceInstanceIdentifier(interfaceName);
236 final Optional<ServicePolicy> optionalServicePolicy =
237 Optional.ofNullable(PolicyWriterUtil.netconfRead(mountpoint, servicePolicyIid));
238 if (optionalServicePolicy.isPresent()) {
239 LOG.trace("Policy map {} is bound to correct interface {} ", policyMapName, interfaceName);
242 boolean iResult = PolicyWriterUtil.writeInterface(context.getPolicyMapLocation());
243 context.setFutureResult(Futures.immediateCheckedFuture(iResult));
247 final PolicyMap emptyMap = createEmptyPolicyMap(policyMapName);
248 boolean pmResult = PolicyWriterUtil.writePolicyMap(emptyMap, context.getPolicyMapLocation());
249 context.setFutureResult(Futures.immediateCheckedFuture(pmResult));
251 LOG.info("Created policy-map {} on node {}", policyMapName, nodeId.getValue());
252 LOG.trace("Adding policy-map {} to interface {}", policyMapName, interfaceName);
253 boolean iResult = PolicyWriterUtil.writeInterface(context.getPolicyMapLocation());
254 context.setFutureResult(Futures.immediateCheckedFuture(iResult));
262 * Removes empty policy-map and its interface
264 * @param policyMapLocation - location of policy-map
265 * @return true if policy-map is present and not empty or if it is successfully removed also with interface, false
268 private static boolean deleteEmptyPolicyMapWithInterface(PolicyManagerImpl.PolicyMapLocation policyMapLocation) {
269 final String policyMapName = policyMapLocation.getPolicyMapName();
270 final DataBroker mountpoint = policyMapLocation.getMountpoint();
271 final InstanceIdentifier<PolicyMap> policyMapIid = PolicyWriterUtil.policyMapInstanceIdentifier(policyMapName);
273 final Optional<PolicyMap> optionalPolicyMap = Optional.ofNullable(PolicyWriterUtil.netconfRead(mountpoint, policyMapIid));
274 if (optionalPolicyMap.isPresent()) {
275 final PolicyMap policyMap = optionalPolicyMap.get();
276 if (policyMap.getXmlClass() == null || policyMap.getXmlClass().isEmpty()) {
277 // No entries, remove
278 if (PolicyWriterUtil.removePolicyMap(policyMapLocation)) {
279 // Remove interface binding if exists
280 LOG.info("Policy-map {} removed", policyMapName);
281 return PolicyWriterUtil.removeInterface(policyMapLocation);
285 LOG.debug("Policy-map {} still contains entries, cannot be removed", policyMapLocation.getPolicyMapName());
292 public static ServicePolicy createServicePolicy(final String chainName, final Direction direction) {
294 final ServiceChainBuilder serviceChainBuilder = new ServiceChainBuilder();
295 serviceChainBuilder.setName(chainName) // Same as the policy map name
296 .setDirection(direction);
298 final TypeBuilder typeBuilder = new TypeBuilder();
299 typeBuilder.setServiceChain(serviceChainBuilder.build());
301 ServicePolicyBuilder servicePolicyBuilder = new ServicePolicyBuilder();
302 servicePolicyBuilder.setType(typeBuilder.build());
304 return servicePolicyBuilder.build();
307 private static PolicyMap createEmptyPolicyMap(String policyMapName) {
308 // TODO maybe could be better to create also class-default entry with pass-through value than not to create any default entry at all
309 // Construct policy map
310 final PolicyMapBuilder policyMapBuilder = new PolicyMapBuilder();
311 policyMapBuilder.setName(policyMapName)
312 .setKey(new PolicyMapKey(policyMapName))
313 .setType(PolicyMap.Type.ServiceChain);
314 return policyMapBuilder.build();
317 static Class createPolicyMapEntry(final String policyClassName, final RenderedServicePath renderedPath,
318 final ActionCase actionCase) {
320 final ForwardCaseBuilder forwardCaseBuilder = new ForwardCaseBuilder();
321 if (actionCase.equals(CHAIN) && renderedPath != null) {
323 final ForwardBuilder forwardBuilder = new ForwardBuilder();
324 final List<ServicePath> servicePaths = new ArrayList<>();
325 final ServicePathBuilder servicePathBuilder = new ServicePathBuilder();
326 servicePathBuilder.setKey(new ServicePathKey(renderedPath.getPathId()))
327 .setServicePathId(renderedPath.getPathId())
328 .setServiceIndex(renderedPath.getStartingIndex());
329 servicePaths.add(servicePathBuilder.build());
330 forwardBuilder.setServicePath(servicePaths);
331 forwardCaseBuilder.setForward(forwardBuilder.build());
333 // Create Action List
334 final List<ActionList> actionList = new ArrayList<>();
335 final ActionListBuilder actionListBuilder = new ActionListBuilder();
336 actionListBuilder.setKey(new ActionListKey(PolicyActionType.Forward))
337 .setActionType(PolicyActionType.Forward)
338 .setActionParam(forwardCaseBuilder.build());
339 actionList.add(actionListBuilder.build());
341 final ClassBuilder policyClassBuilder = new ClassBuilder();
342 policyClassBuilder.setName(new ClassNameType(policyClassName))
343 .setKey(new ClassKey(new ClassNameType(policyClassName)))
344 .setActionList(actionList);
345 return policyClassBuilder.build();
348 static Match createSecurityGroupMatch(final int sourceTag, final int destinationTag) {
349 final SecurityGroupBuilder sgBuilder = new SecurityGroupBuilder();
350 final Source source = new SourceBuilder().setTag(sourceTag).build();
351 final Destination destination = new DestinationBuilder().setTag(destinationTag).build();
352 sgBuilder.setDestination(destination)
354 final SecurityGroup securityGroup = sgBuilder.build();
355 final MatchBuilder matchBuilder = new MatchBuilder();
356 matchBuilder.setSecurityGroup(securityGroup);
357 return matchBuilder.build();
361 static ClassMap createClassMap(final String classMapName, final Match match) {
362 final ClassMapBuilder cmBuilder = new ClassMapBuilder();
363 cmBuilder.setName(classMapName)
364 .setKey(new ClassMapKey(classMapName))
365 .setPrematch(ClassMap.Prematch.MatchAll)
367 return cmBuilder.build();
371 * Constructs {@link ActionInDirection} object with {@link ActionCase} as a key. ActionInDirection object contains
372 * info about action, participation and rule direction.
374 * @param data - used for finding rule's rule group
375 * @param peer - contains {@link RuleGroupWithRendererEndpointParticipation}
376 * @return map with actionCase/ActionInDirection entries, empty map if no rule is found
379 private static Map<ActionCase, ActionInDirection> getActionInDirection(final Configuration data,
380 final PeerEndpoint peer) {
381 final Set<ResolvedRule> rulesInDirection = new HashSet<>();
382 EndpointPolicyParticipation participation = null;
383 HasDirection.Direction direction = null;
384 // Find all rules in desired direction
385 for (RuleGroupWithRendererEndpointParticipation ruleGroupKey :
386 peer.getRuleGroupWithRendererEndpointParticipation()) {
387 participation = ruleGroupKey.getRendererEndpointParticipation();
388 final RuleGroup ruleGroup = findRuleGroup(data, ruleGroupKey);
389 if (ruleGroup == null || ruleGroup.getResolvedRule() == null) {
393 for (ResolvedRule resolvedRule : ruleGroup.getResolvedRule()) {
394 if (resolvedRule == null) {
397 if (resolvedRule.getClassifier() == null || resolvedRule.getAction() == null) {
400 // TODO only first Classifier used
401 final Classifier classifier = resolvedRule.getClassifier().get(0);
402 direction = classifier.getDirection();
403 rulesInDirection.add(resolvedRule);
406 if (rulesInDirection.isEmpty()) {
407 return Collections.emptyMap();
409 // TODO use only first rule with ActionDefinitionID for now
410 final Map<ActionCase, ActionInDirection> result = new HashMap<>();
411 for (ResolvedRule resolvedRule : rulesInDirection) {
412 // TODO only first action used for now
413 final Action action = resolvedRule.getAction().get(0);
414 final RuleName name = resolvedRule.getName();
415 if (action.getActionDefinitionId() != null) {
416 final ActionDefinitionId actionDefinitionId = action.getActionDefinitionId();
417 // Currently only chain action is supported
418 if (actionDefinitionId.equals(ChainActionDefinition.ID)) {
419 ActionInDirection actionInDirection = new ActionInDirection(name, action, participation, direction);
420 result.put(ActionCase.CHAIN, actionInDirection);
425 return Collections.emptyMap();
428 public static InstanceIdentifier getMountpointIidFromAbsoluteLocation(final RendererEndpoint endpoint,
429 final List<AddressEndpointWithLocation> endpointsWithLocation) {
430 if (endpointsWithLocation.isEmpty()) {
433 AddressEndpointWithLocation endpointWithLocation = RendererPolicyUtil.lookupEndpoint(endpoint,
434 endpointsWithLocation);
435 final AbsoluteLocation absoluteLocation = endpointWithLocation.getAbsoluteLocation();
436 final LocationType locationType = absoluteLocation.getLocationType();
437 ExternalLocationCase location = (ExternalLocationCase) locationType;
438 if (location == null) {
439 LOG.warn("Endpoint {} does not contain info about external location",
440 endpointWithLocation.getKey().toString());
443 return location.getExternalNodeMountPoint();
446 public static String getInterfaceNameFromAbsoluteLocation(final RendererEndpoint endpoint,
447 final List<AddressEndpointWithLocation> endpointsWithLocation) {
448 if (endpoint == null || endpointsWithLocation == null) {
451 final AddressEndpointWithLocation endpointWithLocation = RendererPolicyUtil.lookupEndpoint(endpoint,
452 endpointsWithLocation);
453 final AbsoluteLocation absoluteLocation = endpointWithLocation.getAbsoluteLocation();
454 final LocationType locationType = absoluteLocation.getLocationType();
455 final ExternalLocationCase location = (ExternalLocationCase) locationType;
456 if (location == null) {
457 LOG.warn("Endpoint {} does not contain info about external location",
458 endpointWithLocation.getKey().toString());
461 return location.getExternalNodeConnector();
464 static TenantId getTenantId(final PeerEndpoint peer) {
465 for (RuleGroupWithRendererEndpointParticipation ruleGroup :
466 peer.getRuleGroupWithRendererEndpointParticipation()) {
467 if (ruleGroup.getTenantId() != null) {
468 return ruleGroup.getTenantId();
474 static String generateClassMapName(final int sourceTag, final int destinationTag) {
475 return "srcTag" + sourceTag + "_dstTag" + destinationTag;
479 * Action in Direction - wrapper class
481 static class ActionInDirection {
483 private final RuleName ruleName;
484 private final Action action;
485 private final EndpointPolicyParticipation participation;
486 private final HasDirection.Direction direction;
488 ActionInDirection(final RuleName ruleName,
490 final EndpointPolicyParticipation participation,
491 final HasDirection.Direction direction) {
492 this.ruleName = Preconditions.checkNotNull(ruleName);
493 this.action = Preconditions.checkNotNull(action);
494 this.participation = Preconditions.checkNotNull(participation);
495 this.direction = Preconditions.checkNotNull(direction);
498 RuleName getRuleName() {
506 EndpointPolicyParticipation getParticipation() {
507 return participation;
510 HasDirection.Direction getDirection() {