io.cloudslang.content.amazon.factory.helpers.InstanceUtils.java Source code

Java tutorial

Introduction

Here is the source code for io.cloudslang.content.amazon.factory.helpers.InstanceUtils.java

Source

/*
 * (c) Copyright 2017 EntIT Software LLC, a Micro Focus company, L.P.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Apache License v2.0 which accompany this distribution.
 *
 * The Apache License is available 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.
 */

package io.cloudslang.content.amazon.factory.helpers;

import io.cloudslang.content.amazon.entities.aws.Affinity;
import io.cloudslang.content.amazon.entities.aws.Architecture;
import io.cloudslang.content.amazon.entities.aws.BlockDeviceMappingStatus;
import io.cloudslang.content.amazon.entities.aws.BlockRootDeviceType;
import io.cloudslang.content.amazon.entities.aws.Hypervisor;
import io.cloudslang.content.amazon.entities.aws.InstanceLifecycle;
import io.cloudslang.content.amazon.entities.aws.InstanceFilter;
import io.cloudslang.content.amazon.entities.aws.InstanceInitiatedShutdownBehavior;
import io.cloudslang.content.amazon.entities.aws.InstanceState;
import io.cloudslang.content.amazon.entities.aws.InstanceType;
import io.cloudslang.content.amazon.entities.aws.MonitoringState;
import io.cloudslang.content.amazon.entities.aws.NetworkInterfaceAttachmentStatus;
import io.cloudslang.content.amazon.entities.aws.NetworkInterfaceStatus;
import io.cloudslang.content.amazon.entities.aws.ProductCodeType;
import io.cloudslang.content.amazon.entities.aws.Tenancy;
import io.cloudslang.content.amazon.entities.aws.VolumeType;
import io.cloudslang.content.amazon.entities.aws.VirtualizationType;

import io.cloudslang.content.amazon.entities.inputs.InputsWrapper;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.LinkedHashMap;

import static io.cloudslang.content.amazon.utils.InputsUtil.getArrayWithoutDuplicateEntries;
import static io.cloudslang.content.amazon.utils.InputsUtil.getEnforcedBooleanCondition;
import static io.cloudslang.content.amazon.utils.InputsUtil.getQueryParamsSpecificString;
import static io.cloudslang.content.amazon.utils.InputsUtil.getStringsArray;
import static io.cloudslang.content.amazon.utils.InputsUtil.getValidEbsSize;
import static io.cloudslang.content.amazon.utils.InputsUtil.setCommonQueryParamsMap;
import static io.cloudslang.content.amazon.utils.InputsUtil.setOptionalMapEntry;
import static io.cloudslang.content.amazon.utils.InputsUtil.validateAgainstDifferentArraysLength;

import static org.apache.commons.lang3.StringUtils.isBlank;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
import static org.apache.commons.lang3.ArrayUtils.isNotEmpty;
import static java.lang.String.valueOf;

