Bug 5325 Missing sfc action in rules 69/34469/5
authorMartin Sunal <msunal@cisco.com>
Thu, 11 Feb 2016 15:35:54 +0000 (16:35 +0100)
committerKeith Burns (alagalah) <alagalah@gmail.com>
Thu, 11 Feb 2016 19:44:43 +0000 (20:44 +0100)
Change-Id: I1b90da5deb3fa7615249fef95f87983404f429e7
Signed-off-by: Martin Sunal <msunal@cisco.com>
Signed-off-by: Keith Burns (alagalah) <alagalah@gmail.com>
13 files changed:
neutron-mapper/pom.xml
neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/NeutronMapper.java
neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronRouterAware.java
neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/group/SecGroupDao.java
neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/rule/NeutronGbpMapperServiceImpl.java [new file with mode: 0644]
neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/rule/NeutronSecurityRuleAware.java
neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/rule/SecRuleDao.java
neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/rule/SecRuleEntityDecoder.java
neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/rule/SingleClassifierRule.java
neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/rule/SingleRuleContract.java
neutron-mapper/src/main/yang/neutron-gbp-mapper.yang
neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/rule/SingleClassifierRuleTest.java
neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/rule/SingleRuleContractTest.java

index b2b7727a70faa17d8823fb9f393ebcc3266dac8a..d263012216a3de94538d2e3161f2f08a65ffc73d 100644 (file)
       <type>test-jar</type>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.mdsal.model</groupId>
+      <artifactId>ietf-yang-types-20130715</artifactId>
+    </dependency>
   </dependencies>
 
  <build>
index f897c59e2bca5530650caeb1ad6008ce60cb7fea..3c64bd79e1483a261880d61ed23e4995df5457fa 100644 (file)
@@ -14,6 +14,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration;
 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.NeutronFloatingIpAware;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.NeutronNetworkAware;
@@ -23,6 +24,7 @@ import org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.NeutronRouterAwa
 import org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.NeutronSubnetAware;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.group.NeutronSecurityGroupAware;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.group.SecGroupDao;
+import org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.rule.NeutronGbpMapperServiceImpl;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.rule.NeutronSecurityRuleAware;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.rule.SecRuleDao;
 import org.opendaylight.neutron.spi.INeutronFloatingIPAware;
