Neutron-mapper uses only DTOs from neutron.yang
[groupbasedpolicy.git] / neutron-mapper / src / main / java / org / opendaylight / groupbasedpolicy / neutron / mapper / mapping / rule / NeutronGbpMapperServiceImpl.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.rule;
10
11 import static com.google.common.base.Preconditions.checkNotNull;
12
13 import java.util.List;
14 import java.util.concurrent.ExecutionException;
15 import java.util.concurrent.Future;
16
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;
34
35 import com.google.common.base.Optional;
36 import com.google.common.util.concurrent.Futures;
37
38 public class NeutronGbpMapperServiceImpl implements NeutronGbpMapperService {
39
40     private static final Logger LOG = LoggerFactory.getLogger(NeutronGbpMapperServiceImpl.class);
41     private NeutronSecurityRuleAware secRuleAware;
42     private DataBroker dataProvider;
43
44     public NeutronGbpMapperServiceImpl(DataBroker dataProvider, NeutronSecurityRuleAware secRuleAware) {
45         this.dataProvider = checkNotNull(dataProvider);
46         this.secRuleAware = checkNotNull(secRuleAware);
47     }
48
49     @Override
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.")
57                 .build());
58         }
59
60         ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
61         Optional<Neutron> potentialNeutron;
62         try {
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.")
68                     .build());
69         }
70         if (!potentialNeutron.isPresent()) {
71             return Futures.immediateFuture(RpcResultBuilder.<Void>failed()
72                     .withError(ErrorType.PROTOCOL, "No neutron data in CONF DS.")
73                     .build());
74         }
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);
81                 continue;
82             }
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);
86             if (!isSuccessful) {
87                 rwTx.cancel();
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.")
93                     .build());
94             }
95         }
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.")
103                 .build());
104         }
105         return Futures.immediateFuture(RpcResultBuilder.<Void>success().build());
106     }
107
108 }