import static io.cloudslang.content.amazon.entities.constants.Constants.AwsParams.BLOCK_DEVICE_MAPPING;
import static io.cloudslang.content.amazon.entities.constants.Constants.AwsParams.DELETE_ON_TERMINATION;
import static io.cloudslang.content.amazon.entities.constants.Constants.AwsParams.ENCRYPTED;
import static io.cloudslang.content.amazon.entities.constants.Constants.AwsParams.FORCE;
import static io.cloudslang.content.amazon.entities.constants.Constants.AwsParams.FILTER;
import static io.cloudslang.content.amazon.entities.constants.Constants.AwsParams.IMAGE_ID;
import static io.cloudslang.content.amazon.entities.constants.Constants.AwsParams.INSTANCE_ID;
import static io.cloudslang.content.amazon.entities.constants.Constants.AwsParams.IOPS;
import static io.cloudslang.content.amazon.entities.constants.Constants.AwsParams.NAME;
import static io.cloudslang.content.amazon.entities.constants.Constants.AwsParams.NETWORK_INTERFACE;
import static io.cloudslang.content.amazon.entities.constants.Constants.AwsParams.SECURITY_GROUP;
import static io.cloudslang.content.amazon.entities.constants.Constants.AwsParams.SECURITY_GROUP_ID;
import static io.cloudslang.content.amazon.entities.constants.Constants.AwsParams.SNAPSHOT_ID;
import static io.cloudslang.content.amazon.entities.constants.Constants.AwsParams.STANDARD;
import static io.cloudslang.content.amazon.entities.constants.Constants.AwsParams.SUBNET_ID;
import static io.cloudslang.content.amazon.entities.constants.Constants.AwsParams.VALUE;
import static io.cloudslang.content.amazon.entities.constants.Constants.AwsParams.VOLUME_ID;
import static io.cloudslang.content.amazon.entities.constants.Constants.AwsParams.VOLUME_TYPE;
import static io.cloudslang.content.amazon.entities.constants.Constants.Miscellaneous.EBS;
import static io.cloudslang.content.amazon.entities.constants.Constants.Miscellaneous.DOT;
import static io.cloudslang.content.amazon.entities.constants.Constants.Miscellaneous.EMPTY;
import static io.cloudslang.content.amazon.entities.constants.Constants.Miscellaneous.NOT_RELEVANT;
import static io.cloudslang.content.amazon.entities.constants.Constants.Miscellaneous.PIPE_DELIMITER;
import static io.cloudslang.content.amazon.entities.constants.Constants.Values.START_INDEX;
import static io.cloudslang.content.amazon.entities.constants.Constants.Values.ONE;
import static io.cloudslang.content.amazon.entities.constants.Inputs.EbsInputs.BLOCK_DEVICE_MAPPING_DEVICE_NAMES_STRING;
import static io.cloudslang.content.amazon.entities.constants.Inputs.EbsInputs.BLOCK_DEVICE_MAPPING_VIRTUAL_NAMES_STRING;
import static io.cloudslang.content.amazon.entities.constants.Inputs.EbsInputs.DELETE_ON_TERMINATIONS_STRING;
import static io.cloudslang.content.amazon.entities.constants.Inputs.EbsInputs.ENCRYPTED_STRING;
import static io.cloudslang.content.amazon.entities.constants.Inputs.EbsInputs.IOPS_STRING;
import static io.cloudslang.content.amazon.entities.constants.Inputs.EbsInputs.NO_DEVICES_STRING;
import static io.cloudslang.content.amazon.entities.constants.Inputs.EbsInputs.SNAPSHOT_IDS_STRING;
import static io.cloudslang.content.amazon.entities.constants.Inputs.EbsInputs.VOLUME_IDS_STRING;
import static io.cloudslang.content.amazon.entities.constants.Inputs.EbsInputs.VOLUME_SIZES_STRING;
import static io.cloudslang.content.amazon.entities.constants.Inputs.EbsInputs.VOLUME_TYPES_STRING;
import static io.cloudslang.content.amazon.entities.constants.Inputs.InstanceInputs.FILTER_NAMES_STRING;
import static io.cloudslang.content.amazon.entities.constants.Inputs.InstanceInputs.FILTER_VALUES_STRING;
import static io.cloudslang.content.amazon.entities.constants.Inputs.InstanceInputs.INSTANCE_IDS_STRING;
import static io.cloudslang.content.amazon.entities.constants.Inputs.InstanceInputs.LOWER_CASE_DISABLE_API_TERMINATION;
import static io.cloudslang.content.amazon.entities.constants.Inputs.InstanceInputs.LOWER_CASE_INSTANCE_INITIATED_SHUTDOWN_BEHAVIOR;
import static io.cloudslang.content.amazon.entities.constants.Inputs.InstanceInputs.LOWER_CASE_KERNEL;
import static io.cloudslang.content.amazon.entities.constants.Inputs.InstanceInputs.LOWER_CASE_RAMDISK;
import static io.cloudslang.content.amazon.entities.constants.Inputs.InstanceInputs.LOWER_CASE_USER_DATA;

/**
 * Created by Mihai Tusa.
 * 9/15/2016.
 */
public class InstanceUtils {
    private static final String AFFINITY_FILTER = "affinity";
    private static final String ARCHITECTURE_FILTER = "architecture";
    private static final String ATTRIBUTE = "Attribute";
    private static final String CLIENT_TOKEN = "ClientToken";
    private static final String BLOCK_DEVICE_MAPPING_DEVICE_NAME = "DeviceName";
    private static final String BLOCK_DEVICE_MAPPING_STATUS_FILTER = "block-device-mapping.status";
    private static final String DISABLE_API_TERMINATION = "DisableApiTermination";
    private static final String EBS_OPTIMIZED = "EbsOptimized";
    private static final String ENA_SUPPORT = "EnaSupport";
    private static final String GROUP_ID = "GroupId";
    private static final String HYPERVISOR_FILTER = "hypervisor";
    private static final String IAM_INSTANCE_PROFILE_ARN = "IamInstanceProfile.Arn";
    private static final String IAM_INSTANCE_PROFILE_NAME = "IamInstanceProfile.Name";
    private static final String INSTANCE_INITIATED_SHUTDOWN_BEHAVIOR = "InstanceInitiatedShutdownBehavior";
    private static final String INSTANCE_LIFECYCLE_FILTER = "instance-lifecycle";
    private static final String INSTANCE_STATE_CODE_FILTER = "instance-state-code";
    private static final String INSTANCE_STATE_NAME_FILTER = "instance-state-name";
    private static final String INSTANCE_TYPE = "InstanceType";
    private static final String INSTANCE_TYPE_FILTER = "instance-type";
    private static final String KERNEL = "Kernel";
    private static final String KERNEL_ID = "KernelId";
    private static final String KEY_NAME = "KeyName";
    private static final String MAX_COUNT = "MaxCount";
    private static final String MAX_RESULTS = "MaxResults";
    private static final String MIN_COUNT = "MinCount";
    private static final String MONITORING_ENABLED = "Monitoring.Enabled";
    private static final String MONITORING_STATE_FILTER = "monitoring-state";
    private static final String NEXT_TOKEN = "NextToken";
    private static final String NETWORK_INTERFACE_ATTACHMENT_STATUS_FILTER = "network-interface.attachment.status";
    private static final String NETWORK_INTERFACE_STATUS_FILTER = "network-interface.status";
    private static final String NO_DEVICE = "NoDevice";
    private static final String NOT_RELEVANT_KEY_STRING = "-1";
    private static final String PLACEMENT_AFFINITY = "Placement.Affinity";
    private static final String PLACEMENT_AVAILABILITY_ZONE = "Placement.AvailabilityZone";
    private static final String PLACEMENT_GROUP_NAME = "Placement.GroupName";
    private static final String PLACEMENT_HOST_ID = "Placement.HostId";
    private static final String PLACEMENT_TENANCY = "Placement.Tenancy";
    private static final String PRODUCT_CODE_TYPE_FILTER = "product-code.type";
    private static final String RAMDISK = "Ramdisk";
    private static final String RAMDISK_ID = "RamdiskId";
    private static final String ROOT_DEVIOCE_TYPE_FILTER = "root-device-type";
    private static final String SOURCE_DEST_CHECK = "SourceDestCheck";
    private static final String SRIOV_NET_SUPPORT = "SriovNetSupport";
    private static final String TENANCY_FILTER = "tenancy";
    private static final String USER_DATA = "UserData";
    private static final String VOLUME_SIZE = "VolumeSize";
    private static final String VIRTUAL_NAME = "VirtualName";
    private static final String VIRTUALIZATION_TYPE_FILTER = "virtualization-type";

