Security group in VPP renderer 06/47006/37
authorTomas Cechvala <tcechval@cisco.com>
Thu, 12 Jan 2017 16:01:41 +0000 (17:01 +0100)
committerTomas Cechvala <tcechval@cisco.com>
Wed, 1 Mar 2017 11:05:46 +0000 (12:05 +0100)
Introducing traffic filtering by using
access-lists based on security-groups.

Implementation for transforming resolved
policy to INGRESS/EGRESS access lists in HC.

Change-Id: Ie7bf491b3aa3e1d6724ce37cce1835ccb2b06f79
Signed-off-by: Tomas Cechvala <tcechval@cisco.com>
48 files changed:
groupbasedpolicy/pom.xml
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/base_endpoint/BaseEndpointServiceImpl.java
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/EndpointLocationInfo.java
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/RendererConfigurationBuilder.java
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/RendererManager.java
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/util/AddressEndpointUtils.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/AddressEndpointUtils.java with 97% similarity]
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/util/ContainmentEndpointUtils.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ContainmentEndpointUtils.java with 89% similarity]
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/util/EndpointLocationUtils.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/EndpointLocationUtils.java with 97% similarity]
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/util/EndpointUtils.java
groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/RendererManagerTest.java
groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/PolicyResolverTest.java
neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/infrastructure/NetworkService.java
neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/util/MappingUtils.java
neutron-mapper/src/main/yang/routing-node-spec.yang [new file with mode: 0644]
neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/PortHandler.java
renderers/iovisor/src/main/resources/META-INF/MANIFEST.MF [new file with mode: 0644]
renderers/vpp/src/main/java/org/opendaylight/controller/config/yang/config/vpp_provider/impl/VppRenderer.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/iface/AclManager.java [new file with mode: 0644]
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/iface/InterfaceManager.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/ForwardingManager.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/VppRendererPolicyManager.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/AccessListUtil.java [new file with mode: 0644]
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/AccessListWrapper.java [new file with mode: 0644]
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/AddressMapper.java [new file with mode: 0644]
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/DestinationMapper.java [new file with mode: 0644]
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/EgressAccessListWrapper.java [new file with mode: 0644]
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/GbpAceBuilder.java [new file with mode: 0644]
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/IngressAccessListWrapper.java [new file with mode: 0644]
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/SourceMapper.java [new file with mode: 0644]
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/sf/Classifier.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/sf/EtherTypeClassifier.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/sf/IpProtoClassifier.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/sf/L4Classifier.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/sf/SubjectFeatures.java [new file with mode: 0644]
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/util/GbpNetconfTransaction.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/util/VppIidFactory.java
renderers/vpp/src/main/yang/vpp-renderer.yang
renderers/vpp/src/test/java/org/opendaylight/controller/config/yang/config/vpp_provider/impl/VppRendererTest.java
renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/DtoFactory.java
renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/BridgeDomainManagerImplTest.java
renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/ForwardingManagerTest.java
renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/VppRendererPolicyManagerTest.java
renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/AccessListUtilTest.java [new file with mode: 0644]
renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/AccessListWrapperTest.java [new file with mode: 0644]
renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/TestResources.java [new file with mode: 0644]
renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/sf/EtherTypeClassifierTest.java
renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/sf/IpProtoClassifierTest.java
renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/sf/L4ClassifierTest.java

index c8573aea2b24f01cf3cbbb3cb5ef12b67f441224..f70bbbd74f9190782b20460c80e69fadd45d90fe 100755 (executable)
@@ -98,6 +98,7 @@
               org.opendaylight.groupbasedpolicy.api.*,
               org.opendaylight.groupbasedpolicy.dto,
               org.opendaylight.groupbasedpolicy.util,
+              org.opendaylight.groupbasedpolicy.renderer.util
             </Export-Package>
             <Embed-Dependency>java-ipv6</Embed-Dependency>
           </instructions>
