/*- * ============LICENSE_START======================================================= * ONAP : APP-C * ================================================================================ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= */ package org.onap.appc.seqgen.impl; import org.apache.commons.lang3.StringUtils; import org.onap.appc.dg.flowbuilder.FlowBuilder; import org.onap.appc.dg.flowbuilder.impl.FlowBuilderFactory; import org.onap.appc.dg.objects.FlowStrategies; import org.onap.appc.dg.objects.InventoryModel; import org.onap.appc.dg.objects.VnfcDependencyModel; import org.onap.appc.dg.objects.VnfcFlowModel; import org.onap.appc.domainmodel.Vnfc; import org.onap.appc.domainmodel.Vserver; import org.onap.appc.exceptions.APPCException; import org.onap.appc.seqgen.SequenceGenerator; import org.onap.appc.seqgen.objects.*; import com.att.eelf.configuration.EELFLogger; import com.att.eelf.configuration.EELFManager; import java.util.*; import static org.onap.appc.seqgen.objects.Constants.*; public class StopSequenceGenerator implements SequenceGenerator { private static final EELFLogger logger = EELFManager.getInstance().getLogger(StartSequenceGenerator.class); @Override public List generateSequence(SequenceGeneratorInput input) throws APPCException { if(input.getRequestInfo().getActionLevel().equals(ActionLevel.VM.getAction())||input.getRequestInfo().getActionLevel().equals(ActionLevel.VNFC.getAction())|| input.getRequestInfo().getActionLevel().equals(ActionLevel.VNF.getAction())||input.getRequestInfo().getActionLevel().equals(ActionLevel.VF_MODULE.getAction())) { if (input.getRequestInfo().getActionLevel().equals(ActionLevel.VNF.getAction()) && input.getDependencyModel() != null) { FlowStrategies flowStrategy = readStopFlowStrategy(input); VnfcFlowModel flowModel = buildFlowModel(input.getInventoryModel() , input.getDependencyModel(), flowStrategy); logger.debug("Flow Model " + flowModel); return generateSequenceWithDependencyModel(flowModel, input); } else { logger.info("Generating sequence without dependency model"); return generateSequenceWithOutDependency(input); } }throw new APPCException("Invalid action level "+input.getRequestInfo().getActionLevel()); } private List generateSequenceWithOutDependency(SequenceGeneratorInput input){ List transactionList = new LinkedList<>(); Integer transactionId = 1; List transactionIds = new LinkedList<>(); List invVnfcList = input.getInventoryModel().getVnf().getVnfcs(); boolean singleTransaction=checkSingleTransaction(invVnfcList); for (Vnfc vnfc : invVnfcList) { List vms = vnfc.getVserverList(); for(Vserver vm:vms){ Transaction transaction = new Transaction(); transaction.setTransactionId(transactionId); transactionIds.add(transactionId++); transaction.setAction(Action.STOP.getActionType()); transaction.setActionLevel(ActionLevel.VM.getAction()); ActionIdentifier actionIdentifier = new ActionIdentifier(); actionIdentifier.setvServerId(vm.getId()); transaction.setActionIdentifier(actionIdentifier); transaction.setPayload(input.getRequestInfo().getPayload()); if(!singleTransaction){ updateStopResponse(transaction); } transactionList.add(transaction); } } return transactionList; } private void updateStopResponse(Transaction transaction) { Response failureResponse = new Response(); failureResponse.setResponseMessage(ResponseMessage.FAILURE.getResponse()); Map failureAction = new HashMap<>(); failureAction.put(ResponseAction.IGNORE.getAction(),Boolean.TRUE.toString()); failureResponse.setResponseAction(failureAction); transaction.addResponse(failureResponse); } private boolean checkSingleTransaction(List invVnfcList) { int vServerCount=0; for(Vnfc vnfc : invVnfcList) { List vms = vnfc.getVserverList(); vServerCount=vServerCount+vms.size(); } return vServerCount <= 1; } private List generateSequenceWithDependencyModel(VnfcFlowModel flowModel,SequenceGeneratorInput input){ List transactionList = new LinkedList<>(); Integer transactionId = 1; List transactionIds = new LinkedList<>(); Iterator> itr = flowModel.getModelIterator(); while (itr.hasNext()){ List vnfcs = itr.next(); for(Vnfc vnfc:vnfcs){ boolean stopApplicationSupported = readApplicationStopCapability(input); if(stopApplicationSupported && !vnfc.getVserverList().isEmpty()){ Transaction stopAppTransaction = new Transaction(); stopAppTransaction.setTransactionId(transactionId++); stopAppTransaction.setAction(Action.STOP_APPLICATION.getActionType()); stopAppTransaction.setActionLevel(ActionLevel.VNFC.getAction()); ActionIdentifier stopActionIdentifier = new ActionIdentifier(); stopActionIdentifier .setVnfcName(vnfc.getVnfcName()); stopAppTransaction.setActionIdentifier(stopActionIdentifier ); stopAppTransaction.setPayload(input.getRequestInfo().getPayload()); updateStopResponse(stopAppTransaction); transactionList.add(stopAppTransaction); } List vms = vnfc.getVserverList(); for(Vserver vm:vms){ Transaction transaction = new Transaction(); transaction.setTransactionId(transactionId); transactionIds.add(transactionId++); transaction.setAction(Action.STOP.getActionType()); transaction.setActionLevel(ActionLevel.VM.getAction()); ActionIdentifier actionIdentifier = new ActionIdentifier(); actionIdentifier.setvServerId(vm.getId()); transaction.setActionIdentifier(actionIdentifier); transaction.setPayload(input.getRequestInfo().getPayload()); updateStopResponse(transaction); transactionList.add(transaction); } } } return transactionList; } private VnfcFlowModel buildFlowModel(InventoryModel inventoryModel, VnfcDependencyModel dependencyModel, FlowStrategies flowStrategy) throws APPCException { FlowBuilder flowBuilder = FlowBuilderFactory.getInstance().getFlowBuilder(flowStrategy); if (flowBuilder == null) { throw new APPCException("Flow Strategy not supported " + flowStrategy); } return flowBuilder.buildFlowModel(dependencyModel, inventoryModel); } private FlowStrategies readStopFlowStrategy(SequenceGeneratorInput sequenceGeneratorInput) throws APPCException { Map tunableParams = sequenceGeneratorInput.getTunableParams(); FlowStrategies strategy; String strategyStr = null; if (tunableParams != null) { strategyStr = tunableParams.get(Constants.STRATEGY); if (StringUtils.isBlank(strategyStr)) { return FlowStrategies.REVERSE; } strategy = FlowStrategies.findByString(strategyStr); if (strategy != null) { return strategy; } } throw new APPCException("Invalid Strategy " + strategyStr); } private boolean readApplicationStopCapability(SequenceGeneratorInput input) { Map> capability = input.getCapability(); if(capability!= null){ List vnfcCapabilities = capability.get(Constants.CapabilityLevel.VNFC.getLevel()); if(vnfcCapabilities!=null) return vnfcCapabilities.stream().anyMatch(p -> Capabilties.STOP_APPLICATION.getCapability().equalsIgnoreCase(p)); } return false; } }