From 7e3931da4e6cdaf0eaa55cb504a39f4c3d71b5f7 Mon Sep 17 00:00:00 2001 From: IvanBorislavovDimitrov Date: Fri, 20 Feb 2026 17:02:26 +0200 Subject: [PATCH] Use resources to deploy instead resources from descriptor during keys detection --- .../steps/BuildCloudDeployModelStep.java | 58 ++++++------- .../steps/BuildCloudDeployModelStepTest.java | 82 +++++++++++++++++-- 2 files changed, 100 insertions(+), 40 deletions(-) diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/BuildCloudDeployModelStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/BuildCloudDeployModelStep.java index ecb7d1882d..652a307b4a 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/BuildCloudDeployModelStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/BuildCloudDeployModelStep.java @@ -1,16 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.TreeSet; -import java.util.stream.Collectors; -import java.util.stream.Stream; - import jakarta.inject.Inject; import jakarta.inject.Named; import org.cloudfoundry.multiapps.common.SLException; @@ -66,6 +55,17 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.TreeSet; +import java.util.stream.Collectors; +import java.util.stream.Stream; + import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toSet; @@ -92,8 +92,6 @@ protected StepPhase executeStep(ProcessContext context) { getStepLogger().debug(Messages.BUILDING_CLOUD_MODEL); DeploymentDescriptor deploymentDescriptor = context.getVariable(Variables.COMPLETE_DEPLOYMENT_DESCRIPTOR); - addDetectedExistingServiceKeysToDetectedManagedKeys(context); - // Get module sets: DeployedMta deployedMta = context.getVariable(Variables.DEPLOYED_MTA); List deployedApplications = (deployedMta != null) ? deployedMta.getApplications() : Collections.emptyList(); @@ -148,6 +146,7 @@ protected StepPhase executeStep(ProcessContext context) { context.setVariable(Variables.SERVICES_TO_BIND, servicesForBindings); List resourcesForDeployment = calculateResourcesForDeployment(context, deploymentDescriptor); + addDetectedExistingServiceKeysToDetectedManagedKeys(context, resourcesForDeployment); SelectiveDeployChecker selectiveDeployChecker = getSelectiveDeployChecker(context, deploymentDescriptor); selectiveDeployChecker.check(resourcesForDeployment); @@ -357,11 +356,8 @@ private List getDomainsFromApps(ProcessContext context, DeploymentDescri return new ArrayList<>(domains); } - private void addDetectedExistingServiceKeysToDetectedManagedKeys(ProcessContext context) { - String mtaId = context.getVariable(Variables.MTA_ID); - String mtaNamespace = context.getVariable(Variables.MTA_NAMESPACE); - - List deployedServiceKeys = detectDeployedServiceKeys(mtaId, mtaNamespace, context); + private void addDetectedExistingServiceKeysToDetectedManagedKeys(ProcessContext context, List resourcesForDeployment) { + List deployedServiceKeys = detectDeployedServiceKeys(context, resourcesForDeployment); if (!deployedServiceKeys.isEmpty()) { List detectedServiceKeysForManagedServices = context.getVariable(Variables.DEPLOYED_MTA_SERVICE_KEYS); @@ -375,8 +371,9 @@ private void addDetectedExistingServiceKeysToDetectedManagedKeys(ProcessContext } } - private List detectDeployedServiceKeys(String mtaId, String mtaNamespace, - ProcessContext context) { + private List detectDeployedServiceKeys(ProcessContext context, List resourcesForDeployment) { + String mtaId = context.getVariable(Variables.MTA_ID); + String mtaNamespace = context.getVariable(Variables.MTA_NAMESPACE); String spaceGuid = context.getVariable(Variables.SPACE_GUID); String userGuid = context.getVariable(Variables.USER_GUID); OAuth2AccessTokenWithAdditionalInfo token = tokenService.getToken(userGuid); @@ -384,16 +381,16 @@ private List detectDeployedServiceKeys(String mtaId, Stri CustomServiceKeysClient serviceKeysClient = getCustomServiceKeysClient(credentials, context.getVariable(Variables.CORRELATION_ID)); - List existingInstanceGuids = getExistingServiceGuids(context); + List existingInstanceGuids = getExistingServiceGuids(context, resourcesForDeployment); return serviceKeysClient.getServiceKeysByMetadataAndExistingGuids( spaceGuid, mtaId, mtaNamespace, existingInstanceGuids ); } - private List getExistingServiceGuids(ProcessContext context) { + private List getExistingServiceGuids(ProcessContext context, List resourcesForDeployment) { CloudControllerClient client = context.getControllerClient(); - List resources = getExistingServiceResourcesFromDescriptor(context); + List resources = getExistingResourcesOnly(resourcesForDeployment); return resources.parallelStream() .map(resource -> resolveServiceGuid(client, resource)) @@ -427,16 +424,11 @@ private void logIgnoredService(String message, String serviceName, Exception e) LOGGER.error(formattedMessage, e); } - private List getExistingServiceResourcesFromDescriptor(ProcessContext context) { - DeploymentDescriptor descriptor = context.getVariable(Variables.COMPLETE_DEPLOYMENT_DESCRIPTOR); - - if (descriptor == null) { - return List.of(); - } - return descriptor.getResources() - .stream() - .filter(resource -> CloudModelBuilderUtil.getResourceType(resource) == ResourceType.EXISTING_SERVICE) - .toList(); + private List getExistingResourcesOnly(List resourcesForDeployment) { + return resourcesForDeployment + .stream() + .filter(resource -> CloudModelBuilderUtil.getResourceType(resource) == ResourceType.EXISTING_SERVICE) + .toList(); } protected CustomServiceKeysClient getCustomServiceKeysClient(CloudCredentials credentials, String correlationId) { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/BuildCloudDeployModelStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/BuildCloudDeployModelStepTest.java index 23f20eceaf..bcc37a4ba9 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/BuildCloudDeployModelStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/BuildCloudDeployModelStepTest.java @@ -1,12 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.stream.Stream; - import com.fasterxml.jackson.core.type.TypeReference; import org.cloudfoundry.multiapps.common.test.TestUtil; import org.cloudfoundry.multiapps.common.test.Tester.Expectation; @@ -38,8 +31,16 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Stream; + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -50,6 +51,7 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; class BuildCloudDeployModelStepTest extends SyncFlowableStepTest { @@ -232,6 +234,72 @@ void testServiceKeysOfExistingServicesAreAdded() { } + @Test + void testServiceKeysOnlyDetectedForResourcesSpecifiedForDeployment() { + prepareContextForSelectiveDeployment(); + + UUID guid1 = UUID.randomUUID(); + UUID guid2 = UUID.randomUUID(); + prepareServiceInstances(guid1, guid2); + + CustomServiceKeysClient mockedServiceKeysClient = mock(CustomServiceKeysClient.class); + DeployedMtaServiceKey deployedKey1 = createDeployedKey(TEST_RESOURCE_NAME); + when(mockedServiceKeysClient.getServiceKeysByMetadataAndExistingGuids( + eq(TEST_SPACE_GUID), eq(TEST_MTA_ID), eq(TEST_MTA_NAMESPACE), anyList() + )).thenReturn(List.of(deployedKey1)); + + BuildCloudDeployModelStep spyStep = prepareStepWithMockedServiceKeysClient(mockedServiceKeysClient); + spyStep.execute(execution); + + List capturedServiceGuids = captureServiceGuidsPassedToClient(mockedServiceKeysClient); + assertEquals(1, capturedServiceGuids.size(), "Only the resource specified for deployment should be queried"); + assertEquals(guid1.toString(), capturedServiceGuids.get(0), "The GUID should match the resource specified for deployment"); + + List detectedServiceKeysFromExistingServices = context.getVariable(Variables.DEPLOYED_MTA_SERVICE_KEYS); + assertEquals(1, detectedServiceKeysFromExistingServices.size()); + assertTrue(detectedServiceKeysFromExistingServices.contains(deployedKey1)); + } + + private void prepareContextForSelectiveDeployment() { + DeploymentDescriptor deploymentDescriptor = createDescriptorWithExistingServicesForKeysTest(); + context.setVariable(Variables.COMPLETE_DEPLOYMENT_DESCRIPTOR, deploymentDescriptor); + context.setVariable(Variables.MTA_ID, TEST_MTA_ID); + context.setVariable(Variables.MTA_NAMESPACE, TEST_MTA_NAMESPACE); + context.setVariable(Variables.SPACE_GUID, TEST_SPACE_GUID); + context.setVariable(Variables.MTA_MAJOR_SCHEMA_VERSION, 3); + context.setVariable(Variables.RESOURCES_FOR_DEPLOYMENT, List.of(TEST_RESOURCE_NAME)); + } + + private void prepareServiceInstances(UUID guid1, UUID guid2) { + var instance1 = ImmutableCloudServiceInstance.builder() + .name(TEST_RESOURCE_NAME) + .metadata(ImmutableCloudMetadata.of(guid1)) + .build(); + var instance2 = ImmutableCloudServiceInstance.builder() + .name(TEST_RESOURCE_NAME_2) + .metadata(ImmutableCloudMetadata.of(guid2)) + .build(); + when(client.getServiceInstance(TEST_RESOURCE_NAME)).thenReturn(instance1); + when(client.getServiceInstance(TEST_RESOURCE_NAME_2)).thenReturn(instance2); + } + + private BuildCloudDeployModelStep prepareStepWithMockedServiceKeysClient(CustomServiceKeysClient mockedServiceKeysClient) { + BuildCloudDeployModelStep spyStep = spy(step); + doReturn(mockedServiceKeysClient) + .when(spyStep) + .getCustomServiceKeysClient(any(CloudCredentials.class), anyString()); + return spyStep; + } + + @SuppressWarnings("unchecked") + private List captureServiceGuidsPassedToClient(CustomServiceKeysClient mockedServiceKeysClient) { + ArgumentCaptor> guidsCaptor = ArgumentCaptor.forClass(List.class); + verify(mockedServiceKeysClient).getServiceKeysByMetadataAndExistingGuids( + eq(TEST_SPACE_GUID), eq(TEST_MTA_ID), eq(TEST_MTA_NAMESPACE), guidsCaptor.capture() + ); + return guidsCaptor.getValue(); + } + private DeploymentDescriptor createDescriptorWithExistingServicesForKeysTest() { Resource resource1 = createExistingServiceResource(TEST_RESOURCE_NAME); Resource resource2 = createExistingServiceResource(TEST_RESOURCE_NAME_2);