/* * Copyright (c) 2014 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.ofoverlay.flow; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.opendaylight.groupbasedpolicy.api.sf.L4ClassifierDefinition; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.MockOfContext; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.MockPolicyManager; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.endpoint.MockEndpointManager; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.node.MockSwitchManager; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sf.AllowAction; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sf.Classifier; 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.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress; 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.ClauseName; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2BridgeDomainId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2FloodDomainId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L3ContextId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SelectorName; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubjectName; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubnetId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContext; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContextBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.Segmentation; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.SegmentationBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection.Direction; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.action.refs.ActionRefBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.classifier.refs.ClassifierRef; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.classifier.refs.ClassifierRefBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValueBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.TenantBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.ForwardingContextBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.PolicyBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L2BridgeDomainBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L2FloodDomainBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L3ContextBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.SubnetBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.ContractBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.EndpointGroupBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.SubjectFeatureInstancesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.ClauseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.Subject; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.SubjectBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.subject.Rule; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.subject.RuleBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.endpoint.group.ConsumerNamedSelectorBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.endpoint.group.ProviderNamedSelectorBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.subject.feature.instances.ActionInstanceBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.subject.feature.instances.ClassifierInstanceBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; import com.google.common.collect.ImmutableList; public class OfTableTest { protected MockOfContext ctx; protected MockEndpointManager endpointManager; protected MockPolicyManager policyManager; protected MockSwitchManager switchManager; protected NodeId nodeId = new NodeId("openflow:1"); protected NodeId remoteNodeId = new NodeId("openflow:2"); protected NodeConnectorId nodeConnectorId = new NodeConnectorId(nodeId.getValue() + ":4"); protected NodeConnectorId tunnelId = new NodeConnectorId(nodeId.getValue() + ":42"); protected L3ContextId l3c = new L3ContextId("2cf51ee4-e996-467e-a277-2d380334a91d"); protected L2BridgeDomainId bd = new L2BridgeDomainId("c95182ba-7807-43f8-98f7-6c7c720b7639"); protected L2FloodDomainId fd = new L2FloodDomainId("98e1439e-52d2-46f8-bd69-5136e6088771"); protected L2FloodDomainId ext_fd = new L2FloodDomainId("d8024f7a-b83e-11e5-9912-ba0be0483c18"); protected SubnetId sub = new SubnetId("4fcf8dfc-53b5-4aef-84d3-6b5586992fcb"); protected SubnetId sub2 = new SubnetId("c285a59f-fcb8-42e6-bf29-87ea522fd626"); protected SubnetId sub3 = new SubnetId("a0380d52-2a25-48ef-882c-a4d4cd9e00ec"); protected SubnetId ext_sub = new SubnetId("8da17ad9-3261-4dc9-bcff-928a2f73cce7"); protected TenantId tid = new TenantId("1118c691-8520-47ad-80b8-4cf5e3fe3302"); protected EndpointGroupId eg = new EndpointGroupId("36dec84a-08c7-497b-80b6-a0035af72a12"); protected EndpointGroupId eg2 = new EndpointGroupId("632e5e11-7988-4eb5-8fe6-6c182d890276"); protected ContractId cid = new ContractId("a5874893-bcd5-46de-96af-3c8d99bedf9f"); protected void initCtx() { endpointManager = new MockEndpointManager(); policyManager = new MockPolicyManager(endpointManager); switchManager = new MockSwitchManager(); ctx = new MockOfContext(null, policyManager, switchManager, endpointManager, null); } protected TenantBuilder baseTenant() { return new TenantBuilder().setId(tid) .setPolicy(new PolicyBuilder() .setEndpointGroup(ImmutableList.of( new EndpointGroupBuilder().setId(eg) .setNetworkDomain(sub) .setConsumerNamedSelector(ImmutableList.of(new ConsumerNamedSelectorBuilder() .setName(new SelectorName("cns1")).setContract(ImmutableList.of(cid)).build())) .build(), new EndpointGroupBuilder().setId(eg2) .setNetworkDomain(sub2) .setProviderNamedSelector(ImmutableList.of(new ProviderNamedSelectorBuilder() .setName(new SelectorName("pns1")).setContract(ImmutableList.of(cid)).build())) .build())) .setSubjectFeatureInstances( new SubjectFeatureInstancesBuilder() .setClassifierInstance( ImmutableList .of(new ClassifierInstanceBuilder().setName(new ClassifierName("tcp_dst_80")) .setClassifierDefinitionId(L4ClassifierDefinition.DEFINITION.getId()) .setParameterValue(ImmutableList.of( new ParameterValueBuilder().setName(new ParameterName("destport")) .setIntValue(Long.valueOf(80)) .build(), new ParameterValueBuilder().setName(new ParameterName("proto")) .setIntValue(Long.valueOf(6)) .build())) .build(), new ClassifierInstanceBuilder() .setName(new ClassifierName("tcp_src_80")) .setClassifierDefinitionId(Classifier.L4_CL.getId()) .setParameterValue(ImmutableList.of( new ParameterValueBuilder() .setName(new ParameterName("sourceport")) .setIntValue(Long.valueOf(80)) .build(), new ParameterValueBuilder().setName(new ParameterName("proto")) .setIntValue(Long.valueOf(6)) .build())) .build(), new ClassifierInstanceBuilder() .setName(new ClassifierName("ether_type")) .setClassifierDefinitionId(Classifier.ETHER_TYPE_CL.getId()) .setParameterValue(ImmutableList.of(new ParameterValueBuilder() .setName(new ParameterName("ethertype")) .setIntValue(Long.valueOf(FlowUtils.IPv4)) .build())) .build())) .setActionInstance( ImmutableList.of(new ActionInstanceBuilder().setName(new ActionName("allow")) .setActionDefinitionId(new AllowAction().getId()) .build())) .build()) .build()) .setForwardingContext( new ForwardingContextBuilder() .setL3Context(ImmutableList.of(new L3ContextBuilder().setId(l3c).build())) .setL2BridgeDomain( ImmutableList.of(new L2BridgeDomainBuilder().setId(bd).setParent(l3c).build())) .setL2FloodDomain(ImmutableList.of( new L2FloodDomainBuilder() .setId(fd) .setParent(bd) .addAugmentation(Segmentation.class, new SegmentationBuilder() .setSegmentationId(Integer.valueOf(216)) .build()) .build(), new L2FloodDomainBuilder() .setId(ext_fd) .addAugmentation(Segmentation.class, new SegmentationBuilder() .setSegmentationId(Integer.valueOf(2016)) .build()) .build())) .setSubnet(ImmutableList.of( new SubnetBuilder().setId(sub2) .setParent(fd) .setIpPrefix(new IpPrefix(new Ipv4Prefix("10.0.1.0/24"))) .setVirtualRouterIp(new IpAddress(new Ipv4Address("10.0.1.1"))) .build(), new SubnetBuilder().setId(sub) .setParent(fd) .setIpPrefix(new IpPrefix(new Ipv4Prefix("10.0.0.0/24"))) .setVirtualRouterIp(new IpAddress(new Ipv4Address("10.0.0.1"))) .build(), new SubnetBuilder().setId(sub3) .setParent(bd) .setIpPrefix(new IpPrefix(new Ipv4Prefix("10.0.2.0/24"))) .setVirtualRouterIp(new IpAddress(new Ipv4Address("10.0.2.1"))) .build(), new SubnetBuilder() .setId(ext_sub) .setIpPrefix(new IpPrefix(new Ipv4Prefix("192.168.111.0/24"))) .setParent(ext_fd) .build())) .build()); } protected ContractBuilder baseContract(List<Subject> subjects) { ContractBuilder contractBuilder = new ContractBuilder().setId(cid).setSubject(subjects); // TODO refactor if (subjects == null) { return contractBuilder.setClause(ImmutableList.of(new ClauseBuilder().setName(new ClauseName("test")) .setSubjectRefs(ImmutableList.<SubjectName>of(new SubjectName("s1"))) .build())); } List<SubjectName> subjectNames = new ArrayList<>(); for (Subject subject : subjects) { subjectNames.add(subject.getName()); } return contractBuilder.setClause(ImmutableList.of(new ClauseBuilder().setName(new ClauseName("test")) .setSubjectRefs(subjectNames) .build())); } protected SubjectBuilder baseSubject(Direction direction) { return new SubjectBuilder() .setName(new SubjectName("s1")) .setRule(ImmutableList.of(new RuleBuilder() .setActionRef(ImmutableList.of(new ActionRefBuilder() .setName(new ActionName("allow")) .build())) .setClassifierRef(ImmutableList.of(new ClassifierRefBuilder() .setName(new ClassifierName("tcp_dst_80")) .setDirection(direction) .setInstanceName(new ClassifierName("tcp_dst_80")) .build())) .build())); } protected Subject createSubject(String name, List<Rule> rules){ return new SubjectBuilder().setName(new SubjectName(name)).setRule(rules).build(); } protected List<ClassifierRef> createClassifierRefs(Map<String, Direction> refNamesAndDirections) { List<ClassifierRef> refs = new ArrayList<>(); for (String refName : refNamesAndDirections.keySet()) { refs.add(new ClassifierRefBuilder().setName(new ClassifierName(refName)) .setDirection(refNamesAndDirections.get(refName)) .setInstanceName(new ClassifierName(refName)) .build()); } return refs; } protected EndpointBuilder baseEP() { return new EndpointBuilder() .setL2Context(bd) .setTenant(tid) .setEndpointGroup(eg) .setMacAddress(new MacAddress("00:00:00:00:00:01")) .setNetworkContainment(sub2); } protected EndpointBuilder localEP() { OfOverlayContext ofc = new OfOverlayContextBuilder() .setNodeId(nodeId) .setNodeConnectorId(nodeConnectorId) .build(); return baseEP() .addAugmentation(OfOverlayContext.class, ofc); } protected EndpointBuilder remoteEP(NodeId id) { OfOverlayContext ofc = new OfOverlayContextBuilder() .setNodeId(id) .setNodeConnectorId(new NodeConnectorId(id.getValue() + ":5")) .build(); return baseEP() .setMacAddress(new MacAddress("00:00:00:00:00:02")) .addAugmentation(OfOverlayContext.class, ofc); } }