diff --git a/cloud-api/src/main/java/com/sequenceiq/cloudbreak/cloud/ResourceConnector.java b/cloud-api/src/main/java/com/sequenceiq/cloudbreak/cloud/ResourceConnector.java index 31d49b8da30..d94363d5a09 100644 --- a/cloud-api/src/main/java/com/sequenceiq/cloudbreak/cloud/ResourceConnector.java +++ b/cloud-api/src/main/java/com/sequenceiq/cloudbreak/cloud/ResourceConnector.java @@ -2,6 +2,7 @@ import java.util.List; import java.util.Map; +import java.util.Optional; import com.sequenceiq.cloudbreak.cloud.context.AuthenticatedContext; import com.sequenceiq.cloudbreak.cloud.exception.QuotaExceededException; @@ -238,7 +239,8 @@ default CloudDatabaseServerSslCertificate getDatabaseServerActiveSslRootCertific * @return the status of updated resources * @throws Exception in case of any error */ - List update(AuthenticatedContext authenticatedContext, CloudStack stack, List resources, UpdateType type) + List update(AuthenticatedContext authenticatedContext, CloudStack stack, List resources, + UpdateType type, Optional group) throws Exception; /** diff --git a/cloud-api/src/test/java/com/sequenceiq/cloudbreak/cloud/ResourceConnectorTest.java b/cloud-api/src/test/java/com/sequenceiq/cloudbreak/cloud/ResourceConnectorTest.java index 37a85008c23..851857e546d 100644 --- a/cloud-api/src/test/java/com/sequenceiq/cloudbreak/cloud/ResourceConnectorTest.java +++ b/cloud-api/src/test/java/com/sequenceiq/cloudbreak/cloud/ResourceConnectorTest.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Map; +import java.util.Optional; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -120,7 +121,8 @@ public List upscale(AuthenticatedContext authenticatedConte } @Override - public List update(AuthenticatedContext authenticatedContext, CloudStack stack, List resources, UpdateType type) { + public List update(AuthenticatedContext authenticatedContext, CloudStack stack, + List resources, UpdateType type, Optional group) { return null; } diff --git a/cloud-aws-cloudformation/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/connector/resource/AwsResourceConnector.java b/cloud-aws-cloudformation/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/connector/resource/AwsResourceConnector.java index dd0f9613d3c..4f43a44b46e 100644 --- a/cloud-aws-cloudformation/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/connector/resource/AwsResourceConnector.java +++ b/cloud-aws-cloudformation/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/connector/resource/AwsResourceConnector.java @@ -6,6 +6,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Optional; import javax.inject.Inject; @@ -186,8 +187,9 @@ public CloudDatabaseServerSslCertificate getDatabaseServerActiveSslRootCertifica } @Override - public List update(AuthenticatedContext authenticatedContext, CloudStack stack, List resources, UpdateType type) { - return awsUpdateService.update(authenticatedContext, stack, resources, type); + public List update(AuthenticatedContext authenticatedContext, CloudStack stack, List resources, + UpdateType type, Optional group) { + return awsUpdateService.update(authenticatedContext, stack, resources, type, group); } @Override diff --git a/cloud-aws-cloudformation/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/connector/resource/AwsUpdateService.java b/cloud-aws-cloudformation/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/connector/resource/AwsUpdateService.java index 491cac642b8..25ef38ed1d1 100644 --- a/cloud-aws-cloudformation/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/connector/resource/AwsUpdateService.java +++ b/cloud-aws-cloudformation/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/connector/resource/AwsUpdateService.java @@ -6,6 +6,7 @@ import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; import javax.inject.Inject; @@ -49,7 +50,8 @@ public class AwsUpdateService { @Inject private AwsLaunchConfigurationUpdateService launchConfigurationUpdateService; - public List update(AuthenticatedContext authenticatedContext, CloudStack stack, List resources, UpdateType type) { + public List update(AuthenticatedContext authenticatedContext, CloudStack stack, List resources, + UpdateType type, Optional targetGroupName) { ArrayList cloudResourceStatuses = new ArrayList<>(); LOGGER.info("The update method which will be followed is {}.", type); if (!resources.isEmpty()) { @@ -67,28 +69,31 @@ public List update(AuthenticatedContext authenticatedContex cloudResourceStatuses.add(new CloudResourceStatus(cloudResource, ResourceStatus.UPDATED))); } } else if (type.equals(UpdateType.VERTICAL_SCALE)) { - updateWithVerticalScaling(authenticatedContext, stack, resources); + updateWithVerticalScaling(authenticatedContext, stack, resources, targetGroupName); } } return cloudResourceStatuses; } - private void updateWithVerticalScaling(AuthenticatedContext authenticatedContext, CloudStack stack, List resources) { + private void updateWithVerticalScaling(AuthenticatedContext authenticatedContext, CloudStack stack, + List resources, Optional groupName) { String cfTemplate = stack.getTemplate(); CloudResource cfResource = getCloudFormationStack(resources); for (Group group : stack.getGroups()) { - Map updatableFields = Map.of( - LaunchTemplateField.INSTANCE_TYPE, - group.getReferenceInstanceConfiguration().getTemplate().getFlavor(), - LaunchTemplateField.ROOT_DISK, - String.valueOf(group.getRootVolumeSize()) - ); - if (cfTemplate.contains(LAUNCH_TEMPLATE)) { - LOGGER.info("Update fields on launchtemplate {} on group {} on cf {}", updatableFields, group.getName(), cfResource.getName()); - awsLaunchTemplateUpdateService.updateLaunchTemplate(updatableFields, authenticatedContext, cfResource.getName(), group, stack); - } else { - LOGGER.info("Update fields on launchconfiguration {} on group {} on cf {}", updatableFields, group.getName(), cfResource.getName()); - launchConfigurationUpdateService.updateLaunchConfigurations(authenticatedContext, stack, cfResource, updatableFields, group); + if (!groupName.isEmpty() && group.getName().equalsIgnoreCase(groupName.get())) { + Map updatableFields = Map.of( + LaunchTemplateField.INSTANCE_TYPE, + group.getReferenceInstanceConfiguration().getTemplate().getFlavor(), + LaunchTemplateField.ROOT_DISK, + String.valueOf(group.getRootVolumeSize()) + ); + if (cfTemplate.contains(LAUNCH_TEMPLATE)) { + LOGGER.info("Update fields on launchtemplate {} on group {} on cf {}", updatableFields, group.getName(), cfResource.getName()); + awsLaunchTemplateUpdateService.updateLaunchTemplate(updatableFields, authenticatedContext, cfResource.getName(), group, stack); + } else { + LOGGER.info("Update fields on launchconfiguration {} on group {} on cf {}", updatableFields, group.getName(), cfResource.getName()); + launchConfigurationUpdateService.updateLaunchConfigurations(authenticatedContext, stack, cfResource, updatableFields, group); + } } } diff --git a/cloud-aws-cloudformation/src/test/java/com/sequenceiq/cloudbreak/cloud/aws/connector/resource/AwsUpdateServiceTest.java b/cloud-aws-cloudformation/src/test/java/com/sequenceiq/cloudbreak/cloud/aws/connector/resource/AwsUpdateServiceTest.java index 70d9c8dcaf6..5d8198eb2b2 100644 --- a/cloud-aws-cloudformation/src/test/java/com/sequenceiq/cloudbreak/cloud/aws/connector/resource/AwsUpdateServiceTest.java +++ b/cloud-aws-cloudformation/src/test/java/com/sequenceiq/cloudbreak/cloud/aws/connector/resource/AwsUpdateServiceTest.java @@ -12,6 +12,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Optional; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -64,7 +65,8 @@ void updateCloudFormationTemplateResourceWithImageParameter() { .withParameters(Collections.singletonMap(CloudResource.IMAGE, "dummy")) .build(); - List statuses = underTest.update(ac, stack, Collections.singletonList(cloudResource), UpdateType.IMAGE_UPDATE); + List statuses = underTest.update(ac, stack, Collections.singletonList(cloudResource), + UpdateType.IMAGE_UPDATE, Optional.empty()); verify(awsImageUpdateService, times(1)).updateImage(ac, stack, cloudResource); assertEquals(1, statuses.size()); @@ -83,7 +85,8 @@ void updateCloudFormationTemplateResourceWithoutImageParameter() { .withType(ResourceType.AWS_LAUNCHCONFIGURATION) .build(); - List statuses = underTest.update(ac, stack, List.of(cloudResource, launch), UpdateType.IMAGE_UPDATE); + List statuses = underTest.update(ac, stack, List.of(cloudResource, launch), + UpdateType.IMAGE_UPDATE, Optional.empty()); verify(awsImageUpdateService, times(0)).updateImage(ac, stack, cloudResource); assertEquals(0, statuses.size()); @@ -102,7 +105,8 @@ void updateRandomResource() { .withParameters(Collections.singletonMap(CloudResource.IMAGE, "dummy")) .build(); - List statuses = underTest.update(ac, stack, List.of(cloudResource, cf), UpdateType.IMAGE_UPDATE); + List statuses = underTest.update(ac, stack, List.of(cloudResource, cf), + UpdateType.IMAGE_UPDATE, Optional.empty()); verify(awsImageUpdateService, times(0)).updateImage(ac, stack, cloudResource); assertEquals(1, statuses.size()); @@ -157,7 +161,7 @@ void verticalScaleLaunchTemplate() { when(stack.getTemplate()).thenReturn("AWS::EC2::LaunchTemplate"); - underTest.update(ac, stack, Collections.singletonList(cloudResource), UpdateType.VERTICAL_SCALE); + underTest.update(ac, stack, Collections.singletonList(cloudResource), UpdateType.VERTICAL_SCALE, Optional.of("gwGroup")); Map updatableFields = Map.of( LaunchTemplateField.INSTANCE_TYPE, @@ -167,6 +171,30 @@ void verticalScaleLaunchTemplate() { verify(awsLaunchTemplateUpdateService, times(1)).updateLaunchTemplate(eq(updatableFields), any(), eq("cf"), eq(gatewayGroup), eq(stack)); } + @Test + void verticalScaleLaunchTemplateWhenGroupNotPresentedShouldNotCallModificationService() { + CloudResource cloudResource = CloudResource.builder() + .withName("cf") + .withType(ResourceType.CLOUDFORMATION_STACK) + .withParameters(Collections.singletonMap(CloudResource.IMAGE, "dummy")) + .build(); + Group gatewayGroup = mock(Group.class); + when(gatewayGroup.getName()).thenReturn("gwGroup"); + when(stack.getGroups()).thenReturn(List.of(gatewayGroup)); + when(stack.getTemplate()).thenReturn("AWS::EC2::LaunchTemplate"); + + + underTest.update(ac, stack, Collections.singletonList(cloudResource), UpdateType.VERTICAL_SCALE, Optional.of("gwGroup1")); + + Map updatableFields = Map.of( + LaunchTemplateField.INSTANCE_TYPE, + "m42.xxxl", + LaunchTemplateField.ROOT_DISK, + "100"); + verify(awsLaunchTemplateUpdateService, times(0)).updateLaunchTemplate(eq(updatableFields), any(), eq("cf"), eq(gatewayGroup), eq(stack)); + verify(launchConfigurationUpdateService, times(0)).updateLaunchConfigurations(any(), any(), any(), any()); + } + @Test void verticalScaleLaunchConfig() { CloudResource cloudResource = CloudResource.builder() @@ -186,7 +214,7 @@ void verticalScaleLaunchConfig() { when(stack.getTemplate()).thenReturn("AWS::EC2::LaunchConfiguration"); - underTest.update(ac, stack, Collections.singletonList(cloudResource), UpdateType.VERTICAL_SCALE); + underTest.update(ac, stack, Collections.singletonList(cloudResource), UpdateType.VERTICAL_SCALE, Optional.of("gwGroup")); Map updatableFields = Map.of( LaunchTemplateField.INSTANCE_TYPE, diff --git a/cloud-aws-common/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/common/resource/volume/AwsAttachmentResourceBuilder.java b/cloud-aws-common/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/common/resource/volume/AwsAttachmentResourceBuilder.java index 4a8c4cb3acd..2b83d18d61b 100644 --- a/cloud-aws-common/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/common/resource/volume/AwsAttachmentResourceBuilder.java +++ b/cloud-aws-common/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/common/resource/volume/AwsAttachmentResourceBuilder.java @@ -137,7 +137,7 @@ private void checkIfEveryVolumesAttachedSuccessfullyEvenIfSomethingFailed(CloudR @Override public CloudResource update(AwsContext context, CloudResource cloudResource, CloudInstance instance, - AuthenticatedContext auth, CloudStack cloudStack) throws Exception { + AuthenticatedContext auth, CloudStack cloudStack, Optional targetGroupName) throws Exception { return null; } diff --git a/cloud-aws-common/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/common/resource/volume/AwsEfsResourceBuilder.java b/cloud-aws-common/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/common/resource/volume/AwsEfsResourceBuilder.java index 9e03887dd9c..a54e1e6902f 100644 --- a/cloud-aws-common/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/common/resource/volume/AwsEfsResourceBuilder.java +++ b/cloud-aws-common/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/common/resource/volume/AwsEfsResourceBuilder.java @@ -127,7 +127,7 @@ public List build(AwsContext context, CloudInstance instance, lon @Override public CloudResource update(AwsContext context, CloudResource cloudResource, CloudInstance instance, - AuthenticatedContext auth, CloudStack cloudStack) throws Exception { + AuthenticatedContext auth, CloudStack cloudStack, Optional targetGroupName) throws Exception { return null; } diff --git a/cloud-aws-common/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/common/resource/volume/AwsVolumeResourceBuilder.java b/cloud-aws-common/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/common/resource/volume/AwsVolumeResourceBuilder.java index ecb69d60ff1..d5b9449ff7a 100644 --- a/cloud-aws-common/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/common/resource/volume/AwsVolumeResourceBuilder.java +++ b/cloud-aws-common/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/common/resource/volume/AwsVolumeResourceBuilder.java @@ -306,7 +306,7 @@ public List build(AwsContext context, CloudInstance instance, lon @Override public CloudResource update(AwsContext context, CloudResource cloudResource, CloudInstance instance, - AuthenticatedContext auth, CloudStack cloudStack) throws Exception { + AuthenticatedContext auth, CloudStack cloudStack, Optional targetGroupName) throws Exception { return null; } diff --git a/cloud-aws-native/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/resource/instance/AbstractAwsNativeComputeBuilder.java b/cloud-aws-native/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/resource/instance/AbstractAwsNativeComputeBuilder.java index 4ed74e0a11c..b6f5ff247f2 100644 --- a/cloud-aws-native/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/resource/instance/AbstractAwsNativeComputeBuilder.java +++ b/cloud-aws-native/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/resource/instance/AbstractAwsNativeComputeBuilder.java @@ -1,6 +1,7 @@ package com.sequenceiq.cloudbreak.cloud.aws.resource.instance; import java.util.List; +import java.util.Optional; import com.sequenceiq.cloudbreak.cloud.aws.common.context.AwsContext; import com.sequenceiq.cloudbreak.cloud.aws.resource.AbstractAwsNativeResourceBuilder; @@ -30,7 +31,7 @@ public CloudVmInstanceStatus stop(AwsContext context, AuthenticatedContext auth, @Override public CloudResource update(AwsContext context, CloudResource cloudResource, CloudInstance instance, - AuthenticatedContext auth, CloudStack cloudStack) throws Exception { + AuthenticatedContext auth, CloudStack cloudStack, Optional targetGroupName) throws Exception { return null; } diff --git a/cloud-aws-native/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/resource/instance/AwsNativeInstanceResourceBuilder.java b/cloud-aws-native/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/resource/instance/AwsNativeInstanceResourceBuilder.java index c0e3c913c83..b6e89b2d336 100644 --- a/cloud-aws-native/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/resource/instance/AwsNativeInstanceResourceBuilder.java +++ b/cloud-aws-native/src/main/java/com/sequenceiq/cloudbreak/cloud/aws/resource/instance/AwsNativeInstanceResourceBuilder.java @@ -156,7 +156,7 @@ public List build(AwsContext context, CloudInstance cloudInstance @Override public CloudResource update(AwsContext context, CloudResource cloudResource, CloudInstance instance, - AuthenticatedContext auth, CloudStack cloudStack) throws Exception { + AuthenticatedContext auth, CloudStack cloudStack, Optional targetGroup) throws Exception { AmazonEc2Client amazonEc2Client = context.getAmazonEc2Client(); Optional existedOpt = resourceById(amazonEc2Client, instance.getInstanceId()); Instance awsInstance; @@ -165,7 +165,11 @@ public CloudResource update(AwsContext context, CloudResource cloudResource, Clo LOGGER.info("Instance exists with name: {} ({}), check the state: {}", awsInstance.instanceId(), instance.getInstanceId(), awsInstance.state().name()); String requestedInstanceType = instance.getTemplate().getFlavor(); - if (!awsInstance.instanceType().toString().equals(requestedInstanceType)) { + if (isThisGroupApplicable(instance, targetGroup, awsInstance, requestedInstanceType)) { + LOGGER.info("Modify group {}, from instance type {}, to instance type {}.", + targetGroup.get(), + awsInstance.instanceType().name(), + instance.getTemplate().getFlavor()); ModifyInstanceAttributeRequest modifyInstanceAttributeRequest = ModifyInstanceAttributeRequest.builder() .instanceId(awsInstance.instanceId()) .instanceType(AttributeValue.builder().value(instance.getTemplate().getFlavor()).build()) @@ -179,6 +183,11 @@ public CloudResource update(AwsContext context, CloudResource cloudResource, Clo return null; } + private boolean isThisGroupApplicable(CloudInstance instance, Optional targetGroup, Instance awsInstance, String requestedInstanceType) { + return !targetGroup.isEmpty() && targetGroup.equals(instance.getTemplate().getGroupName()) + && !awsInstance.instanceType().toString().equals(requestedInstanceType); + } + Collection blocks(Group group, CloudStack cloudStack, AuthenticatedContext ac) { AwsInstanceView awsInstanceView = new AwsInstanceView(group.getReferenceInstanceTemplate()); List blocks = new ArrayList<>(); diff --git a/cloud-azure/src/main/java/com/sequenceiq/cloudbreak/cloud/azure/AzureResourceConnector.java b/cloud-azure/src/main/java/com/sequenceiq/cloudbreak/cloud/azure/AzureResourceConnector.java index e3a1525a303..96e80c58743 100644 --- a/cloud-azure/src/main/java/com/sequenceiq/cloudbreak/cloud/azure/AzureResourceConnector.java +++ b/cloud-azure/src/main/java/com/sequenceiq/cloudbreak/cloud/azure/AzureResourceConnector.java @@ -7,6 +7,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Optional; import javax.inject.Inject; @@ -331,14 +332,14 @@ public List terminateDatabaseServer(AuthenticatedContext au } @Override - public List update(AuthenticatedContext authenticatedContext, CloudStack stack, List resources, UpdateType type) - throws QuotaExceededException { + public List update(AuthenticatedContext authenticatedContext, CloudStack stack, List resources, + UpdateType type, Optional group) throws QuotaExceededException { LOGGER.info("The update method which will be followed is {}.", type); if (type.equals(UpdateType.VERTICAL_SCALE)) { AzureClient client = authenticatedContext.getParameter(AzureClient.class); AzureStackView azureStackView = azureStackViewProvider .getAzureStack(new AzureCredentialView(authenticatedContext.getCloudCredential()), stack, client, authenticatedContext); - return azureVerticalScaleService.verticalScale(authenticatedContext, stack, resources, azureStackView, client); + return azureVerticalScaleService.verticalScale(authenticatedContext, stack, resources, azureStackView, client, group); } return List.of(); } diff --git a/cloud-azure/src/main/java/com/sequenceiq/cloudbreak/cloud/azure/resource/AbstractAzureComputeBuilder.java b/cloud-azure/src/main/java/com/sequenceiq/cloudbreak/cloud/azure/resource/AbstractAzureComputeBuilder.java index a94e87d0ff4..b8d8dc77d46 100644 --- a/cloud-azure/src/main/java/com/sequenceiq/cloudbreak/cloud/azure/resource/AbstractAzureComputeBuilder.java +++ b/cloud-azure/src/main/java/com/sequenceiq/cloudbreak/cloud/azure/resource/AbstractAzureComputeBuilder.java @@ -1,6 +1,7 @@ package com.sequenceiq.cloudbreak.cloud.azure.resource; import java.util.List; +import java.util.Optional; import com.sequenceiq.cloudbreak.cloud.azure.context.AzureContext; import com.sequenceiq.cloudbreak.cloud.context.AuthenticatedContext; @@ -34,7 +35,7 @@ public CloudVmInstanceStatus start(AzureContext context, AuthenticatedContext au @Override public CloudResource update(AzureContext context, CloudResource cloudResource, CloudInstance instance, - AuthenticatedContext auth, CloudStack cloudStack) throws Exception { + AuthenticatedContext auth, CloudStack cloudStack, Optional targetGroupName) throws Exception { return null; } } diff --git a/cloud-azure/src/main/java/com/sequenceiq/cloudbreak/cloud/azure/upscale/AzureVerticalScaleService.java b/cloud-azure/src/main/java/com/sequenceiq/cloudbreak/cloud/azure/upscale/AzureVerticalScaleService.java index 18b38da56de..a59d7bf899e 100644 --- a/cloud-azure/src/main/java/com/sequenceiq/cloudbreak/cloud/azure/upscale/AzureVerticalScaleService.java +++ b/cloud-azure/src/main/java/com/sequenceiq/cloudbreak/cloud/azure/upscale/AzureVerticalScaleService.java @@ -2,6 +2,7 @@ import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; import javax.inject.Inject; @@ -40,7 +41,7 @@ public class AzureVerticalScaleService { private AzureVirtualMachineService azureVirtualMachineService; public List verticalScale(AuthenticatedContext ac, CloudStack stack, List resources, AzureStackView azureStackView, - AzureClient client) throws QuotaExceededException { + AzureClient client, Optional group) throws QuotaExceededException { CloudContext cloudContext = ac.getCloudContext(); String stackName = azureUtils.getStackName(cloudContext); try { @@ -56,8 +57,10 @@ public List verticalScale(AuthenticatedContext ac, CloudSta .stream() .filter(value -> value.name().equals(cloudInstance.getInstanceId())) .filter(value -> !value.size().toString().equalsIgnoreCase(cloudInstance.getTemplate().getFlavor())) + .filter(value -> cloudInstance.getTemplate().getGroupName().equalsIgnoreCase(group.get())) .forEach(value -> { - LOGGER.info("Vertical scaling vm {} with flavor {}.", value.name(), cloudInstance.getTemplate().getFlavor()); + LOGGER.info("Vertical scaling group {} vm {} with flavor {}.", + group.get(), value.name(), cloudInstance.getTemplate().getFlavor()); client.modifyInstanceType(resourceGroupName, value.name(), cloudInstance.getTemplate().getFlavor()); }); } diff --git a/cloud-azure/src/test/java/com/sequenceiq/cloudbreak/cloud/azure/upscale/AzureVerticalScaleServiceTest.java b/cloud-azure/src/test/java/com/sequenceiq/cloudbreak/cloud/azure/upscale/AzureVerticalScaleServiceTest.java index cf2653ec284..5a5253a957b 100644 --- a/cloud-azure/src/test/java/com/sequenceiq/cloudbreak/cloud/azure/upscale/AzureVerticalScaleServiceTest.java +++ b/cloud-azure/src/test/java/com/sequenceiq/cloudbreak/cloud/azure/upscale/AzureVerticalScaleServiceTest.java @@ -12,6 +12,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import org.junit.Before; import org.junit.Test; @@ -107,7 +108,7 @@ public void testVerticalScaleWhenAzureAnswersTheVerticalScaleShouldHappen() thro .thenReturn("group"); when(azureVirtualMachineService.getVirtualMachinesByName(any(), any(), any())).thenReturn(new HashMap<>()); - List actual = underTest.verticalScale(ac, stack, resources, azureStackView, client); + List actual = underTest.verticalScale(ac, stack, resources, azureStackView, client, Optional.empty()); assertEquals(0, actual.size()); } @@ -127,7 +128,7 @@ public void testVerticalScaleWhenDropExceptionThenVerticalScaleDoesNotHappen() { when(azureUtils.getInstanceList(any(CloudStack.class))) .thenThrow(new Retry.ActionFailedException("VMs not started in time.", new ApiErrorException("Error", null, cloudError))); CloudConnectorException cloudConnectorException = assertThrows(CloudConnectorException.class, () -> - underTest.verticalScale(ac, stack, resources, azureStackView, client) + underTest.verticalScale(ac, stack, resources, azureStackView, client, Optional.empty()) ); assertThat(cloudConnectorException.getMessage()) diff --git a/cloud-gcp/src/main/java/com/sequenceiq/cloudbreak/cloud/gcp/compute/AbstractGcpComputeBuilder.java b/cloud-gcp/src/main/java/com/sequenceiq/cloudbreak/cloud/gcp/compute/AbstractGcpComputeBuilder.java index 8e2747502de..94816eabd7f 100644 --- a/cloud-gcp/src/main/java/com/sequenceiq/cloudbreak/cloud/gcp/compute/AbstractGcpComputeBuilder.java +++ b/cloud-gcp/src/main/java/com/sequenceiq/cloudbreak/cloud/gcp/compute/AbstractGcpComputeBuilder.java @@ -1,6 +1,7 @@ package com.sequenceiq.cloudbreak.cloud.gcp.compute; import java.util.List; +import java.util.Optional; import com.sequenceiq.cloudbreak.cloud.context.AuthenticatedContext; import com.sequenceiq.cloudbreak.cloud.gcp.AbstractGcpResourceBuilder; @@ -35,7 +36,7 @@ public CloudVmInstanceStatus start(GcpContext context, AuthenticatedContext auth @Override public CloudResource update(GcpContext context, CloudResource cloudResource, CloudInstance instance, - AuthenticatedContext auth, CloudStack cloudStack) throws Exception { + AuthenticatedContext auth, CloudStack cloudStack, Optional targetGroupName) throws Exception { return null; } } diff --git a/cloud-gcp/src/main/java/com/sequenceiq/cloudbreak/cloud/gcp/compute/GcpInstanceResourceBuilder.java b/cloud-gcp/src/main/java/com/sequenceiq/cloudbreak/cloud/gcp/compute/GcpInstanceResourceBuilder.java index 597df659d7f..6e2a67b076d 100644 --- a/cloud-gcp/src/main/java/com/sequenceiq/cloudbreak/cloud/gcp/compute/GcpInstanceResourceBuilder.java +++ b/cloud-gcp/src/main/java/com/sequenceiq/cloudbreak/cloud/gcp/compute/GcpInstanceResourceBuilder.java @@ -364,21 +364,26 @@ public CloudVmInstanceStatus stop(GcpContext context, AuthenticatedContext auth, @Override public CloudResource update(GcpContext context, CloudResource resource, CloudInstance cloudInstance, - AuthenticatedContext auth, CloudStack cloudStack) throws Exception { + AuthenticatedContext auth, CloudStack cloudStack, Optional targetGroupName) throws Exception { String projectId = gcpStackUtil.getProjectId(auth.getCloudCredential()); String availabilityZone = cloudInstance.getAvailabilityZone(); Compute compute = context.getCompute(); String instanceId = cloudInstance.getInstanceId(); try { - LOGGER.info("Gcp operations are preparing: instanceId: {}, projectId: {}, availabilityZone: {}", instanceId, projectId, availabilityZone); - Get get = compute.instances().get(projectId, availabilityZone, instanceId); - Instance gcpInstance = get.execute(); - gcpInstance.setMachineType(String.format(MACHINETYPE_URL, - projectId, availabilityZone, cloudInstance.getTemplate().getFlavor())); - Compute.Instances.Update update = compute.instances().update(projectId, availabilityZone, gcpInstance.getName(), gcpInstance); - Operation operation = update.execute(); - LOGGER.debug("Operation with {} successfully inited on {} instance.", operation.getName(), cloudInstance.getInstanceId()); - return createOperationAwareCloudResource(resource, operation); + if (!targetGroupName.isEmpty() && cloudInstance.getTemplate().getGroupName().equalsIgnoreCase(targetGroupName.get())) { + LOGGER.info("Gcp operations are preparing: group: {}, instanceId: {}, projectId: {}, availabilityZone: {}", + targetGroupName.get(), instanceId, projectId, availabilityZone); + Get get = compute.instances().get(projectId, availabilityZone, instanceId); + Instance gcpInstance = get.execute(); + gcpInstance.setMachineType(String.format(MACHINETYPE_URL, + projectId, availabilityZone, cloudInstance.getTemplate().getFlavor())); + Compute.Instances.Update update = compute.instances().update(projectId, availabilityZone, gcpInstance.getName(), gcpInstance); + Operation operation = update.execute(); + LOGGER.debug("Operation with {} successfully inited on {} instance.", operation.getName(), cloudInstance.getInstanceId()); + return createOperationAwareCloudResource(resource, operation); + } else { + return null; + } } catch (TokenResponseException e) { throw gcpStackUtil.getMissingServiceAccountKeyError(e, context.getProjectId()); } catch (IOException e) { diff --git a/cloud-mock/src/main/java/com/sequenceiq/cloudbreak/cloud/mock/MockResourceConnector.java b/cloud-mock/src/main/java/com/sequenceiq/cloudbreak/cloud/mock/MockResourceConnector.java index c72e79ea08f..05eb8fec37a 100644 --- a/cloud-mock/src/main/java/com/sequenceiq/cloudbreak/cloud/mock/MockResourceConnector.java +++ b/cloud-mock/src/main/java/com/sequenceiq/cloudbreak/cloud/mock/MockResourceConnector.java @@ -10,6 +10,7 @@ import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; @@ -171,7 +172,8 @@ private List newTerminateDatabaseServerImpl(AuthenticatedCo } @Override - public List update(AuthenticatedContext authenticatedContext, CloudStack stack, List resources, UpdateType type) { + public List update(AuthenticatedContext authenticatedContext, CloudStack stack, List resources, + UpdateType type, Optional groupName) { List cloudResourceStatuses = resources.stream().map(r -> { Group group = stack.getGroups().stream().filter(g -> g.getName().equals(r.getGroup())).findFirst() .orElseThrow(NotFoundException.notFound("Group", r.getGroup())); diff --git a/cloud-reactor/src/main/java/com/sequenceiq/cloudbreak/cloud/handler/UpdateImageHandler.java b/cloud-reactor/src/main/java/com/sequenceiq/cloudbreak/cloud/handler/UpdateImageHandler.java index e775ce1a3c8..4ae462109bd 100644 --- a/cloud-reactor/src/main/java/com/sequenceiq/cloudbreak/cloud/handler/UpdateImageHandler.java +++ b/cloud-reactor/src/main/java/com/sequenceiq/cloudbreak/cloud/handler/UpdateImageHandler.java @@ -1,6 +1,7 @@ package com.sequenceiq.cloudbreak.cloud.handler; import java.util.List; +import java.util.Optional; import javax.inject.Inject; @@ -51,7 +52,7 @@ public void accept(Event event) { cloudResources.stream().filter(resource -> resource.getType().getCommonResourceType() == CommonResourceType.TEMPLATE) .forEach(resource -> resource.putParameter(CloudResource.IMAGE, stack.getImage().getImageName())); - connector.resources().update(auth, stack, cloudResources, UpdateType.IMAGE_UPDATE); + connector.resources().update(auth, stack, cloudResources, UpdateType.IMAGE_UPDATE, Optional.empty()); UpdateImageResult result = new UpdateImageResult(request.getResourceId()); request.getResult().onNext(result); eventBus.notify(result.selector(), new Event<>(event.getHeaders(), result)); diff --git a/cloud-reactor/src/test/java/com/sequenceiq/cloudbreak/cloud/handler/testcontext/TestApplicationContext.java b/cloud-reactor/src/test/java/com/sequenceiq/cloudbreak/cloud/handler/testcontext/TestApplicationContext.java index bf3e6b2d22b..b96db45489f 100644 --- a/cloud-reactor/src/test/java/com/sequenceiq/cloudbreak/cloud/handler/testcontext/TestApplicationContext.java +++ b/cloud-reactor/src/test/java/com/sequenceiq/cloudbreak/cloud/handler/testcontext/TestApplicationContext.java @@ -179,7 +179,7 @@ public CloudConnector cloudConnectors() throws Exception { .thenReturn(Collections.singletonList(new CloudResourceStatus(resource, ResourceStatus.CREATED))); when(resourceConnector.terminate(any(), any(), any())) .thenReturn(Collections.singletonList(new CloudResourceStatus(resource, ResourceStatus.DELETED))); - when(resourceConnector.update(any(), any(), any(), any())) + when(resourceConnector.update(any(), any(), any(), any(), any())) .thenReturn(Collections.singletonList(new CloudResourceStatus(resource, ResourceStatus.UPDATED))); when(resourceConnector.upscale(any(), any(), any(), any())) .thenReturn(Collections.singletonList(new CloudResourceStatus(resource, ResourceStatus.UPDATED))); diff --git a/cloud-template/src/main/java/com/sequenceiq/cloudbreak/cloud/template/AbstractResourceConnector.java b/cloud-template/src/main/java/com/sequenceiq/cloudbreak/cloud/template/AbstractResourceConnector.java index 02b3cb08d08..054fa2bc122 100644 --- a/cloud-template/src/main/java/com/sequenceiq/cloudbreak/cloud/template/AbstractResourceConnector.java +++ b/cloud-template/src/main/java/com/sequenceiq/cloudbreak/cloud/template/AbstractResourceConnector.java @@ -4,6 +4,7 @@ import java.util.Collection; import java.util.HashSet; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -268,7 +269,8 @@ public List downscale(AuthenticatedContext auth, CloudStack } @Override - public List update(AuthenticatedContext auth, CloudStack stack, List resources, UpdateType type) throws Exception { + public List update(AuthenticatedContext auth, CloudStack stack, List resources, + UpdateType type, Optional group) throws Exception { LOGGER.info("Update stack with resources: {}", resources); CloudContext cloudContext = auth.getCloudContext(); Platform platform = cloudContext.getPlatform(); @@ -290,7 +292,7 @@ public List update(AuthenticatedContext auth, CloudStack st //compute List computeResources = computeResourceService.getComputeResources(variant, resources); - List computeStatuses = computeResourceService.update(context, auth, stack, computeResources); + List computeStatuses = computeResourceService.update(context, auth, stack, computeResources, group); cloudResourceStatuses.addAll(computeStatuses); return cloudResourceStatuses; diff --git a/cloud-template/src/main/java/com/sequenceiq/cloudbreak/cloud/template/ComputeResourceBuilder.java b/cloud-template/src/main/java/com/sequenceiq/cloudbreak/cloud/template/ComputeResourceBuilder.java index 4506bda0a7b..9f59dc4429b 100644 --- a/cloud-template/src/main/java/com/sequenceiq/cloudbreak/cloud/template/ComputeResourceBuilder.java +++ b/cloud-template/src/main/java/com/sequenceiq/cloudbreak/cloud/template/ComputeResourceBuilder.java @@ -1,6 +1,7 @@ package com.sequenceiq.cloudbreak.cloud.template; import java.util.List; +import java.util.Optional; import com.sequenceiq.cloudbreak.cloud.CloudPlatformAware; import com.sequenceiq.cloudbreak.cloud.context.AuthenticatedContext; @@ -88,7 +89,7 @@ List build(C context, CloudInstance instance, long privateId, Aut List buildableResource, CloudStack cloudStack) throws Exception; CloudResource update(C context, CloudResource resource, CloudInstance instance, AuthenticatedContext auth, - CloudStack cloudStack) throws Exception; + CloudStack cloudStack, Optional targetGroup) throws Exception; /** * This method will be called if an instance stop/start is requested to check the state of the instance. diff --git a/cloud-template/src/main/java/com/sequenceiq/cloudbreak/cloud/template/compute/ComputeResourceService.java b/cloud-template/src/main/java/com/sequenceiq/cloudbreak/cloud/template/compute/ComputeResourceService.java index cc642497cc3..c67c8507613 100644 --- a/cloud-template/src/main/java/com/sequenceiq/cloudbreak/cloud/template/compute/ComputeResourceService.java +++ b/cloud-template/src/main/java/com/sequenceiq/cloudbreak/cloud/template/compute/ComputeResourceService.java @@ -122,9 +122,10 @@ private List getDeletedResourcesOrFail(Collection update(ResourceBuilderContext ctx, AuthenticatedContext auth, CloudStack stack, List cloudResource) { + public List update(ResourceBuilderContext ctx, AuthenticatedContext auth, CloudStack stack, + List cloudResource, Optional group) { LOGGER.info("Update compute resources."); - return new ResourceBuilder(ctx, auth).updateResources(ctx, auth, cloudResource, stack); + return new ResourceBuilder(ctx, auth).updateResources(ctx, auth, cloudResource, stack, group); } public List stopInstances(ResourceBuilderContext context, AuthenticatedContext auth, List cloudInstances) { @@ -327,7 +328,7 @@ public List buildResources(CloudStack cloudStack, Iterable< } public List updateResources(ResourceBuilderContext ctx, AuthenticatedContext auth, - List computeResources, CloudStack cloudStack) { + List computeResources, CloudStack cloudStack, Optional group) { List results = new ArrayList<>(); Collection>>> futures = new ArrayList<>(); Variant variant = auth.getCloudContext().getVariant(); @@ -342,7 +343,7 @@ public List updateResources(ResourceBuilderContext ctx, Aut .findFirst(); if (instance.isPresent()) { ResourceUpdateCallablePayload resourceUpdateCallablePayload - = new ResourceUpdateCallablePayload(cloudResource, instance.get(), ctx, auth, cloudStack, builder); + = new ResourceUpdateCallablePayload(cloudResource, instance.get(), ctx, auth, cloudStack, builder, group); ResourceUpdateCallable updateCallable = resourceActionFactory.buildUpdateCallable(resourceUpdateCallablePayload); Future>> future = resourceBuilderExecutor.submit(updateCallable); futures.add(future); diff --git a/cloud-template/src/main/java/com/sequenceiq/cloudbreak/cloud/template/compute/ResourceUpdateCallable.java b/cloud-template/src/main/java/com/sequenceiq/cloudbreak/cloud/template/compute/ResourceUpdateCallable.java index bac7fee199e..cd71ee0bd23 100644 --- a/cloud-template/src/main/java/com/sequenceiq/cloudbreak/cloud/template/compute/ResourceUpdateCallable.java +++ b/cloud-template/src/main/java/com/sequenceiq/cloudbreak/cloud/template/compute/ResourceUpdateCallable.java @@ -2,6 +2,7 @@ import java.util.Collections; import java.util.List; +import java.util.Optional; import java.util.concurrent.Callable; import org.slf4j.Logger; @@ -39,6 +40,8 @@ public class ResourceUpdateCallable implements Callable builder; + private final Optional targetGroup; + public ResourceUpdateCallable(ResourceUpdateCallablePayload payload, SyncPollingScheduler> syncPollingScheduler, ResourcePollTaskFactory resourcePollTaskFactory) { this.syncPollingScheduler = syncPollingScheduler; @@ -49,6 +52,7 @@ public ResourceUpdateCallable(ResourceUpdateCallablePayload payload, SyncPolling this.instance = payload.getCloudInstance(); this.stack = payload.getCloudStack(); this.builder = payload.getBuilder(); + this.targetGroup = payload.getTargetGroup(); } @Override @@ -57,7 +61,7 @@ public ResourceRequestResult> call() throws Exception if (resource.getStatus().resourceExists()) { CloudResource updateResource; try { - updateResource = builder.update(context, resource, instance, auth, stack); + updateResource = builder.update(context, resource, instance, auth, stack, targetGroup); } catch (PreserveResourceException ignored) { LOGGER.debug("Preserve resource for later use."); CloudResourceStatus status = new CloudResourceStatus(resource, ResourceStatus.CREATED); diff --git a/cloud-template/src/main/java/com/sequenceiq/cloudbreak/cloud/template/compute/ResourceUpdateCallablePayload.java b/cloud-template/src/main/java/com/sequenceiq/cloudbreak/cloud/template/compute/ResourceUpdateCallablePayload.java index ced95397814..e51a1daeb17 100644 --- a/cloud-template/src/main/java/com/sequenceiq/cloudbreak/cloud/template/compute/ResourceUpdateCallablePayload.java +++ b/cloud-template/src/main/java/com/sequenceiq/cloudbreak/cloud/template/compute/ResourceUpdateCallablePayload.java @@ -1,5 +1,7 @@ package com.sequenceiq.cloudbreak.cloud.template.compute; +import java.util.Optional; + import com.sequenceiq.cloudbreak.cloud.context.AuthenticatedContext; import com.sequenceiq.cloudbreak.cloud.model.CloudInstance; import com.sequenceiq.cloudbreak.cloud.model.CloudResource; @@ -21,14 +23,17 @@ public class ResourceUpdateCallablePayload { private final ComputeResourceBuilder builder; + private final Optional targetGroup; + public ResourceUpdateCallablePayload(CloudResource resource, CloudInstance cloudInstance, ResourceBuilderContext context, - AuthenticatedContext auth, CloudStack cloudStack, ComputeResourceBuilder builder) { + AuthenticatedContext auth, CloudStack cloudStack, ComputeResourceBuilder builder, Optional targetGroup) { this.resource = resource; this.cloudInstance = cloudInstance; this.context = context; this.auth = auth; this.cloudStack = cloudStack; this.builder = builder; + this.targetGroup = targetGroup; } public CloudResource getCloudResource() { @@ -54,4 +59,8 @@ public CloudInstance getCloudInstance() { public ComputeResourceBuilder getBuilder() { return builder; } + + public Optional getTargetGroup() { + return targetGroup; + } } diff --git a/cloud-yarn/src/main/java/com/sequenceiq/cloudbreak/cloud/yarn/YarnResourceConnector.java b/cloud-yarn/src/main/java/com/sequenceiq/cloudbreak/cloud/yarn/YarnResourceConnector.java index a71c9daa665..5771e3e30ab 100644 --- a/cloud-yarn/src/main/java/com/sequenceiq/cloudbreak/cloud/yarn/YarnResourceConnector.java +++ b/cloud-yarn/src/main/java/com/sequenceiq/cloudbreak/cloud/yarn/YarnResourceConnector.java @@ -10,6 +10,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; import javax.inject.Inject; @@ -249,7 +250,8 @@ public ExternalDatabaseStatus getDatabaseServerStatus(AuthenticatedContext authe } @Override - public List update(AuthenticatedContext authenticatedContext, CloudStack stack, List resources, UpdateType type) { + public List update(AuthenticatedContext authenticatedContext, CloudStack stack, List resources, + UpdateType type, Optional group) { return null; } diff --git a/core/src/main/java/com/sequenceiq/cloudbreak/core/flow2/stack/upscale/StackUpscaleService.java b/core/src/main/java/com/sequenceiq/cloudbreak/core/flow2/stack/upscale/StackUpscaleService.java index a8cea3bb548..28cbbf30e2a 100644 --- a/core/src/main/java/com/sequenceiq/cloudbreak/core/flow2/stack/upscale/StackUpscaleService.java +++ b/core/src/main/java/com/sequenceiq/cloudbreak/core/flow2/stack/upscale/StackUpscaleService.java @@ -15,6 +15,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -220,12 +221,13 @@ public List upscale(AuthenticatedContext ac, UpscaleStackRe } public List verticalScale(AuthenticatedContext ac, CoreVerticalScaleRequest request, - CloudConnector connector) throws Exception { + CloudConnector connector, String group) throws Exception { CloudStack cloudStack = request.getCloudStack(); try { - return connector.resources().update(ac, cloudStack, request.getResourceList(), UpdateType.VERTICAL_SCALE); + return connector.resources().update(ac, cloudStack, request.getResourceList(), UpdateType.VERTICAL_SCALE, + Optional.ofNullable(group)); } catch (Exception e) { - return handleExceptionAndRetryUpdate(request, connector, ac, cloudStack, e, UpdateType.VERTICAL_SCALE); + return handleExceptionAndRetryUpdate(request, connector, ac, cloudStack, e, UpdateType.VERTICAL_SCALE, group); } } @@ -242,10 +244,11 @@ private List handleQuotaExceptionAndRetryUpscale(UpscaleSta } private List handleExceptionAndRetryUpdate(CoreVerticalScaleRequest request, - CloudConnector connector, AuthenticatedContext ac, CloudStack cloudStack, Exception e, UpdateType type) throws Exception { + CloudConnector connector, AuthenticatedContext ac, CloudStack cloudStack, Exception e, + UpdateType type, String group) throws Exception { flowMessageService.fireEventAndLog(request.getResourceId(), UPDATE_IN_PROGRESS.name(), STACK_UPSCALE_QUOTA_ISSUE, e.getMessage()); - return connector.resources().update(ac, cloudStack, request.getResourceList(), type); + return connector.resources().update(ac, cloudStack, request.getResourceList(), type, Optional.ofNullable(group)); } private int getRemovableNodeCount(AdjustmentTypeWithThreshold adjustmentTypeWithThreshold, QuotaExceededException quotaExceededException, diff --git a/core/src/main/java/com/sequenceiq/cloudbreak/reactor/CoreVerticalScaleHandler.java b/core/src/main/java/com/sequenceiq/cloudbreak/reactor/CoreVerticalScaleHandler.java index 6b63a4303bf..57a86177e89 100644 --- a/core/src/main/java/com/sequenceiq/cloudbreak/reactor/CoreVerticalScaleHandler.java +++ b/core/src/main/java/com/sequenceiq/cloudbreak/reactor/CoreVerticalScaleHandler.java @@ -51,7 +51,8 @@ public void accept(Event stackVerticalScaleRequestEven try { CloudConnector connector = cloudPlatformConnectors.get(cloudContext.getPlatformVariant()); AuthenticatedContext ac = getAuthenticatedContext(request, cloudContext, connector); - List resourceStatus = stackUpscaleService.verticalScale(ac, request, connector); + List resourceStatus = stackUpscaleService.verticalScale(ac, request, connector, + stackVerticalScaleV4Request.getGroup()); LOGGER.info("Vertical scaling resource statuses: {}", resourceStatus); CoreVerticalScaleResult result = new CoreVerticalScaleResult( request.getResourceId(), diff --git a/freeipa/src/main/java/com/sequenceiq/freeipa/flow/freeipa/verticalscale/FreeIpaVerticalScaleService.java b/freeipa/src/main/java/com/sequenceiq/freeipa/flow/freeipa/verticalscale/FreeIpaVerticalScaleService.java index 1cae9784eb0..b5b23599193 100644 --- a/freeipa/src/main/java/com/sequenceiq/freeipa/flow/freeipa/verticalscale/FreeIpaVerticalScaleService.java +++ b/freeipa/src/main/java/com/sequenceiq/freeipa/flow/freeipa/verticalscale/FreeIpaVerticalScaleService.java @@ -68,7 +68,8 @@ public List verticalScale(AuthenticatedContext ac, FreeIpaV CloudConnector connector) throws Exception { CloudStack cloudStack = request.getCloudStack(); try { - return connector.resources().update(ac, cloudStack, request.getResourceList(), UpdateType.VERTICAL_SCALE); + return connector.resources().update(ac, cloudStack, request.getResourceList(), UpdateType.VERTICAL_SCALE, + Optional.ofNullable(request.getFreeIPAVerticalScaleRequest().getGroup())); } catch (Exception e) { LOGGER.info("Exception occured on update process retrying the operation. Error was: {}", e.getMessage(), e); return handleExceptionAndRetryUpdate(request, connector, ac, cloudStack, UpdateType.VERTICAL_SCALE); @@ -81,6 +82,7 @@ private List handleExceptionAndRetryUpdate( AuthenticatedContext ac, CloudStack cloudStack, UpdateType type) throws Exception { - return connector.resources().update(ac, cloudStack, request.getResourceList(), type); + return connector.resources().update(ac, cloudStack, request.getResourceList(), type, + Optional.ofNullable(request.getFreeIPAVerticalScaleRequest().getGroup())); } }