2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.rule;
11 import static com.google.common.base.Preconditions.checkNotNull;
13 import java.util.List;
14 import java.util.concurrent.ExecutionException;
15 import java.util.concurrent.Future;
17 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
18 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
19 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
20 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.SecurityRuleUtils;
21 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.ChangeActionOfSecurityGroupRulesInput;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.NeutronGbpMapperService;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.change.action.of.security.group.rules.input.SecurityGroupRule;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.secgroups.rev150712.security.rules.attributes.security.rules.SecurityRule;
28 import org.opendaylight.yangtools.yang.common.RpcError.ErrorType;
29 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
30 import org.opendaylight.yangtools.yang.common.RpcResult;
31 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
35 import com.google.common.base.Optional;
36 import com.google.common.util.concurrent.Futures;
38 public class NeutronGbpMapperServiceImpl implements NeutronGbpMapperService {
40 private static final Logger LOG = LoggerFactory.getLogger(NeutronGbpMapperServiceImpl.class);
41 private NeutronSecurityRuleAware secRuleAware;
42 private DataBroker dataProvider;
44 public NeutronGbpMapperServiceImpl(DataBroker dataProvider, NeutronSecurityRuleAware secRuleAware) {
45 this.dataProvider = checkNotNull(dataProvider);
46 this.secRuleAware = checkNotNull(secRuleAware);
50 public Future<RpcResult<Void>> changeActionOfSecurityGroupRules(ChangeActionOfSecurityGroupRulesInput input) {
51 List<SecurityGroupRule> securityGroupRules = input.getSecurityGroupRule();
52 if (securityGroupRules == null || input.getAction() == null) {
53 LOG.debug("Missing params in request:\n{}", input);
54 return Futures.immediateFuture(RpcResultBuilder.<Void>failed()
55 .withError(ErrorType.PROTOCOL, "Missing params. Changing to action "
56 + input.getAction().getActionChoice() + " was not successful.")
60 ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
61 Optional<Neutron> potentialNeutron;
63 potentialNeutron = rwTx.read(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(Neutron.class).build()).get();
64 } catch (InterruptedException | ExecutionException e) {
65 LOG.error("Exception during neutron reading.", e);
66 return Futures.immediateFuture(RpcResultBuilder.<Void>failed()
67 .withError(ErrorType.PROTOCOL, "Cannot read from CONF DS.")
70 if (!potentialNeutron.isPresent()) {
71 return Futures.immediateFuture(RpcResultBuilder.<Void>failed()
72 .withError(ErrorType.PROTOCOL, "No neutron data in CONF DS.")
75 Neutron neutron = potentialNeutron.get();
76 for (SecurityGroupRule secGrpRule : securityGroupRules) {
77 Uuid uuid = secGrpRule.getUuid();
78 Optional<SecurityRule> potentialSecRule = SecurityRuleUtils.findSecurityRule(uuid, neutron.getSecurityRules());
79 if (!potentialSecRule.isPresent()) {
80 LOG.warn("Security rule {} does not exist.", uuid);
83 LOG.trace("Changing action to {} in security group rule {}", input.getAction().getActionChoice(), uuid);
84 boolean isSuccessful =
85 secRuleAware.changeActionOfNeutronSecurityRule(potentialSecRule.get(), input.getAction().getActionChoice(), neutron, rwTx);
88 LOG.warn("Changing action to {} in security group rule {} was not successful.",
89 input.getAction().getActionChoice(), uuid);
90 return Futures.immediateFuture(RpcResultBuilder.<Void>failed()
91 .withError(ErrorType.APPLICATION,
92 "Changing to action " + input.getAction().getActionChoice() + " was not successful.")
96 boolean isSubmittedToDs = DataStoreHelper.submitToDs(rwTx);
97 if (!isSubmittedToDs) {
98 LOG.warn("Changing action to {} in security group rules {} was not successful.",
99 input.getAction().getActionChoice(), input.getSecurityGroupRule());
100 return Futures.immediateFuture(RpcResultBuilder.<Void>failed()
101 .withError(ErrorType.APPLICATION, "Storing to datastore was not successful. Changing to action "
102 + input.getAction().getActionChoice() + " was not successful.")
105 return Futures.immediateFuture(RpcResultBuilder.<Void>success().build());