    public Map<String, String> getDescribeInstancesQueryParamsMap(InputsWrapper wrapper) {
        Map<String, String> queryParamsMap = new LinkedHashMap<>();
        setCommonQueryParamsMap(queryParamsMap, wrapper.getCommonInputs().getAction(),
                wrapper.getCommonInputs().getVersion());
        setInstanceIdsQueryParams(wrapper, queryParamsMap);
        setOptionalMapEntry(queryParamsMap, MAX_RESULTS, wrapper.getInstanceInputs().getMaxResults(),
                !NOT_RELEVANT.equalsIgnoreCase(wrapper.getInstanceInputs().getMaxResults()));
        setOptionalMapEntry(queryParamsMap, NEXT_TOKEN, wrapper.getInstanceInputs().getNextToken(),
                isNotBlank(wrapper.getInstanceInputs().getNextToken()));
        setDescribeInstancesQueryParamsFilter(queryParamsMap, wrapper);

        return queryParamsMap;
    }

    public Map<String, String> getModifyInstanceAttributeQueryParamsMap(InputsWrapper wrapper) {
        Map<String, String> queryParamsMap = new HashMap<>();
        setCommonQueryParamsMap(queryParamsMap, wrapper.getCommonInputs().getAction(),
                wrapper.getCommonInputs().getVersion());
        queryParamsMap.put(INSTANCE_ID, wrapper.getCustomInputs().getInstanceId());
        setAttribute(queryParamsMap, wrapper.getInstanceInputs().getAttribute());
        new CommonUtils().setPrefixedAndSuffixedCommonQueryParams(queryParamsMap,
                wrapper.getIamInputs().getSecurityGroupIdsString(), GROUP_ID, EMPTY,
                wrapper.getCommonInputs().getDelimiter());
        setModifyInstanceAttributeEbsSpecs(queryParamsMap, wrapper);
        setOptionalMapEntry(queryParamsMap, VALUE, wrapper.getInstanceInputs().getAttributeValue(),
                isNotBlank(wrapper.getInstanceInputs().getAttributeValue()));
        setOptionalMapEntry(queryParamsMap, DISABLE_API_TERMINATION + DOT + VALUE,
                valueOf(wrapper.getInstanceInputs().isDisableApiTermination()),
                wrapper.getInstanceInputs().isDisableApiTermination());
        setOptionalMapEntry(queryParamsMap, EBS_OPTIMIZED + DOT + VALUE,
                valueOf(wrapper.getEbsInputs().isEbsOptimized()), wrapper.getEbsInputs().isEbsOptimized());
        setOptionalMapEntry(queryParamsMap, ENA_SUPPORT + DOT + VALUE,
                valueOf(wrapper.getInstanceInputs().isEnaSupport()), wrapper.getInstanceInputs().isEnaSupport());
        setOptionalMapEntry(queryParamsMap, INSTANCE_INITIATED_SHUTDOWN_BEHAVIOR + DOT + VALUE,
                wrapper.getInstanceInputs().getInstanceInitiatedShutdownBehavior(),
                (isNotBlank(wrapper.getInstanceInputs().getInstanceInitiatedShutdownBehavior())) && !NOT_RELEVANT
                        .equalsIgnoreCase(wrapper.getInstanceInputs().getInstanceInitiatedShutdownBehavior()));
        setOptionalMapEntry(queryParamsMap, INSTANCE_TYPE + DOT + VALUE,
                wrapper.getCustomInputs().getInstanceType(),
                (isNotBlank(wrapper.getCustomInputs().getInstanceType())
                        && !NOT_RELEVANT.equalsIgnoreCase(wrapper.getCustomInputs().getInstanceType())));
        setOptionalMapEntry(queryParamsMap, KERNEL + DOT + VALUE, wrapper.getInstanceInputs().getKernel(),
                isNotBlank(wrapper.getInstanceInputs().getKernel()));
        setOptionalMapEntry(queryParamsMap, RAMDISK + DOT + VALUE, wrapper.getInstanceInputs().getRamdisk(),
                isNotBlank(wrapper.getInstanceInputs().getRamdisk()));
        setOptionalMapEntry(queryParamsMap, SOURCE_DEST_CHECK + DOT + VALUE,
                wrapper.getInstanceInputs().getSourceDestinationCheck(),
                (isNotBlank(wrapper.getInstanceInputs().getSourceDestinationCheck()) && !NOT_RELEVANT
                        .equalsIgnoreCase(wrapper.getInstanceInputs().getSourceDestinationCheck())));
        setOptionalMapEntry(queryParamsMap, SRIOV_NET_SUPPORT + DOT + VALUE,
                wrapper.getInstanceInputs().getSriovNetSupport(),
                isNotBlank(wrapper.getInstanceInputs().getSriovNetSupport()));
        setOptionalMapEntry(queryParamsMap, USER_DATA + DOT + VALUE, wrapper.getInstanceInputs().getUserData(),
                isNotBlank(wrapper.getInstanceInputs().getUserData()));

        return queryParamsMap;
    }

