From 7932b38d2deae2e880973f87d9bacd15f332b013 Mon Sep 17 00:00:00 2001 From: UzYav <38292887+Yavor16@users.noreply.github.com> Date: Thu, 25 Jun 2026 10:01:12 +0300 Subject: [PATCH 1/2] Fix objectstore problem (#1861) Fix the problem with the start of deploy-service --- .../multiapps/controller/web/Messages.java | 2 +- .../ObjectStoreFileStorageFactoryBean.java | 32 +++------- ...ObjectStoreFileStorageFactoryBeanTest.java | 61 +++++++++++++++++++ 3 files changed, 69 insertions(+), 26 deletions(-) diff --git a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/Messages.java b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/Messages.java index 40dcff49a1..2cce47657e 100644 --- a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/Messages.java +++ b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/Messages.java @@ -57,7 +57,7 @@ public final class Messages { // WARN log messages - public static final String NO_OBJECTSTORE_PROVIDER_FOUND = "No ObjectStore provider found!"; + public static final String NO_OBJECTSTORE_PROVIDER_FOUND_FOR_0 = "No ObjectStore provider found for {0}!"; // INFO log messages public static final String ALM_SERVICE_ENV_INITIALIZED = "Deploy service environment initialized"; diff --git a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/configuration/bean/factory/ObjectStoreFileStorageFactoryBean.java b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/configuration/bean/factory/ObjectStoreFileStorageFactoryBean.java index f8311d7d94..18020e1a0a 100644 --- a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/configuration/bean/factory/ObjectStoreFileStorageFactoryBean.java +++ b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/configuration/bean/factory/ObjectStoreFileStorageFactoryBean.java @@ -23,7 +23,6 @@ import org.cloudfoundry.multiapps.controller.persistence.util.EnvironmentServicesFinder; import org.cloudfoundry.multiapps.controller.web.Constants; import org.cloudfoundry.multiapps.controller.web.Messages; -import org.cloudfoundry.multiapps.controller.web.configuration.service.ImmutableObjectStoreServiceInfo; import org.cloudfoundry.multiapps.controller.web.configuration.service.ObjectStoreServiceInfo; import org.cloudfoundry.multiapps.controller.web.configuration.service.ObjectStoreServiceInfoCreator; import org.jclouds.ContextBuilder; @@ -92,11 +91,13 @@ public FileStorage createObjectStoreFromFirstReachableProvider(Map createObjectStoreBasedOnProvider(String objectStoreProviderName, List providersServiceInfo, Map exceptions) { - return switch (objectStoreProviderName) { - case Constants.AZURE -> tryToCreateSdkObjectStore(exceptions, Constants.AZUREBLOB); - case Constants.GCP -> tryToCreateSdkObjectStore(exceptions, Constants.GOOGLE_CLOUD_STORAGE); - default -> tryToCreateJCloudsObjectStore(objectStoreProviderName, providersServiceInfo, exceptions); - }; + Optional objectStoreServiceInfoOptional = getAppropriateProvider(objectStoreProviderName, + providersServiceInfo); + if (objectStoreServiceInfoOptional.isEmpty()) { + LOGGER.warn(MessageFormat.format(Messages.NO_OBJECTSTORE_PROVIDER_FOUND_FOR_0, objectStoreProviderName)); + return Optional.empty(); + } + return tryToCreateObjectStore(objectStoreServiceInfoOptional.get(), exceptions); } private Optional getAppropriateProvider(String objectStoreProviderName, @@ -107,25 +108,6 @@ private Optional getAppropriateProvider(String objectSto .findFirst(); } - private Optional tryToCreateJCloudsObjectStore(String objectStoreProviderName, - List providersServiceInfo, - Map exceptions) { - Optional objectStoreServiceInfoOptional = getAppropriateProvider(objectStoreProviderName, - providersServiceInfo); - if (objectStoreServiceInfoOptional.isPresent()) { - ObjectStoreServiceInfo objectStoreServiceInfo = objectStoreServiceInfoOptional.get(); - return tryToCreateObjectStore(objectStoreServiceInfo, exceptions); - } - LOGGER.warn(Messages.NO_OBJECTSTORE_PROVIDER_FOUND); - return Optional.empty(); - } - - private Optional tryToCreateSdkObjectStore(Map exceptions, String providerName) { - return tryToCreateObjectStore(ImmutableObjectStoreServiceInfo.builder() - .provider(providerName) - .build(), exceptions); - } - private Optional tryToCreateObjectStore(ObjectStoreServiceInfo objectStoreServiceInfo, Map exceptions) { try { diff --git a/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/configuration/bean/factory/ObjectStoreFileStorageFactoryBeanTest.java b/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/configuration/bean/factory/ObjectStoreFileStorageFactoryBeanTest.java index dc5fc6bded..bcc01c7235 100644 --- a/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/configuration/bean/factory/ObjectStoreFileStorageFactoryBeanTest.java +++ b/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/configuration/bean/factory/ObjectStoreFileStorageFactoryBeanTest.java @@ -15,6 +15,7 @@ import org.cloudfoundry.multiapps.controller.persistence.util.EnvironmentServicesFinder; import org.cloudfoundry.multiapps.controller.web.Constants; import org.cloudfoundry.multiapps.controller.web.Messages; +import org.cloudfoundry.multiapps.controller.web.configuration.service.ImmutableObjectStoreServiceInfo; import org.cloudfoundry.multiapps.controller.web.configuration.service.ObjectStoreServiceInfo; import org.cloudfoundry.multiapps.controller.web.configuration.service.ObjectStoreServiceInfoCreator; import org.jclouds.blobstore.BlobStoreContext; @@ -59,6 +60,9 @@ class ObjectStoreFileStorageFactoryBeanTest { @Mock private AzureObjectStoreFileStorage azureObjectStoreFileStorage; + private ObjectStoreServiceInfo capturedGcpServiceInfo; + private ObjectStoreServiceInfo capturedAzureServiceInfo; + @BeforeEach void setUp() throws Exception { MockitoAnnotations.openMocks(this) @@ -149,6 +153,61 @@ void testObjectStoreCreationWhenEnvIsInvalid() { .createObjectStoreFromFirstReachableProvider(anyMap(), anyList()); } + @Test + void testGcpFactoryReceivesPopulatedCredentialsWhenEnvIsGcp() { + mockCfService(); + when(applicationConfiguration.getObjectStoreClientType()).thenReturn(Constants.GCP); + + objectStoreFileStorageFactoryBean.afterPropertiesSet(); + + assertNotNull(capturedGcpServiceInfo); + assertEquals(Constants.GOOGLE_CLOUD_STORAGE, capturedGcpServiceInfo.getProvider()); + assertNotNull(capturedGcpServiceInfo.getCredentials(), + "GCP factory must receive an ObjectStoreServiceInfo carrying the bound credentials map"); + assertEquals(ACCESS_KEY_ID_VALUE, capturedGcpServiceInfo.getCredentials() + .get(Constants.ACCESS_KEY_ID)); + assertEquals(BUCKET_VALUE, capturedGcpServiceInfo.getCredentials() + .get(Constants.BUCKET)); + } + + @Test + void testAzureFactoryReceivesPopulatedCredentialsWhenEnvIsAzure() { + mockCfService(); + when(applicationConfiguration.getObjectStoreClientType()).thenReturn(Constants.AZURE); + + objectStoreFileStorageFactoryBean.afterPropertiesSet(); + + assertNotNull(capturedAzureServiceInfo); + assertEquals(Constants.AZUREBLOB, capturedAzureServiceInfo.getProvider()); + assertNotNull(capturedAzureServiceInfo.getCredentials(), + "Azure factory must receive an ObjectStoreServiceInfo carrying the bound credentials map"); + assertEquals(SECRET_ACCESS_KEY_VALUE, capturedAzureServiceInfo.getCredentials() + .get(Constants.SECRET_ACCESS_KEY)); + } + + @Test + void testGcpEnvWithNoMatchingProviderInfoFallsThroughToNoValidStore() { + mockCfService(); + when(applicationConfiguration.getObjectStoreClientType()).thenReturn(Constants.GCP); + + ObjectStoreFileStorageFactoryBean bean = new ObjectStoreFileStorageFactoryBean("deploy-service-os", environmentServicesFinder, + applicationConfiguration) { + @Override + public List getProvidersServiceInfo() { + return List.of(ImmutableObjectStoreServiceInfo.builder() + .provider(Constants.AWS_S_3) + .identity(ACCESS_KEY_ID_VALUE) + .credential(SECRET_ACCESS_KEY_VALUE) + .container(BUCKET_VALUE) + .build()); + } + }; + + Exception exception = assertThrows(IllegalStateException.class, bean::afterPropertiesSet); + assertEquals(Messages.NO_VALID_OBJECT_STORE_CONFIGURATION_FOUND, exception.getMessage()); + assertNull(capturedGcpServiceInfo, "GCP factory must not be invoked when no matching provider info is bound"); + } + @Test void testObjectStoreCreationWhenEnvProviderFailsToConnect() { mockCfService(); @@ -203,11 +262,13 @@ protected JCloudsObjectStoreFileStorage createFileStorage(ObjectStoreServiceInfo @Override protected GcpObjectStoreFileStorage createGcpFileStorage(ObjectStoreServiceInfo credentials) { + ObjectStoreFileStorageFactoryBeanTest.this.capturedGcpServiceInfo = credentials; return ObjectStoreFileStorageFactoryBeanTest.this.gcpObjectStoreFileStorage; } @Override protected AzureObjectStoreFileStorage createAzureFileStorage(ObjectStoreServiceInfo objectStoreServiceInfo) { + ObjectStoreFileStorageFactoryBeanTest.this.capturedAzureServiceInfo = objectStoreServiceInfo; return ObjectStoreFileStorageFactoryBeanTest.this.azureObjectStoreFileStorage; } From b9299f08e198eee17c41fd2a27e9d09366c8f117 Mon Sep 17 00:00:00 2001 From: Yavor16 Date: Thu, 25 Jun 2026 11:08:45 +0300 Subject: [PATCH 2/2] [release] Set version to 2.49.1 --- multiapps-controller-api/pom.xml | 2 +- multiapps-controller-client/pom.xml | 2 +- multiapps-controller-core-test/pom.xml | 2 +- multiapps-controller-core/pom.xml | 2 +- multiapps-controller-coverage/pom.xml | 2 +- multiapps-controller-database-migration/pom.xml | 2 +- multiapps-controller-persistence-test/pom.xml | 2 +- multiapps-controller-persistence/pom.xml | 2 +- multiapps-controller-process/pom.xml | 2 +- multiapps-controller-shutdown-client/pom.xml | 2 +- multiapps-controller-web/pom.xml | 2 +- pom.xml | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/multiapps-controller-api/pom.xml b/multiapps-controller-api/pom.xml index 645814e815..6718b91302 100644 --- a/multiapps-controller-api/pom.xml +++ b/multiapps-controller-api/pom.xml @@ -10,7 +10,7 @@ org.cloudfoundry.multiapps multiapps-controller-parent - 2.49.0 + 2.49.1 diff --git a/multiapps-controller-client/pom.xml b/multiapps-controller-client/pom.xml index 1ee21896e5..a397bdb20a 100644 --- a/multiapps-controller-client/pom.xml +++ b/multiapps-controller-client/pom.xml @@ -9,7 +9,7 @@ org.cloudfoundry.multiapps multiapps-controller-parent - 2.49.0 + 2.49.1 diff --git a/multiapps-controller-core-test/pom.xml b/multiapps-controller-core-test/pom.xml index f68afffb50..b865706537 100644 --- a/multiapps-controller-core-test/pom.xml +++ b/multiapps-controller-core-test/pom.xml @@ -9,7 +9,7 @@ org.cloudfoundry.multiapps multiapps-controller-parent - 2.49.0 + 2.49.1 diff --git a/multiapps-controller-core/pom.xml b/multiapps-controller-core/pom.xml index 022fdda24e..4f1e5f47f6 100644 --- a/multiapps-controller-core/pom.xml +++ b/multiapps-controller-core/pom.xml @@ -9,7 +9,7 @@ org.cloudfoundry.multiapps multiapps-controller-parent - 2.49.0 + 2.49.1 diff --git a/multiapps-controller-coverage/pom.xml b/multiapps-controller-coverage/pom.xml index e6b143ba8b..648ef8bd8f 100644 --- a/multiapps-controller-coverage/pom.xml +++ b/multiapps-controller-coverage/pom.xml @@ -9,7 +9,7 @@ org.cloudfoundry.multiapps multiapps-controller-parent - 2.49.0 + 2.49.1 diff --git a/multiapps-controller-database-migration/pom.xml b/multiapps-controller-database-migration/pom.xml index eb3740a6a2..8f72c10463 100644 --- a/multiapps-controller-database-migration/pom.xml +++ b/multiapps-controller-database-migration/pom.xml @@ -9,7 +9,7 @@ org.cloudfoundry.multiapps multiapps-controller-parent - 2.49.0 + 2.49.1 diff --git a/multiapps-controller-persistence-test/pom.xml b/multiapps-controller-persistence-test/pom.xml index ec75fa5bdb..9d78556cd7 100644 --- a/multiapps-controller-persistence-test/pom.xml +++ b/multiapps-controller-persistence-test/pom.xml @@ -9,7 +9,7 @@ org.cloudfoundry.multiapps multiapps-controller-parent - 2.49.0 + 2.49.1 diff --git a/multiapps-controller-persistence/pom.xml b/multiapps-controller-persistence/pom.xml index a6eb19bd2f..ac3eb22453 100644 --- a/multiapps-controller-persistence/pom.xml +++ b/multiapps-controller-persistence/pom.xml @@ -9,7 +9,7 @@ org.cloudfoundry.multiapps multiapps-controller-parent - 2.49.0 + 2.49.1 diff --git a/multiapps-controller-process/pom.xml b/multiapps-controller-process/pom.xml index 0f708a0220..1acdd0e05f 100644 --- a/multiapps-controller-process/pom.xml +++ b/multiapps-controller-process/pom.xml @@ -9,7 +9,7 @@ org.cloudfoundry.multiapps multiapps-controller-parent - 2.49.0 + 2.49.1 diff --git a/multiapps-controller-shutdown-client/pom.xml b/multiapps-controller-shutdown-client/pom.xml index dd62a9f94c..983b9c16a1 100644 --- a/multiapps-controller-shutdown-client/pom.xml +++ b/multiapps-controller-shutdown-client/pom.xml @@ -8,7 +8,7 @@ org.cloudfoundry.multiapps multiapps-controller-parent - 2.49.0 + 2.49.1 diff --git a/multiapps-controller-web/pom.xml b/multiapps-controller-web/pom.xml index 1230ba7678..ff644c5f11 100644 --- a/multiapps-controller-web/pom.xml +++ b/multiapps-controller-web/pom.xml @@ -9,7 +9,7 @@ org.cloudfoundry.multiapps multiapps-controller-parent - 2.49.0 + 2.49.1 diff --git a/pom.xml b/pom.xml index ab1de63588..50a061bca8 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 org.cloudfoundry.multiapps multiapps-controller-parent - 2.49.0 + 2.49.1 pom MultiApps Controller Parent Multi-Target Application (MTA) deployment service for Cloud Foundry