Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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;

Expand All @@ -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<DeployedMtaApplication> deployedApplications = (deployedMta != null) ? deployedMta.getApplications() : Collections.emptyList();
Expand Down Expand Up @@ -148,6 +146,7 @@ protected StepPhase executeStep(ProcessContext context) {
context.setVariable(Variables.SERVICES_TO_BIND, servicesForBindings);

List<Resource> resourcesForDeployment = calculateResourcesForDeployment(context, deploymentDescriptor);
addDetectedExistingServiceKeysToDetectedManagedKeys(context, resourcesForDeployment);

SelectiveDeployChecker selectiveDeployChecker = getSelectiveDeployChecker(context, deploymentDescriptor);
selectiveDeployChecker.check(resourcesForDeployment);
Expand Down Expand Up @@ -357,11 +356,8 @@ private List<String> 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<DeployedMtaServiceKey> deployedServiceKeys = detectDeployedServiceKeys(mtaId, mtaNamespace, context);
private void addDetectedExistingServiceKeysToDetectedManagedKeys(ProcessContext context, List<Resource> resourcesForDeployment) {
List<DeployedMtaServiceKey> deployedServiceKeys = detectDeployedServiceKeys(context, resourcesForDeployment);
if (!deployedServiceKeys.isEmpty()) {

List<DeployedMtaServiceKey> detectedServiceKeysForManagedServices = context.getVariable(Variables.DEPLOYED_MTA_SERVICE_KEYS);
Expand All @@ -375,25 +371,26 @@ private void addDetectedExistingServiceKeysToDetectedManagedKeys(ProcessContext
}
}

private List<DeployedMtaServiceKey> detectDeployedServiceKeys(String mtaId, String mtaNamespace,
ProcessContext context) {
private List<DeployedMtaServiceKey> detectDeployedServiceKeys(ProcessContext context, List<Resource> 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);
CloudCredentials credentials = new CloudCredentials(token);

CustomServiceKeysClient serviceKeysClient = getCustomServiceKeysClient(credentials, context.getVariable(Variables.CORRELATION_ID));

List<String> existingInstanceGuids = getExistingServiceGuids(context);
List<String> existingInstanceGuids = getExistingServiceGuids(context, resourcesForDeployment);

return serviceKeysClient.getServiceKeysByMetadataAndExistingGuids(
spaceGuid, mtaId, mtaNamespace, existingInstanceGuids
);
}

private List<String> getExistingServiceGuids(ProcessContext context) {
private List<String> getExistingServiceGuids(ProcessContext context, List<Resource> resourcesForDeployment) {
CloudControllerClient client = context.getControllerClient();
List<Resource> resources = getExistingServiceResourcesFromDescriptor(context);
List<Resource> resources = getExistingResourcesOnly(resourcesForDeployment);

return resources.parallelStream()
.map(resource -> resolveServiceGuid(client, resource))
Expand Down Expand Up @@ -427,16 +424,11 @@ private void logIgnoredService(String message, String serviceName, Exception e)
LOGGER.error(formattedMessage, e);
}

private List<Resource> 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<Resource> getExistingResourcesOnly(List<Resource> resourcesForDeployment) {
return resourcesForDeployment
.stream()
.filter(resource -> CloudModelBuilderUtil.getResourceType(resource) == ResourceType.EXISTING_SERVICE)
.toList();
}

protected CustomServiceKeysClient getCustomServiceKeysClient(CloudCredentials credentials, String correlationId) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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<BuildCloudDeployModelStep> {
Expand Down Expand Up @@ -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<String> 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<DeployedMtaServiceKey> 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<String> captureServiceGuidsPassedToClient(CustomServiceKeysClient mockedServiceKeysClient) {
ArgumentCaptor<List<String>> 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);
Expand Down
Loading