    public Map<String, String> getRebootInstancesQueryParamsMap(InputsWrapper wrapper) {
        return getRebootStartStopTerminateCommonQueryParamsMap(wrapper);
    }

    public Map<String, String> getRunInstancesQueryParamsMap(InputsWrapper wrapper) throws Exception {
        Map<String, String> queryParamsMap = new HashMap<>();
        setCommonQueryParamsMap(queryParamsMap, wrapper.getCommonInputs().getAction(),
                wrapper.getCommonInputs().getVersion());
        queryParamsMap.put(DISABLE_API_TERMINATION, valueOf(wrapper.getInstanceInputs().isDisableApiTermination()));
        queryParamsMap.put(EBS_OPTIMIZED, valueOf(wrapper.getEbsInputs().isEbsOptimized()));
        queryParamsMap.put(IMAGE_ID, wrapper.getCustomInputs().getImageId());
        queryParamsMap.put(MAX_COUNT, valueOf(wrapper.getInstanceInputs().getMaxCount()));
        queryParamsMap.put(MIN_COUNT, valueOf(wrapper.getInstanceInputs().getMinCount()));
        queryParamsMap.put(MONITORING_ENABLED, valueOf(wrapper.getInstanceInputs().isMonitoring()));

        String instanceType = NOT_RELEVANT.equalsIgnoreCase(wrapper.getCustomInputs().getInstanceType())
                ? InstanceType.M1_SMALL.name().toLowerCase()
                : InstanceType.getInstanceType(wrapper.getCustomInputs().getInstanceType());
        queryParamsMap.put(INSTANCE_TYPE, instanceType);
        String iisbvalue = NOT_RELEVANT
                .equalsIgnoreCase(wrapper.getInstanceInputs().getInstanceInitiatedShutdownBehavior())
                        ? InstanceInitiatedShutdownBehavior.STOP.name().toLowerCase()
                        : InstanceInitiatedShutdownBehavior
                                .getValue(wrapper.getInstanceInputs().getInstanceInitiatedShutdownBehavior());
        queryParamsMap.put(INSTANCE_INITIATED_SHUTDOWN_BEHAVIOR, iisbvalue);

        setOptionalMapEntry(queryParamsMap, CLIENT_TOKEN, wrapper.getInstanceInputs().getClientToken(),
                isNotBlank(wrapper.getInstanceInputs().getClientToken()));
        setOptionalMapEntry(queryParamsMap, IAM_INSTANCE_PROFILE_ARN,
                wrapper.getIamInputs().getIamInstanceProfileArn(),
                isNotBlank(wrapper.getIamInputs().getIamInstanceProfileArn()));
        setOptionalMapEntry(queryParamsMap, IAM_INSTANCE_PROFILE_NAME,
                wrapper.getIamInputs().getIamInstanceProfileName(),
                isNotBlank(wrapper.getIamInputs().getIamInstanceProfileName()));
        setOptionalMapEntry(queryParamsMap, KERNEL_ID, wrapper.getCustomInputs().getKernelId(),
                isNotBlank(wrapper.getCustomInputs().getKernelId()));
        setOptionalMapEntry(queryParamsMap, KEY_NAME, wrapper.getIamInputs().getKeyPairName(),
                isNotBlank(wrapper.getIamInputs().getKeyPairName()));
        setOptionalMapEntry(queryParamsMap, PLACEMENT_AFFINITY, wrapper.getInstanceInputs().getAffinity(),
                isNotBlank(wrapper.getInstanceInputs().getAffinity()));
        setOptionalMapEntry(queryParamsMap, PLACEMENT_AVAILABILITY_ZONE,
                wrapper.getCustomInputs().getAvailabilityZone(),
                isNotBlank(wrapper.getCustomInputs().getAvailabilityZone()));
        setOptionalMapEntry(queryParamsMap, PLACEMENT_GROUP_NAME,
                wrapper.getInstanceInputs().getPlacementGroupName(),
                isNotBlank(wrapper.getInstanceInputs().getPlacementGroupName()));
        setOptionalMapEntry(queryParamsMap, PLACEMENT_HOST_ID, wrapper.getCustomInputs().getHostId(),
                isNotBlank(wrapper.getCustomInputs().getHostId()));
        setOptionalMapEntry(queryParamsMap, PLACEMENT_TENANCY, wrapper.getInstanceInputs().getTenancy(),
                !NOT_RELEVANT.equalsIgnoreCase(wrapper.getInstanceInputs().getTenancy()));
        setOptionalMapEntry(queryParamsMap, RAMDISK_ID, wrapper.getCustomInputs().getRamdiskId(),
                isNotBlank(wrapper.getCustomInputs().getRamdiskId()));
        setOptionalMapEntry(queryParamsMap, USER_DATA, wrapper.getInstanceInputs().getUserData(),
                isNotBlank(wrapper.getInstanceInputs().getUserData()));

        setBlockDeviceMappingQueryParams(queryParamsMap, wrapper);
        new NetworkUtils().setNetworkInterfaceQueryParams(queryParamsMap, wrapper);

        if (!queryParamsMap.keySet().toString().contains(NETWORK_INTERFACE)) {
            setOptionalMapEntry(queryParamsMap, SUBNET_ID, wrapper.getCustomInputs().getSubnetId(),
                    isNotBlank(wrapper.getCustomInputs().getSubnetId()));
            setSecurityGroupQueryParams(queryParamsMap, wrapper);
        }

        return queryParamsMap;
    }

