com.eucalyptus.cloudformation.StackAdminUtils.java Source code

Java tutorial

Introduction

Here is the source code for com.eucalyptus.cloudformation.StackAdminUtils.java

Source

/*************************************************************************
 * (c) Copyright 2017 Hewlett Packard Enterprise Development Company LP
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 3 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see http://www.gnu.org/licenses/.
 ************************************************************************/
package com.eucalyptus.cloudformation;

import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow;
import com.amazonaws.services.simpleworkflow.model.RequestCancelWorkflowExecutionRequest;
import com.amazonaws.services.simpleworkflow.model.UnknownResourceException;
import com.eucalyptus.auth.AuthException;
import com.eucalyptus.cloudformation.bootstrap.CloudFormationAWSCredentialsProvider;
import com.eucalyptus.cloudformation.entity.SignalEntityManager;
import com.eucalyptus.cloudformation.entity.StackEntity;
import com.eucalyptus.cloudformation.entity.StackEntityManager;
import com.eucalyptus.cloudformation.entity.StackEventEntityManager;
import com.eucalyptus.cloudformation.entity.StackEventHelper;
import com.eucalyptus.cloudformation.entity.StackResourceEntity;
import com.eucalyptus.cloudformation.entity.StackResourceEntityManager;
import com.eucalyptus.cloudformation.entity.StackUpdateInfoEntityManager;
import com.eucalyptus.cloudformation.entity.StackWorkflowEntity;
import com.eucalyptus.cloudformation.entity.StackWorkflowEntityManager;
import com.eucalyptus.cloudformation.entity.StacksWithNoUpdateToPerformEntityManager;
import com.eucalyptus.cloudformation.entity.Status;
import com.eucalyptus.cloudformation.workflow.WorkflowClientManager;
import com.eucalyptus.simpleworkflow.common.client.Config;
import org.apache.log4j.Logger;

/**
 * Created by ethomas on 4/21/17.
 */
public class StackAdminUtils {

    private final static Logger LOG = Logger.getLogger(StackAdminUtils.class);

    public static void removeStack(String stackId) throws CloudFormationException, AuthException {
        StackEntity stackEntity = StackEntityManager.getNonDeletedStackById(stackId);
        if (stackEntity == null) {
            throw new ValidationErrorException("Can not find undeleted stack " + stackId);
        }
        String stackAccountId = stackEntity.getAccountId();
        cancelWorkflows(stackId);
        StackWorkflowEntityManager.deleteStackWorkflowEntities(stackId);
        StackUpdateInfoEntityManager.deleteStackUpdateInfo(stackId, stackAccountId);
        // increase stack version to consolidate stack
        StackResourceEntityManager.flattenResources(stackId, stackAccountId, stackEntity.getStackVersion());
        StackEntityManager.reallyDeleteAllStackVersionsExcept(stackId, stackAccountId,
                stackEntity.getStackVersion());
        for (StackResourceEntity stackResourceEntity : StackResourceEntityManager
                .describeStackResources(stackAccountId, stackId)) {
            if (stackResourceEntity.getResourceStatus() != Status.DELETE_COMPLETE
                    && stackResourceEntity.getResourceStatus() != Status.DELETE_SKIPPED) {
                stackResourceEntity.setResourceStatus(Status.DELETE_SKIPPED);
                stackResourceEntity.setResourceStatusReason("Forced delete immediately, skipping resources");
                StackResourceEntityManager.updateStackResource(stackResourceEntity);
                StackEventEntityManager.addStackEvent(stackResourceEntity);
            }
        }
        StackEventHelper.createGlobalStackEvent(stackId, stackAccountId, Status.DELETE_COMPLETE.toString(),
                "Forced delete immediately", stackEntity.getStackVersion());
        StackResourceEntityManager.deleteStackResources(stackId, stackAccountId);
        StackEventEntityManager.deleteStackEvents(stackId, stackAccountId);
        StackEntityManager.deleteStack(stackId, stackAccountId);
        StackWorkflowEntityManager.deleteStackWorkflowEntities(stackId);
        StackUpdateInfoEntityManager.deleteStackUpdateInfo(stackId, stackAccountId);
        StacksWithNoUpdateToPerformEntityManager.deleteStackWithNoUpdateToPerform(stackId, stackAccountId);
        SignalEntityManager.deleteSignals(stackId, stackAccountId);
    }

    public static void cancelWorkflows(String stackId) throws CloudFormationException, AuthException {
        StackEntity stackEntity = StackEntityManager.getNonDeletedStackById(stackId);
        if (stackEntity == null) {
            throw new ValidationErrorException("Can not find undeleted stack " + stackId);
        }
        String stackAccountId = stackEntity.getAccountId();
        AmazonSimpleWorkflow simpleWorkflowClient = Config
                .buildClient(CloudFormationAWSCredentialsProvider.CloudFormationUserSupplier.INSTANCE);
        try {
            // first cancel all outstanding workflows
            for (StackWorkflowEntity stackWorkflowEntity : StackWorkflowEntityManager
                    .getStackWorkflowEntities(stackId)) {
                try {
                    RequestCancelWorkflowExecutionRequest requestCancelWorkflowExecutionRequest = new RequestCancelWorkflowExecutionRequest();
                    requestCancelWorkflowExecutionRequest.setWorkflowId(stackWorkflowEntity.getWorkflowId());
                    requestCancelWorkflowExecutionRequest.setRunId(stackWorkflowEntity.getRunId());
                    requestCancelWorkflowExecutionRequest.setDomain(stackWorkflowEntity.getDomain());
                    simpleWorkflowClient.requestCancelWorkflowExecution(requestCancelWorkflowExecutionRequest);
                } catch (UnknownResourceException ex) {
                    ; // don't bother
                }
            }
        } finally {
            simpleWorkflowClient.shutdown();
        }
    }
}