Security group in VPP renderer
[groupbasedpolicy.git] / renderers / vpp / src / test / java / org / opendaylight / groupbasedpolicy / renderer / vpp / DtoFactory.java
index 1269b87803324042c9beb0c2e682d039ab3185f6..7bf93baf3758fa946a85174f783d75168777063f 100644 (file)
@@ -12,22 +12,44 @@ import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import org.opendaylight.groupbasedpolicy.api.sf.AllowActionDefinition;
+import org.opendaylight.groupbasedpolicy.api.sf.EtherTypeClassifierDefinition;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.iface.VppPathMapper;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.KeyFactory;
+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.common.endpoint.fields.NetworkContainment;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.common.endpoint.fields.NetworkContainmentBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.common.endpoint.fields.network.containment.containment.ForwardingContextContainmentBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.AbsoluteLocation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.AbsoluteLocationBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.absolute.location.location.type.ExternalLocationCaseBuilder;
+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.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.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.AddressType;
 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;
@@ -36,6 +58,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.r
 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.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;
@@ -44,8 +68,19 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.r
 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 org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
@@ -57,15 +92,27 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
 
 public class DtoFactory {
 
+    static IpPrefix subnetPrefix = new IpPrefix(new Ipv4Prefix("10.0.0.0/24"));
+    static IpAddress virtRouterIp = new IpAddress(new Ipv4Address("10.0.0.1"));
+
     public static final ContextId CTX_ID = new ContextId("ctx");
+    public static final ContextId L3_CTX = new ContextId("l3ctx");
+    public static final ContextId L2BD_CTX = new ContextId("l2bd");
     public static final ContextId L2FD_CTX = new ContextId("l2fd");
     public static final ContractId CONTRACT_ID = new ContractId("contract");
     public static final TenantId TENANT_ID = new TenantId("tenant");
     public static final SubjectName SUBJECT_NAME = new SubjectName("subject");
     public static final RuleName RULE_NAME = new RuleName("rule");
+
+    public static final Name L2_FD_ID = new Name("l2fd");
+    public static final Name L3_CTX_ID = new Name("l3ctx");
+    public static final Name L2_BD_ID = new Name("l2bd");
+    public static final Name SUBNET_ID = new Name("subnetId");
+
     public static final RuleGroupWithRendererEndpointParticipation RULE_GROUP_WITH_CONSUMER =
             new RuleGroupWithRendererEndpointParticipationBuilder().setContractId(CONTRACT_ID)
                 .setTenantId(TENANT_ID)
@@ -78,11 +125,6 @@ public class DtoFactory {
                 .setSubjectName(SUBJECT_NAME)
                 .setRendererEndpointParticipation(EndpointPolicyParticipation.PROVIDER)
                 .build();
-    public static final RuleGroup RULE_GROUP = new RuleGroupBuilder().setContractId(CONTRACT_ID)
-        .setTenantId(TENANT_ID)
-        .setSubjectName(SUBJECT_NAME)
-        .setResolvedRule(Arrays.asList(new ResolvedRuleBuilder().setName(RULE_NAME).build()))
-        .build();
     public final static TopologyKey TOPO_KEY = new TopologyKey(new TopologyId("topology-netconf"));
     public final static InstanceIdentifier<Node> VPP_NODE_1_IID = InstanceIdentifier.builder(NetworkTopology.class)
         .child(Topology.class, TOPO_KEY)
@@ -122,14 +164,76 @@ public class DtoFactory {
             .concat(consumersAsRendererEps.stream(), providersAsRendererEps.stream()).collect(Collectors.toList());
         return new ConfigurationBuilder().setEndpoints(endpoints)
             .setRendererEndpoints(new RendererEndpointsBuilder().setRendererEndpoint(rendererEps).build())
-            .setRuleGroups(new RuleGroupsBuilder().setRuleGroup(Arrays.asList(RULE_GROUP)).build())
+            .setRuleGroups(new RuleGroupsBuilder(createRuleGroups()).build())
+            .setRendererForwarding(new RendererForwardingBuilder()
+                .setRendererForwardingByTenant(ImmutableList.<RendererForwardingByTenant>of(createForwarding()))
+                .build())
+            .build();
+    }
+
+    private static RendererForwardingByTenant createForwarding() {
+        RendererForwardingContext l2Fd = createRendererForwardingCtx(L2FD_CTX, L2_FD_ID, L2FloodDomain.class).setParent(
+                createParent(L2BD_CTX, L2BridgeDomain.class))
+            .build();
+        RendererForwardingContext l2Bd = createRendererForwardingCtx(L3_CTX, L3_CTX_ID, L3Context.class).setParent(
+                createParent(L3_CTX, L3Context.class))
+            .build();
+        RendererForwardingContext l3Ctx = createRendererForwardingCtx(L2BD_CTX, L2_BD_ID, L2BridgeDomain.class).build();
+        RendererNetworkDomain subnet = new RendererNetworkDomainBuilder().setNetworkDomainId(new NetworkDomainId(SUBNET_ID.getValue()))
+            .setName(SUBNET_ID)
+            .setNetworkDomainType(Subnet.class)
+            .setParent(createParent(L2FD_CTX, L2FloodDomain.class))
+            .addAugmentation(
+                    SubnetAugmentRenderer.class,
+                    new SubnetAugmentRendererBuilder().setSubnet(
+                            new SubnetBuilder().setIpPrefix(subnetPrefix).setVirtualRouterIp(virtRouterIp).build())
+                        .build())
+            .build();
+        return new RendererForwardingByTenantBuilder().setTenantId(TENANT_ID)
+            .setRendererForwardingContext(ImmutableList.<RendererForwardingContext>of(l2Fd, l2Bd, l3Ctx))
+            .setRendererNetworkDomain(ImmutableList.<RendererNetworkDomain>of(subnet))
+            .build();
+    }
+
+    static RendererForwardingContextBuilder createRendererForwardingCtx(ContextId id, Name name,
+            Class<? extends ContextType> type) {
+        return new RendererForwardingContextBuilder().setName(name).setContextId(id).setContextType(type);
+    }
+
+    static Parent createParent(ContextId ctxId, Class<? extends ContextType> type) {
+        return new ParentBuilder().setContextId(ctxId).setContextType(type).build();
+    }
+
+    public static RuleGroups createRuleGroups() {
+        ParameterValue param = new ParameterValueBuilder().setIntValue(EtherTypeClassifierDefinition.IPv4_VALUE)
+            .setName(new ParameterName(EtherTypeClassifierDefinition.ETHERTYPE_PARAM))
+            .build();
+        Classifier classif = new ClassifierBuilder().setClassifierDefinitionId(EtherTypeClassifierDefinition.ID)
+            .setDirection(Direction.In)
+            .setName(new ClassifierName("cl-name"))
+            .setParameterValue(ImmutableList.<ParameterValue>of(param))
+            .build();
+        Action action = new ActionBuilder().setActionDefinitionId(AllowActionDefinition.ID)
+            .setName(new ActionName("Allow"))
+            .build();
+        ResolvedRuleBuilder rrBuilder = new ResolvedRuleBuilder();
+        rrBuilder.setClassifier(ImmutableList.<Classifier>of(classif));
+        rrBuilder.setAction(ImmutableList.<Action>of(action));
+        rrBuilder.setName(RULE_NAME);
+        rrBuilder.setOrder(0);
+        RuleGroup ruleGroup = new RuleGroupBuilder().setTenantId(TENANT_ID)
+            .setOrder(0)
+            .setSubjectName(SUBJECT_NAME)
+            .setContractId(CONTRACT_ID)
+            .setResolvedRule(ImmutableList.<ResolvedRule>of(rrBuilder.build()))
             .build();
+        return new RuleGroupsBuilder().setRuleGroup(ImmutableList.<RuleGroup>of(ruleGroup)).build();
     }
 
     public static AddressEndpointWithLocation createEndpoint(String ip, String l2FdIdAsNetCont,
             AbsoluteLocation absoluteLocation) {
         AddressEndpointWithLocationKey key =
-                new AddressEndpointWithLocationKey(ip, AddressType.class, CTX_ID, ContextType.class);
+                new AddressEndpointWithLocationKey(ip, AddressType.class, CTX_ID, L3Context.class);
         NetworkContainment networkContainment =
                 new NetworkContainmentBuilder().setContainment(new ForwardingContextContainmentBuilder()
                     .setContextType(L2FloodDomain.class).setContextId(new ContextId(l2FdIdAsNetCont)).build()).build();