    public Map<String, String> getStartInstancesQueryParamsMap(InputsWrapper wrapper) {
        return getRebootStartStopTerminateCommonQueryParamsMap(wrapper);
    }

    public Map<String, String> getStopInstancesQueryParamsMap(InputsWrapper wrapper) {
        Map<String, String> queryParamsMap = getRebootStartStopTerminateCommonQueryParamsMap(wrapper);
        setOptionalMapEntry(queryParamsMap, FORCE, valueOf(wrapper.getInstanceInputs().isForceStop()),
                wrapper.getInstanceInputs().isForceStop());

        return queryParamsMap;
    }

    public Map<String, String> getTerminateInstancesQueryParamsMap(InputsWrapper wrapper) {
        return getRebootStartStopTerminateCommonQueryParamsMap(wrapper);
    }

    private Map<String, String> getRebootStartStopTerminateCommonQueryParamsMap(InputsWrapper wrapper) {
        Map<String, String> queryParamsMap = new HashMap<>();
        setCommonQueryParamsMap(queryParamsMap, wrapper.getCommonInputs().getAction(),
                wrapper.getCommonInputs().getVersion());
        setInstanceIdsQueryParams(wrapper, queryParamsMap);

        return queryParamsMap;
    }

    private String getCurrentVolumeType(Map<String, String> queryParamsMap, int index) {
        return queryParamsMap.get(BLOCK_DEVICE_MAPPING + DOT + (index + ONE) + DOT + EBS + VOLUME_TYPE);
    }

    private boolean getOptionalsSetterFlag(String[] validationArray, String[] toBeValidatedArray, String firstInput,
            String secondInput) {
        if (toBeValidatedArray != null) {
            validateAgainstDifferentArraysLength(validationArray, toBeValidatedArray, firstInput, secondInput);
            return Boolean.TRUE;
        }
        return Boolean.FALSE;
    }

    private String getFilterValue(String filterName, String filterValue) {
        switch (filterName) {
        case AFFINITY_FILTER:
            return Affinity.getValue(filterValue);
        case ARCHITECTURE_FILTER:
            return Architecture.getValue(filterValue);
        case BLOCK_DEVICE_MAPPING_STATUS_FILTER:
            return BlockDeviceMappingStatus.getValue(filterValue);
        case HYPERVISOR_FILTER:
            return Hypervisor.getValue(filterValue);
        case INSTANCE_LIFECYCLE_FILTER:
            return InstanceLifecycle.getValue(filterValue);
        case INSTANCE_STATE_CODE_FILTER:
            return valueOf(InstanceState.getKey(filterValue));
        case INSTANCE_STATE_NAME_FILTER:
            return InstanceState.getValue(filterValue);
        case INSTANCE_TYPE_FILTER:
            return InstanceType.getInstanceType(filterValue);
        case MONITORING_STATE_FILTER:
            return MonitoringState.getValue(filterValue);
        case PRODUCT_CODE_TYPE_FILTER:
            return ProductCodeType.getValue(filterValue);
        case ROOT_DEVIOCE_TYPE_FILTER:
            return BlockRootDeviceType.getValue(filterValue);
        case TENANCY_FILTER:
            return Tenancy.getValue(filterValue);
        case VIRTUALIZATION_TYPE_FILTER:
            return VirtualizationType.getValue(filterValue);
        case NETWORK_INTERFACE_STATUS_FILTER:
            return NetworkInterfaceStatus.getValue(filterValue);
        case NETWORK_INTERFACE_ATTACHMENT_STATUS_FILTER:
            return NetworkInterfaceAttachmentStatus.getValue(filterValue);
        default:
            return filterValue;
        }
    }

    private void setDescribeInstancesQueryParamsFilter(Map<String, String> queryParamsMap, InputsWrapper wrapper) {
        String[] filterNamesArray = getArrayWithoutDuplicateEntries(
                wrapper.getInstanceInputs().getFilterNamesString(), FILTER_NAMES_STRING,
                wrapper.getCommonInputs().getDelimiter());
        String[] filterValuesArray = getStringsArray(wrapper.getInstanceInputs().getFilterValuesString(), EMPTY,
                wrapper.getCommonInputs().getDelimiter());
        validateAgainstDifferentArraysLength(filterNamesArray, filterValuesArray, FILTER_NAMES_STRING,
                FILTER_VALUES_STRING);
        if (isNotEmpty(filterNamesArray) && isNotEmpty(filterValuesArray)) {
            for (int index = START_INDEX; index < filterNamesArray.length; index++) {
                String filterName = InstanceFilter.getInstanceFilter(filterNamesArray[index]);
                queryParamsMap.put(getFilterNameKey(index), filterName);
                setFilterValues(queryParamsMap, filterName, filterValuesArray[index], index);
            }
        }
    }

