/* * 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.ExecutionException; 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.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.groupbasedpolicy.neutron.mapper.util.SecurityRuleUtils; 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.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.secgroups.rev150712.security.rules.attributes.security.rules.SecurityRule; import org.opendaylight.yangtools.yang.common.RpcError.ErrorType; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; 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.base.Optional; 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(); Optional<Neutron> potentialNeutron; try { potentialNeutron = rwTx.read(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(Neutron.class).build()).get(); } catch (InterruptedException | ExecutionException e) { LOG.error("Exception during neutron reading.", e); return Futures.immediateFuture(RpcResultBuilder.<Void>failed() .withError(ErrorType.PROTOCOL, "Cannot read from CONF DS.") .build()); } if (!potentialNeutron.isPresent()) { return Futures.immediateFuture(RpcResultBuilder.<Void>failed() .withError(ErrorType.PROTOCOL, "No neutron data in CONF DS.") .build()); } Neutron neutron = potentialNeutron.get(); for (SecurityGroupRule secGrpRule : securityGroupRules) { Uuid uuid = secGrpRule.getUuid(); Optional<SecurityRule> potentialSecRule = SecurityRuleUtils.findSecurityRule(uuid, neutron.getSecurityRules()); if (!potentialSecRule.isPresent()) { LOG.warn("Security rule {} does not exist.", uuid); continue; } LOG.trace("Changing action to {} in security group rule {}", input.getAction().getActionChoice(), uuid); boolean isSuccessful = secRuleAware.changeActionOfNeutronSecurityRule(potentialSecRule.get(), input.getAction().getActionChoice(), neutron, 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()); } }