/* * 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.vpp.policy.acl; import java.util.ArrayList; import java.util.List; import org.opendaylight.groupbasedpolicy.api.sf.AllowActionDefinition; import org.opendaylight.groupbasedpolicy.api.sf.EtherTypeClassifierDefinition; import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.PolicyContext; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.child.endpoints.ChildEndpoint; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.child.endpoints.ChildEndpointBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.parent.child.endpoints.parent.endpoint.choice.ParentEndpointCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.parent.child.endpoints.parent.endpoint.choice.parent.endpoint._case.ParentEndpoint; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.parent.child.endpoints.parent.endpoint.choice.parent.endpoint._case.ParentEndpointBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionName; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierName; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContextId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Name; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.NetworkDomainId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.RuleName; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubjectName; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.IpPrefixType; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.L2BridgeDomain; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.L2FloodDomain; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.L3Context; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.MacAddressType; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.Subnet; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.SubnetAugmentRenderer; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.SubnetAugmentRendererBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.has.subnet.SubnetBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.ContextType; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.fields.Parent; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.fields.ParentBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection.Direction; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValue; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValueBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.EndpointPolicyParticipation; 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.RendererPolicyBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.ConfigurationBuilder; 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.RendererEndpointsBuilder; 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.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.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.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.has.actions.Action; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.actions.ActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.classifiers.Classifier; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.classifiers.ClassifierBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.resolved.rules.ResolvedRule; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.resolved.rules.ResolvedRuleBuilder; import com.google.common.collect.ImmutableList; public class TestResources { private static final String EP1_IP = "10.0.0.10/32"; private static final String EP2_EP = "10.0.0.20/32"; private static final String EP1_MAC = "aa:bb:cc:dd:ee:ff"; private static final String EP2_MAC = "ff:ee:dd:cc:bb:aa"; private static final ContextId L2_FD_ID = new ContextId("l2FdId"); private static final ContextId L2_BD_ID = new ContextId("l2BridgeDomainId"); private static final ContextId L3_CTX_ID = new ContextId("l3CtxId"); private static final SubjectName SUBJECT_NAME = new SubjectName("subject"); private static final ContractId CONTRACT_ID = new ContractId("contract"); private static final RuleName RULE_NAME_IN = new RuleName("rule_in"); private static final RuleName RULE_NAME_OUT = new RuleName("rule_out"); private static final ClassifierName CLASSIF_NAME = new ClassifierName("cl-name"); private static final NetworkDomainId SUBNET_ID = new NetworkDomainId("subnet"); private static final IpPrefix SUBNET_PREFIX = new IpPrefix(new Ipv4Prefix("10.0.0.0/24")); private static final IpAddress VIRTUAL_ROUTER_IP = new IpAddress(new Ipv4Address("10.0.0.1")); protected static final TenantId TENANT_ID = new TenantId("tenant1"); public final AddressEndpointWithLocation l2AddrEp1 = l2AddressEndpointWithLocation(EP1_MAC, L2_BD_ID, EP1_IP, L3_CTX_ID); public final AddressEndpointWithLocation l3AddrEp1 = l3AddressEndpointWithLocation(EP1_MAC, L2_BD_ID, EP1_IP, L3_CTX_ID); public final AddressEndpointWithLocation l2AddrEp2 = l2AddressEndpointWithLocation(EP2_MAC, L2_BD_ID, EP2_EP, L3_CTX_ID); public final AddressEndpointWithLocation l3AddrEp2 = l3AddressEndpointWithLocation(EP2_MAC, L2_BD_ID, EP2_EP, L3_CTX_ID); PolicyContext createPolicyContext() { List<AddressEndpointWithLocation> addrEps = new ArrayList<>(); addrEps.add(l2AddrEp1); addrEps.add(l3AddrEp1); addrEps.add(l2AddrEp2); addrEps.add(l3AddrEp2); ConfigurationBuilder config = new ConfigurationBuilder(); config.setEndpoints(new EndpointsBuilder().setAddressEndpointWithLocation(addrEps).build()).build(); config.setRendererEndpoints(new RendererEndpointsBuilder().setRendererEndpoint(createRendEps()).build()); config.setRuleGroups(createRuleGroups()); config.setRendererForwarding(new RendererForwardingBuilder().setRendererForwardingByTenant( ImmutableList.<RendererForwardingByTenant>of(createForwarding())).build()); return new PolicyContext(new RendererPolicyBuilder().setConfiguration(config.build()).build()); } private List<RendererEndpoint> createRendEps() { List<RendererEndpoint> rEps = new ArrayList<>(); PeerEndpointBuilder pEp1 = peerEndpoint(l2AddrEp1).setRuleGroupWithRendererEndpointParticipation( ImmutableList.<RuleGroupWithRendererEndpointParticipation>of(createRuleGroup(CONTRACT_ID, SUBJECT_NAME, TENANT_ID, EndpointPolicyParticipation.PROVIDER))); PeerEndpointBuilder pEp2 = peerEndpoint(l2AddrEp2).setRuleGroupWithRendererEndpointParticipation( ImmutableList.<RuleGroupWithRendererEndpointParticipation>of(createRuleGroup(CONTRACT_ID, SUBJECT_NAME, TENANT_ID, EndpointPolicyParticipation.CONSUMER))); RendererEndpointBuilder l2RendEp1 = rendererEndpoint(l2AddrEp1); l2RendEp1.setPeerEndpoint(ImmutableList.<PeerEndpoint>of(pEp2.build())); RendererEndpointBuilder l2RendEp2 = rendererEndpoint(l2AddrEp2); l2RendEp2.setPeerEndpoint(ImmutableList.<PeerEndpoint>of(pEp1.build())); rEps.add(l2RendEp1.build()); rEps.add(l2RendEp2.build()); return rEps; } private RuleGroupWithRendererEndpointParticipation createRuleGroup(ContractId ctrctId, SubjectName sn, TenantId tnntId, EndpointPolicyParticipation participation) { return new RuleGroupWithRendererEndpointParticipationBuilder().setRendererEndpointParticipation(participation) .setContractId(ctrctId) .setSubjectName(sn) .setTenantId(tnntId) .build(); } public RuleGroups createRuleGroups() { ParameterValue param = new ParameterValueBuilder().setIntValue(EtherTypeClassifierDefinition.IPv4_VALUE) .setName(new ParameterName(EtherTypeClassifierDefinition.ETHERTYPE_PARAM)) .build(); Classifier classif_in = new ClassifierBuilder().setClassifierDefinitionId(EtherTypeClassifierDefinition.ID) .setDirection(Direction.In) .setName(CLASSIF_NAME) .setParameterValue(ImmutableList.<ParameterValue>of(param)) .build(); Classifier classif_out = new ClassifierBuilder().setClassifierDefinitionId(EtherTypeClassifierDefinition.ID) .setDirection(Direction.Out) .setName(CLASSIF_NAME) .setParameterValue(ImmutableList.<ParameterValue>of(param)) .build(); Action action = new ActionBuilder().setActionDefinitionId(AllowActionDefinition.ID) .setName(new ActionName("Allow")) .build(); ResolvedRule ruleIn = resolveRule(RULE_NAME_IN, ImmutableList.<Classifier>of(classif_in), ImmutableList.<Action>of(action), 0); ResolvedRule ruleOut = resolveRule(RULE_NAME_OUT, ImmutableList.<Classifier>of(classif_out), ImmutableList.<Action>of(action), 1); RuleGroup ruleGroup = new RuleGroupBuilder().setTenantId(TENANT_ID) .setOrder(0) .setSubjectName(SUBJECT_NAME) .setContractId(CONTRACT_ID) .setResolvedRule(ImmutableList.<ResolvedRule>of(ruleIn, ruleOut)) .build(); return new RuleGroupsBuilder().setRuleGroup(ImmutableList.<RuleGroup>of(ruleGroup)).build(); } private ResolvedRule resolveRule(RuleName ruleName, List<Classifier> classifs, List<Action> actions, Integer order) { ResolvedRuleBuilder rrBuilder = new ResolvedRuleBuilder(); rrBuilder.setClassifier(classifs); rrBuilder.setAction(actions); rrBuilder.setName(ruleName); rrBuilder.setOrder(order); return rrBuilder.build(); } private RendererForwardingByTenant createForwarding() { RendererForwardingContext l2Fd = createRendererForwardingCtx(L2_FD_ID, new Name("l2fd"), L2FloodDomain.class) .setParent(createParent(L2_BD_ID, L2BridgeDomain.class)).build(); RendererForwardingContext l2Bd = createRendererForwardingCtx(L3_CTX_ID, new Name("l3ctx"), L3Context.class) .setParent(createParent(L3_CTX_ID, L3Context.class)).build(); RendererForwardingContext l3Ctx = createRendererForwardingCtx(L2_BD_ID, new Name("l2bd"), L2BridgeDomain.class).build(); RendererNetworkDomain subnet = new RendererNetworkDomainBuilder().setNetworkDomainId(SUBNET_ID) .setName(new Name("subnet")) .setNetworkDomainType(Subnet.class) .setParent(createParent(L2_FD_ID, L2FloodDomain.class)) .addAugmentation(SubnetAugmentRenderer.class, new SubnetAugmentRendererBuilder().setSubnet(new SubnetBuilder().setIsTenant(true) .setIpPrefix(SUBNET_PREFIX) .setVirtualRouterIp(VIRTUAL_ROUTER_IP) .build()).build()) .build(); return new RendererForwardingByTenantBuilder().setTenantId(TENANT_ID) .setRendererForwardingContext(ImmutableList.<RendererForwardingContext>of(l2Fd, l2Bd, l3Ctx)) .setRendererNetworkDomain(ImmutableList.<RendererNetworkDomain>of(subnet)) .build(); } RendererForwardingContextBuilder createRendererForwardingCtx(ContextId id, Name name, Class<? extends ContextType> type) { return new RendererForwardingContextBuilder().setName(name).setContextId(id).setContextType(type); } Parent createParent(ContextId ctxId, Class<? extends ContextType> type) { return new ParentBuilder().setContextId(ctxId).setContextType(type).build(); } RendererEndpointBuilder rendererEndpoint(AddressEndpointWithLocation addrEp) { return new RendererEndpointBuilder().setAddress(addrEp.getAddress()) .setAddressType(addrEp.getAddressType()) .setContextId(addrEp.getContextId()) .setContextType(addrEp.getContextType()); } PeerEndpointBuilder peerEndpoint(AddressEndpointWithLocation addrEp) { return new PeerEndpointBuilder().setAddress(addrEp.getAddress()) .setAddressType(addrEp.getAddressType()) .setContextId(addrEp.getContextId()) .setContextType(addrEp.getContextType()); } AddressEndpointWithLocation l3AddressEndpointWithLocation(String macAddress, ContextId macAddrContextId, String ipAddress, ContextId ipAddressContextId) { ChildEndpoint childEndpoint = new ChildEndpointBuilder().setAddress(macAddress) .setAddressType(MacAddressType.class) .setContextType(L2BridgeDomain.class) .setContextId(macAddrContextId) .build(); return new AddressEndpointWithLocationBuilder().setAddress(ipAddress) .setAddressType(IpPrefixType.class) .setContextId(ipAddressContextId) .setContextType(L3Context.class) .setChildEndpoint(ImmutableList.<ChildEndpoint>of(childEndpoint)) .build(); } AddressEndpointWithLocation l2AddressEndpointWithLocation(String macAddress, ContextId macAddrContextId, String ipAddress, ContextId ipAddressContextId) { ParentEndpoint parentEndpoint = new ParentEndpointBuilder().setAddress(ipAddress) .setAddressType(IpPrefixType.class) .setContextType(L3Context.class) .setContextId(ipAddressContextId) .build(); return new AddressEndpointWithLocationBuilder().setAddress(macAddress) .setAddressType(MacAddressType.class) .setContextId(macAddrContextId) .setContextType(L2BridgeDomain.class) .setParentEndpointChoice( new ParentEndpointCaseBuilder().setParentEndpoint(ImmutableList.<ParentEndpoint>of(parentEndpoint)) .build()) .build(); } }