    private void setFilterValues(Map<String, String> queryParamsMap, String filterName, String filterValues,
            int index) {
        String[] valuesArray = getStringsArray(filterValues, EMPTY, PIPE_DELIMITER);
        if (isNotEmpty(valuesArray)) {
            for (int counter = START_INDEX; counter < valuesArray.length; counter++) {
                if (!NOT_RELEVANT.equalsIgnoreCase(getFilterValue(filterName, valuesArray[counter]))
                        || !NOT_RELEVANT_KEY_STRING.equals(getFilterValue(filterName, valuesArray[counter]))) {
                    queryParamsMap.put(getFilterValueKey(index, counter),
                            getFilterValue(filterName, valuesArray[counter].toLowerCase()));
                    if (!NOT_RELEVANT.equalsIgnoreCase(getFilterValue(filterName, valuesArray[counter]))
                            || !NOT_RELEVANT_KEY_STRING.equals(getFilterValue(filterName, valuesArray[counter]))) {
                        queryParamsMap.put(getFilterValueKey(index, counter),
                                getFilterValue(filterName, valuesArray[counter].toLowerCase()));
                    }
                }
            }
        }
    }

    private String getFilterNameKey(int index) {
        return FILTER + DOT + valueOf(index + ONE) + DOT + NAME;
    }

    private String getFilterValueKey(int index, int counter) {
        return FILTER + DOT + valueOf(index + ONE) + DOT + VALUE + DOT + valueOf(counter + ONE);
    }

    private void setModifyInstanceAttributeEbsSpecs(Map<String, String> queryParamsMap, InputsWrapper wrapper) {
        String delimiter = wrapper.getCommonInputs().getDelimiter();
        String[] deviceNamesArray = getArrayWithoutDuplicateEntries(
                wrapper.getEbsInputs().getBlockDeviceMappingDeviceNamesString(),
                BLOCK_DEVICE_MAPPING_DEVICE_NAMES_STRING, delimiter);
        String[] deleteOnTerminationsArray = getStringsArray(wrapper.getEbsInputs().getDeleteOnTerminationsString(),
                EMPTY, delimiter);
        String[] volumeIdsArray = getArrayWithoutDuplicateEntries(wrapper.getEbsInputs().getVolumeIdsString(),
                VOLUME_IDS_STRING, delimiter);
        String[] noDevicesArray = getStringsArray(wrapper.getEbsInputs().getNoDevicesString(), EMPTY, delimiter);
        String[] virtualNamesArray = getArrayWithoutDuplicateEntries(
                wrapper.getEbsInputs().getBlockDeviceMappingVirtualNamesString(),
                BLOCK_DEVICE_MAPPING_VIRTUAL_NAMES_STRING, delimiter);

        validateAgainstDifferentArraysLength(deviceNamesArray, deleteOnTerminationsArray,
                BLOCK_DEVICE_MAPPING_DEVICE_NAMES_STRING, DELETE_ON_TERMINATIONS_STRING);
        validateAgainstDifferentArraysLength(deviceNamesArray, volumeIdsArray,
                BLOCK_DEVICE_MAPPING_DEVICE_NAMES_STRING, VOLUME_IDS_STRING);
        validateAgainstDifferentArraysLength(deviceNamesArray, noDevicesArray,
                BLOCK_DEVICE_MAPPING_DEVICE_NAMES_STRING, NO_DEVICES_STRING);
        validateAgainstDifferentArraysLength(deviceNamesArray, virtualNamesArray,
                BLOCK_DEVICE_MAPPING_DEVICE_NAMES_STRING, BLOCK_DEVICE_MAPPING_VIRTUAL_NAMES_STRING);
        setEbsOptionalQueryParams(queryParamsMap, deviceNamesArray, deleteOnTerminationsArray, volumeIdsArray,
                noDevicesArray, virtualNamesArray);
    }

    private void setInstanceIdsQueryParams(InputsWrapper wrapper, Map<String, String> queryParamsMap) {
        String[] instanceIdsArray = getArrayWithoutDuplicateEntries(
                wrapper.getInstanceInputs().getInstanceIdsString(), INSTANCE_IDS_STRING,
                wrapper.getCommonInputs().getDelimiter());
        if (isNotEmpty(instanceIdsArray)) {
            for (int index = START_INDEX; index < instanceIdsArray.length; index++) {
                setOptionalMapEntry(queryParamsMap, INSTANCE_ID + DOT + valueOf(index + ONE),
                        instanceIdsArray[index],
                        isNotBlank(instanceIdsArray[index])
                                && !NOT_RELEVANT.equalsIgnoreCase(instanceIdsArray[index])
                                && !EMPTY.equals(instanceIdsArray[index]));
                setOptionalMapEntry(queryParamsMap, INSTANCE_ID + DOT + valueOf(index + ONE),
                        instanceIdsArray[index],
                        isNotBlank(instanceIdsArray[index])
                                && !NOT_RELEVANT.equalsIgnoreCase(instanceIdsArray[index])
                                && !EMPTY.equals(instanceIdsArray[index]));
            }
        }
    }