index 00c492073120db6408c103716a4e3baa85d07f17..38a78b5cebc81210f84d8548ba20d80dfc56c2e2 100644 (file)
@@ -122,7 +122,7 @@ public class BaseEndpointServiceImpl implements BaseEndpointService, AutoCloseab
         ParentContainmentEndpoint epAsParent = new ParentContainmentEndpointBuilder(endpoint).build();
         for (ChildEndpoint child : nullToEmpty(endpoint.getChildEndpoint())) {
             InstanceIdentifier<AddressEndpoint> childIid =
-                    IidFactory.addressEndpointIid(EndpointUtils.createAddressEndointKey(child));
+                    IidFactory.addressEndpointIid(EndpointUtils.createAddressEndpointKey(child));
             Optional<AddressEndpoint> childAddrEpOptional =
                     DataStoreHelper.readFromDs(LogicalDatastoreType.OPERATIONAL, childIid, t);
             if (childAddrEpOptional.isPresent()) {
@@ -137,7 +137,7 @@ public class BaseEndpointServiceImpl implements BaseEndpointService, AutoCloseab
         ParentEndpoint epAsParent = new ParentEndpointBuilder(endpoint).build();
         for (ChildEndpoint child : nullToEmpty(endpoint.getChildEndpoint())) {
             InstanceIdentifier<AddressEndpoint> childIid =
-                    IidFactory.addressEndpointIid(EndpointUtils.createAddressEndointKey(child));
+                    IidFactory.addressEndpointIid(EndpointUtils.createAddressEndpointKey(child));
             Optional<AddressEndpoint> childAddrEpOptional =
                     DataStoreHelper.readFromDs(LogicalDatastoreType.OPERATIONAL, childIid, t);
             if (childAddrEpOptional.isPresent()) {
@@ -290,7 +290,7 @@ public class BaseEndpointServiceImpl implements BaseEndpointService, AutoCloseab
     private void deleteAddressEndpointFromChilds(ReadWriteTransaction t, AddressEndpoint endpoint) {
         for (ChildEndpoint childEndpoint : nullToEmpty(endpoint.getChildEndpoint())) {
             KeyedInstanceIdentifier<ParentEndpoint, ParentEndpointKey> parentEp =
-                    IidFactory.addressEndpointIid(EndpointUtils.createAddressEndointKey(childEndpoint)).child(ParentEndpoint.class,
+                    IidFactory.addressEndpointIid(EndpointUtils.createAddressEndpointKey(childEndpoint)).child(ParentEndpoint.class,
                             new ParentEndpointKey(endpoint.getAddress(), endpoint.getAddressType(),
                                     endpoint.getContextId(), endpoint.getContextType()));
             DataStoreHelper.removeIfExists(LogicalDatastoreType.OPERATIONAL, parentEp, t);
index 426a09f560041a1fd0f0528c9afc7e7d172d1e6e..dabf7e90dddcdb5547ca0f3627fdd050a955f59d 100644 (file)
@@ -11,6 +11,7 @@ package org.opendaylight.groupbasedpolicy.renderer;
 import java.util.List;
 import java.util.Set;
 
+import org.opendaylight.groupbasedpolicy.renderer.util.EndpointLocationUtils;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.EndpointLocations;
 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.AddressEndpointLocationKey;
index 4799c960d8090c14316e93c89b1461a177fabe3c..0e553a760b5abd3ea0057ffd91e684eb141efe37 100644 (file)
@@ -16,6 +16,7 @@ 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;
@@ -24,10 +25,15 @@ 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.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;
@@ -371,7 +377,7 @@ public class RendererConfigurationBuilder {
         return contEpWithLoc.build();
     }
 
-    public RuleGroups buildRuluGroups(ResolvedPolicyInfo policyInfo) {
+    public RuleGroups buildRuleGroups(ResolvedPolicyInfo policyInfo) {
         List<RuleGroup> ruleGroups = resolveRuleGroups(getPolicyRuleGroupKeys(), policyInfo);
         return new RuleGroupsBuilder().setRuleGroup(ruleGroups).build();
     }
index 5393971525bb36ceeb1e7ba23475f0fb0183e08c..baaf223797c8ec2a5e33bad912cb1f49f6b2fa48 100644 (file)
@@ -11,6 +11,7 @@ package org.opendaylight.groupbasedpolicy.renderer;
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import javax.annotation.Nullable;
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -18,6 +19,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Function;
 import com.google.common.base.Optional;
@@ -26,6 +28,7 @@ import com.google.common.collect.ImmutableCollection;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.ImmutableSet;
+
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
@@ -39,6 +42,8 @@ import org.opendaylight.groupbasedpolicy.renderer.listener.EndpointsListener;
 import org.opendaylight.groupbasedpolicy.renderer.listener.ForwardingListener;
 import org.opendaylight.groupbasedpolicy.renderer.listener.RenderersListener;
 import org.opendaylight.groupbasedpolicy.renderer.listener.ResolvedPoliciesListener;
+import org.opendaylight.groupbasedpolicy.renderer.util.AddressEndpointUtils;
+import org.opendaylight.groupbasedpolicy.renderer.util.ContainmentEndpointUtils;
 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.EndpointLocations;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.Endpoints;
@@ -362,7 +367,7 @@ public class RendererManager implements AutoCloseable {
                         currentState.rendererByNode, epAugmentorRegistry.getEndpointAugmentors());
         configBuilder.setEndpoints(endpoints);
 
-        RuleGroups ruleGroups = rendererPolicyBuilder.buildRuluGroups(currentState.policyInfo);
+        RuleGroups ruleGroups = rendererPolicyBuilder.buildRuleGroups(currentState.policyInfo);
         configBuilder.setRuleGroups(ruleGroups);
 
         RendererForwarding rendererForwarding = rendererPolicyBuilder.buildRendererForwarding(currentState.forwarding,
similarity index 97%
rename from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/AddressEndpointUtils.java
rename to groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/util/AddressEndpointUtils.java
index 8342f579edf653255e494534c2528a07851e4b55..f8688cf0f22cf7641d620fde448cbbe78d89a1b2 100644 (file)
@@ -6,7 +6,7 @@
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.opendaylight.groupbasedpolicy.renderer;
+package org.opendaylight.groupbasedpolicy.renderer.util;
 
 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.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpointKey;
@@ -44,5 +44,4 @@ public class AddressEndpointUtils {
         return new AddressEndpointKey(peerExtEpKey.getAddress(), peerExtEpKey.getAddressType(),
                 peerExtEpKey.getContextId(), peerExtEpKey.getContextType());
     }
-
 }
similarity index 89%
rename from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ContainmentEndpointUtils.java
rename to groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/util/ContainmentEndpointUtils.java
index de3f9681cc6df7a53fc792c68163cbbab8536164..04aab069a161ebe3650fbcda50cdc88fb79b5580 100644 (file)
@@ -6,13 +6,16 @@
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.opendaylight.groupbasedpolicy.renderer;
+package org.opendaylight.groupbasedpolicy.renderer.util;
 
 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.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerExternalContainmentEndpointKey;
 
 public class ContainmentEndpointUtils {
 
+    //hiding default public constructor
+    private ContainmentEndpointUtils() {}
+
     public static PeerExternalContainmentEndpointKey toPeerExtContEpKey(ContainmentEndpointKey peerContEpKey) {
         return new PeerExternalContainmentEndpointKey(peerContEpKey.getContextId(), peerContEpKey.getContextType());
     }
similarity index 97%
rename from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/EndpointLocationUtils.java
rename to groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/util/EndpointLocationUtils.java
index 6e7f81f496bcb7a3a680d05f0f3d39f769b9224f..89478204908805d54a41a344f88601d598153916 100644 (file)
@@ -6,7 +6,7 @@
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.opendaylight.groupbasedpolicy.renderer;
+package org.opendaylight.groupbasedpolicy.renderer.util;
 
 import java.util.List;
 
@@ -25,6 +25,9 @@ import com.google.common.collect.ImmutableMultimap.Builder;
 
 public class EndpointLocationUtils {
 
+    // hiding default public constructor
+    private EndpointLocationUtils() {}
+
     public static ImmutableMultimap<InstanceIdentifier<?>, AddressEndpointLocation> resolveEndpointsByAbsoluteNodeLocation(
             @Nullable List<AddressEndpointLocation> addressEndpointLocations) {
         if (addressEndpointLocations == null) {
index 00432a62226f03e4a62a0334be110bdcd9f73f82..dcc056a7d90308755bcdfba56e8604e0d4320729 100644 (file)
@@ -24,7 +24,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpo
 
 public class EndpointUtils {
 
-    public static AddressEndpointKey createAddressEndointKey(ChildEndpoint child) {
+    public static AddressEndpointKey createAddressEndpointKey(ChildEndpoint child) {
         return new AddressEndpointKey(child.getAddress(), child.getAddressType(), child.getContextId(),
                 child.getContextType());
     }
@@ -57,5 +57,4 @@ public class EndpointUtils {
         }
         return Collections.emptyList();
     }
-
 }
index 801c2bbeb82fc73bc619cc738f5f8d42eaa8ad0b..a9f934745c596cbc6b81149d604fdb3435bfd140 100644 (file)
@@ -14,8 +14,10 @@ import static org.junit.Assert.assertTrue;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableTable;
+
 import java.util.Collections;
 import java.util.Set;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -25,6 +27,7 @@ import org.mockito.runners.MockitoJUnitRunner;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.groupbasedpolicy.base_endpoint.EndpointAugmentorRegistryImpl;
 import org.opendaylight.groupbasedpolicy.forwarding.NetworkDomainAugmentorRegistryImpl;
+import org.opendaylight.groupbasedpolicy.renderer.util.AddressEndpointUtils;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.EndpointLocations;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.EndpointLocationsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.Endpoints;
index b0b40c31cc30e61e13f5729bcfff5b6aabfa351c..4d31d0d35cc0b453232500115f91ca729db4be97 100755 (executable)
@@ -7,6 +7,8 @@
  */
 package org.opendaylight.groupbasedpolicy.resolver;
 
+import com.google.common.base.Preconditions;
+
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -39,6 +41,7 @@ public class PolicyResolverTest extends GbpDataBrokerTest {
     @Before
     public void init() {
         dataProvider = getDataBroker();
+        Preconditions.checkNotNull(dataProvider);
         policyResolver = new PolicyResolver(dataProvider);
     }
 
index 0025e53d58113e1ac69006b3ecd23f4f20c1a9fa..6a33eb3709377885d4c43d2ee78f7a55e85db3b9 100755 (executable)
@@ -9,6 +9,7 @@
 package org.opendaylight.groupbasedpolicy.neutron.mapper.infrastructure;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -64,6 +65,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev
 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.ProviderNamedSelector;
 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.ActionInstance;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.subject.feature.instances.ClassifierInstance;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.subject.feature.instances.ClassifierInstanceBuilder;
 
@@ -385,6 +387,9 @@ public class NetworkService {
             wTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.classifierInstanceIid(tenantId, ci.getName()), ci,
                     true);
         }
+        for (ActionInstance ai : Collections.singleton(MappingUtils.ACTION_ALLOW)) {
+            wTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.actionInstanceIid(tenantId, ai.getName()), ai, true);
+        }
         wTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.contractIid(tenantId, DHCP_CONTRACT_ID), DHCP_CONTRACT,
                 true);
         wTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.contractIid(tenantId, DNS_CONTRACT_ID), DNS_CONTRACT,
index 27823e732e915c2e37eb40dede6f09f7fbb15ab0..53405e7af64565c624d1d7b8f6dd6a8d8c3fac11 100644 (file)
@@ -17,11 +17,10 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContextId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
-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.forwarding.l2_l3.rev160427.L3Context;
 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.rev160427.ContextType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.fields.Parent;
@@ -38,11 +37,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev
 public final class MappingUtils {
 
     public static final String NEUTRON_ROUTER = "neutron_router-";
-    public static final String NEUTRON_EXTERNAL = "neutron_external_network-";
-    public static final String NEUTRON_GROUP = "neutron_group-";
     public static final IpPrefix DEFAULT_ROUTE = new IpPrefix(new Ipv4Prefix("0.0.0.0/0"));
     public static final ActionInstance ACTION_ALLOW = new ActionInstanceBuilder().setName(
-            new ActionName("Allow"))
+            new ActionName("allow"))
         .setActionDefinitionId(AllowActionDefinition.DEFINITION.getId())
         .build();
     public static final ActionChoice ALLOW_ACTION_CHOICE = new AllowActionCaseBuilder().setAllow(
diff --git a/neutron-mapper/src/main/yang/routing-node-spec.yang b/neutron-mapper/src/main/yang/routing-node-spec.yang
new file mode 100644 (file)
index 0000000..4b5c5b3
--- /dev/null
@@ -0,0 +1,175 @@
+module neutron-gbp-mapper {
+    yang-version 1;
+
+    namespace "urn:opendaylight:groupbasedpolicy:neutron-gbp-mapper";
+    prefix "neutron-gbp-mapper";
+
+    import gbp-common { prefix gbp-common; }
+    import endpoint { prefix gbp-endpoint; }
+    import ietf-yang-types { prefix yang; revision-date 2013-07-15; }
+    import ietf-inet-types { prefix inet; revision-date 2013-07-15; }
+    import base-endpoint { prefix base-ep; revision-date 2016-04-27; }
+    import forwarding { prefix fwd; revision-date 2016-04-27; }
+    import l2-l3-forwarding { prefix l2-l3; revision-date 2016-04-27; }
+
+
+
+    description
+        "This module defines the mapping model between Neutron entities and GBP entities.";
+
+    revision "2015-05-13" {
+        description
+            "Initial revision.";
+    }
+
+    grouping neutron-port-key {
+        leaf port-id {
+            description "A unique ID for the neutron port";
+            type gbp-common:unique-id;
+        }
+    }
+
+    container mappings {
+        description "Mapping of neutron entities by groupbasedpolicy entities and vice versa.";
+        config false;
+        container neutron-by-gbp-mappings {
+            description "Neutron entities by groupbasedpolicy entities";
+            container ports-by-endpoints {
+                description "Neutron ports by groupbasedpolicy endpoint";
+                status deprecated;
+                list port-by-endpoint {
+                    description "Neutron port key by groupbasedpolicy endpoint key";
+                    key "l2-context mac-address";
+                    uses gbp-endpoint:l2-key;
+                    uses neutron-port-key;
+                }
+            }
+            container ports-by-base-endpoints {
+                description "Neutron ports by groupbasedpolicy base-endpoint";
+                list port-by-base-endpoint {
+                    description "Neutron port key by groupbasedpolicy base-endpoint key";
+                    key "context-type context-id address-type address";
+                    uses base-ep:address-endpoint-key;
+                    uses neutron-port-key;
+                }
+            }
+
+            container external-gateways-as-endpoints {
+                description "Endpoints that represent Neutron External Gateways for External Subnets.
+                    Please note these ARE NOT Neutron router ports, they are outside of Neutron.";
+                list external-gateway-as-endpoint {
+                    description "Endpoints that represent Neutron External Gateways for External Subnets.
+                        Please note these ARE NOT Neutron router ports, they are outside of Neutron.";
+
+                    key "context-id context-type address address-type";
+
+                    uses base-ep:address-endpoint-key;
+                }
+            }
+
+            container external-gateways-as-l3-endpoints {
+                status deprecated; // use external-gateways-as-endpoints
+                description "L3Endpoints that represent Neutron External Gateways for External Subnets.
+                    Please note these ARE NOT Neutron router ports, they are outside of Neutron.";
+                list external-gateway-as-l3-endpoint {
+                    description "L3Endpoints that represent Neutron External Gateways for External Subnets.
+                        Please note these ARE NOT Neutron router ports, they are outside of Neutron.";
+                    key "l3-context ip-address";
+                    uses gbp-endpoint:l3-key;
+                }
+            }
+
+            container provider-physical-networks-as-l2-flood-domains {
+                status deprecated;
+                list provider-physical-network-as-l2-flood-domain {
+                    key "tenant-id l2-flood-domain-id";
+                    leaf tenant-id {
+                        description "Tenant of L2 Flood Domain";
+                        type gbp-common:tenant-id;
+                    }
+                    leaf l2-flood-domain-id {
+                        description "The L2 Flood Domain ID";
+                        type gbp-common:l2-flood-domain-id;
+                    }
+                    leaf segmentation-id {
+                        mandatory true;
+                        description "An isolated segment on the physical network. The network-type
+                            attribute defines the segmentation model. For example, if network-type
+                            is vlan, this ID is a vlan identifier.";
+                        type string;
+                    }
+                }
+            }
+
+            container provider-networks-as-l2-flood-domains {
+                list provider-physical-network-as-l2-flood-domain {
+                    key "tenant-id l2-flood-domain-id";
+                    leaf tenant-id {
+                        description "Tenant of L2 Flood Domain";
+                        type gbp-common:tenant-id;
+                    }
+                    leaf l2-flood-domain-id {
+                        type gbp-common:context-id;
+                    }
+                    leaf segmentation-id {
+                        mandatory true;
+                        description "An isolated segment on the physical network. The network-type
+                            attribute defines the segmentation model. For example, if network-type
+                            is vlan, this ID is a vlan identifier.";
+                        type string;
+                    }
+                }
+            }
+        }
+
+        container gbp-by-neutron-mappings {
+            description "Groupbasedpolicy entities by neutron entities";
+            container endpoints-by-ports {
+                description "Groupbasedpolicy endpoints by neutron ports";
+                status deprecated;
+                list endpoint-by-port {
+                    description "Groupbasedpolicy endpoint key by neutron port key";
+                    key port-id;
+                    uses neutron-port-key;
+                    uses gbp-endpoint:l2-key;
+                }
+            }
+            container base-endpoints-by-ports {
+                description "Groupbasedpolicy base-endpoints by neutron ports";
+                list base-endpoint-by-port {
+                    description "Groupbasedpolicy base-endpoint key by neutron port key";
+                    key port-id;
+                    uses neutron-port-key;
+                    uses base-ep:address-endpoint-key;
+                }
+            }
+        }
+    }
+
+    rpc change-action-of-security-group-rules {
+        input {
+            list security-group-rule {
+                key uuid;
+                leaf uuid {
+                    type yang:uuid;
+                    description "UUID to index this neutron security group rule.";
+                }
+            }
+            container action {
+                choice action-choice {
+                    case sfc-action-case {
+                        leaf sfc-chain-name {
+                            type string;
+                        }
+                    }
+                    case allow-action-case {
+                        container allow {
+                            presence true;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+}
index 7622ba488a1cab5a4b81be5a8d2bcc3ed57dde32..d9db8c14d3e983c4ac73797f06151b4e797edd08 100644 (file)
@@ -33,6 +33,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gb
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.base.endpoints.by.ports.BaseEndpointByPort;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.base.endpoints.by.ports.BaseEndpointByPortKey;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.Config;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.ExcludeFromPolicy;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.ExcludeFromPolicyBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes._interface.type.choice.LoopbackCase;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes._interface.type.choice.LoopbackCaseBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes._interface.type.choice.TapCase;\r
@@ -253,6 +255,8 @@ public class PortHandler implements TransactionChainListener {
                     .setName(createQRouterPortName(port.getUuid()))\r
                     .build();\r
             vppEpBuilder.setInterfaceTypeChoice(tapCase);\r
+            vppEpBuilder.addAugmentation(ExcludeFromPolicy.class,\r
+                    new ExcludeFromPolicyBuilder().setExcludeFromPolicy(true).build());\r
         } else if (isValidVppRouterPort(port)) {\r
             if (!DEFAULT_NODE.equals(routingNode.getValue())) {\r
                 LOG.warn(\r
diff --git a/renderers/iovisor/src/main/resources/META-INF/MANIFEST.MF b/renderers/iovisor/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644 (file)
index 0000000..78d1fb9
--- /dev/null
@@ -0,0 +1,223 @@
+Manifest-Version: 1.0
+Bnd-LastModified: 1485939979022
+Build-Jdk: 1.8.0_112
+Built-By: tcechval
+Bundle-Description: OpenDaylight is leading the transformation to Open S
+ oftware Defined Networking (SDN). For more information, please see http
+ s://www.opendaylight.org
+Bundle-DocURL: https://www.opendaylight.org
+Bundle-License: https://www.eclipse.org/legal/epl-v10.html
+Bundle-ManifestVersion: 2
+Bundle-Name: iovisor-renderer
+Bundle-SymbolicName: org.opendaylight.groupbasedpolicy.iovisor-renderer
+Bundle-Vendor: OpenDaylight
+Bundle-Version: 0.5.0.SNAPSHOT
+Created-By: Apache Maven Bundle Plugin
+Export-Package: org.opendaylight.groupbasedpolicy.renderer.iovisor.endpo
+ int;version="0.5.0";uses:="org.opendaylight.controller.md.sal.binding.a
+ pi,org.opendaylight.groupbasedpolicy.api,org.opendaylight.groupbasedpol
+ icy.renderer.iovisor.module,org.opendaylight.groupbasedpolicy.util,org.
+ opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev
+ 140421,org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.e
+ ndpoint.rev140421.endpoints,org.opendaylight.yangtools.yang.binding",or
+ g.opendaylight.groupbasedpolicy.renderer.iovisor;version="0.5.0";uses:=
+ "org.opendaylight.controller.md.sal.binding.api,org.opendaylight.groupb
+ asedpolicy.api,org.opendaylight.groupbasedpolicy.renderer.iovisor.endpo
+ int,org.opendaylight.groupbasedpolicy.renderer.iovisor.module,org.opend
+ aylight.groupbasedpolicy.util,org.opendaylight.yang.gen.v1.urn.opendayl
+ ight.groupbasedpolicy.iovisor.rev151030,org.opendaylight.yang.gen.v1.ur
+ n.opendaylight.groupbasedpolicy.renderer.rev151103,org.opendaylight.yan
+ g.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.re
+ solved.policies,org.opendaylight.yangtools.yang.binding",org.opendaylig
+ ht.groupbasedpolicy.renderer.iovisor.module;version="0.5.0";uses:="org.
+ opendaylight.controller.md.sal.binding.api,org.opendaylight.controller.
+ md.sal.common.api.data,org.opendaylight.groupbasedpolicy.util,org.opend
+ aylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.
+ rev151030,org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolic
+ y.iovisor.rev151030.iovisor.module.instances,org.opendaylight.yang.gen.
+ v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.iovisor.modules.
+ by.tenant.by.endpointgroup.id.iovisor.module.by.tenant.by.endpointgroup
+ .id,org.opendaylight.yangtools.yang.binding",org.opendaylight.groupbase
+ dpolicy.renderer.iovisor.restclient;version="0.5.0",org.opendaylight.gr
+ oupbasedpolicy.renderer.iovisor.sf;version="0.5.0";uses:="org.opendayli
+ ght.controller.md.sal.binding.api,org.opendaylight.groupbasedpolicy.api
+ ,org.opendaylight.groupbasedpolicy.util,org.opendaylight.yang.gen.v1.ur
+ n.opendaylight.groupbasedpolicy.common.rev140421,org.opendaylight.yang.
+ gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421,org.opendayli
+ ght.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subj
+ ect.feature.definitions,org.opendaylight.yang.gen.v1.urn.opendaylight.g
+ roupbasedpolicy.policy.rev140421.subject.feature.instance,org.opendayli
+ ght.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tena
+ nts.tenant.policy.subject.feature.instances,org.opendaylight.yang.gen.v
+ 1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.render
+ er.capabilities.supported.action.definition,org.opendaylight.yang.gen.v
+ 1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.render
+ er.capabilities.supported.classifier.definition,org.opendaylight.yangto
+ ols.yang.binding",org.opendaylight.groupbasedpolicy.renderer.iovisor.ut
+ ils;version="0.5.0";uses:="org.opendaylight.controller.md.sal.binding.a
+ pi,org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.t
+ ypes.rev130715,org.opendaylight.yang.gen.v1.urn.opendaylight.groupbased
+ policy.common.rev140421,org.opendaylight.yang.gen.v1.urn.opendaylight.g
+ roupbasedpolicy.iovisor.rev151030,org.opendaylight.yang.gen.v1.urn.open
+ daylight.groupbasedpolicy.iovisor.rev151030.iovisor.module.instances,or
+ g.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.re
+ v151030.iovisor.modules.by.tenant.by.endpointgroup.id,org.opendaylight.
+ yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.iovisor
+ .resolved.endpoints,org.opendaylight.yang.gen.v1.urn.opendaylight.group
+ basedpolicy.iovisor.rev151030.iovisor.resolved.endpoints.by.tenant.by.e
+ ndpointgroup.id,org.opendaylight.yangtools.yang.binding",org.opendaylig
+ ht.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030;vers
+ ion="0.5.0";uses:="org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.
+ yang.ietf.inet.types.rev130715,org.opendaylight.yang.gen.v1.urn.openday
+ light.groupbasedpolicy.endpoint.rev140421,org.opendaylight.yang.gen.v1.
+ urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints,org.open
+ daylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev15103
+ 0.iovisor.module.instances,org.opendaylight.yang.gen.v1.urn.opendayligh
+ t.groupbasedpolicy.iovisor.rev151030.iovisor.modules.by.tenant.by.endpo
+ intgroup.id,org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpol
+ icy.iovisor.rev151030.iovisor.resolved.endpoints,org.opendaylight.yang.
+ gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.iovisor.reso
+ lved.endpoints.by.tenant.by.endpointgroup.id,org.opendaylight.yangtools
+ .concepts,org.opendaylight.yangtools.yang.binding,org.opendaylight.yang
+ tools.yang.common",org.opendaylight.yang.gen.v1.urn.opendaylight.groupb
+ asedpolicy.iovisor.rev151030.iovisor.module.instances;version="0.5.0";u
+ ses:="org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ine
+ t.types.rev130715,org.opendaylight.yang.gen.v1.urn.opendaylight.groupba
+ sedpolicy.iovisor.rev151030,org.opendaylight.yangtools.concepts,org.ope
+ ndaylight.yangtools.yang.binding,org.opendaylight.yangtools.yang.common
+ ",org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ioviso
+ r.rev151030.iovisor.modules.by.tenant.by.endpointgroup.id.iovisor.modul
+ e.by.tenant.by.endpointgroup.id;version="0.5.0";uses:="org.opendaylight
+ .yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030,org.op
+ endaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151
+ 030.iovisor.modules.by.tenant.by.endpointgroup.id,org.opendaylight.yang
+ tools.concepts,org.opendaylight.yangtools.yang.binding,org.opendaylight
+ .yangtools.yang.common",org.opendaylight.yang.gen.v1.urn.opendaylight.g
+ roupbasedpolicy.iovisor.rev151030.iovisor.modules.by.tenant.by.endpoint
+ group.id;version="0.5.0";uses:="org.opendaylight.yang.gen.v1.urn.openda
+ ylight.groupbasedpolicy.common.rev140421,org.opendaylight.yang.gen.v1.u
+ rn.opendaylight.groupbasedpolicy.iovisor.rev151030,org.opendaylight.yan
+ g.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.iovisor.mo
+ dules.by.tenant.by.endpointgroup.id.iovisor.module.by.tenant.by.endpoin
+ tgroup.id,org.opendaylight.yangtools.concepts,org.opendaylight.yangtool
+ s.yang.binding,org.opendaylight.yangtools.yang.common",org.opendaylight
+ .yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.ioviso
+ r.resolved.endpoints.by.tenant.by.endpointgroup.id.iovisor.resolved.end
+ point.by.tenant.by.endpointgroup.id;version="0.5.0";uses:="org.opendayl
+ ight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.r
+ ev140421,org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy
+ .endpoint.rev140421,org.opendaylight.yang.gen.v1.urn.opendaylight.group
+ basedpolicy.iovisor.rev151030.iovisor.resolved.endpoints.by.tenant.by.e
+ ndpointgroup.id,org.opendaylight.yangtools.concepts,org.opendaylight.ya
+ ngtools.yang.binding,org.opendaylight.yangtools.yang.common",org.openda
+ ylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.
+ iovisor.resolved.endpoints.by.tenant.by.endpointgroup.id;version="0.5.0
+ ";uses:="org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy
+ .common.rev140421,org.opendaylight.yang.gen.v1.urn.opendaylight.groupba
+ sedpolicy.iovisor.rev151030,org.opendaylight.yang.gen.v1.urn.opendaylig
+ ht.groupbasedpolicy.iovisor.rev151030.iovisor.resolved.endpoints.by.ten
+ ant.by.endpointgroup.id.iovisor.resolved.endpoint.by.tenant.by.endpoint
+ group.id,org.opendaylight.yangtools.concepts,org.opendaylight.yangtools
+ .yang.binding,org.opendaylight.yangtools.yang.common",org.opendaylight.
+ yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.iovisor
+ .resolved.endpoints;version="0.5.0";uses:="org.opendaylight.yang.gen.v1
+ .urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715,org.opendaylight
+ .yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421,org.ope
+ ndaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140
+ 421,org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovi
+ sor.rev151030,org.opendaylight.yangtools.concepts,org.opendaylight.yang
+ tools.yang.binding,org.opendaylight.yangtools.yang.common"
+Import-Package: com.google.common.base;version="[18.0,19)",com.google.co
+ mmon.collect;version="[18.0,19)",com.google.common.net;version="[18.0,1
+ 9)",com.google.common.util.concurrent;version="[18.0,19)",com.sun.jerse
+ y.api.client;version="[1.17,2)",com.sun.jersey.api.client.config;versio
+ n="[1.17,2)",javax.ws.rs.core;version="[1.1,2)",org.opendaylight.contro
+ ller.config.api;version="[0.6,1)",org.opendaylight.controller.config.ap
+ i.annotations;version="[0.6,1)",org.opendaylight.controller.config.spi;
+ version="[0.6,1)",org.opendaylight.controller.md.sal.binding.api;versio
+ n="[1.5,2)",org.opendaylight.controller.md.sal.common.api.data;version=
+ "[1.5,2)",org.opendaylight.controller.sal.common.util;version="[1.5,2)"
+ ,org.opendaylight.groupbasedpolicy.api;version="[0.5,1)",org.opendaylig
+ ht.groupbasedpolicy.api.sf;version="[0.5,1)",org.opendaylight.groupbase
+ dpolicy.dto;version="[0.5,1)",org.opendaylight.groupbasedpolicy.rendere
+ r.iovisor;version="[0.5,1)",org.opendaylight.groupbasedpolicy.renderer.
+ iovisor.endpoint;version="[0.5,1)",org.opendaylight.groupbasedpolicy.re
+ nderer.iovisor.module;version="[0.5,1)",org.opendaylight.groupbasedpoli
+ cy.renderer.iovisor.restclient;version="[0.5,1)",org.opendaylight.group
+ basedpolicy.renderer.iovisor.sf;version="[0.5,1)",org.opendaylight.grou
+ pbasedpolicy.renderer.iovisor.utils;version="[0.5,1)",org.opendaylight.
+ groupbasedpolicy.util;version="[0.5,1)",org.opendaylight.mdsal.singleto
+ n.common.api;version="[2.2,3)",org.opendaylight.yang.gen.v1.urn.ietf.pa
+ rams.xml.ns.yang.ietf.inet.types.rev130715;version="[1.2,2)",org.openda
+ ylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421;v
+ ersion="[0.5,1)",org.opendaylight.yang.gen.v1.urn.opendaylight.groupbas
+ edpolicy.endpoint.rev140421;version="[0.5,1)",org.opendaylight.yang.gen
+ .v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints;vers
+ ion="[0.5,1)",org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedp
+ olicy.iovisor.rev151030;version="[0.5,1)",org.opendaylight.yang.gen.v1.
+ urn.opendaylight.groupbasedpolicy.iovisor.rev151030.iovisor.module.inst
+ ances;version="[0.5,1)",org.opendaylight.yang.gen.v1.urn.opendaylight.g
+ roupbasedpolicy.iovisor.rev151030.iovisor.modules.by.tenant.by.endpoint
+ group.id;version="[0.5,1)",org.opendaylight.yang.gen.v1.urn.opendayligh
+ t.groupbasedpolicy.iovisor.rev151030.iovisor.modules.by.tenant.by.endpo
+ intgroup.id.iovisor.module.by.tenant.by.endpointgroup.id;version="[0.5,
+ 1)",org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovi
+ sor.rev151030.iovisor.resolved.endpoints;version="[0.5,1)",org.opendayl
+ ight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.io
+ visor.resolved.endpoints.by.tenant.by.endpointgroup.id;version="[0.5,1)
+ ",org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ioviso
+ r.rev151030.iovisor.resolved.endpoints.by.tenant.by.endpointgroup.id.io
+ visor.resolved.endpoint.by.tenant.by.endpointgroup.id;version="[0.5,1)"
+ ,org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.
+ rev140421;version="[0.5,1)",org.opendaylight.yang.gen.v1.urn.opendaylig
+ ht.groupbasedpolicy.policy.rev140421.subject.feature.definitions;versio
+ n="[0.5,1)",org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpol
+ icy.policy.rev140421.subject.feature.instance;version="[0.5,1)",org.ope
+ ndaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev14042
+ 1.subject.feature.instance.parameter.value;version="[0.5,1)",org.openda
+ ylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.t
+ enants.tenant.policy.subject.feature.instances;version="[0.5,1)",org.op
+ endaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev15
+ 1103;version="[0.5,1)",org.opendaylight.yang.gen.v1.urn.opendaylight.gr
+ oupbasedpolicy.renderer.rev151103.has.parameters.type;version="[0.5,1)"
+ ,org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.rendere
+ r.rev151103.has.parameters.type.parameter.type;version="[0.5,1)",org.op
+ endaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev15
+ 1103.renderers;version="[0.5,1)",org.opendaylight.yang.gen.v1.urn.opend
+ aylight.groupbasedpolicy.renderer.rev151103.renderers.renderer;version=
+ "[0.5,1)",org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolic
+ y.renderer.rev151103.renderers.renderer.capabilities;version="[0.5,1)",
+ org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer
+ .rev151103.renderers.renderer.capabilities.supported.action.definition;
+ version="[0.5,1)",org.opendaylight.yang.gen.v1.urn.opendaylight.groupba
+ sedpolicy.renderer.rev151103.renderers.renderer.capabilities.supported.
+ classifier.definition;version="[0.5,1)",org.opendaylight.yang.gen.v1.ur
+ n.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.i
+ nterests.followed.tenants.followed.tenant;version="[0.5,1)",org.openday
+ light.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.
+ supported._int.value.fields;version="[0.5,1)",org.opendaylight.yang.gen
+ .v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.supported.rang
+ e.value.fields;version="[0.5,1)",org.opendaylight.yang.gen.v1.urn.opend
+ aylight.groupbasedpolicy.resolved.policy.rev150828;version="[0.5,1)",or
+ g.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.p
+ olicy.rev150828.resolved.policies;version="[0.5,1)",org.opendaylight.ya
+ ng.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupba
+ sedpolicy.rev151106;version="[0.5,1)",org.opendaylight.yang.gen.v1.urn.
+ opendaylight.params.xml.ns.yang.controller.config.rev130405;version="[0
+ .6,1)",org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang
+ .controller.config.rev130405.modules.module;version="[0.6,1)",org.opend
+ aylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.s
+ al.binding.impl.rev131028;version="[1.5,2)",org.opendaylight.yang.gen.v
+ 1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.binding.rev1310
+ 28;version="[1.5,2)",org.opendaylight.yang.gen.v1.urn.opendaylight.yang
+ .extension.yang.ext.rev130709;version="[2013.9,2014)",org.opendaylight.
+ yangtools.concepts;version="[1.1,2)",org.opendaylight.yangtools.yang.bi
+ nding;version="[0.10,1)",org.opendaylight.yangtools.yang.binding.annota
+ tions;version="[0.10,1)",org.opendaylight.yangtools.yang.common;version
+ ="[1.1,2)",org.osgi.framework;version="[1.7,2)",org.slf4j;version="[1.7
+ ,2)"
+Originally-Created-By: Apache Maven Bundle Plugin
+Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))"
+Tool: Bnd-3.0.0.201509101326
index e591ea4e813286b3bf3d43e4e8cfd428ece76e81..4a7711512c1bffea3829ff1617df1f81a79b7127 100644 (file)
@@ -8,6 +8,7 @@
 
 package org.opendaylight.controller.config.yang.config.vpp_provider.impl;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
@@ -19,6 +20,7 @@ import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
 import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.api.BridgeDomainManager;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.adapter.VppRpcServiceImpl;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.iface.AclManager;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.iface.InterfaceManager;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.listener.RendererPolicyListener;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.listener.VppEndpointListener;
@@ -28,7 +30,10 @@ import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.BridgeDomainManager
 import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.ForwardingManager;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.VppRendererPolicyManager;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.sf.AllowAction;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.sf.Classifier;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.sf.EtherTypeClassifier;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.sf.IpProtoClassifier;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.sf.L4Classifier;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.MountedDataBrokerProvider;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.RendererName;
@@ -61,15 +66,13 @@ public class VppRenderer implements AutoCloseable, BindingAwareProvider {
             ImmutableList.of(new SupportedActionDefinitionBuilder().setActionDefinitionId(new AllowAction().getId())
                 .setSupportedParameterValues(new AllowAction().getSupportedParameterValues())
                 .build());
-    private final List<SupportedClassifierDefinition> classifierDefinitions = ImmutableList
-        .of(new SupportedClassifierDefinitionBuilder().setClassifierDefinitionId(new EtherTypeClassifier(null).getId())
-            .setSupportedParameterValues(new EtherTypeClassifier(null).getSupportedParameterValues())
-            .build());
+    private final List<SupportedClassifierDefinition> classifierDefinitions;
 
     private final DataBroker dataBroker;
 
     private VppNodeManager vppNodeManager;
     private InterfaceManager interfaceManager;
+    private AclManager aclManager;
     private VppRendererPolicyManager vppRendererPolicyManager;
 
     private VppNodeListener vppNodeListener;
@@ -80,6 +83,24 @@ public class VppRenderer implements AutoCloseable, BindingAwareProvider {
     public VppRenderer(DataBroker dataBroker, BindingAwareBroker bindingAwareBroker) {
         this.dataBroker = Preconditions.checkNotNull(dataBroker);
         bindingAwareBroker.registerProvider(this);
+        EtherTypeClassifier etherTypeClassifier = new EtherTypeClassifier(null);
+        IpProtoClassifier ipProtoClassifier = new IpProtoClassifier(etherTypeClassifier);
+        classifierDefinitions =
+                buildClassifierDefinitions(etherTypeClassifier, ipProtoClassifier, new L4Classifier(ipProtoClassifier));
+    }
+
+    private List<SupportedClassifierDefinition> buildClassifierDefinitions(Classifier ... classifs) {
+        List<SupportedClassifierDefinition> clDefs = new ArrayList<>();
+        SupportedClassifierDefinitionBuilder clDefBuilder = new SupportedClassifierDefinitionBuilder();
+        for (Classifier classif : classifs) {
+            if (classif.getParent() != null) {
+                clDefBuilder.setParentClassifierDefinitionId(classif.getParent().getId());
+            }
+            clDefs.add(clDefBuilder.setClassifierDefinitionId(classif.getId())
+                .setSupportedParameterValues(classif.getSupportedParameterValues())
+                .build());
+        }
+        return clDefs;
     }
 
     @Override
@@ -112,10 +133,11 @@ public class VppRenderer implements AutoCloseable, BindingAwareProvider {
         EventBus dtoEventBus = new EventBus((exception, context) -> LOG.error("Could not dispatch event: {} to {}",
                 context.getSubscriber(), context.getSubscriberMethod(), exception));
         interfaceManager = new InterfaceManager(mountDataProvider, dataBroker);
+        aclManager = new AclManager(mountDataProvider);
         dtoEventBus.register(interfaceManager);
         BridgeDomainManager bdManager = new BridgeDomainManagerImpl(dataBroker);
-        ForwardingManager fwManager = new ForwardingManager(interfaceManager, bdManager, dataBroker);
-        vppRendererPolicyManager = new VppRendererPolicyManager(fwManager, dataBroker);
+        ForwardingManager fwManager = new ForwardingManager(interfaceManager, aclManager, bdManager, dataBroker);
+        vppRendererPolicyManager = new VppRendererPolicyManager(fwManager, aclManager, dataBroker);
         dtoEventBus.register(vppRendererPolicyManager);
 
         vppNodeListener = new VppNodeListener(dataBroker, vppNodeManager, dtoEventBus);
diff --git a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/iface/AclManager.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/iface/AclManager.java
new file mode 100644 (file)
index 0000000..29f5583
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2017 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.iface;
+
+import java.util.stream.Collectors;
+
+import javax.annotation.Nonnull;
+
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.groupbasedpolicy.renderer.util.AddressEndpointUtils;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.PolicyContext;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.acl.AccessListUtil;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.KeyFactory;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.MountedDataBrokerProvider;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.absolute.location.location.type.ExternalLocationCase;
+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.renderer.endpoints.RendererEndpointKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpointKey;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableSet;
+
+public class AclManager {
+
+    private static final Logger LOG = LoggerFactory.getLogger(AclManager.class);
+    private final MountedDataBrokerProvider mountDataProvider;
+
+    public AclManager(@Nonnull MountedDataBrokerProvider mountDataProvider) {
+        this.mountDataProvider = Preconditions.checkNotNull(mountDataProvider);
+    }
+
+    public void updateAclsForPeers(PolicyContext policyCtx, RendererEndpointKey rEpKey) {
+        ImmutableSet<PeerEndpointKey> peers = policyCtx.getPolicyTable().row(rEpKey).keySet();
+        for (RendererEndpointKey peerRendEp : peers.stream()
+            .map(AddressEndpointUtils::fromPeerEpKey)
+            .collect(Collectors.toList())
+            .stream()
+            .map(AddressEndpointUtils::toRendererEpKey)
+            .collect(Collectors.toList())) {
+            updateAclsForRendEp(peerRendEp, policyCtx);
+        }
+    }
+
+    public void updateAclsForRendEp(RendererEndpointKey rEpKey, PolicyContext policyCtx) {
+        LOG.info("Updating policy for endpoint {}", rEpKey);
+        AddressEndpointWithLocation peerAddrEp = policyCtx.getAddrEpByKey().get(KeyFactory.addressEndpointKey(rEpKey));
+        ExternalLocationCase epLoc = InterfaceManager.resolveAndValidateLocation(peerAddrEp);
+        InstanceIdentifier<?> vppNodeIid = epLoc.getExternalNodeMountPoint();
+        Optional<InstanceIdentifier<Interface>> optInterfaceIid =
+                VppPathMapper.interfaceToInstanceIdentifier(epLoc.getExternalNodeConnector());
+        if (!optInterfaceIid.isPresent()) {
+            LOG.warn("Cannot  find interface for endpoint {}. ACLs for endpoint not updated {}. ", rEpKey);
+            return;
+        }
+        Optional<DataBroker> optMountPoint = mountDataProvider.getDataBrokerForMountPoint(vppNodeIid);
+        AccessListUtil.resolveAclsOnInterface(rEpKey, policyCtx).forEach(aclWrapper -> aclWrapper
+            .writeAcl(optMountPoint.get(), optInterfaceIid.get().firstKeyOf(Interface.class)));
+    }
+}
index afa42e76ff38e275132da875ce938c8610dbcf6f..f7d4eade21ed9d7fb2b5c9f55ea99e8b825ad8f5 100644 (file)
@@ -8,16 +8,13 @@
 
 package org.opendaylight.groupbasedpolicy.renderer.vpp.iface;
 
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
-import java.util.concurrent.ExecutionException;
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-import com.google.common.base.Strings;
-import com.google.common.eventbus.Subscribe;
-import com.google.common.util.concurrent.AsyncFunction;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
+
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
@@ -28,6 +25,7 @@ import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.VhostUserCommand;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.VhostUserCommand.VhostUserCommandBuilder;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.event.NodeOperEvent;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.event.VppEndpointConfEvent;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.acl.AccessListWrapper;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.GbpNetconfTransaction;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.General.Operations;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.MountedDataBrokerProvider;
@@ -40,6 +38,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpo
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.absolute.location.location.type.ExternalLocationCase;
 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.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.ExcludeFromPolicy;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes.InterfaceTypeChoice;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes._interface.type.choice.LoopbackCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes._interface.type.choice.TapCase;
@@ -52,16 +51,28 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.base.attributes.Interconnection;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.base.attributes.interconnection.BridgeBased;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.base.attributes.interconnection.BridgeBasedBuilder;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.SetMultimap;
+import com.google.common.eventbus.Subscribe;
+import com.google.common.util.concurrent.AsyncFunction;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+
 public class InterfaceManager implements AutoCloseable {
 
     private static final Logger LOG = LoggerFactory.getLogger(InterfaceManager.class);
     private final MountedDataBrokerProvider mountDataProvider;
     private final VppEndpointLocationProvider vppEndpointLocationProvider;
+    private final SetMultimap<NodeId, String> excludedFromPolicy = HashMultimap.create();
 
     public InterfaceManager(@Nonnull MountedDataBrokerProvider mountDataProvider, @Nonnull DataBroker dataProvider) {
         this.mountDataProvider = Preconditions.checkNotNull(mountDataProvider);
@@ -75,13 +86,17 @@ public class InterfaceManager implements AutoCloseable {
             switch (event.getDtoModificationType()) {
                 case CREATED: {
                     vppEndpointCreated(event.getAfter().get()).get();
+                    updatePolicyExcludedEndpoints(event.getAfter().get(), true);
                 }
                 break;
                 case UPDATED:
                     vppEndpointUpdated(event.getBefore().get(), event.getAfter().get()).get();
+                    updatePolicyExcludedEndpoints(event.getBefore().get(), false);
+                    updatePolicyExcludedEndpoints(event.getAfter().get(), true);
                     break;
                 case DELETED:
                     vppEndpointDeleted(event.getBefore().get()).get();
+                    updatePolicyExcludedEndpoints(event.getBefore().get(), false);
                     break;
             }
         } catch (InterruptedException | ExecutionException e) {
@@ -89,6 +104,17 @@ public class InterfaceManager implements AutoCloseable {
         }
     }
 
+    private void updatePolicyExcludedEndpoints(VppEndpoint vppEndpoint, boolean created) {
+        if (vppEndpoint.getAugmentation(ExcludeFromPolicy.class) != null) {
+            return;
+        }
+        if (created) {
+            excludedFromPolicy.put(vppEndpoint.getVppNodeId(), vppEndpoint.getVppInterfaceName());
+            return;
+        }
+        excludedFromPolicy.remove(vppEndpoint.getVppNodeId(), vppEndpoint.getVppInterfaceName());
+    }
+
     private ListenableFuture<Void> vppEndpointCreated(VppEndpoint vppEndpoint) {
         InterfaceTypeChoice interfaceTypeChoice = vppEndpoint.getInterfaceTypeChoice();
         LOG.trace("Creating VPP endpoint {}, type of {}", vppEndpoint, interfaceTypeChoice);
@@ -318,6 +344,7 @@ public class InterfaceManager implements AutoCloseable {
      */
     public synchronized ListenableFuture<Void> addBridgeDomainToInterface(@Nonnull String bridgeDomainName,
                                                                           @Nonnull AddressEndpointWithLocation addrEpWithLoc,
+                                                                          @Nonnull List<AccessListWrapper> aclWrappers,
                                                                           boolean enableBvi) {
         ExternalLocationCase epLoc = resolveAndValidateLocation(addrEpWithLoc);
         InstanceIdentifier<?> vppNodeIid = epLoc.getExternalNodeMountPoint();
@@ -369,6 +396,16 @@ public class InterfaceManager implements AutoCloseable {
                 GbpNetconfTransaction.RETRY_COUNT);
         if (transactionState) {
             LOG.debug("Adding bridge domain {} to interface {} successful", bridgeDomainName, interfacePath);
+            Set<String> excludedIfaces = excludedFromPolicy.get(vppNodeIid.firstKeyOf(Node.class).getNodeId());
+            if(excludedIfaces == null || !excludedIfaces.contains(interfaceIid.firstKeyOf(Interface.class).getName())) {
+                // can apply ACLs on interfaces in bridge domains
+                aclWrappers.forEach(aclWrapper -> {
+                    LOG.debug("Writing access list for interface {} on a node {}.", interfaceIid,
+                            vppNodeIid);
+                    aclWrapper.writeAcl(mountpoint, interfaceIid.firstKeyOf(Interface.class));
+                    aclWrapper.writeAclRefOnIface(mountpoint, interfaceIid);
+                });
+            }
             String bridgeDomainPath = VppPathMapper.bridgeDomainToRestPath(bridgeDomainName);
             return vppEndpointLocationProvider.replaceLocationForEndpoint(new ExternalLocationCaseBuilder()
                     .setExternalNode(bridgeDomainPath)
@@ -444,10 +481,9 @@ public class InterfaceManager implements AutoCloseable {
      *                      and {@link ExternalLocationCase#getExternalNodeConnector()} MUST NOT be {@code null}
      * @return {@link ListenableFuture}
      */
-    public synchronized
-    @Nonnull
-    ListenableFuture<Void> deleteBridgeDomainFromInterface(
+    public synchronized @Nonnull ListenableFuture<Void> deleteBridgeDomainFromInterface(
             @Nonnull AddressEndpointWithLocation addrEpWithLoc) {
+        // TODO update ACLs for peers
         ExternalLocationCase epLoc = resolveAndValidateLocation(addrEpWithLoc);
         InstanceIdentifier<?> vppNodeIid = epLoc.getExternalNodeMountPoint();
         String interfacePath = epLoc.getExternalNodeConnector();
@@ -476,23 +512,27 @@ public class InterfaceManager implements AutoCloseable {
             LOG.debug("Bridge domain does not exist therefore it is considered as deleted for interface {}",
                     interfacePath);
             // bridge domain does not exist on interface so we consider job done
-            return vppEndpointLocationProvider.replaceLocationForEndpoint(new ExternalLocationCaseBuilder()
-                    .setExternalNode(null)
-                    .setExternalNodeMountPoint(vppNodeIid)
-                    .setExternalNodeConnector(interfacePath)
-                    .build(), addrEpWithLoc.getKey());
+            return vppEndpointLocationProvider.replaceLocationForEndpoint(
+                    new ExternalLocationCaseBuilder().setExternalNode(null)
+                        .setExternalNodeMountPoint(vppNodeIid)
+                        .setExternalNodeConnector(interfacePath)
+                        .build(),
+                    addrEpWithLoc.getKey());
         }
         InstanceIdentifier<L2> l2Iid =
                 interfaceIid.builder().augmentation(VppInterfaceAugmentation.class).child(L2.class).build();
         LOG.debug("Deleting bridge domain from interface {}", interfacePath);
-        final boolean transactionState = GbpNetconfTransaction.deleteIfExists(mountpoint, l2Iid,
-                GbpNetconfTransaction.RETRY_COUNT);
+        final boolean transactionState =
+                GbpNetconfTransaction.deleteIfExists(mountpoint, l2Iid, GbpNetconfTransaction.RETRY_COUNT);
         if (transactionState) {
-            return vppEndpointLocationProvider.replaceLocationForEndpoint(new ExternalLocationCaseBuilder()
-                    .setExternalNode(null)
-                    .setExternalNodeMountPoint(vppNodeIid)
-                    .setExternalNodeConnector(interfacePath)
-                    .build(), addrEpWithLoc.getKey());
+            AccessListWrapper.removeAclsForInterface(mountpoint, interfaceIid.firstKeyOf(Interface.class));
+            AccessListWrapper.removeAclRefFromIface(mountpoint, interfaceIid.firstKeyOf(Interface.class));
+            return vppEndpointLocationProvider.replaceLocationForEndpoint(
+                    new ExternalLocationCaseBuilder().setExternalNode(null)
+                        .setExternalNodeMountPoint(vppNodeIid)
+                        .setExternalNodeConnector(interfacePath)
+                        .build(),
+                    addrEpWithLoc.getKey());
         } else {
             final String message = "Failed to delete bridge domain from interface " + interfacePath;
             LOG.warn(message);
@@ -500,7 +540,7 @@ public class InterfaceManager implements AutoCloseable {
         }
     }
 
-    private static ExternalLocationCase resolveAndValidateLocation(AddressEndpointWithLocation addrEpWithLoc) {
+    static ExternalLocationCase resolveAndValidateLocation(AddressEndpointWithLocation addrEpWithLoc) {
         LocationType locationType = addrEpWithLoc.getAbsoluteLocation().getLocationType();
         if (!(locationType instanceof ExternalLocationCase)) {
             throw new IllegalArgumentException("Endpoint does not have external location " + addrEpWithLoc);
index 461ce4bd0296ba8e42804fc5453e2ac34a6851a7..282faa1892e598c1422f3009ecbb31e4930af5a6 100644 (file)
@@ -22,7 +22,9 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.api.BridgeDomainManager;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.iface.AclManager;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.iface.InterfaceManager;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.acl.AccessListUtil;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.KeyFactory;
 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.common.endpoint.fields.NetworkContainment;
@@ -45,12 +47,12 @@ 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.forwarding.renderer.forwarding.by.tenant.RendererNetworkDomainKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.Config;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.VlanNetwork;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes.InterfaceTypeChoice;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes._interface.type.choice.LoopbackCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpBridgeDomain;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpBridgeDomainKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpoint;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpointKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes.InterfaceTypeChoice;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes._interface.type.choice.LoopbackCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VxlanVni;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
@@ -73,12 +75,16 @@ public final class ForwardingManager {
     private long lastVxlanVni = 1L;
     private final Map<String, VxlanVni> vxlanVniByBridgeDomain = new HashMap<>();
     private final InterfaceManager ifaceManager;
+    private final AclManager aclManager;
     private final BridgeDomainManager bdManager;
     private final DataBroker dataBroker;
-    public ForwardingManager(@Nonnull InterfaceManager ifaceManager, @Nonnull BridgeDomainManager bdManager, @Nonnull DataBroker dataBroker) {
+
+    public ForwardingManager(@Nonnull InterfaceManager ifaceManager, @Nonnull AclManager aclManager,
+            @Nonnull BridgeDomainManager bdManager, @Nonnull DataBroker dataBroker) {
         this.ifaceManager = Preconditions.checkNotNull(ifaceManager);
         this.bdManager = Preconditions.checkNotNull(bdManager);
         this.dataBroker = Preconditions.checkNotNull(dataBroker);
+        this.aclManager = Preconditions.checkNotNull(aclManager);
     }
 
     public Optional<GbpBridgeDomain> readGbpBridgeDomainConfig(String name) {
@@ -86,7 +92,9 @@ public final class ForwardingManager {
             .child(GbpBridgeDomain.class, new GbpBridgeDomainKey(name))
             .build();
         ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();
-        return DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION, bdIid, rTx);
+        Optional<GbpBridgeDomain> optBd = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION, bdIid, rTx);
+        rTx.close();
+        return optBd;
     }
 
     public void createBridgeDomainOnNodes(SetMultimap<String, NodeId> vppNodesByBridgeDomain) {
@@ -178,7 +186,9 @@ public final class ForwardingManager {
             }
             String l2FloodDomain = optL2FloodDomain.get();
             try {
-                ifaceManager.addBridgeDomainToInterface(l2FloodDomain, rEp, isBviForEndpoint(rEp)).get();
+                ifaceManager.addBridgeDomainToInterface(l2FloodDomain, rEp, AccessListUtil.resolveAclsOnInterface(
+                        rEpKey, policyCtx), isBviForEndpoint(rEp)).get();
+                aclManager.updateAclsForPeers(policyCtx, rEpKey);
                 LOG.debug("Interface added to bridge-domain {} for endpoint {}", l2FloodDomain, rEp);
             } catch (InterruptedException | ExecutionException e) {
                 // TODO add it to the status for renderer manager
index 6ba9f8403591b9e61404fd3eb3edfc73db96bef9..1c045e3f35b3d8a4052511d8bf2fdf1b02f18f4f 100644 (file)
@@ -21,15 +21,21 @@ import org.opendaylight.controller.config.yang.config.vpp_provider.impl.VppRende
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.groupbasedpolicy.renderer.util.AddressEndpointUtils;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.event.NodeOperEvent;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.event.RendererPolicyConfEvent;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.iface.AclManager;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.KeyFactory;
 import org.opendaylight.groupbasedpolicy.util.IidFactory;
+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.has.absolute.location.absolute.location.location.type.ExternalLocationCase;
+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.renderers.renderer.RendererPolicy;
 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.configuration.endpoints.AddressEndpointWithLocation;
 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.rule.groups.RuleGroupKey;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -54,10 +60,13 @@ public class VppRendererPolicyManager {
     private static final Logger LOG = LoggerFactory.getLogger(VppRendererPolicyManager.class);
     private final DataBroker dataProvider;
     private ForwardingManager fwManager;
+    private final AclManager aclManager;
 
-    public VppRendererPolicyManager(@Nonnull ForwardingManager fwManager, @Nonnull DataBroker dataProvider) {
+    public VppRendererPolicyManager(@Nonnull ForwardingManager fwManager, @Nonnull AclManager aclManager,
+            @Nonnull DataBroker dataProvider) {
         this.fwManager = Preconditions.checkNotNull(fwManager);
         this.dataProvider = Preconditions.checkNotNull(dataProvider);
+        this.aclManager = Preconditions.checkNotNull(aclManager);
     }
 
     @Subscribe
@@ -178,6 +187,56 @@ public class VppRendererPolicyManager {
                 fwManager.createForwardingForEndpoint(rEpKey, policyCtxAfter);
             }
         });
+        updatePolicy(policyCtxBefore, policyCtxAfter);
+    }
+
+    /**
+     * Looks for changed rule groups in {@code policyCtxBefore} and {@code policyCtxAfter}.
+     * Access lists are updated for endpoints in {@code policyCtxAfter} affected by changed rule
+     * groups.
+     *
+     * @param policyCtxBefore policy before
+     * @param policyCtxAfter policy after
+     */
+    private void updatePolicy(PolicyContext policyCtxBefore, PolicyContext policyCtxAfter) {
+        LOG.info("Updating policy by rule groups.");
+        Set<RuleGroupKey> diffRuleGroups = new HashSet<>();
+        diffRuleGroups.addAll(Sets.difference(policyCtxBefore.getRuleGroupByKey().keySet(),
+                policyCtxAfter.getRuleGroupByKey().keySet()));
+        diffRuleGroups.addAll(Sets.difference(policyCtxAfter.getRuleGroupByKey().keySet(), policyCtxBefore.getRuleGroupByKey().keySet()));
+        LOG.trace("Rule groups changed: {} ", diffRuleGroups.size());
+        Set<RendererEndpointKey> updates = new HashSet<>();
+        for (PolicyContext policy : new PolicyContext[] {policyCtxBefore, policyCtxAfter}) {
+            if (policy.getPolicy().getConfiguration() == null
+                    || policy.getPolicy().getConfiguration().getRendererEndpoints() == null
+                    || policy.getPolicy().getConfiguration().getRendererEndpoints().getRendererEndpoint() == null) {
+                continue;
+            }
+            policy.getPolicy()
+                .getConfiguration()
+                .getRendererEndpoints()
+                .getRendererEndpoint()
+                .stream()
+                .filter(rEp -> !updates.contains(rEp.getKey()))
+                .forEach(rEp -> {
+                    for (PeerEndpoint pEp : rEp.getPeerEndpoint()) {
+                        for (RuleGroupWithRendererEndpointParticipation rg : pEp
+                            .getRuleGroupWithRendererEndpointParticipation()) {
+                            if (!diffRuleGroups.contains(
+                                    new RuleGroupKey(rg.getContractId(), rg.getSubjectName(), rg.getTenantId()))) {
+                                continue;
+                            }
+                            LOG.debug("Updated resolved rule group: {}. Affected endpoints {} and {}.", rg.getKey(), rEp.getKey(), pEp.getKey());
+                            updates.add(rEp.getKey());
+                            AddressEndpointKey k1 = AddressEndpointUtils.fromPeerEpKey(pEp.getKey());
+                            updates.add(AddressEndpointUtils.toRendererEpKey(k1));
+                        }
+                    }
+                });
+        }
+        for (RendererEndpointKey rEpKey : updates) {
+            aclManager.updateAclsForRendEp(rEpKey, policyCtxAfter);
+        }
     }
 
     private static boolean isLocationChanged(AddressEndpointWithLocation before, AddressEndpointWithLocation after) {
diff --git a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/AccessListUtil.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/AccessListUtil.java
new file mode 100644 (file)
index 0000000..ea91766
--- /dev/null
@@ -0,0 +1,381 @@
+/*
+ * 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.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Nonnull;
+
+import org.opendaylight.groupbasedpolicy.api.sf.AllowActionDefinition;
+import org.opendaylight.groupbasedpolicy.renderer.util.AddressEndpointUtils;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.PolicyContext;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.RendererResolvedPolicy;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.sf.SubjectFeatures;
+import org.opendaylight.groupbasedpolicy.util.EndpointUtils;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.Actions;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.ActionsBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.actions.packet.handling.PermitBuilder;
+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.Ipv4Prefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;
+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.forwarding.l2_l3.rev160427.L2BridgeDomain;
+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.has.subnet.Subnet;
+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.renderer.rev151103.EndpointPolicyParticipation;
+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.renderer.endpoints.RendererEndpointKey;
+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.forwarding.RendererForwardingByTenant;
+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.classifiers.Classifier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.resolved.rules.ResolvedRule;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Optional;
+
+ /*
+  * Transforms Renderer policy into access-list configuration for Honeycomb.
+  *
+  * */
+
+public class AccessListUtil {
+
+    private static final Logger LOG = LoggerFactory.getLogger(AccessListUtil.class);
+    private static final String UNDERSCORE = "_";
+    private static final String PERMIT_EXTERNAL_INGRESS = "permit_external_ingress";
+    private static final String PERMIT_EXTERNAL_EGRESS = "permit_external_egress";
+    private static final String DENY_INGRESS_IPV4 = "deny_ingress_ipv4";
+    private static final String DENY_INGRESS_IPV6 = "deny_ingress_ipv6";
+    private static final String DENY_EGRESS_IPV4 = "deny_egress_ipv4";
+    private static final String DENY_EGRESS_IPV6 = "deny_egress_ipv6";
+
+    public enum ACE_DIRECTION {
+        INGRESS, EGRESS
+    }
+
+    // hiding default public constructor
+    private AccessListUtil() {}
+
+    public static List<AccessListWrapper> resolveAclsOnInterface(RendererEndpointKey rEpKey, PolicyContext ctx) {
+        List<AccessListWrapper> aclWrappers = new ArrayList<>();
+        for (ACE_DIRECTION dir : new ACE_DIRECTION[] {ACE_DIRECTION.INGRESS, ACE_DIRECTION.EGRESS}) {
+            aclWrappers.add(buildAccessListWrappers(dir, ctx, rEpKey));
+        }
+        return aclWrappers;
+    }
+
+    /**
+     * @param policyDirection direction for which policy should be resolved. EP -> VPP = OUTBOUND, EP <- VPP = INBOUND 
+     * @param ctx with cached data
+     * @param rEpKey key of EP for which to create ACLs.
+     * @return synchronization futures, so that INGRESS and EGRESS ACLS can be resolved in parallel.
+     */
+    private static AccessListWrapper buildAccessListWrappers(ACE_DIRECTION policyDirection, PolicyContext ctx,
+            RendererEndpointKey rEpKey) {
+        LOG.trace("Resolving policy for VPP renderer endpoint {} in a separate thread in {} direction.", rEpKey,
+                policyDirection);
+        AccessListWrapper aclWrapper = AccessListUtil.ACE_DIRECTION.INGRESS
+            .equals(policyDirection) ? new IngressAccessListWrapper() : new EgressAccessListWrapper();
+        ctx.getPolicyTable()
+            .row(rEpKey)
+            .keySet()
+            .stream()
+            .filter(peerEpKey -> peerHasLocation(ctx, peerEpKey))
+            .forEach(peerEpKey -> {
+            ctx.getPolicyTable().get(rEpKey, peerEpKey).forEach(resolvedRules -> {
+                List<GbpAceBuilder> rules = new ArrayList<>();
+                LOG.debug("Resolving policy for {} and peer endpoint {}", rEpKey, peerEpKey);
+                Direction classifDir =
+                        calculateClassifDirection(resolvedRules.getRendererEndpointParticipation(), policyDirection);
+                rules.addAll(resolveAclRulesFromPolicy(resolvedRules, classifDir,
+                        rEpKey.getAddress() + UNDERSCORE + peerEpKey.getAddress()));
+                updateAddressesInRules(rules, rEpKey, peerEpKey, ctx, policyDirection, true);
+                aclWrapper.writeRules(rules);
+            });
+        });
+        // resolve peers with no location
+        aclWrapper.writeRules(denyDomainSubnets(ctx, policyDirection));
+        // TODO currently any traffic heading to/from outside of managed domain is
+        // permitted for demonstration purposes
+        if (rEpKey.getContextType().isAssignableFrom(L2BridgeDomain.class) && findAddrEp(ctx, rEpKey) != null) {
+            Optional<GbpAceBuilder> allowExtAccess =
+                    allowExternalNetworksForEp(findAddrEp(ctx, rEpKey), policyDirection);
+            if (allowExtAccess.isPresent()) {
+                aclWrapper.writeRule(allowExtAccess.get());
+            }
+        }
+        return aclWrapper;
+    }
+
+    /**
+     * Resolves direction for classifiers that will be applied to INBOUND or OUTBOUND direction.
+     * </p>
+     * Rule is applied in INGRESS direction when participation is PROVIDER and classifier direction is OUT
+     * </p>
+     * Rule is applied in INGRESS direction when participation is CONSUMER and classifier direction is IN
+     * </p>
+     * INBOUND direction is applied otherwise.
+     * </p>
+     * Based on this
+     * </p>
+     * OUT classifier direction is resolved for INGRESS traffic when participation is PROVIDER
+     * </p>
+     * OUT classifier direction is resolved for EGRESS traffic when participation is CONSUMER
+     * </p>
+     * IN is resolved otherwise.
+     * </p>
+     * @param participation provider or consumer
+     * @param direction EGRESS or INGRESS
+     * @return Direction that classifiers should match for given policy direction.
+     */
+    private static Direction calculateClassifDirection(EndpointPolicyParticipation participation, ACE_DIRECTION direction) {
+        if (EndpointPolicyParticipation.PROVIDER.equals(participation) && ACE_DIRECTION.INGRESS.equals(direction)) {
+            return Direction.Out;
+        }
+        if (EndpointPolicyParticipation.CONSUMER.equals(participation) && ACE_DIRECTION.EGRESS.equals(direction)) {
+            return Direction.Out;
+        }
+        return Direction.In;
+    }
+
+    private static void updateAddressesInRules(List<GbpAceBuilder> rules, RendererEndpointKey rEpKey,
+            PeerEndpointKey peerEpKey, PolicyContext ctx, ACE_DIRECTION policyDirection,
+            boolean resolveForLocationPeers) {
+        for (AddressMapper addrMapper : Arrays.asList(new SourceMapper(policyDirection),
+                new DestinationMapper(policyDirection))) {
+            if (peerHasLocation(ctx, peerEpKey) && resolveForLocationPeers) {
+                addrMapper.updateRules(rules, findAddrEp(ctx, rEpKey), findAddrEp(ctx, peerEpKey));
+            } else if (!peerHasLocation(ctx, peerEpKey) && !resolveForLocationPeers) {
+                addrMapper.updateExtRules(rules, findAddrEp(ctx, rEpKey), null);
+            }
+        }
+    }
+
+    private static boolean peerHasLocation(PolicyContext ctx, PeerEndpointKey peerEpKey) {
+        return ctx.getAddrEpByKey().get(
+                AddressEndpointUtils.fromPeerEpKey(peerEpKey)) != null;
+    }
+
+    private static AddressEndpointWithLocation findAddrEp(PolicyContext ctx, RendererEndpointKey rEpKey) {
+        return ctx.getAddrEpByKey().get(
+                AddressEndpointUtils.fromRendererEpKey(rEpKey));
+    }
+
+    private static AddressEndpointWithLocation findAddrEp(PolicyContext ctx, PeerEndpointKey rEpKey) {
+        return ctx.getAddrEpByKey().get(
+                AddressEndpointUtils.fromPeerEpKey(rEpKey));
+    }
+
+    /** Transform a resolved rule to ACE with corresponding classification and action fields
+     *
+     * @param resolvedPolicy resolved rules, with the same participation - provider or consumer
+     * @param direction rules matching corresponding direction will be collected
+     * @return resolved ACE entries
+     */
+    private static List<GbpAceBuilder> resolveAclRulesFromPolicy(RendererResolvedPolicy resolvedPolicy,
+            Direction direction, String namePasphrase) {
+        List<GbpAceBuilder> aclRules = new ArrayList<>();
+        for (ResolvedRule resolvedRule : resolvedPolicy.getRuleGroup().getRules()) {
+            Map<String, ParameterValue> params = resolveClassifParamsForDir(direction, resolvedRule.getClassifier());
+            if (params.isEmpty()) {
+                continue;
+            }
+            LOG.debug("Processing classifification params {} in resolved rule {}.", params,
+                    resolvedRule.getName() + UNDERSCORE + namePasphrase);
+            org.opendaylight.groupbasedpolicy.renderer.vpp.sf.Classifier classif =
+                    resolveImplementedClassifForDir(direction, resolvedRule.getClassifier());
+            GbpAceBuilder aclRuleBuilder =
+                    new GbpAceBuilder(resolvedRule.getName().getValue() + UNDERSCORE + namePasphrase);
+            boolean updated = classif != null && classif.updateMatch(aclRuleBuilder, params);
+            Optional<Actions> optAction = resolveActions(resolvedRule.getAction());
+            if (!optAction.isPresent() || !updated) {
+                LOG.error("Failed to process rule {}. Resolved parameters {}, resolved classifier. Actions resolved: {}"
+                        + "{}.", resolvedRule.getName().getValue(), params, classif, optAction.isPresent());
+                continue;
+            }
+            aclRuleBuilder.setAction(optAction.get());
+            aclRules.add(aclRuleBuilder);
+        }
+        return aclRules;
+    }
+
+    private static org.opendaylight.groupbasedpolicy.renderer.vpp.sf.Classifier resolveImplementedClassifForDir(
+            @Nonnull Direction direction, @Nonnull List<Classifier> classifiers) {
+        org.opendaylight.groupbasedpolicy.renderer.vpp.sf.Classifier feasibleClassifier = null;
+        for (Classifier cl : classifiers) {
+            if (direction.equals(cl.getDirection()) || direction.equals(Direction.Bidirectional)) {
+                org.opendaylight.groupbasedpolicy.renderer.vpp.sf.Classifier classif =
+                        SubjectFeatures.getClassifier(cl.getClassifierDefinitionId());
+                if (feasibleClassifier == null) {
+                    feasibleClassifier = classif;
+                }
+                if (classif.getParent() != null && classif.getParent().equals(feasibleClassifier)) {
+                    feasibleClassifier = classif;
+                }
+            }
+        }
+        return feasibleClassifier;
+    }
+
+    private static Map<String, ParameterValue> resolveClassifParamsForDir(Direction direction,
+            List<Classifier> classifier) {
+        Map<String, ParameterValue> params = new HashMap<>();
+        classifier.stream()
+            .filter(classif -> direction.equals(classif.getDirection()) || direction.equals(Direction.Bidirectional))
+            .forEach(classif -> {
+                LOG.trace("Resolving parameters for classiifier: {} with direction", classif, direction);
+                classif.getParameterValue()
+                    .stream()
+                    .filter(v -> params.get(v.getName().getValue()) == null) // not unique
+                    .filter(v -> v.getIntValue() != null || v.getStringValue() != null || v.getRangeValue() != null)
+                    .forEach(v -> params.put(v.getName().getValue(), v));
+                LOG.trace("Resolved parameters {} for classiifier: {} with direction {}", params, classif, direction);
+            });
+        return params;
+    }
+
+    private static Optional<Actions> resolveActions(List<Action> actions) {
+        for (Action action : actions) {
+            if (AllowActionDefinition.ID
+                .equals(action.getActionDefinitionId())) {
+                LOG.trace("Applying supported action: {}", action);
+                return Optional
+                    .of(new ActionsBuilder().setPacketHandling(new PermitBuilder().setPermit(true).build()).build());
+            }
+        }
+        LOG.warn("No supported action found among actions: {}", actions);
+        return Optional.absent();
+    }
+
+    /*
+     * so far any traffic heading to/from outside of managed domain is permitted for demonstration
+     * purposes
+     * TODO initial workaround for external networking
+     */
+   private static Optional<GbpAceBuilder> allowExternalNetworksForEp(@Nonnull AddressEndpointWithLocation addrEp,
+            AccessListUtil.ACE_DIRECTION dir) {
+        List<ParentEndpoint> parentEndpoints = EndpointUtils.getParentEndpoints(addrEp.getParentEndpointChoice());
+        if (parentEndpoints.isEmpty()) {
+            return Optional.absent();
+        }
+        for (ParentEndpoint parentEp : parentEndpoints) {
+            InetAddress byName;
+            try {
+                byName = InetAddress.getByName(substringBeforeSlash(parentEp.getAddress()));
+            } catch (UnknownHostException e) {
+                LOG.error("Failed to parse IP address {}", e);
+                return Optional.absent();
+            }
+            if (byName instanceof Inet4Address) {
+                if (AccessListUtil.ACE_DIRECTION.INGRESS.equals(dir)) {
+                    return Optional.of(new GbpAceBuilder(PERMIT_EXTERNAL_INGRESS).setIpAddresses(
+                            new Ipv4Prefix(parentEp.getAddress()), null).setPermit());
+                } else {
+                    return Optional.of(new GbpAceBuilder(PERMIT_EXTERNAL_EGRESS).setIpAddresses(null,
+                            new Ipv4Prefix(parentEp.getAddress())).setPermit());
+                }
+            } else if (byName instanceof Inet6Address) {
+                if (AccessListUtil.ACE_DIRECTION.INGRESS.equals(dir)) {
+                    return Optional.of(new GbpAceBuilder(PERMIT_EXTERNAL_INGRESS).setIpAddresses(
+                            new Ipv6Prefix(parentEp.getAddress()), null).setPermit());
+                } else {
+                    return Optional.of(new GbpAceBuilder(PERMIT_EXTERNAL_EGRESS).setIpAddresses(null,
+                            new Ipv6Prefix(parentEp.getAddress())).setPermit());
+                }
+            }
+        }
+        return Optional.absent();
+    }
+
+    /**
+     * Helps stripping address part of a CIDR
+     */
+    private static String substringBeforeSlash(String address) {
+        return (address.contains("/") && address.split("/").length > 0) ? address.split("/")[0] : address;
+    }
+
+    private static List<GbpAceBuilder> denyDomainSubnets(@Nonnull PolicyContext ctx, @Nonnull ACE_DIRECTION policyDirection) {
+        List<GbpAceBuilder> aclRuleBuilders = new ArrayList<>();
+        for (RendererForwardingByTenant rf : ctx.getPolicy()
+            .getConfiguration()
+            .getRendererForwarding()
+            .getRendererForwardingByTenant()) {
+            rf.getRendererNetworkDomain()
+                .stream()
+                .filter(rnd -> org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.Subnet.class
+                    .equals(rnd.getNetworkDomainType()))
+                .forEach(rnd -> {
+                    SubnetAugmentRenderer subnetAug = rnd.getAugmentation(SubnetAugmentRenderer.class);
+                    // subnetAug should not be null
+                    subnetAug.getSubnet();
+                    if (policyDirection.equals(ACE_DIRECTION.INGRESS)) {
+                        aclRuleBuilders.add(denyIngressTrafficForPrefix(subnetAug.getSubnet()));
+                    }
+                    else {
+                        aclRuleBuilders.add(denyEgressTrafficForPrefix(subnetAug.getSubnet()));
+                    }
+                });
+        }
+        return aclRuleBuilders;
+    }
+
+    private static GbpAceBuilder denyEgressTrafficForPrefix(Subnet subnet) {
+        IpPrefix ipPrefix = subnet.getIpPrefix();
+        if (ipPrefix.getIpv4Prefix() != null) {
+            return new GbpAceBuilder(DENY_EGRESS_IPV4 + UNDERSCORE + String.valueOf(ipPrefix.getValue()))
+                .setIpAddresses(ipPrefix.getIpv4Prefix(), null).setDeny();
+        } else if (ipPrefix.getIpv6Prefix() != null) {
+            return new GbpAceBuilder(DENY_EGRESS_IPV6 + UNDERSCORE + String.valueOf(ipPrefix.getValue()))
+                .setIpAddresses(ipPrefix.getIpv6Prefix(), null).setDeny();
+        }
+        throw new IllegalStateException("Unknown prefix type " + subnet.getIpPrefix());
+    }
+
+    static void setSourceL3Address(GbpAceBuilder rule, String address) throws UnknownHostException {
+        InetAddress addr = InetAddress.getByName(substringBeforeSlash(address));
+        if (addr instanceof Inet6Address) {
+            rule.setIpAddresses(new Ipv6Prefix(address), null);
+        } else {
+            rule.setIpAddresses(new Ipv4Prefix(address), null);
+        }
+    }
+
+    static void setDestinationL3Address(GbpAceBuilder rule, String address) throws UnknownHostException {
+        InetAddress addr = InetAddress.getByName(substringBeforeSlash(address));
+        if (addr instanceof Inet6Address) {
+            rule.setIpAddresses(null, new Ipv6Prefix(address));
+        } else {
+            rule.setIpAddresses(null, new Ipv4Prefix(address));
+        }
+    }
+
+    static GbpAceBuilder denyIngressTrafficForPrefix(Subnet subnet) {
+        IpPrefix ipPrefix = subnet.getIpPrefix();
+        if (ipPrefix.getIpv4Prefix() != null) {
+            return new GbpAceBuilder(DENY_INGRESS_IPV4 + UNDERSCORE + String.valueOf(ipPrefix.getValue()))
+                .setIpAddresses(null, ipPrefix.getIpv4Prefix()).setDeny();
+        } else if (ipPrefix.getIpv6Prefix() != null) {
+            return new GbpAceBuilder(DENY_INGRESS_IPV6 + UNDERSCORE + String.valueOf(ipPrefix.getValue()))
+                .setIpAddresses(null, ipPrefix.getIpv6Prefix()).setDeny();
+        }
+        throw new IllegalStateException("Unknown prefix type " + subnet.getIpPrefix());
+    }
+}
diff --git a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/AccessListWrapper.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/AccessListWrapper.java
new file mode 100644 (file)
index 0000000..0301984
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * 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 javax.annotation.Nonnull;
+
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.acl.AccessListUtil.ACE_DIRECTION;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.GbpNetconfTransaction;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.Acl;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.AclBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.AccessListEntries;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.AccessListEntriesBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.Ace;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.VppAcl;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class AccessListWrapper {
+
+    private static final Logger LOG = LoggerFactory.getLogger(AccessListWrapper.class);
+    private List<GbpAceBuilder> rules;
+
+    public AccessListWrapper() {
+        rules = new ArrayList<>();
+    }
+
+    public void writeRule(GbpAceBuilder rule) {
+        if (rule != null) {
+            this.rules.add(rule);
+        }
+    }
+
+    public void writeRules(List<GbpAceBuilder> rules) {
+        if (rules != null) {
+            rules.forEach(this::writeRule);
+        }
+    }
+
+    public List<GbpAceBuilder> readRules() {
+        return rules;
+    }
+
+    protected String resolveAclName(InterfaceKey key) {
+        return key.getName() + getDirection();
+    }
+
+    public abstract AccessListUtil.ACE_DIRECTION getDirection();
+
+    public abstract void writeAclRefOnIface(@Nonnull DataBroker mountPoint,
+            @Nonnull InstanceIdentifier<Interface> ifaceIid);
+
+    public Acl buildVppAcl(@Nonnull InterfaceKey ifaceKey) {
+        List<Ace> aces = new ArrayList<>();
+        for (GbpAceBuilder rule : rules) {
+            aces.add(rule.build());
+        }
+        AccessListEntries entries = new AccessListEntriesBuilder().setAce(aces).build();
+        return new AclBuilder().setAclType(VppAcl.class)
+            .setAclName(resolveAclName(ifaceKey))
+            .setAccessListEntries(entries)
+            .build();
+    }
+
+    public void writeAcl(@Nonnull DataBroker mountPoint, @Nonnull InterfaceKey ifaceKey) {
+        Acl builtAcl = this.buildVppAcl(ifaceKey);
+        LOG.info("Writing access-list {}", builtAcl.getAclName());
+        boolean write = GbpNetconfTransaction.write(mountPoint, VppIidFactory.getVppAcl(resolveAclName(ifaceKey)),
+                builtAcl, GbpNetconfTransaction.RETRY_COUNT);
+        if (!write) {
+            LOG.error("Failed to write rule {}", builtAcl);
+        }
+    }
+
+    public static void removeAclsForInterface(@Nonnull DataBroker mountPoint, @Nonnull InterfaceKey ifaceKey) {
+        LOG.debug("Removing access-list {}", ifaceKey);
+        for (ACE_DIRECTION dir : new ACE_DIRECTION[] {ACE_DIRECTION.INGRESS, ACE_DIRECTION.EGRESS}) {
+        GbpNetconfTransaction.deleteIfExists(mountPoint, VppIidFactory.getVppAcl(ifaceKey.getName() + dir),
+                GbpNetconfTransaction.RETRY_COUNT);
+        }
+    }
+
+    public static void removeAclRefFromIface(@Nonnull DataBroker mountPoint, @Nonnull InterfaceKey ifaceKey) {
+        LOG.debug("Removing access-lists from interface {}", ifaceKey.getName());
+        GbpNetconfTransaction.deleteIfExists(mountPoint, VppIidFactory.getInterfaceIetfAcl(ifaceKey),
+                GbpNetconfTransaction.RETRY_COUNT);
+    }
+}
diff --git a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/AddressMapper.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/AddressMapper.java
new file mode 100644 (file)
index 0000000..8d42237
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * 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.List;
+
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.DestinationPortRangeBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.SourcePortRangeBuilder;
+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.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocation;
+
+
+abstract class AddressMapper {
+
+    private AccessListUtil.ACE_DIRECTION direction;
+
+    private static final PortNumber DHCP_67 = new PortNumber(67);
+    private static final PortNumber DHCP_68 = new PortNumber(68);
+    private static final PortNumber DHCPV6_547 = new PortNumber(547);
+    private static final PortNumber DHCPV6_548 = new PortNumber(548);
+
+    AddressMapper(AccessListUtil.ACE_DIRECTION direction) {
+        this.direction = direction;
+    }
+
+    abstract void updateRule(AddressEndpointWithLocation addrEp, GbpAceBuilder aclRuleBuilder);
+
+    //TODO implement for peers with no location
+    abstract List<GbpAceBuilder> updateExtRules(List<GbpAceBuilder> rules, AddressEndpointWithLocation localEp,
+            ContainmentEndpoint cEp);
+
+    public List<GbpAceBuilder> updateRules(List<GbpAceBuilder> rules, AddressEndpointWithLocation localEp,
+            AddressEndpointWithLocation peerEp) {
+        if (this instanceof SourceMapper) {
+            if (AccessListUtil.ACE_DIRECTION.INGRESS.equals(direction)) {
+                return updateRules(rules, localEp);
+            }
+            return updateRules(rules, peerEp);
+        }
+        if (this instanceof DestinationMapper) {
+            if (AccessListUtil.ACE_DIRECTION.INGRESS.equals(direction)) {
+                return updateRules(rules, peerEp);
+            }
+            return updateRules(rules, localEp);
+        }
+        return rules;
+    }
+
+    private List<GbpAceBuilder> updateRules(List<GbpAceBuilder> rules, AddressEndpointWithLocation addrEp) {
+        for (GbpAceBuilder rule : rules) {
+            if (isInRange(rule.getSourcePortRangeBuilder(), DHCP_67)
+                    && isInRange(rule.getDestinationPortRangeBuilder(), DHCP_68)) {
+                continue;
+            }
+            if (isInRange(rule.getSourcePortRangeBuilder(), DHCP_68)
+                    && isInRange(rule.getDestinationPortRangeBuilder(), DHCP_67)) {
+                continue;
+            }
+            if (isInRange(rule.getSourcePortRangeBuilder(), DHCPV6_547)
+                    && isInRange(rule.getDestinationPortRangeBuilder(), DHCPV6_548)) {
+                continue;
+            }
+            if (isInRange(rule.getSourcePortRangeBuilder(), DHCPV6_548)
+                    && isInRange(rule.getDestinationPortRangeBuilder(), DHCPV6_547)) {
+                continue;
+            }
+            updateRule(addrEp, rule);
+        }
+        return rules;
+    }
+
+    private boolean isInRange(SourcePortRangeBuilder spr, PortNumber portNumber) {
+        return spr != null && isInRange(spr.getLowerPort(), spr.getUpperPort(), portNumber);
+    }
+
+    private boolean isInRange(DestinationPortRangeBuilder dpr, PortNumber portNumber) {
+        return dpr != null && isInRange(dpr.getLowerPort(),dpr.getUpperPort(), portNumber);
+    }
+
+    private boolean isInRange(PortNumber lower, PortNumber upper, PortNumber ref) {
+        if (lower != null && upper != null) {
+            return (lower.getValue() <= ref.getValue()) && (ref.getValue() <= upper.getValue());
+        }
+        return (lower != null && lower.getValue().equals(ref.getValue()))
+                || (upper != null && upper.getValue().equals(ref.getValue()));
+    }
+}
diff --git a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/DestinationMapper.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/DestinationMapper.java
new file mode 100644 (file)
index 0000000..bb7f7db
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * 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.net.UnknownHostException;
+import java.util.List;
+
+import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.acl.AccessListUtil.ACE_DIRECTION;
+import org.opendaylight.groupbasedpolicy.util.EndpointUtils;
+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.parent.child.endpoints.parent.endpoint.choice.parent.endpoint._case.ParentEndpoint;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.L3Context;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+class DestinationMapper extends AddressMapper {
+
+    private static final Logger LOG = LoggerFactory.getLogger(DestinationMapper.class);
+
+    DestinationMapper(ACE_DIRECTION direction) {
+        super(direction);
+    }
+
+    @Override
+    List<GbpAceBuilder> updateExtRules(List<GbpAceBuilder> rules, AddressEndpointWithLocation localEp,
+            ContainmentEndpoint cEp) {
+        // TODO external networking.
+        return rules;
+    }
+
+    @Override
+    void updateRule(AddressEndpointWithLocation addrEp, GbpAceBuilder aclRuleBuilder) {
+        if (!EndpointUtils.getParentEndpoints(addrEp.getParentEndpointChoice()).isEmpty()) {
+            // TODO more parents, when supported
+            ParentEndpoint parentEp = EndpointUtils.getParentEndpoints(addrEp.getParentEndpointChoice()).get(0);
+            if (parentEp != null && parentEp.getContextType().isAssignableFrom(L3Context.class)) {
+                LOG.trace("Setting dst IP address {} in rule {}", parentEp.getAddress(), aclRuleBuilder);
+                try {
+                    AccessListUtil.setDestinationL3Address(aclRuleBuilder, parentEp.getAddress());
+                } catch (UnknownHostException e) {
+                    LOG.error("Failed to parse address {}. Cannot apply ACL entry {}. {}", parentEp.getAddress(),
+                            aclRuleBuilder, e);
+                }
+            }
+        }
+    }
+}
diff --git a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/EgressAccessListWrapper.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/EgressAccessListWrapper.java
new file mode 100644 (file)
index 0000000..8a348db
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * 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 javax.annotation.Nonnull;
+
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.acl.AccessListUtil.ACE_DIRECTION;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.GbpNetconfTransaction;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.acl.rev161214.VppAclInterfaceAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.acl.rev161214._interface.acl.attributes.Acl;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.acl.rev161214._interface.acl.attributes.acl.Egress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.acl.rev161214._interface.acl.attributes.acl.EgressBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.acl.rev161214.vpp.acls.base.attributes.VppAcls;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.acl.rev161214.vpp.acls.base.attributes.VppAclsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.VppAcl;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+import com.google.common.collect.ImmutableList;
+
+public class EgressAccessListWrapper extends AccessListWrapper {
+
+    @Override
+    public ACE_DIRECTION getDirection() {
+        return AccessListUtil.ACE_DIRECTION.EGRESS;
+    }
+
+    @Override
+    public void writeAclRefOnIface(@Nonnull DataBroker mountPoint, @Nonnull InstanceIdentifier<Interface> ifaceIid) {
+        InstanceIdentifier<Egress> egressRefIid = outboundIfaceAclRefIid(ifaceIid);
+        VppAcls vppAcl = new VppAclsBuilder().setName(resolveAclName(ifaceIid.firstKeyOf(Interface.class)))
+            .setType(VppAcl.class)
+            .build();
+        Egress egressAcl = new EgressBuilder().setVppAcls(ImmutableList.<VppAcls>of(vppAcl)).build();
+        GbpNetconfTransaction.write(mountPoint, egressRefIid, egressAcl, GbpNetconfTransaction.RETRY_COUNT);
+    }
+
+    private InstanceIdentifier<Egress> outboundIfaceAclRefIid(InstanceIdentifier<Interface> ifaceIid) {
+        return ifaceIid.builder()
+            .augmentation(VppAclInterfaceAugmentation.class)
+            .child(Acl.class)
+            .child(Egress.class)
+            .build();
+    }
+}
diff --git a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/GbpAceBuilder.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/GbpAceBuilder.java
new file mode 100644 (file)
index 0000000..c365b5d
--- /dev/null
@@ -0,0 +1,219 @@
+/*
+ * 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 javax.annotation.Nullable;
+
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.Ace;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.AceBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.Actions;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.ActionsBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.Matches;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.MatchesBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.actions.packet.handling.DenyBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.actions.packet.handling.PermitBuilder;
+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.inet.types.rev130715.Ipv6Prefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.DestinationPortRange;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.DestinationPortRangeBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.SourcePortRange;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.SourcePortRangeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.access.lists.acl.access.list.entries.ace.matches.ace.type.VppAce;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.access.lists.acl.access.list.entries.ace.matches.ace.type.VppAceBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.VppAceNodesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.vpp.ace.nodes.AceIpVersion;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.vpp.ace.nodes.ace.ip.version.AceIpv4;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.vpp.ace.nodes.ace.ip.version.AceIpv4Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.vpp.ace.nodes.ace.ip.version.AceIpv6;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.vpp.ace.nodes.ace.ip.version.AceIpv6Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.icmp.header.fields.IcmpCodeRangeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.icmp.header.fields.IcmpTypeRangeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.IpProtocol;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.ip.protocol.IcmpBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.ip.protocol.OtherBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.ip.protocol.TcpBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.ip.protocol.UdpBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.ip.protocol.icmp.IcmpNodesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.ip.protocol.other.OtherNodesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.ip.protocol.tcp.TcpNodes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.ip.protocol.tcp.TcpNodesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.ip.protocol.udp.UdpNodes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.ip.protocol.udp.UdpNodesBuilder;
+
+import com.google.common.base.Preconditions;
+
+public class GbpAceBuilder {
+
+    private final String name;
+    private Short protocol;
+    private SourcePortRangeBuilder sourcePortRangeBuilder;
+    private DestinationPortRangeBuilder destinationPortRangeBuilder;
+    private AceIpVersion aceIpVersion;
+    private AceIpv4 aceIpv4;
+    private AceIpv6 aceIpv6;
+    private IpProtocol ipProtocol;
+    private Actions action; // deny is a default action in the model
+
+    private static final Short FIRST_ICMP = 0;
+    private static final Short LAST_ICMP = 254;
+    
+    GbpAceBuilder(String name) {
+        this.name = Preconditions.checkNotNull(name, "Cannot build rule with empty name.");
+        this.sourcePortRangeBuilder = new SourcePortRangeBuilder();
+        this.destinationPortRangeBuilder = new DestinationPortRangeBuilder();
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public Short getProtocol() {
+        return protocol;
+    }
+
+    public SourcePortRangeBuilder getSourcePortRangeBuilder() {
+        return sourcePortRangeBuilder;
+    }
+
+    public DestinationPortRangeBuilder getDestinationPortRangeBuilder() {
+        return destinationPortRangeBuilder;
+    }
+
+    public AceIpVersion getAceIpVersion() {
+        return aceIpVersion;
+    }
+
+    public Actions getAction() {
+        return action;
+    }
+
+    public GbpAceBuilder setProtocol(short protocol) {
+        this.protocol = protocol;
+        return this;
+    }
+
+    public GbpAceBuilder setSourcePortRange(SourcePortRangeBuilder sourcePortRangeBuilder) {
+        if (sourcePortRangeBuilder != null) {
+            this.sourcePortRangeBuilder = sourcePortRangeBuilder;
+        }
+        return this;
+    }
+
+    public GbpAceBuilder setDestinationPortRange(DestinationPortRangeBuilder destPortRangeBuilder) {
+        if (destPortRangeBuilder != null) {
+            this.destinationPortRangeBuilder = destPortRangeBuilder;
+        }
+        return this;
+    }
+
+    public GbpAceBuilder setIpAddresses(@Nullable Ipv4Prefix srcIp, @Nullable Ipv4Prefix dstIp) {
+        AceIpv4Builder aceIpv4Builder = (aceIpv4 != null) ? new AceIpv4Builder(aceIpv4) : new AceIpv4Builder();
+        if (srcIp != null) {
+            aceIpv4Builder.setSourceIpv4Network(srcIp);
+        }
+        if (dstIp != null) {
+            aceIpv4Builder.setDestinationIpv4Network(dstIp);
+        }
+        this.aceIpv4 = aceIpv4Builder.build();
+        this.aceIpVersion = aceIpv4;
+        return this;
+    }
+
+    public GbpAceBuilder setIpAddresses(@Nullable Ipv6Prefix srcIp, @Nullable Ipv6Prefix dstIp) {
+        AceIpv6Builder aceIpv6Builder = (aceIpv6 != null) ? new AceIpv6Builder(aceIpv6) : new AceIpv6Builder();
+        if (srcIp != null) {
+            aceIpv6Builder.setSourceIpv6Network(srcIp);
+        }
+        if (dstIp != null) {
+            aceIpv6Builder.setDestinationIpv6Network(dstIp);
+        }
+        this.aceIpv6 = aceIpv6Builder.build();
+        this.aceIpVersion = aceIpv6;
+        return this;
+    }
+
+    public GbpAceBuilder setPermit() {
+        this.action = new ActionsBuilder().setPacketHandling(new PermitBuilder().setPermit(true).build()).build();
+        return this;
+    }
+
+    public GbpAceBuilder setDeny() {
+        this.action = new ActionsBuilder().setPacketHandling(new DenyBuilder().setDeny(true).build()).build();
+        return this;
+    }
+
+    public GbpAceBuilder setAction(Actions actions) {
+        this.action = actions;
+        return this;
+    }
+
+    public Ace build() {
+        if (protocol == null || protocol == 0) {
+            ipProtocol =
+                    new OtherBuilder().setOtherNodes(new OtherNodesBuilder().setProtocol((short) 0).build()).build();
+        } else {
+            if (protocol == 1) {
+                ipProtocol = new IcmpBuilder().setIcmpNodes(new IcmpNodesBuilder()
+                    .setIcmpTypeRange(new IcmpTypeRangeBuilder().setFirst(FIRST_ICMP).setLast(LAST_ICMP).build())
+                    .setIcmpCodeRange(new IcmpCodeRangeBuilder().setFirst(FIRST_ICMP).setLast(LAST_ICMP).build())
+                    .build()).build();
+            }
+            SourcePortRange sourcePortRange = (sourcePortRangeBuilder.getLowerPort() != null
+                    && sourcePortRangeBuilder.getUpperPort() != null) ? sourcePortRangeBuilder.build() : null;
+            DestinationPortRange destPortRange = (destinationPortRangeBuilder.getLowerPort() != null
+                    && destinationPortRangeBuilder.getUpperPort() != null) ? destinationPortRangeBuilder.build() : null;
+            if (protocol == 6) {
+                TcpNodes tcpNodes = new TcpNodesBuilder().setSourcePortRange(sourcePortRange)
+                    .setDestinationPortRange(destPortRange)
+                    .build();
+                ipProtocol = new TcpBuilder().setTcpNodes(tcpNodes).build();
+            }
+            if (protocol == 17) {
+                UdpNodes udpNodes = new UdpNodesBuilder().setSourcePortRange(sourcePortRange)
+                    .setDestinationPortRange(destPortRange)
+                    .build();
+                ipProtocol = new UdpBuilder().setUdpNodes(udpNodes).build();
+                ipProtocol = new UdpBuilder().setUdpNodes(udpNodes).build();
+            }
+        }
+        VppAce vppAce = new VppAceBuilder()
+            .setVppAceNodes(new VppAceNodesBuilder().setAceIpVersion(aceIpVersion).setIpProtocol(ipProtocol).build())
+            .build();
+        Matches matches = new MatchesBuilder().setAceType(vppAce).build();
+        AceBuilder aceBuilder = new AceBuilder();
+        aceBuilder.setMatches(matches);
+        aceBuilder.setActions(action);
+        aceBuilder.setRuleName(name);
+        return aceBuilder.build();
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendNonNullTo(sb, "GbpAceBuilder [name=", name);
+        if (sourcePortRangeBuilder != null) {
+            appendNonNullTo(sb, ", srcPort=lower:", sourcePortRangeBuilder.getLowerPort());
+            appendNonNullTo(sb, ", srcPort=upper:", sourcePortRangeBuilder.getUpperPort());
+        }
+        if (sourcePortRangeBuilder != null) {
+            appendNonNullTo(sb, ", dstPort=lower:", destinationPortRangeBuilder.getLowerPort());
+            appendNonNullTo(sb, ", dstPort=upper:", destinationPortRangeBuilder.getUpperPort());
+        }
+        appendNonNullTo(sb, ", protocol=", protocol);
+        appendNonNullTo(sb, ", aceIpVersion=", aceIpVersion);
+        appendNonNullTo(sb, ", action=", action);
+        return sb.toString();
+    }
+
+    private void appendNonNullTo(StringBuilder sb, String key, Object value) {
+        if (value != null && key!= null) {
+            sb.append(key).append(value);
+        }
+    }
+}
diff --git a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/IngressAccessListWrapper.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/IngressAccessListWrapper.java
new file mode 100644 (file)
index 0000000..afdd1da
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * 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 javax.annotation.Nonnull;
+
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.acl.AccessListUtil.ACE_DIRECTION;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.GbpNetconfTransaction;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.acl.rev161214.VppAclInterfaceAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.acl.rev161214._interface.acl.attributes.Acl;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.acl.rev161214._interface.acl.attributes.acl.Ingress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.acl.rev161214._interface.acl.attributes.acl.IngressBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.acl.rev161214.vpp.acls.base.attributes.VppAcls;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.acl.rev161214.vpp.acls.base.attributes.VppAclsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.VppAcl;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+import com.google.common.collect.ImmutableList;
+
+public class IngressAccessListWrapper extends AccessListWrapper {
+
+    @Override
+    public ACE_DIRECTION getDirection() {
+        return AccessListUtil.ACE_DIRECTION.INGRESS;
+    }
+
+    @Override
+    public void writeAclRefOnIface(@Nonnull DataBroker mountPoint, @Nonnull InstanceIdentifier<Interface> ifaceIid) {
+        InstanceIdentifier<Ingress> ingressRefIid = outboundIfaceAclRefIid(ifaceIid);
+        VppAcls vppAcl = new VppAclsBuilder().setName(resolveAclName(ifaceIid.firstKeyOf(Interface.class)))
+            .setType(VppAcl.class)
+            .build();
+        Ingress egressAcl = new IngressBuilder().setVppAcls(ImmutableList.<VppAcls>of(vppAcl)).build();
+        GbpNetconfTransaction.write(mountPoint, ingressRefIid, egressAcl, GbpNetconfTransaction.RETRY_COUNT);
+    }
+
+    private InstanceIdentifier<Ingress> outboundIfaceAclRefIid(InstanceIdentifier<Interface> ifaceIid) {
+        return ifaceIid.builder()
+            .augmentation(VppAclInterfaceAugmentation.class)
+            .child(Acl.class)
+            .child(Ingress.class)
+            .build();
+    }
+}
diff --git a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/SourceMapper.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/SourceMapper.java
new file mode 100644 (file)
index 0000000..ebaeb36
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * 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.net.UnknownHostException;
+import java.util.List;
+
+import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.acl.AccessListUtil.ACE_DIRECTION;
+import org.opendaylight.groupbasedpolicy.util.EndpointUtils;
+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.parent.child.endpoints.parent.endpoint.choice.parent.endpoint._case.ParentEndpoint;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.L3Context;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+class SourceMapper extends AddressMapper {
+
+    private static final Logger LOG = LoggerFactory.getLogger(SourceMapper.class);
+
+    SourceMapper(ACE_DIRECTION direction) {
+        super(direction);
+    }
+
+    @Override
+    List<GbpAceBuilder> updateExtRules(List<GbpAceBuilder> rules, AddressEndpointWithLocation localEp,
+            ContainmentEndpoint cEp) {
+        // TODO external networking as a next step.
+        return rules;
+    }
+
+    @Override
+    void updateRule(AddressEndpointWithLocation addrEp, GbpAceBuilder aclRuleBuilder) {
+        if (!EndpointUtils.getParentEndpoints(addrEp.getParentEndpointChoice()).isEmpty()) {
+            // TODO more parents
+            ParentEndpoint parentEp = EndpointUtils.getParentEndpoints(addrEp.getParentEndpointChoice()).get(0);
+            if (parentEp != null && parentEp.getContextType().isAssignableFrom(L3Context.class)) {
+                LOG.trace("Setting src IP address {} in rule {}", parentEp.getAddress(), aclRuleBuilder);
+                try {
+                    AccessListUtil.setSourceL3Address(aclRuleBuilder, parentEp.getAddress());
+                } catch (UnknownHostException e) {
+                    LOG.error("Failed to parse address {}. Cannot apply ACL entry {}. {}", parentEp.getAddress(),
+                            aclRuleBuilder, e);
+                }
+            }
+        }
+    }
+}
index 33949003afc9d5008ebe920e0355ef4a307bcc71..dc0a307cb0db9c76424a6457ae8828308bd91821 100755 (executable)
@@ -8,29 +8,77 @@
 
 package org.opendaylight.groupbasedpolicy.renderer.vpp.sf;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
+import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.acl.GbpAceBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierDefinitionId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definitions.ClassifierDefinition;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValue;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.supported.classifier.definition.SupportedParameterValues;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Represent a classifier definition.
  */
 public abstract class Classifier {
 
+    private static final Logger LOG = LoggerFactory.getLogger(Classifier.class);
     protected final Classifier parent;
 
-    public static final EtherTypeClassifier ETHER_TYPE_CL = new EtherTypeClassifier(null);
-    public static final IpProtoClassifier IP_PROTO_CL = new IpProtoClassifier(ETHER_TYPE_CL);
-    public static final L4Classifier L4_CL = new L4Classifier(IP_PROTO_CL);
-
     protected Classifier(Classifier parent) {
         this.parent = parent;
     }
 
+    /**
+     * Template method for resolving {@code matches}.
+     *
+     * @param aclRuleBuilder list of builders containing {@code matches} to update
+     * @param params parameters of classifier-instance inserted by user
+     * @return result, which indicates if all the matching fields were updated successfully
+     */
+    public final boolean updateMatch(GbpAceBuilder aclRuleBuilder, Map<String, ParameterValue> params) {
+        LOG.debug("Updating ACE entries {} with parameters {}",aclRuleBuilder, params);
+        if (params == null) {
+                return false;
+        }
+        GbpAceBuilder matchBuilders = aclRuleBuilder;
+        try {
+            checkPresenceOfRequiredParams(params);
+            matchBuilders = this.update(matchBuilders, params);
+            Classifier clParent = this.getParent();
+            List<Classifier> updatedClassifiers = new ArrayList<>();
+            updatedClassifiers.add(this);
+            while (clParent != null) {
+                boolean hasReqParams = true;
+                try {
+                    clParent.checkPresenceOfRequiredParams(params);
+                } catch (IllegalArgumentException e) {
+                    LOG.error("Missing required params for classifier {}. {}", clParent.getId(), e);
+                    hasReqParams = false;
+                }
+                if (hasReqParams) {
+                    matchBuilders = clParent.update(matchBuilders, params);
+                    updatedClassifiers.add(clParent);
+                }
+                clParent = clParent.getParent();
+            }
+            for (Classifier updatedClassifier : updatedClassifiers) {
+                updatedClassifier.checkPrereqs(matchBuilders);
+            }
+        } catch (IllegalArgumentException e) {
+                LOG.error("Failed to update matches {}", e);
+                return false;
+        }
+        return true;
+    }
+
+    abstract GbpAceBuilder update(GbpAceBuilder ruleBuilder, Map<String, ParameterValue> params);
+
+    abstract void checkPrereqs(GbpAceBuilder matchBuilders);
+
     /**
      * Get the classifier definition id for this classifier.
      *
index 447fb1b0f2bbac1f5b4c5d72daf404fc4ea0f583..4799587a7754f33db6951572899296aedf6b6d3a 100755 (executable)
@@ -12,6 +12,7 @@ import java.util.List;
 import java.util.Map;
 
 import org.opendaylight.groupbasedpolicy.api.sf.EtherTypeClassifierDefinition;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.acl.GbpAceBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierDefinitionId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definitions.ClassifierDefinition;
@@ -59,12 +60,23 @@ public class EtherTypeClassifier extends Classifier {
     @Override
     protected void checkPresenceOfRequiredParams(Map<String, ParameterValue> params) {
         if (params.get(EtherTypeClassifierDefinition.ETHERTYPE_PARAM) == null) {
-            throw new IllegalArgumentException(
-                    "Parameter " + EtherTypeClassifierDefinition.ETHERTYPE_PARAM + " not specified.");
+            throw new IllegalArgumentException("Parameter " + EtherTypeClassifierDefinition.ETHERTYPE_PARAM
+                    + " not specified.");
         }
         if (params.get(EtherTypeClassifierDefinition.ETHERTYPE_PARAM).getIntValue() == null) {
-            throw new IllegalArgumentException(
-                    "Value of " + EtherTypeClassifierDefinition.ETHERTYPE_PARAM + " parameter is not present.");
+            throw new IllegalArgumentException("Value of " + EtherTypeClassifierDefinition.ETHERTYPE_PARAM
+                    + " parameter is not present.");
         }
     }
+
+    @Override
+    GbpAceBuilder update(GbpAceBuilder ruleBuilder, Map<String, ParameterValue> params) {
+        // ETHER_TYPE matching not supported yet
+        return ruleBuilder;
+    }
+
+    @Override
+    void checkPrereqs(GbpAceBuilder matchBuilders) {
+        // Nothing to consider yet.
+    }
 }
index 019bde00da3ba22c232c8f77315ef9945f7d7e2c..d5324d7788b9d94260b378e880a398cd70ccbb92 100755 (executable)
@@ -12,6 +12,7 @@ import java.util.List;
 import java.util.Map;
 
 import org.opendaylight.groupbasedpolicy.api.sf.IpProtoClassifierDefinition;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.acl.GbpAceBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierDefinitionId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definitions.ClassifierDefinition;
@@ -29,7 +30,7 @@ import com.google.common.collect.ImmutableList;
  */
 public class IpProtoClassifier extends Classifier {
 
-    protected IpProtoClassifier(Classifier parent) {
+    public IpProtoClassifier(Classifier parent) {
         super(parent);
     }
 
@@ -70,6 +71,20 @@ public class IpProtoClassifier extends Classifier {
         }
     }
 
+    @Override
+    GbpAceBuilder update(GbpAceBuilder ruleBuilder, Map<String, ParameterValue> params) {
+        Long proto = getIpProtoValue(params);
+        if (ruleBuilder.getProtocol() == null && proto != null) {
+            ruleBuilder.setProtocol(proto.shortValue());
+        }
+        return ruleBuilder;
+    }
+
+    @Override
+    void checkPrereqs(GbpAceBuilder matchBuilders) {
+        // TODO check whether mandatory fields are set in builder
+    }
+
     /**
      * Return the IpProtocol value. May return null.
      *
index c24d2579f480d578c2894577808aea9d65ab5dd7..26fd5e67e87e80c87481e26ff016382d8106d07f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
+ * 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,
@@ -8,8 +8,14 @@
 
 package org.opendaylight.groupbasedpolicy.renderer.vpp.sf;
 
-import com.google.common.collect.ImmutableList;
+import java.util.List;
+import java.util.Map;
+
 import org.opendaylight.groupbasedpolicy.api.sf.L4ClassifierDefinition;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.acl.GbpAceBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.DestinationPortRangeBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.SourcePortRangeBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierDefinitionId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definitions.ClassifierDefinition;
@@ -22,20 +28,23 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.supported._int.value.fields.SupportedIntValueInRangeBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.supported.range.value.fields.SupportedRangeValue;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.supported.range.value.fields.SupportedRangeValueBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
-import java.util.List;
-import java.util.Map;
+import com.google.common.collect.ImmutableList;
 
 /**
  * Match against TCP or UDP, and source and/or destination ports
  */
 public class L4Classifier extends Classifier {
 
+    private static final Logger LOG = LoggerFactory.getLogger(L4Classifier.class);
+
     static final String EXC_MSG_PARAM_VALUE_NOT_SPECIFIED = "Value of parameter not specified: ";
     static final String EXC_MSG_MUT_EXCLUSIVE_PARAMS = "Mutually exclusive parameters: ";
     static final String EXC_MSG_RANGE_VALUE_MISMATCH = "Range value mismatch: ";
 
-    protected L4Classifier(Classifier parent) {
+    public L4Classifier(Classifier parent) {
         super(parent);
     }
 
@@ -112,4 +121,46 @@ public class L4Classifier extends Classifier {
         }
     }
 
+    @Override
+    GbpAceBuilder update(GbpAceBuilder ruleBuilder, Map<String, ParameterValue> params) {
+        ruleBuilder.setSourcePortRange(resolveSourcePortRange(params, L4ClassifierDefinition.SRC_PORT_PARAM,
+                L4ClassifierDefinition.SRC_PORT_RANGE_PARAM));
+        ruleBuilder.setDestinationPortRange(resolveDestinationPortRange(params, L4ClassifierDefinition.DST_PORT_PARAM,
+                L4ClassifierDefinition.DST_PORT_RANGE_PARAM));
+        return ruleBuilder;
+    }
+
+    private SourcePortRangeBuilder resolveSourcePortRange(Map<String, ParameterValue> params, String portParam, String portRangeParam) {
+        LOG.info("Updating dest port params:{}", params);
+        SourcePortRangeBuilder srcRange = new SourcePortRangeBuilder();
+        if (params.get(portParam) != null) {
+            PortNumber portNumber = new PortNumber(params.get(portParam).getIntValue().intValue());
+            srcRange.setLowerPort(portNumber).setUpperPort(portNumber);
+        }
+        if (params.get(portRangeParam) != null) {
+            srcRange.setLowerPort(new PortNumber(params.get(portParam).getRangeValue().getMin().intValue()));
+            srcRange.setUpperPort(new PortNumber(params.get(portParam).getRangeValue().getMax().intValue()));
+        }
+        return srcRange;
+    }
+
+    private DestinationPortRangeBuilder resolveDestinationPortRange(Map<String, ParameterValue> params, String portParam, String portRangeParam) {
+        LOG.info("Updating source port params:{}", params);
+        DestinationPortRangeBuilder dstRange = new DestinationPortRangeBuilder();
+        if (params.get(portParam) != null) {
+            PortNumber portNumber = new PortNumber(params.get(portParam).getIntValue().intValue());
+            dstRange.setLowerPort(portNumber).setUpperPort(portNumber);
+        }
+        if (params.get(portRangeParam) != null) {
+            dstRange.setLowerPort(new PortNumber(params.get(portParam).getRangeValue().getMin().intValue()));
+            dstRange.setUpperPort(new PortNumber(params.get(portParam).getRangeValue().getMax().intValue()));
+        }
+        return dstRange;
+    }
+
+    @Override
+    void checkPrereqs(GbpAceBuilder matchBuilders) {
+        // TODO check whether mandatory fields are set in builder
+    }
+
 }
diff --git a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/sf/SubjectFeatures.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/sf/SubjectFeatures.java
new file mode 100644 (file)
index 0000000..a5ffbec
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2017 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.sf;
+
+import java.util.Map;
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierDefinitionId;
+
+import com.google.common.collect.ImmutableMap;
+
+public class SubjectFeatures {
+
+    private static final EtherTypeClassifier ETHER_TYPE_CL = new EtherTypeClassifier(null);
+    private static final IpProtoClassifier IP_PROTO_CL = new IpProtoClassifier(ETHER_TYPE_CL);
+    private static final L4Classifier L4_CL = new L4Classifier(IP_PROTO_CL);
+
+    private static final Map<ClassifierDefinitionId, org.opendaylight.groupbasedpolicy.renderer.vpp.sf.Classifier> CLASSIFIERS =
+            ImmutableMap.of(ETHER_TYPE_CL.getId(), ETHER_TYPE_CL, IP_PROTO_CL.getId(), IP_PROTO_CL, L4_CL.getId(), L4_CL);
+
+    public static Classifier getClassifier(ClassifierDefinitionId id) {
+        return CLASSIFIERS.get(id);
+    }
+}
index ac4d715f6f0f2054c5715bb313c98cf0c6b9005c..74905a4e02099a5c8249b7423005e59c2fc396a3 100644 (file)
@@ -8,9 +8,6 @@
 
 package org.opendaylight.groupbasedpolicy.renderer.vpp.util;
 
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-import com.google.common.util.concurrent.CheckedFuture;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
@@ -24,6 +21,10 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.CheckedFuture;
+
 public class GbpNetconfTransaction {
 
     public static final byte RETRY_COUNT = 3;
index 0e08b1c57b83dbf0dc2c3b1b583f4c3486f7fd04..d7742e1bf69a42f5357fbb8f4e1698c491b2f122 100644 (file)
@@ -9,6 +9,9 @@
 package org.opendaylight.groupbasedpolicy.renderer.vpp.util;
 
 import org.opendaylight.controller.config.yang.config.vpp_provider.impl.VppRenderer;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.AccessLists;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.Acl;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.AclKey;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
@@ -20,10 +23,12 @@ 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.nodes.RendererNodeKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VppInterfaceAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VppState;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.IetfAcl;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.L2;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.BridgeDomains;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.bridge.domains.BridgeDomain;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.bridge.domains.BridgeDomainKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.VppAcl;
 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;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
@@ -91,4 +96,20 @@ public class VppIidFactory {
             .child(BridgeDomain.class, bridgeDomainStateKey)
             .build();
     }
+
+    public static InstanceIdentifier<Acl> getVppAcl(String aclName) {
+        return InstanceIdentifier.builder(AccessLists.class)
+            .child(Acl.class, new AclKey(aclName, VppAcl.class))
+            .build();
+    }
+
+    /**
+     * IID to access list references on an interface
+     */
+    public static InstanceIdentifier<IetfAcl> getInterfaceIetfAcl(InterfaceKey ifaceKey) {
+        return getInterfaceIID(ifaceKey).builder()
+            .augmentation(VppInterfaceAugmentation.class)
+            .child(IetfAcl.class)
+            .build();
+    }
 }
index 6396208259c44b70c59c466f002eb3972a471ec9..cb6ddcb5a19c37fffcc76429a9cbba9a3d6bd10c 100644 (file)
@@ -17,6 +17,7 @@ module vpp-renderer {
     import opendaylight-l2-types { prefix l2-types; revision-date "2013-08-27"; }
     import ietf-yang-types { prefix yang-types; revision-date "2013-07-15"; }
     import ietf-inet-types { prefix "inet-types"; }
+    import yang-ext {prefix ext; revision-date "2013-07-09";}
 
     description
         "This module is a baseline for the group-based policy vpp renderer model.";
@@ -157,4 +158,13 @@ module vpp-renderer {
             }
         }
     }
+
+    augment "/vpp-renderer:config/vpp-renderer:vpp-endpoint" {
+        ext:augment-identifier "exclude-from-policy";
+        leaf exclude-from-policy {
+            description "Device attached as an endpoint may act as network element,
+                         e.g. qrouter attached via tap interface.";
+            type empty;
+        }
+    }
 }
index ae69fd3ceebf5fe1b84f3b832873c20c85515c10..5ff71e0adc42b55b10f706e3a1d75f767f1e080b 100644 (file)
@@ -9,6 +9,8 @@
 package org.opendaylight.controller.config.yang.config.vpp_provider.impl;
 
 import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableList;
+
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -22,9 +24,13 @@ import org.opendaylight.controller.md.sal.binding.api.MountPoint;
 import org.opendaylight.controller.md.sal.binding.api.MountPointService;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
+import org.opendaylight.groupbasedpolicy.api.sf.EtherTypeClassifierDefinition;
+import org.opendaylight.groupbasedpolicy.api.sf.IpProtoClassifierDefinition;
+import org.opendaylight.groupbasedpolicy.api.sf.L4ClassifierDefinition;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.VppRendererDataBrokerTest;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierDefinitionId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.Renderer;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.RendererKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.SupportedActionDefinition;
@@ -36,21 +42,23 @@ import java.util.List;
 
 @RunWith(MockitoJUnitRunner.class)
 public class VppRendererTest  extends VppRendererDataBrokerTest {
-    private final String CLASSIFIER = "Classifier-EtherType";
+
+    private final List<ClassifierDefinitionId> classifDefs = ImmutableList.<ClassifierDefinitionId>of(
+            EtherTypeClassifierDefinition.ID, IpProtoClassifierDefinition.ID, L4ClassifierDefinition.ID);
+
     private final String ACTION_ALLOW = "Action-Allow";
-    private final String SUPPORTED_PARAM_NAME = "ethertype";
 
     private DataBroker dataBroker;
     @Mock
-    DataBroker dataBroker2;
+    private DataBroker dataBroker2;
     @Mock
-    BindingAwareBroker bindingAwareBroker;
+    private BindingAwareBroker bindingAwareBroker;
     @Mock
-    MountPointService mountPointService;
+    private MountPointService mountPointService;
     @Mock
-    MountPoint mountPoint;
+    private MountPoint mountPoint;
     @Mock
-    BindingAwareBroker.ProviderContext providerContext;
+    private BindingAwareBroker.ProviderContext providerContext;
 
     @Before
     public void init(){
@@ -79,10 +87,8 @@ public class VppRendererTest  extends VppRendererDataBrokerTest {
         Renderer renderer = rendererOptional.get();
         Assert.assertEquals(VppRenderer.NAME, renderer.getName());
         List<SupportedClassifierDefinition> definition = renderer.getCapabilities().getSupportedClassifierDefinition();
-        Assert.assertEquals(1, definition.size());
-        Assert.assertEquals(CLASSIFIER, definition.get(0).getClassifierDefinitionId().getValue());
-        Assert.assertEquals(SUPPORTED_PARAM_NAME, definition.get(0).getSupportedParameterValues().get(0).getParameterName().getValue());
-
+        Assert.assertEquals(3, definition.size());
+        definition.forEach(cl -> Assert.assertTrue(classifDefs.contains(cl.getClassifierDefinitionId())));
         List<SupportedActionDefinition> actionDefinition = renderer.getCapabilities().getSupportedActionDefinition();
         Assert.assertEquals(1, actionDefinition.size());
         Assert.assertEquals(ACTION_ALLOW, actionDefinition.get(0).getActionDefinitionId().getValue());
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();
index 261d7678847b23ad06b2f0e6378a8145404f5fb2..00698c79cb522effcb43432d5da072bb3810d470 100644 (file)
@@ -21,6 +21,7 @@ import org.mockito.Mockito;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.iface.AclManager;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.iface.InterfaceManager;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
 import org.opendaylight.groupbasedpolicy.test.CustomDataBrokerTest;
@@ -98,7 +99,9 @@ public class BridgeDomainManagerImplTest extends CustomDataBrokerTest {
         dataBroker = getDataBroker();
         bridgeDomainManager = new BridgeDomainManagerImpl(dataBroker);
         final InterfaceManager interfaceManager = Mockito.mock(InterfaceManager.class);
-        final ForwardingManager fwManager = new ForwardingManager(interfaceManager, bridgeDomainManager, dataBroker);
+        final AclManager aclManager = Mockito.mock(AclManager.class);
+        final ForwardingManager fwManager =
+                new ForwardingManager(interfaceManager, aclManager, bridgeDomainManager, dataBroker);
         fwManager.setTimer((byte) 1);
     }
 
index 801bbfbbed95ec316f6d71590d3e966f8ebe5753..58602c8457a7724734909c4db7f4e112effdbfb4 100644 (file)
@@ -22,7 +22,9 @@ import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.DtoFactory;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.api.BridgeDomainManager;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.iface.AclManager;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.iface.InterfaceManager;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.acl.AccessListWrapper;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.KeyFactory;
 import org.opendaylight.groupbasedpolicy.test.CustomDataBrokerTest;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.AbsoluteLocation;
@@ -56,13 +58,15 @@ public class ForwardingManagerTest extends CustomDataBrokerTest {
     @Mock
     private InterfaceManager ifaceManager;
     @Mock
+    private AclManager aclManager;
+    @Mock
     private BridgeDomainManager bdManager;
 
     private ForwardingManager fwdManager;
 
     @Before
     public void init() {
-        fwdManager = new ForwardingManager(ifaceManager, bdManager, getDataBroker());
+        fwdManager = new ForwardingManager(ifaceManager, aclManager, bdManager, getDataBroker());
     }
 
     @Override
@@ -121,8 +125,6 @@ public class ForwardingManagerTest extends CustomDataBrokerTest {
     public void testRemoveBridgeDomainOnNodes() throws Exception {
         Mockito.when(bdManager.removeBridgeDomainFromVppNode(Mockito.eq(BD_1), Mockito.eq(NODE_1)))
             .thenReturn(Futures.immediateFuture(null));
-        SetMultimap<String, NodeId> vppNodesByBd = ImmutableSetMultimap.of(BD_1, NODE_1);
-
         bdManager.removeBridgeDomainFromVppNode(BD_1, NODE_1);
         Mockito.verify(bdManager).removeBridgeDomainFromVppNode(Matchers.eq(BD_1), Matchers.eq(NODE_1));
     }
@@ -147,12 +149,11 @@ public class ForwardingManagerTest extends CustomDataBrokerTest {
         AddressEndpointWithLocation firstAddrEpWithLoc =
                 policyCtx.getAddrEpByKey().get(KeyFactory.addressEndpointKey(firstRendererEp.getKey()));
         Mockito.when(ifaceManager.addBridgeDomainToInterface(Mockito.eq(DtoFactory.L2FD_CTX.getValue()),
-                Mockito.eq(firstAddrEpWithLoc), Mockito.eq(IS_BVI)))
+                Mockito.eq(firstAddrEpWithLoc), Mockito.anyListOf(AccessListWrapper.class),Mockito.eq(IS_BVI)))
             .thenReturn(Futures.immediateFuture(null));
-
         fwdManager.createForwardingForEndpoint(firstRendererEp.getKey(), policyCtx);
         Mockito.verify(ifaceManager).addBridgeDomainToInterface(Matchers.eq(DtoFactory.L2FD_CTX.getValue()),
-                Matchers.eq(firstAddrEpWithLoc), Mockito.eq(IS_BVI));
+                Matchers.eq(firstAddrEpWithLoc), Mockito.anyListOf(AccessListWrapper.class), Mockito.eq(IS_BVI));
     }
 
     @Test
index d23bcc94e1486e7f7226cfa0e245e2a51a96e0c8..2484b41242677cfb5d1ad215b49f8e7fc11e7876 100644 (file)
@@ -26,6 +26,7 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.DtoFactory;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.event.RendererPolicyConfEvent;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.event.VppEndpointConfEvent;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.iface.AclManager;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.iface.InterfaceManager;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.iface.VppEndpointLocationProvider;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.KeyFactory;
@@ -79,6 +80,7 @@ public class VppRendererPolicyManagerTest extends CustomDataBrokerTest {
 
     private BridgeDomainManagerImpl bdManager;
     private InterfaceManager ifaceManager;
+    private AclManager aclManager;
     private ForwardingManager fwManager;
     private VppRendererPolicyManager vppRendererPolicyManager;
 
@@ -99,9 +101,10 @@ public class VppRendererPolicyManagerTest extends CustomDataBrokerTest {
             .thenReturn(Optional.of(mountPointDataBroker));
         ifaceManager =
                 new InterfaceManager(mountedDataProviderMock, dataBroker);
+        aclManager = new AclManager(mountedDataProviderMock);
         bdManager = new BridgeDomainManagerImpl(mountPointDataBroker);
-        fwManager = new ForwardingManager(ifaceManager, bdManager, dataBroker);
-        vppRendererPolicyManager = new VppRendererPolicyManager(fwManager, dataBroker);
+        fwManager = new ForwardingManager(ifaceManager, aclManager, bdManager, dataBroker);
+        vppRendererPolicyManager = new VppRendererPolicyManager(fwManager, aclManager, dataBroker);
         fwManager.setTimer((byte) 1);
     }
 
diff --git a/renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/AccessListUtilTest.java b/renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/AccessListUtilTest.java
new file mode 100644 (file)
index 0000000..5828b9b
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * 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.List;
+import java.util.stream.Collectors;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.PolicyContext;
+
+public class AccessListUtilTest extends TestResources {
+
+    private PolicyContext ctx;
+
+    @Before
+    public void init() {
+        ctx = super.createPolicyContext();
+    }
+
+    @Test
+    public void resolveAclsOnInterfaceTest() {
+        // TODO add more checking
+        List<AccessListWrapper> acls =
+                AccessListUtil.resolveAclsOnInterface(rendererEndpoint(l2AddrEp2).build().getKey(), ctx);
+        Assert.assertEquals(2, acls.size());
+        Assert.assertEquals(2, acls.stream().map(AccessListWrapper::getDirection).collect(Collectors.toSet()).size());
+        acls.stream().forEach(ace -> {
+            // allow peer + deny rest of tenant net + permit external
+            if (ace instanceof IngressAccessListWrapper) {
+                Assert.assertEquals(3, ace.readRules().size());
+            } else if (ace instanceof EgressAccessListWrapper) {
+                Assert.assertEquals(3, ace.readRules().size());
+            }
+        });
+    }
+}
diff --git a/renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/AccessListWrapperTest.java b/renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/AccessListWrapperTest.java
new file mode 100644 (file)
index 0000000..d650306
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * 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.List;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.acl.AccessListUtil.ACE_DIRECTION;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.Acl;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.VppAcl;
+
+import com.google.common.collect.ImmutableList;
+
+public class AccessListWrapperTest {
+
+    private GbpAceBuilder rule1;
+
+    @Before
+    public void init() {
+        rule1 = Mockito.mock(GbpAceBuilder.class);
+    }
+
+    @Test
+    public void testGetDirection_ingress() {
+        AccessListWrapper aclWrapper = new IngressAccessListWrapper();
+        Assert.assertEquals(ACE_DIRECTION.INGRESS, aclWrapper.getDirection());
+        aclWrapper = new EgressAccessListWrapper();
+        Assert.assertEquals(ACE_DIRECTION.EGRESS, aclWrapper.getDirection());
+    }
+
+    @Test
+    public void writeRulesTest() {
+        AccessListWrapper aclWrapper = new IngressAccessListWrapper();
+        List<GbpAceBuilder> rules = ImmutableList.of(rule1);
+        aclWrapper.writeRules(rules);
+        Assert.assertEquals(rule1, aclWrapper.readRules().get(0));
+        Assert.assertEquals(1, aclWrapper.readRules().size());
+    }
+
+    @Test
+    public void buildVppAclTest() {
+        AccessListWrapper aclWrapper = new IngressAccessListWrapper();
+        aclWrapper.writeRule(rule1);
+        String key1 = "key1";
+        Acl acl = aclWrapper.buildVppAcl(new InterfaceKey(key1));
+        Assert.assertEquals(VppAcl.class, acl.getAclType());
+        Assert.assertEquals(key1 + ACE_DIRECTION.INGRESS, acl.getAclName());
+        Assert.assertEquals(1, acl.getAccessListEntries().getAce().size());
+    }
+}
diff --git a/renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/TestResources.java b/renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/acl/TestResources.java
new file mode 100644 (file)
index 0000000..45f79c3
--- /dev/null
@@ -0,0 +1,273 @@
+/*
+ * 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().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();
+    }
+}
index 09faa7e59dc81a5a9515e6674a9bfc1cfd2f726f..b1a9d16e31e62d17c45e9b52e3add2e495a4c188 100755 (executable)
@@ -13,6 +13,7 @@ import java.util.List;
 import java.util.Map;
 
 import org.junit.Assert;
+import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
@@ -23,22 +24,28 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.r
 
 public class EtherTypeClassifierTest {
 
+    private Classifier ethTypeCl;
     @Rule
     public ExpectedException thrown = ExpectedException.none();
 
+    @Before
+    public void init() {
+        ethTypeCl = SubjectFeatures.getClassifier(EtherTypeClassifierDefinition.ID);
+    }
+
     @Test
     public void testGetSupportedParameterValues() {
         List<SupportedParameterValues> supportedParameterValues =
-                Classifier.ETHER_TYPE_CL.getSupportedParameterValues();
+                ethTypeCl.getSupportedParameterValues();
 
         Assert.assertEquals(1, supportedParameterValues.size());
         Assert.assertEquals(ClassifierTestUtils.SUPPORTED_PARAM_NAME_ETH,
                 supportedParameterValues.get(0).getParameterName().getValue());
 
         Assert.assertEquals(EtherTypeClassifierDefinition.DEFINITION,
-                Classifier.ETHER_TYPE_CL.getClassifierDefinition());
-        Assert.assertEquals(EtherTypeClassifierDefinition.ID, Classifier.ETHER_TYPE_CL.getId());
-        Assert.assertNull(Classifier.ETHER_TYPE_CL.getParent());
+                ethTypeCl.getClassifierDefinition());
+        Assert.assertEquals(EtherTypeClassifierDefinition.ID, ethTypeCl.getId());
+        Assert.assertNull(ethTypeCl.getParent());
     }
 
     @Test
@@ -49,7 +56,7 @@ public class EtherTypeClassifierTest {
 
         thrown.expect(IllegalArgumentException.class);
         thrown.expectMessage(ClassifierTestUtils.MSG_NOT_SPECIFIED);
-        Classifier.ETHER_TYPE_CL.checkPresenceOfRequiredParams(params);
+        ethTypeCl.checkPresenceOfRequiredParams(params);
     }
 
     @Test
@@ -59,6 +66,6 @@ public class EtherTypeClassifierTest {
 
         thrown.expect(IllegalArgumentException.class);
         thrown.expectMessage(ClassifierTestUtils.MSG_PARAMETER_IS_NOT_PRESENT);
-        Classifier.ETHER_TYPE_CL.checkPresenceOfRequiredParams(params);
+        ethTypeCl.checkPresenceOfRequiredParams(params);
     }
 }
index 8a1f592b92a6559d13d98216df96f03bf1cdb4ad..94a482c971e12d1d3abf5b12e9179a2f0b52533c 100755 (executable)
@@ -13,6 +13,7 @@ import java.util.List;
 import java.util.Map;
 
 import org.junit.Assert;
+import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
@@ -23,20 +24,27 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.r
 
 public class IpProtoClassifierTest {
 
+    private Classifier ipProtoCl;
     @Rule
     public ExpectedException thrown = ExpectedException.none();
 
+    @Before
+    public void init() {
+         ipProtoCl = SubjectFeatures.getClassifier(IpProtoClassifierDefinition.ID);
+    }
+
     @Test
     public void testGetSupportedParameterValues() {
-        List<SupportedParameterValues> supportedParameterValues = Classifier.IP_PROTO_CL.getSupportedParameterValues();
+        List<SupportedParameterValues> supportedParameterValues =
+                ipProtoCl.getSupportedParameterValues();
 
         Assert.assertEquals(1, supportedParameterValues.size());
         Assert.assertEquals(ClassifierTestUtils.SUPPORTED_PARAM_NAME_IP,
                 supportedParameterValues.get(0).getParameterName().getValue());
 
-        Assert.assertEquals(IpProtoClassifierDefinition.DEFINITION, Classifier.IP_PROTO_CL.getClassifierDefinition());
-        Assert.assertEquals(IpProtoClassifierDefinition.ID, Classifier.IP_PROTO_CL.getId());
-        Assert.assertEquals(Classifier.ETHER_TYPE_CL, Classifier.IP_PROTO_CL.getParent());
+        Assert.assertEquals(IpProtoClassifierDefinition.DEFINITION, ipProtoCl.getClassifierDefinition());
+        Assert.assertEquals(IpProtoClassifierDefinition.ID, ipProtoCl.getId());
+        Assert.assertEquals(SubjectFeatures.getClassifier(EtherTypeClassifierDefinition.ID), ipProtoCl.getParent());
     }
 
     @Test
@@ -49,7 +57,7 @@ public class IpProtoClassifierTest {
 
         thrown.expect(IllegalArgumentException.class);
         thrown.expectMessage(ClassifierTestUtils.MSG_NOT_SPECIFIED);
-        Classifier.IP_PROTO_CL.checkPresenceOfRequiredParams(params);
+        ipProtoCl.checkPresenceOfRequiredParams(params);
     }
 
     @Test
@@ -61,7 +69,7 @@ public class IpProtoClassifierTest {
 
         thrown.expect(IllegalArgumentException.class);
         thrown.expectMessage(ClassifierTestUtils.MSG_PARAMETER_IS_NOT_PRESENT);
-        Classifier.IP_PROTO_CL.checkPresenceOfRequiredParams(params);
+        ipProtoCl.checkPresenceOfRequiredParams(params);
     }
 
     @Test
@@ -70,7 +78,7 @@ public class IpProtoClassifierTest {
         params.putAll(ClassifierTestUtils.createIntValueParam(IpProtoClassifierDefinition.PROTO_PARAM,
                 IpProtoClassifierDefinition.TCP_VALUE));
 
-        Classifier.IP_PROTO_CL.checkPresenceOfRequiredParams(params);
+        ipProtoCl.checkPresenceOfRequiredParams(params);
 
         Assert.assertEquals(ClassifierTestUtils.TCP, IpProtoClassifier.getIpProtoValue(params));
     }
index dd0281a4d9652860d1517ada0553e76631dc8ef6..bd46833866001b1a419be7dbdff354ac01a91f42 100644 (file)
@@ -12,6 +12,7 @@ import org.junit.Before;
 import org.junit.Rule;\r
 import org.junit.Test;\r
 import org.junit.rules.ExpectedException;\r
+import org.opendaylight.groupbasedpolicy.api.sf.IpProtoClassifierDefinition;\r
 import org.opendaylight.groupbasedpolicy.api.sf.L4ClassifierDefinition;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValue;\r
@@ -36,6 +37,7 @@ public class L4ClassifierTest {
     private ParameterValue pvDstRange81_82;\r
     private ParameterValue pvDstRange82_81;\r
     private ParameterValue pvDstRange_null;\r
+    private Classifier l4Cl;\r
 \r
     @Rule\r
     public ExpectedException thrown = ExpectedException.none();\r
@@ -64,21 +66,22 @@ public class L4ClassifierTest {
                 new ParameterName(L4ClassifierDefinition.DST_PORT_RANGE_PARAM))\r
                 //.setRangeValue(new RangeValueBuilder().setMin(82L).setMax(81L).build())\r
                 .build();\r
+        l4Cl = SubjectFeatures.getClassifier(L4ClassifierDefinition.ID);\r
     }\r
 \r
     @Test\r
     public void testGetId() {\r
-        assertEquals(L4ClassifierDefinition.ID, Classifier.L4_CL.getId());\r
+        assertEquals(L4ClassifierDefinition.ID, l4Cl.getId());\r
     }\r
 \r
     @Test\r
     public void testGetClassifierDefinition() {\r
-        assertEquals(L4ClassifierDefinition.DEFINITION, Classifier.L4_CL.getClassifierDefinition());\r
+        assertEquals(L4ClassifierDefinition.DEFINITION, l4Cl.getClassifierDefinition());\r
     }\r
 \r
     @Test\r
     public void testGetSupportedParameterValues() {\r
-        List<SupportedParameterValues> valuesList = Classifier.L4_CL.getSupportedParameterValues();\r
+        List<SupportedParameterValues> valuesList = l4Cl.getSupportedParameterValues();\r
         assertEquals(4, valuesList.size());\r
 \r
         SupportedParameterValues values = valuesList.get(0);\r
@@ -91,7 +94,7 @@ public class L4ClassifierTest {
     @Test\r
     public void testCheckPresenceOfRequiredParams_Empty() throws Exception {\r
         // TODO check: sending empty map is ok?\r
-        Classifier.L4_CL.checkPresenceOfRequiredParams(new HashMap<String, ParameterValue>());\r
+        l4Cl.checkPresenceOfRequiredParams(new HashMap<String, ParameterValue>());\r
     }\r
 \r
     @Test\r
@@ -100,7 +103,7 @@ public class L4ClassifierTest {
         params.put(L4ClassifierDefinition.SRC_PORT_PARAM, pvSrcPort80);\r
         params.put(L4ClassifierDefinition.DST_PORT_PARAM, pvDstPort80);\r
 \r
-        Classifier.L4_CL.checkPresenceOfRequiredParams(params);\r
+        l4Cl.checkPresenceOfRequiredParams(params);\r
     }\r
 \r
     @Test\r
@@ -109,7 +112,7 @@ public class L4ClassifierTest {
         params.put(L4ClassifierDefinition.SRC_PORT_RANGE_PARAM, pvSrcRange81_82);\r
         params.put(L4ClassifierDefinition.DST_PORT_RANGE_PARAM, pvDstRange81_82);\r
 \r
-        Classifier.L4_CL.checkPresenceOfRequiredParams(params);\r
+        l4Cl.checkPresenceOfRequiredParams(params);\r
     }\r
 \r
     @Test\r
@@ -120,7 +123,7 @@ public class L4ClassifierTest {
 \r
         thrown.expect(IllegalArgumentException.class);\r
         thrown.expectMessage(L4Classifier.EXC_MSG_PARAM_VALUE_NOT_SPECIFIED);\r
-        Classifier.L4_CL.checkPresenceOfRequiredParams(params);\r
+        l4Cl.checkPresenceOfRequiredParams(params);\r
     }\r
 \r
     @Test\r
@@ -131,7 +134,7 @@ public class L4ClassifierTest {
 \r
         thrown.expect(IllegalArgumentException.class);\r
         thrown.expectMessage(L4Classifier.EXC_MSG_PARAM_VALUE_NOT_SPECIFIED);\r
-        Classifier.L4_CL.checkPresenceOfRequiredParams(params);\r
+        l4Cl.checkPresenceOfRequiredParams(params);\r
     }\r
 \r
     @Test\r
@@ -142,7 +145,7 @@ public class L4ClassifierTest {
 \r
         thrown.expect(IllegalArgumentException.class);\r
         thrown.expectMessage(L4Classifier.EXC_MSG_MUT_EXCLUSIVE_PARAMS);\r
-        Classifier.L4_CL.checkPresenceOfRequiredParams(params);\r
+        l4Cl.checkPresenceOfRequiredParams(params);\r
     }\r
 \r
     @Test\r
@@ -153,18 +156,18 @@ public class L4ClassifierTest {
 \r
         thrown.expect(IllegalArgumentException.class);\r
         thrown.expectMessage(L4Classifier.EXC_MSG_RANGE_VALUE_MISMATCH);\r
-        Classifier.L4_CL.checkPresenceOfRequiredParams(params);\r
+        l4Cl.checkPresenceOfRequiredParams(params);\r
     }\r
 \r
     @Test\r
     public void testCheckPresenceOfRequiredParams_emptyParams() {\r
 \r
-        Classifier.L4_CL.checkPresenceOfRequiredParams(new HashMap<String, ParameterValue>());\r
+        l4Cl.checkPresenceOfRequiredParams(new HashMap<String, ParameterValue>());\r
     }\r
 \r
     @Test\r
     public void testGetParent() {\r
-        assertEquals(Classifier.L4_CL.getParent(), Classifier.IP_PROTO_CL);\r
+        assertEquals(l4Cl.getParent(), SubjectFeatures.getClassifier(IpProtoClassifierDefinition.ID));\r
     }\r
 \r
 }\r