@@ -33,22 +35,28 @@ import org.opendaylight.neutron.spi.INeutronSecurityGroupAware;
 import org.opendaylight.neutron.spi.INeutronSecurityRuleAware;
 import org.opendaylight.neutron.spi.INeutronSubnetAware;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.EndpointService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.NeutronGbpMapperService;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
 
 public class NeutronMapper implements AutoCloseable {
 
     private final List<ServiceRegistration<?>> registrations = new ArrayList<ServiceRegistration<?>>();
+    private final DataBroker dataProvider;
+    private final RpcProviderRegistry providerRegistry;
+    private final BundleContext context;
+    private final EndpointService epService;
+    private RpcRegistration<NeutronGbpMapperService> rpcRegistration;
 
     public NeutronMapper(DataBroker dataProvider, RpcProviderRegistry rpcProvider, BundleContext context) {
-        checkNotNull(dataProvider);
-        checkNotNull(rpcProvider);
-        checkNotNull(context);
-        EndpointService epService = rpcProvider.getRpcService(EndpointService.class);
-        registerAwareProviders(dataProvider, epService, context);
+        this.dataProvider = checkNotNull(dataProvider);
+        this.providerRegistry = checkNotNull(rpcProvider);
+        this.context = checkNotNull(context);
+        this.epService = rpcProvider.getRpcService(EndpointService.class);
+        registerAwareProviders();
     }
 
-    private void registerAwareProviders(DataBroker dataProvider, EndpointService epService, BundleContext context) {
+    private void registerAwareProviders() {
         SecGroupDao secGroupDao = new SecGroupDao();
         SecRuleDao secRuleDao = new SecRuleDao();
         NeutronNetworkDao networkDao = new NeutronNetworkDao();
@@ -85,6 +93,9 @@ public class NeutronMapper implements AutoCloseable {
         ServiceRegistration<INeutronFloatingIPAware> neutronFloatingIpAwareRegistration = context
             .registerService(INeutronFloatingIPAware.class, new NeutronFloatingIpAware(dataProvider), null);
         registrations.add(neutronFloatingIpAwareRegistration);
+
+        NeutronGbpMapperService neutronGbpMapperService = new NeutronGbpMapperServiceImpl(dataProvider, securityRuleAware);
+        rpcRegistration = providerRegistry.addRpcImplementation(NeutronGbpMapperService.class, neutronGbpMapperService);
     }
 
     /**
@@ -95,6 +106,7 @@ public class NeutronMapper implements AutoCloseable {
         for (ServiceRegistration<?> registration : registrations) {
             registration.unregister();
         }
+        rpcRegistration.close();
     }
 
 }
index 614821b228fe5d4faeb061ace153379c5386a35b..c448f748336a2a5c2b5a64ef2d03876b93c6e2e6 100644 (file)
@@ -300,9 +300,6 @@ public class NeutronRouterAware implements INeutronRouterAware {
         return new SubnetBuilder(potentialSubnet.get()).setVirtualRouterIp(ipAddress).build();
     }
 
-    /**
-     * @return {@code false} if illegal state occurred; {@code true} otherwise
-     */
     public boolean setNewL3ContextToEpsFromSubnet(TenantId tenantId, L3Context l3Context, Subnet subnet,
             ReadWriteTransaction rwTx) {
         if (subnet.getParent() == null) {
index b124d08f4daa7f334eeec3288cf1fbaee4fafa96..78355ae9c57359f14e7fa7ece4c8e015c88258b2 100644 (file)
@@ -33,7 +33,7 @@ public class SecGroupDao {
     }
 
     /**
-     * @param id
+     * @param id {@link EndpointGroupId} EndpointGroupId
      * @return {@code empty string} if security group with given ID does not exist; returns
      *         {@code name of security group} if has some; otherwise security group id
      */
diff --git a/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/rule/NeutronGbpMapperServiceImpl.java b/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/rule/NeutronGbpMapperServiceImpl.java
new file mode 100644 (file)
index 0000000..d6a5451
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * 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.neutron.mapper.mapping.rule;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.List;
+import java.util.concurrent.Future;
+
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
+import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.ChangeActionOfSecurityGroupRulesInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.NeutronGbpMapperService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.change.action.of.security.group.rules.input.SecurityGroupRule;
+import org.opendaylight.yangtools.yang.common.RpcError.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.util.concurrent.Futures;
+
+public class NeutronGbpMapperServiceImpl implements NeutronGbpMapperService {
+
+    private static final Logger LOG = LoggerFactory.getLogger(NeutronGbpMapperServiceImpl.class);
+    private NeutronSecurityRuleAware secRuleAware;
+    private DataBroker dataProvider;
+
+    public NeutronGbpMapperServiceImpl(DataBroker dataProvider, NeutronSecurityRuleAware secRuleAware) {
+        this.dataProvider = checkNotNull(dataProvider);
+        this.secRuleAware = checkNotNull(secRuleAware);
+    }
+
+    @Override
+    public Future<RpcResult<Void>> changeActionOfSecurityGroupRules(ChangeActionOfSecurityGroupRulesInput input) {
+        List<SecurityGroupRule> securityGroupRules = input.getSecurityGroupRule();
+        if (securityGroupRules == null || input.getAction() == null) {
+            LOG.debug("Missing params in request:\n{}", input);
+            return Futures.immediateFuture(RpcResultBuilder.<Void>failed()
+                .withError(ErrorType.PROTOCOL, "Missing params. Changing to action "
+                        + input.getAction().getActionChoice() + " was not successful.")
+                .build());
+        }
+
+        ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
+        for (SecurityGroupRule secGrpRule : securityGroupRules) {
+            Uuid uuid = secGrpRule.getUuid();
+            LOG.trace("Changing action to {} in security group rule {}", input.getAction().getActionChoice(), uuid);
+            boolean isSuccessful =
+                    secRuleAware.changeActionOfNeutronSecurityRule(uuid, input.getAction().getActionChoice(), rwTx);
+            if (!isSuccessful) {
+                rwTx.cancel();
+                LOG.warn("Changing action to {} in security group rule {} was not successful.",
+                        input.getAction().getActionChoice(), uuid);
+                return Futures.immediateFuture(RpcResultBuilder.<Void>failed()
+                    .withError(ErrorType.APPLICATION,
+                            "Changing to action " + input.getAction().getActionChoice() + " was not successful.")
+                    .build());
+            }
+        }
+        boolean isSubmittedToDs = DataStoreHelper.submitToDs(rwTx);
+        if (!isSubmittedToDs) {
+            LOG.warn("Changing action to {} in security group rules {} was not successful.",
+                    input.getAction().getActionChoice(), input.getSecurityGroupRule());
+            return Futures.immediateFuture(RpcResultBuilder.<Void>failed()
+                .withError(ErrorType.APPLICATION, "Storing to datastore was not successful. Changing to action "
+                        + input.getAction().getActionChoice() + " was not successful.")
+                .build());
+        }
+        return Futures.immediateFuture(RpcResultBuilder.<Void>success().build());
+    }
+
+}
index 5f6885c38a3b27c998a744e85bba6185a3cb4b06..37bf60571410a77419680c85785dc2184d4ecc17 100644 (file)
@@ -10,12 +10,14 @@ package org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.rule;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
+import java.util.List;
 import java.util.Set;
 
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.groupbasedpolicy.api.sf.ChainActionDefinition;
 import org.opendaylight.groupbasedpolicy.dto.EgKey;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.StatusCode;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.group.SecGroupDao;
@@ -24,19 +26,28 @@ import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
 import org.opendaylight.groupbasedpolicy.util.IidFactory;
 import org.opendaylight.neutron.spi.INeutronSecurityRuleAware;
 import org.opendaylight.neutron.spi.NeutronSecurityRule;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClauseName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Description;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SelectorName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.change.action.of.security.group.rules.input.action.ActionChoice;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.change.action.of.security.group.rules.input.action.action.choice.SfcActionCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection.Direction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.action.refs.ActionRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.action.refs.ActionRefBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValueBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.Contract;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.endpoint.group.ConsumerNamedSelector;
 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.ActionInstanceBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.subject.feature.instances.ClassifierInstance;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
@@ -96,22 +107,47 @@ public class NeutronSecurityRuleAware implements INeutronSecurityRuleAware {
         }
     }
 
-    /**
-     * @param secRule this security group rule will be translate to single rule inside single
-     *        subject inside a contract
-     * @param rwTx GBP entities are stored to this transaction. This method NEVER submits or cancel
-     *        the transaction.
-     * @return {@code true} if operation was successful; {@code false} if an illegal state occurs -
-     *         the transaction may contain just partial result
-     */
+    public boolean changeActionOfNeutronSecurityRule(Uuid secRuleId, ActionChoice action, ReadWriteTransaction rwTx) {
+        NeutronSecurityRule secRule = secRuleDao.getSecRuleByUuid(secRuleId);
+        List<ActionRef> actions = createActions(action, SecRuleEntityDecoder.getTenantId(secRule), rwTx);
+        LOG.trace("Changing to action {} for secuirity group rule {}", action, secRule);
+        return addNeutronSecurityRuleWithAction(secRule, actions, rwTx);
+    }
+
+    private List<ActionRef> createActions(ActionChoice action, TenantId tenantId, ReadWriteTransaction rwTx) {
+        if (action instanceof SfcActionCase) {
+            String sfcChainName = ((SfcActionCase) action).getSfcChainName();
+            ActionName actionName = addSfcChainActionInstance(sfcChainName, tenantId, rwTx);
+            return ImmutableList.of(new ActionRefBuilder().setName(actionName).setOrder(0).build());
+        }
+        return MappingUtils.ACTION_REF_ALLOW;
+    }
+
+    private ActionName addSfcChainActionInstance(String sfcChainName, TenantId tenantId, ReadWriteTransaction rwTx) {
+        ActionName actionName = new ActionName(sfcChainName);
+        ActionInstance sfcActionInstance = new ActionInstanceBuilder().setName(actionName)
+            .setActionDefinitionId(ChainActionDefinition.ID)
+            .setParameterValue(ImmutableList.of(new ParameterValueBuilder()
+                .setName(new ParameterName(ChainActionDefinition.SFC_CHAIN_NAME)).setStringValue(sfcChainName).build()))
+            .build();
+        rwTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.actionInstanceIid(tenantId, actionName),
+                sfcActionInstance, true);
+        return actionName;
+    }
+
     public boolean addNeutronSecurityRule(NeutronSecurityRule secRule, ReadWriteTransaction rwTx) {
+        return addNeutronSecurityRuleWithAction(secRule, MappingUtils.ACTION_REF_ALLOW, rwTx);
+    }
+
+    public boolean addNeutronSecurityRuleWithAction(NeutronSecurityRule secRule, List<ActionRef> actions,
+            ReadWriteTransaction rwTx) {
         TenantId tenantId = SecRuleEntityDecoder.getTenantId(secRule);
         EndpointGroupId providerEpgId = SecRuleEntityDecoder.getProviderEpgId(secRule);
         secRuleDao.addSecRule(secRule);
 
         Description contractDescription = new Description(CONTRACT_PROVIDER
                 + secGroupDao.getNameOrIdOfSecGroup(providerEpgId));
-        SingleRuleContract singleRuleContract = createSingleRuleContract(secRule, contractDescription);
+        SingleRuleContract singleRuleContract = createSingleRuleContract(secRule, contractDescription, actions);
         Contract contract = singleRuleContract.getContract();
         rwTx.put(LogicalDatastoreType.CONFIGURATION, IidFactory.contractIid(tenantId, contract.getId()), contract, true);
         SelectorName providerSelector = getSelectorNameWithConsumer(secRule);
@@ -135,11 +171,12 @@ public class NeutronSecurityRuleAware implements INeutronSecurityRuleAware {
     }
 
     @VisibleForTesting
-    static SingleRuleContract createSingleRuleContract(NeutronSecurityRule secRule, Description contractDescription) {
+    static SingleRuleContract createSingleRuleContract(NeutronSecurityRule secRule, Description contractDescription,
+            List<ActionRef> actions) {
         if (Strings.isNullOrEmpty(secRule.getSecurityRuleRemoteIpPrefix())) {
-            return new SingleRuleContract(secRule, 0, contractDescription);
+            return new SingleRuleContract(secRule, 0, contractDescription, actions);
         }
-        return new SingleRuleContract(secRule, 1, contractDescription);
+        return new SingleRuleContract(secRule, 1, contractDescription, actions);
     }
 
     @VisibleForTesting
index 6ccaea6a4cec10ffdbc73ddd0ec75ee0bf5bf8be..9522d7ecb7c63f1f22a74899f69ccee5464dd319 100644 (file)
@@ -8,11 +8,14 @@
 
 package org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.rule;
 
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Set;
 
 import javax.annotation.Nullable;
 
 import org.opendaylight.neutron.spi.NeutronSecurityRule;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
 
 import com.google.common.base.Preconditions;
@@ -24,6 +27,7 @@ public class SecRuleDao {
     private final SetMultimap<EndpointGroupId, NeutronSecurityRule> secRulesByOwnerSecGrpId = HashMultimap.create();
     private final SetMultimap<OwnerAndRemoteOfSecRule, NeutronSecurityRule> secRulesByRemoteSecGrpId =
             HashMultimap.create();
+    private final Map<Uuid, NeutronSecurityRule> secRuleByUuid = new HashMap<>();
 
     public void addSecRule(NeutronSecurityRule secRule) {
         Preconditions.checkNotNull(secRule);
@@ -31,6 +35,7 @@ public class SecRuleDao {
         EndpointGroupId remoteSecGrp = SecRuleEntityDecoder.getConsumerEpgId(secRule);
         secRulesByOwnerSecGrpId.put(ownerSecGrp, secRule);
         secRulesByRemoteSecGrpId.put(new OwnerAndRemoteOfSecRule(ownerSecGrp, remoteSecGrp), secRule);
+        secRuleByUuid.put(new Uuid(secRule.getID()), secRule);
     }
 
     public Set<NeutronSecurityRule> getSecRulesByOwnerSecGrpId(EndpointGroupId secGrpId) {
@@ -46,6 +51,10 @@ public class SecRuleDao {
         return secRulesByRemoteSecGrpId.get(new OwnerAndRemoteOfSecRule(ownerSecGrpId, null));
     }
 
+    public NeutronSecurityRule getSecRuleByUuid(Uuid secRule) {
+        return secRuleByUuid.get(secRule);
+    }
+
     public Set<EndpointGroupId> getAllOwnerSecGrps() {
         return secRulesByOwnerSecGrpId.keySet();
     }
@@ -56,6 +65,7 @@ public class SecRuleDao {
         EndpointGroupId remoteSecGrp = SecRuleEntityDecoder.getConsumerEpgId(secRule);
         secRulesByOwnerSecGrpId.remove(ownerSecGrp, secRule);
         secRulesByRemoteSecGrpId.remove(new OwnerAndRemoteOfSecRule(ownerSecGrp, remoteSecGrp), secRule);
+        secRuleByUuid.remove(new Uuid(secRule.getID()));
     }
 
     static class OwnerAndRemoteOfSecRule {
index ea3550dab6e006c3555dbf42fd79919012938d8b..bfda7e364d52eea7586773412a1845ea6b5b91cb 100755 (executable)
@@ -64,9 +64,6 @@ public class SecRuleEntityDecoder {
         return new EndpointGroupId(Utils.normalizeUuid(secRule.getSecurityRuleGroupID()));\r
     }\r
 \r
-    /**\r
-     * @return {@code null} if {@link NeutronSecurityRule#getSecurityRemoteGroupID()} is null\r
-     */\r
     public static @Nullable EndpointGroupId getConsumerEpgId(NeutronSecurityRule secRule) {\r
         if (Strings.isNullOrEmpty(secRule.getSecurityRemoteGroupID())) {\r
             return null;\r
index 1aa77f4a1f7de3a3de8b369e10a28f265e7b139c..ffe0b9d7397f675fbe44cd0ea6f422b5dbee114a 100644 (file)
@@ -8,10 +8,13 @@
 
 package org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.rule;
 
+
+import java.util.List;
+
 import javax.annotation.concurrent.Immutable;
 
-import org.opendaylight.groupbasedpolicy.neutron.mapper.util.MappingUtils;
 import org.opendaylight.neutron.spi.NeutronSecurityRule;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.action.refs.ActionRef;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.classifier.refs.ClassifierRef;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.subject.Rule;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.subject.RuleBuilder;
@@ -26,16 +29,16 @@ public class SingleClassifierRule {
     private final ClassifierRef classifierRef;
     private final Rule rule;
 
-    public SingleClassifierRule(NeutronSecurityRule secRule, int ruleOrder) {
+    public SingleClassifierRule(NeutronSecurityRule secRule, int ruleOrder, List<ActionRef> actions) {
         classifierInstance = SecRuleEntityDecoder.getClassifierInstance(secRule);
         classifierRef = SecRuleEntityDecoder.getClassifierRef(secRule);
-        rule = createRule(ruleOrder, secRule);
+        rule = createRule(ruleOrder, secRule, actions);
     }
 
-    private Rule createRule(int order, NeutronSecurityRule secRule) {
+    private Rule createRule(int order, NeutronSecurityRule secRule, List<ActionRef> actions) {
         return new RuleBuilder().setName(SecRuleNameDecoder.getRuleName(secRule))
             .setOrder(order)
-            .setActionRef(MappingUtils.ACTION_REF_ALLOW)
+            .setActionRef(actions)
             .setClassifierRef(ImmutableList.of(classifierRef))
             .build();
     }
index 4cd013ad45fa665e10d82c2081f4c65868f5e8e9..d818764935420254a83c2533e88aa71d9df53f45 100644 (file)
@@ -10,11 +10,15 @@ package org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.rule;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
+import java.util.List;
+
 import javax.annotation.Nullable;
 import javax.annotation.concurrent.Immutable;
 
 import org.opendaylight.neutron.spi.NeutronSecurityRule;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Description;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.change.action.of.security.group.rules.input.action.ActionChoice;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.action.refs.ActionRef;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.Contract;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.ContractBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.Clause;
@@ -33,8 +37,8 @@ public class SingleRuleContract {
     private final Clause clause;
     private final Contract contract;
 
-    public SingleRuleContract(NeutronSecurityRule secRule, int subjectAndRuleOrder, @Nullable Description contractDescription) {
-        this(secRule, new SingleClassifierRule(secRule, subjectAndRuleOrder), subjectAndRuleOrder, contractDescription);
+    public SingleRuleContract(NeutronSecurityRule secRule, int subjectAndRuleOrder, @Nullable Description contractDescription, List<ActionRef> actions) {
+        this(secRule, new SingleClassifierRule(secRule, subjectAndRuleOrder, actions), subjectAndRuleOrder, contractDescription);
     }
 
     public SingleRuleContract(NeutronSecurityRule secRule, SingleClassifierRule singleClassifierRule,
index 8f3adafb2e8c6c4c85fc31e525cdb25d3cd9650a..d4e56fe4b9103e9a30ad5cc3c8e6d4a81b7c5bbf 100644 (file)
@@ -4,12 +4,11 @@ module neutron-gbp-mapper {
     namespace "urn:opendaylight:groupbasedpolicy:neutron-gbp-mapper";
     prefix "neutron-gbp-mapper";
 
-    import gbp-common {prefix gbp-common;}
-    import endpoint {prefix gbp-endpoint;}
-    import ietf-inet-types {
-        prefix inet;
-        revision-date 2010-09-24;
-    }
+     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 2010-09-24; }
+
 
     description 
         "This module defines the mapping model between Neutron entities and GBP entities.";
@@ -86,7 +85,32 @@ module neutron-gbp-mapper {
                 }
             }
         }
+    }
 
+    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 e78b9dcf1092ee3dcdb8f44b22376a8c0b14bf91..d883f46d8c7dc466ce35943fb8cd7891b77c6cfc 100644 (file)
@@ -6,6 +6,7 @@ import static org.junit.Assert.assertNotNull;
 import org.junit.Test;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.test.NeutronEntityFactory;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.test.PolicyAssert;
+import org.opendaylight.groupbasedpolicy.neutron.mapper.util.MappingUtils;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.NeutronUtils;
 import org.opendaylight.neutron.spi.NeutronSecurityRule;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.classifier.refs.ClassifierRef;
@@ -20,7 +21,7 @@ public class SingleClassifierRuleTest {
                 "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", NeutronUtils.IPv4,
                 NeutronUtils.INGRESS, NeutronUtils.TCP, 8010, 8020);
         final int ruleOrder = 1;
-        SingleClassifierRule singleClsfRule = new SingleClassifierRule(secRule, ruleOrder);
+        SingleClassifierRule singleClsfRule = new SingleClassifierRule(secRule, ruleOrder, MappingUtils.ACTION_REF_ALLOW);
 
         ClassifierInstance clsfInstance = singleClsfRule.getClassifierInstance();
         assertNotNull(clsfInstance);
index 4510c816cbd47e0c0e1554cdce82e55a84d9128a..dc97dd1c159d5c2ef68355dd561fc1595c7ad706 100644 (file)
@@ -6,6 +6,7 @@ import static org.junit.Assert.assertNotNull;
 import org.junit.Test;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.test.NeutronEntityFactory;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.test.PolicyAssert;
+import org.opendaylight.groupbasedpolicy.neutron.mapper.util.MappingUtils;
 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.NeutronUtils;
 import org.opendaylight.neutron.spi.NeutronSecurityRule;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Description;
@@ -25,7 +26,7 @@ public class SingleRuleContractTest {
                 NeutronUtils.INGRESS, NeutronUtils.TCP, 8010, 8020);
         int subjectAndRuleOrder = 1;
         SingleRuleContract singleRuleContract = new SingleRuleContract(secRule, subjectAndRuleOrder, new Description(
-                "contractDescription"));
+                "contractDescription"), MappingUtils.ACTION_REF_ALLOW);
 
         SingleClassifierRule singleClsfRule = singleRuleContract.getSingleClassifierRule();
         assertNotNull(singleClsfRule);