    private void setSecurityGroupQueryParams(Map<String, String> queryParamsMap, InputsWrapper wrapper) {
        CommonUtils helper = new CommonUtils();
        helper.setPrefixedAndSuffixedCommonQueryParams(queryParamsMap,
                wrapper.getIamInputs().getSecurityGroupNamesString(), SECURITY_GROUP, EMPTY,
                wrapper.getCommonInputs().getDelimiter());
        helper.setPrefixedAndSuffixedCommonQueryParams(queryParamsMap,
                wrapper.getIamInputs().getSecurityGroupIdsString(), SECURITY_GROUP_ID, EMPTY,
                wrapper.getCommonInputs().getDelimiter());
    }

    private void setBlockDeviceMappingQueryParams(Map<String, String> queryParamsMap, InputsWrapper wrapper) {
        String[] deviceNamesArray = getArrayWithoutDuplicateEntries(
                wrapper.getEbsInputs().getBlockDeviceMappingDeviceNamesString(),
                BLOCK_DEVICE_MAPPING_DEVICE_NAMES_STRING, wrapper.getCommonInputs().getDelimiter());
        String[] virtualNamesArray = getArrayWithoutDuplicateEntries(
                wrapper.getEbsInputs().getBlockDeviceMappingVirtualNamesString(),
                BLOCK_DEVICE_MAPPING_VIRTUAL_NAMES_STRING, wrapper.getCommonInputs().getDelimiter());

        if (deviceNamesArray != null && deviceNamesArray.length > START_INDEX && virtualNamesArray != null
                && virtualNamesArray.length > START_INDEX) {
            validateAgainstDifferentArraysLength(deviceNamesArray, virtualNamesArray,
                    BLOCK_DEVICE_MAPPING_DEVICE_NAMES_STRING, BLOCK_DEVICE_MAPPING_VIRTUAL_NAMES_STRING);

            for (int index = START_INDEX; index < deviceNamesArray.length; index++) {
                if (NO_DEVICE.equalsIgnoreCase(deviceNamesArray[index])) {
                    queryParamsMap.put(NO_DEVICE, EMPTY);
                } else {
                    queryParamsMap.put(getQueryParamsSpecificString(BLOCK_DEVICE_MAPPING, index)
                            + BLOCK_DEVICE_MAPPING_DEVICE_NAME, deviceNamesArray[index]);
                    setOptionalMapEntry(queryParamsMap,
                            getQueryParamsSpecificString(BLOCK_DEVICE_MAPPING, index) + VIRTUAL_NAME,
                            virtualNamesArray[index], !NOT_RELEVANT.equalsIgnoreCase(virtualNamesArray[index]));
                    setOptionalQueryParam(queryParamsMap, wrapper.getEbsInputs().getDeleteOnTerminationsString(),
                            EMPTY, wrapper.getCommonInputs().getDelimiter(),
                            BLOCK_DEVICE_MAPPING_DEVICE_NAMES_STRING, DELETE_ON_TERMINATIONS_STRING,
                            DELETE_ON_TERMINATION, deviceNamesArray, index);
                    setOptionalQueryParam(queryParamsMap, wrapper.getEbsInputs().getEncryptedString(), EMPTY,
                            wrapper.getCommonInputs().getDelimiter(), BLOCK_DEVICE_MAPPING_DEVICE_NAMES_STRING,
                            ENCRYPTED_STRING, ENCRYPTED, deviceNamesArray, index);
                    setOptionalQueryParam(queryParamsMap, wrapper.getEbsInputs().getSnapshotIdsString(), EMPTY,
                            wrapper.getCommonInputs().getDelimiter(), BLOCK_DEVICE_MAPPING_DEVICE_NAMES_STRING,
                            SNAPSHOT_IDS_STRING, SNAPSHOT_ID, deviceNamesArray, index);
                    setOptionalQueryParam(queryParamsMap, wrapper.getEbsInputs().getVolumeTypesString(), EMPTY,
                            wrapper.getCommonInputs().getDelimiter(), BLOCK_DEVICE_MAPPING_DEVICE_NAMES_STRING,
                            VOLUME_TYPES_STRING, VOLUME_TYPE, deviceNamesArray, index);
                    setOptionalQueryParam(queryParamsMap, wrapper.getEbsInputs().getIopsString(), EMPTY,
                            wrapper.getCommonInputs().getDelimiter(), BLOCK_DEVICE_MAPPING_DEVICE_NAMES_STRING,
                            IOPS_STRING, IOPS, deviceNamesArray, index);
                    setOptionalQueryParam(queryParamsMap, wrapper.getEbsInputs().getVolumeSizesString(), EMPTY,
                            wrapper.getCommonInputs().getDelimiter(), BLOCK_DEVICE_MAPPING_DEVICE_NAMES_STRING,
                            VOLUME_SIZES_STRING, VOLUME_SIZE, deviceNamesArray, index);
                }
            }
        }
    }

    private void setOptionalQueryParam(Map<String, String> queryParamsMap, String inputString, String toTest,
            String delimiter, String firstInputName, String secondInputName, String customKey,
            String[] referenceArray, int index) {
        String[] inputsArray = getStringsArray(inputString, toTest, delimiter);
        boolean setOptionalQueryParamEntryFlag = getOptionalsSetterFlag(referenceArray, inputsArray, firstInputName,
                secondInputName);
        setOptionalQueryParamEntry(queryParamsMap, inputsArray, customKey, index, setOptionalQueryParamEntryFlag);
    }

    private void setOptionalQueryParamEntry(Map<String, String> queryParamsMap, String[] inputArray,
            String customKey, int index, boolean condition) {
        if (condition && ENCRYPTED.equalsIgnoreCase(customKey)
                && valueOf(ONE).equalsIgnoreCase(inputArray[index])) {
            queryParamsMap.put(getQueryParamsSpecificString(EBS, index) + customKey, inputArray[index]);
        } else if (condition && VOLUME_TYPE.equalsIgnoreCase(customKey)) {
            queryParamsMap.put(getQueryParamsSpecificString(EBS, index) + customKey,
                    VolumeType.getValue(inputArray[index]));
        } else if (condition && IOPS.equalsIgnoreCase(customKey)
                && queryParamsMap.containsValue(VolumeType.IO1.toString())) {
            queryParamsMap.put(getQueryParamsSpecificString(EBS, index) + customKey, inputArray[index]);
        } else if (condition && VOLUME_SIZE.equalsIgnoreCase(customKey)
                && queryParamsMap.keySet().toString().contains(BLOCK_DEVICE_MAPPING)) {
            String currentVolumeType = getCurrentVolumeType(queryParamsMap, index);
            String currentValidSize = isBlank(currentVolumeType) ? getValidEbsSize(inputArray[index], STANDARD)
                    : getValidEbsSize(inputArray[index], currentVolumeType);
            setOptionalMapEntry(queryParamsMap, getQueryParamsSpecificString(EBS, index) + customKey,
                    currentValidSize, !NOT_RELEVANT.equalsIgnoreCase(currentValidSize));
        } else if (condition && DELETE_ON_TERMINATION.equalsIgnoreCase(customKey)
                && getEnforcedBooleanCondition(inputArray[index], true) == Boolean.FALSE) {
            queryParamsMap.put(getQueryParamsSpecificString(EBS, index) + customKey, inputArray[index]);
        } else if (condition && SNAPSHOT_ID.equalsIgnoreCase(customKey)) {
            queryParamsMap.put(getQueryParamsSpecificString(EBS, index) + customKey, inputArray[index]);
        }
    }

    private void setEbsOptionalQueryParams(Map<String, String> queryParamsMap, String[] deviceNamesArray,
            String[] deleteOnTerminationsArray, String[] volumeIdsArray, String[] noDevicesArray,
            String[] virtualNamesArray) {
        boolean setNoDevice = noDevicesArray != null && noDevicesArray.length > START_INDEX;
        boolean setDeleteOnTermination = deleteOnTerminationsArray != null
                && deleteOnTerminationsArray.length > START_INDEX;

        if (isNotEmpty(deviceNamesArray)) {
            for (int index = START_INDEX; index < deviceNamesArray.length; index++) {
                setOptionalMapEntry(queryParamsMap,
                        getQueryParamsSpecificString(BLOCK_DEVICE_MAPPING, index)
                                + BLOCK_DEVICE_MAPPING_DEVICE_NAME,
                        deviceNamesArray[index], isNotBlank(deviceNamesArray[index]));
                setOptionalMapEntry(queryParamsMap,
                        getQueryParamsSpecificString(BLOCK_DEVICE_MAPPING, index) + VIRTUAL_NAME,
                        virtualNamesArray[index],
                        (virtualNamesArray.length > START_INDEX && isNotBlank(virtualNamesArray[index])
                                && !NOT_RELEVANT.equalsIgnoreCase(virtualNamesArray[index])));
                setOptionalMapEntry(queryParamsMap, getQueryParamsSpecificString(EBS, index) + VOLUME_ID,
                        volumeIdsArray[index], isNotBlank(volumeIdsArray[index]));

                if (setNoDevice) {
                    setOptionalMapEntry(queryParamsMap,
                            getQueryParamsSpecificString(BLOCK_DEVICE_MAPPING, index) + NO_DEVICE,
                            noDevicesArray[index], NO_DEVICE.equalsIgnoreCase(noDevicesArray[index]));
                }
                if (setDeleteOnTermination) {
                    setOptionalMapEntry(queryParamsMap,
                            getQueryParamsSpecificString(EBS, index) + DELETE_ON_TERMINATION,
                            deleteOnTerminationsArray[index],
                            Boolean.FALSE == getEnforcedBooleanCondition(deleteOnTerminationsArray[index], true));
                }
            }
        }
    }

    private void setAttribute(Map<String, String> queryParamsMap, String attribute) {
        validateAttribute(attribute);
        setOptionalMapEntry(queryParamsMap, ATTRIBUTE, attribute, !NOT_RELEVANT.equalsIgnoreCase(attribute));
    }

    private void validateAttribute(String attribute) {
        List<String> validAttributesList = Arrays.asList(LOWER_CASE_KERNEL, LOWER_CASE_RAMDISK,
                LOWER_CASE_USER_DATA, LOWER_CASE_DISABLE_API_TERMINATION,
                LOWER_CASE_INSTANCE_INITIATED_SHUTDOWN_BEHAVIOR);

        if (isNotBlank(attribute) && !NOT_RELEVANT.equalsIgnoreCase(attribute)
                && !validAttributesList.contains(attribute)) {
            throw new RuntimeException("Unsupported attribute: [" + attribute + "]. "
                    + "Valid values: | kernel | ramdisk | userData | disableApiTermination | instanceInitiatedShutdownBehavior |");
        }
    }
}