From 115530fb45fab40c293591d2fb1ccf649847d95b Mon Sep 17 00:00:00 2001 From: theghost5800 Date: Thu, 31 Jul 2025 14:58:17 +0300 Subject: [PATCH] Migrate cf-java-client-sap into multiapps-controller project JIRA:LMCROSSITXSADEPLOY-3263 --- multiapps-controller-client/pom.xml | 127 +- .../src/main/java/module-info.java | 16 +- .../client/CloudFoundryTokenProvider.java | 4 +- .../ResilientCloudControllerClient.java | 73 +- .../controller/client/TokenProvider.java | 2 +- .../client/facade/ApplicationLogListener.java | 13 + .../ApplicationServicesUpdateCallback.java | 6 + .../client/facade/CloudControllerClient.java | 734 +++++ .../facade/CloudControllerClientImpl.java | 669 +++++ .../facade/CloudControllerException.java | 40 + .../client/facade/CloudCredentials.java | 225 ++ .../client/facade/CloudException.java | 18 + .../facade/CloudOperationException.java | 50 + .../facade/CloudServiceBrokerException.java | 39 + .../controller/client/facade/Constants.java | 13 + .../controller/client/facade/Messages.java | 30 + .../controller/client/facade/Nullable.java | 5 + .../ServiceBindingOperationCallback.java | 8 + .../controller/client/facade/SkipNulls.java | 5 + .../client/facade/UploadStatusCallback.java | 68 + .../facade/adapters/ApplicationLogEntity.java | 43 + .../adapters/ApplicationLogsResponse.java | 17 + .../adapters/CloudFoundryClientFactory.java | 155 + .../facade/adapters/LogCacheClient.java | 117 + .../facade/adapters/OAuthTokenProvider.java | 27 + .../facade/adapters/RawCloudApplication.java | 72 + .../facade/adapters/RawCloudAsyncJob.java | 50 + .../client/facade/adapters/RawCloudBuild.java | 67 + .../facade/adapters/RawCloudDomain.java | 24 + .../facade/adapters/RawCloudEntity.java | 79 + .../client/facade/adapters/RawCloudEvent.java | 56 + .../facade/adapters/RawCloudPackage.java | 74 + .../facade/adapters/RawCloudProcess.java | 44 + .../client/facade/adapters/RawCloudRoute.java | 99 + .../adapters/RawCloudServiceBinding.java | 37 + .../adapters/RawCloudServiceBroker.java | 40 + .../adapters/RawCloudServiceInstance.java | 55 + .../facade/adapters/RawCloudServiceKey.java | 41 + .../adapters/RawCloudServiceOffering.java | 45 + .../facade/adapters/RawCloudServicePlan.java | 37 + .../client/facade/adapters/RawCloudStack.java | 25 + .../client/facade/adapters/RawCloudTask.java | 50 + .../facade/adapters/RawInstancesInfo.java | 47 + .../client/facade/adapters/RawUserRole.java | 21 + .../adapters/RawV3CloudServiceInstance.java | 25 + .../client/facade/domain/ApplicationLog.java | 34 + .../client/facade/domain/ApplicationLogs.java | 7 + .../client/facade/domain/BitsData.java | 33 + .../facade/domain/CloudApplication.java | 32 + .../client/facade/domain/CloudAsyncJob.java | 31 + .../client/facade/domain/CloudBuild.java | 67 + .../client/facade/domain/CloudDomain.java | 18 + .../client/facade/domain/CloudEntity.java | 29 + .../client/facade/domain/CloudEvent.java | 54 + .../client/facade/domain/CloudJob.java | 51 + .../client/facade/domain/CloudMetadata.java | 35 + .../facade/domain/CloudOrganization.java | 18 + .../client/facade/domain/CloudPackage.java | 62 + .../client/facade/domain/CloudProcess.java | 37 + .../client/facade/domain/CloudRoute.java | 83 + .../facade/domain/CloudServiceBinding.java | 29 + .../facade/domain/CloudServiceBroker.java | 31 + .../facade/domain/CloudServiceInstance.java | 57 + .../client/facade/domain/CloudServiceKey.java | 32 + .../facade/domain/CloudServiceOffering.java | 48 + .../facade/domain/CloudServicePlan.java | 39 + .../client/facade/domain/CloudSpace.java | 22 + .../client/facade/domain/CloudStack.java | 22 + .../client/facade/domain/CloudTask.java | 61 + .../client/facade/domain/Derivable.java | 7 + .../facade/domain/DockerCredentials.java | 17 + .../client/facade/domain/DockerData.java | 21 + .../client/facade/domain/DockerInfo.java | 19 + .../client/facade/domain/DropletInfo.java | 23 + .../client/facade/domain/ErrorDetails.java | 25 + .../client/facade/domain/HealthCheckType.java | 10 + .../client/facade/domain/InstanceInfo.java | 17 + .../client/facade/domain/InstanceState.java | 18 + .../client/facade/domain/InstancesInfo.java | 21 + .../client/facade/domain/Lifecycle.java | 22 + .../client/facade/domain/LifecycleType.java | 12 + .../client/facade/domain/PackageState.java | 5 + .../facade/domain/RouteDestination.java | 30 + .../facade/domain/SecurityGroupRule.java | 29 + .../ServiceCredentialBindingOperation.java | 92 + .../facade/domain/ServiceOperation.java | 114 + .../facade/domain/ServicePlanVisibility.java | 11 + .../client/facade/domain/Staging.java | 77 + .../client/facade/domain/Status.java | 5 + .../client/facade/domain/Upload.java | 19 + .../client/facade/domain/UserRole.java | 35 + .../facade/dto/ApplicationToCreateDto.java | 40 + .../OAuth2AccessTokenWithAdditionalInfo.java | 35 + .../client/facade/oauth2/OAuthClient.java | 135 + .../oauth2/Oauth2AccessTokenResponse.java | 32 + .../client/facade/oauth2/TokenFactory.java | 83 + .../CloudControllerResponseErrorHandler.java | 76 + .../rest/CloudControllerRestClient.java | 263 ++ .../CloudControllerRestClientFactory.java | 72 + .../rest/CloudControllerRestClientImpl.java | 2572 +++++++++++++++++ .../client/facade/rest/CloudSpaceClient.java | 127 + .../util/AuthorizationEndpointGetter.java | 36 + .../client/facade/util/CloudUtil.java | 105 + .../client/facade/util/JobV3Util.java | 48 + .../client/facade/util/JsonUtil.java | 102 + .../client/facade/util/RestUtil.java | 102 + .../client/facade/util/UriUtil.java | 20 + .../lib/domain/CloudApplicationExtended.java | 19 +- .../client/lib/domain/CloudRouteExtended.java | 6 +- .../domain/CloudServiceInstanceExtended.java | 2 +- .../client/lib/domain/DropletInfoFactory.java | 10 +- .../client/lib/domain/HealthCheckInfo.java | 6 +- .../domain/UploadStatusCallbackExtended.java | 2 +- .../controller/client/package-info.java | 2 +- .../util/ResilientCloudOperationExecutor.java | 3 +- .../client/util/TokenProperties.java | 4 +- .../client/facade/ApplicationUtil.java | 94 + ...sCloudControllerClientIntegrationTest.java | 503 ++++ .../CloudControllerClientIntegrationTest.java | 107 + .../facade/CloudStackIntegrationTest.java | 128 + ...sCloudControllerClientIntegrationTest.java | 72 + .../controller/client/facade/ITVariable.java | 69 + .../facade/IntegrationTestConstants.java | 33 + ...sCloudControllerClientIntegrationTest.java | 641 ++++ .../adapters/RawCloudApplicationTest.java | 132 + .../facade/adapters/RawCloudAsyncJobTest.java | 82 + .../facade/adapters/RawCloudBuildTest.java | 137 + .../facade/adapters/RawCloudDomainTest.java | 49 + .../facade/adapters/RawCloudEntityTest.java | 151 + .../facade/adapters/RawCloudEventTest.java | 126 + .../facade/adapters/RawCloudPackageTest.java | 113 + .../facade/adapters/RawCloudRouteTest.java | 107 + .../adapters/RawCloudServiceBindingTest.java | 71 + .../adapters/RawCloudServiceBrokerTest.java | 55 + .../adapters/RawCloudServiceInstanceTest.java | 117 + .../adapters/RawCloudServiceKeyTest.java | 88 + .../adapters/RawCloudServiceOfferingTest.java | 107 + .../adapters/RawCloudServicePlanTest.java | 92 + .../facade/adapters/RawCloudServiceTest.java | 130 + .../facade/adapters/RawCloudStackTest.java | 40 + .../facade/adapters/RawCloudTaskTest.java | 72 + .../facade/adapters/RawInstancesInfoTest.java | 51 + .../facade/adapters/RawUserRoleTest.java | 49 + .../facade/broker/FailConfiguration.java | 31 + .../broker/ServiceBrokerConfiguration.java | 35 + .../facade/oauth2/TokenFactoryTest.java | 86 + ...oudControllerResponseErrorHandlerTest.java | 128 + .../CloudControllerRestClientImplTest.java | 309 ++ .../client/facade/util/JsonUtilTest.java | 107 + .../client/facade/util/UriUtilTest.java | 22 + .../client/facade/rest/v2-error.json | 5 + .../client/facade/rest/v3-error.json | 14 + .../client/facade/service-broker-env.json | 27 + .../client/facade/util/application.json | 46 + .../controller/client/facade/util/build.json | 31 + .../client/facade/util/package.json | 30 + .../client/facade/util/service-instance.json | 37 + .../controller/client/facade/util/task.json | 30 + .../src/main/java/module-info.java | 1 - .../health/model/ApplicationHealthResult.java | 5 +- .../core/cf/CloudControllerClientFactory.java | 22 +- .../cf/CloudControllerClientProvider.java | 4 +- .../core/cf/CloudHandlerFactory.java | 5 +- .../core/cf/OAuthClientExtended.java | 4 +- .../core/cf/OAuthClientFactory.java | 6 +- .../ApplicationStartupStateCalculator.java | 14 +- .../AppBoundServiceInstanceNamesGetter.java | 3 +- .../cf/clients/CFOptimizedEventGetter.java | 3 +- .../core/cf/clients/CfRolesGetter.java | 5 +- .../cf/clients/CloudEntityResourceMapper.java | 11 +- .../cf/clients/CustomControllerClient.java | 3 +- .../CustomControllerClientErrorHandler.java | 10 +- .../cf/clients/CustomServiceKeysClient.java | 15 +- .../clients/ServiceInstanceRoutesGetter.java | 3 +- .../core/cf/clients/WebClientFactory.java | 6 +- .../core/cf/detect/DeployedMtaDetector.java | 12 +- .../DeployedMtaRequiredDataOnlyDetector.java | 6 +- .../MtaMetadataApplicationCollector.java | 6 +- .../MtaMetadataEntityAggregator.java | 8 +- .../processor/MtaMetadataEntityCollector.java | 7 +- .../MtaMetadataServiceCollector.java | 8 +- .../metadata/processor/MtaMetadataParser.java | 11 +- .../processor/MtaMetadataValidator.java | 12 +- .../cf/metadata/util/MtaMetadataUtil.java | 7 +- .../DeployedAfterModulesContentValidator.java | 16 +- .../cf/v2/ApplicationCloudModelBuilder.java | 17 +- .../ApplicationRoutesCloudModelBuilder.java | 5 +- .../core/cf/v2/CloudHandlerFactoryV2.java | 22 +- .../cf/v2/ServiceKeysCloudModelBuilder.java | 18 +- .../core/cf/v3/CloudHandlerFactoryV3.java | 17 +- .../cf/v3/ServiceKeysCloudModelBuilder.java | 11 +- .../core/helpers/ApplicationAttributes.java | 10 +- .../ApplicationEnvironmentUpdater.java | 5 +- .../controller/core/helpers/ClientHelper.java | 7 +- .../core/helpers/MtaConfigurationPurger.java | 16 +- .../core/model/DeployedMtaApplication.java | 5 +- .../core/model/DeployedMtaService.java | 7 +- .../core/model/DeployedMtaServiceKey.java | 7 +- ...ementalAppInstanceUpdateConfiguration.java | 7 +- .../model/TypedServiceOperationState.java | 7 +- ...licationAttributeUpdateStrategyParser.java | 5 +- .../core/parser/DockerInfoParser.java | 9 +- .../parser/IdleRouteParametersParser.java | 16 +- .../core/parser/RouteParametersParser.java | 10 +- .../core/parser/StagingParametersParser.java | 8 +- .../core/parser/TaskParametersParser.java | 13 +- .../termination/DataTerminationService.java | 20 +- .../core/security/token/TokenService.java | 2 +- .../token/parsers/JwtTokenParser.java | 6 +- .../security/token/parsers/TokenParser.java | 4 +- .../token/parsers/TokenParserChain.java | 7 +- .../controller/core/util/ApplicationURI.java | 10 +- .../controller/core/util/SecurityUtil.java | 3 +- .../controller/core/util/UriUtil.java | 3 +- .../controller/core/util/UserInfo.java | 2 +- ...ApplicationStartupStateCalculatorTest.java | 21 +- ...ustomControllerClientErrorHandlerTest.java | 18 +- .../cf/detect/DeployedMtaDetectorTest.java | 114 +- .../MtaMetadataEntityAggregatorTest.java | 11 +- ...pplicationRoutesCloudModelBuilderTest.java | 30 +- .../core/cf/v2/CloudModelBuilderTest.java | 2 +- .../core/cf/v3/CloudModelBuilderTest.java | 31 +- .../helpers/ApplicationAttributesTest.java | 17 +- .../ApplicationEnvironmentUpdaterTest.java | 18 +- .../core/helpers/ClientHelperTest.java | 17 +- .../helpers/MtaConfigurationPurgerTest.java | 35 +- .../core/parser/DockerInfoParserTest.java | 11 +- .../parser/StagingParametersParserTest.java | 4 +- .../core/security/token/TokenServiceTest.java | 2 +- .../token/parsers/JwtTokenParserTest.java | 24 +- .../core/util/ApplicationURITest.java | 7 +- .../core/util/SecurityUtilTest.java | 17 +- .../controller/core/util/TestData.java | 3 +- .../src/main/java/module-info.java | 1 - .../client/LoggingCloudControllerClient.java | 57 +- .../process/jobs/OrphanedDataCleaner.java | 15 +- .../DeployAppSubProcessEndListener.java | 13 +- .../process/steps/AddDomainsStep.java | 6 +- .../steps/BindServiceToApplicationStep.java | 8 +- .../BuildApplicationDeployModelStep.java | 12 +- .../steps/BuildCloudDeployModelStep.java | 43 +- .../steps/BuildCloudUndeployModelStep.java | 6 +- .../CalculateServiceKeyForWaitingStep.java | 14 +- .../CheckServiceBindingOperationStep.java | 10 +- .../steps/CheckServiceKeyOperationStep.java | 11 +- .../steps/CheckServiceOperationStateStep.java | 4 +- .../steps/CheckServicesToDeleteStep.java | 12 +- .../steps/ClearMtaMetadataBaseStep.java | 9 +- .../CollectServicesInProgressStateStep.java | 20 +- .../steps/CollectSystemParametersStep.java | 8 +- .../process/steps/CreateOrUpdateAppStep.java | 10 +- .../CreateOrUpdateServiceBrokerStep.java | 18 +- .../process/steps/CreateServiceKeyStep.java | 13 +- .../process/steps/CreateServiceStep.java | 10 +- .../steps/DeleteApplicationRoutesStep.java | 8 +- .../process/steps/DeleteApplicationStep.java | 10 +- .../process/steps/DeleteIdleRoutesStep.java | 10 +- .../steps/DeleteServiceBrokersStep.java | 12 +- .../process/steps/DeleteServiceKeyStep.java | 10 +- .../steps/DeleteServiceMtaMetadataStep.java | 6 +- .../process/steps/DeleteServiceStep.java | 8 +- .../steps/DetachServiceKeysFromMtaStep.java | 4 +- .../steps/DetachServicesFromMtaStep.java | 9 +- .../steps/DetectApplicationsToRenameStep.java | 8 +- .../process/steps/DetectDeployedMtaStep.java | 4 +- ...eApplicationServiceBindingActionsStep.java | 8 +- ...rmineDesiredStateAchievingActionsStep.java | 8 +- .../DetermineServiceBindingsToDeleteStep.java | 6 +- ...ServiceCreateUpdateServiceActionsStep.java | 25 +- ...mineServiceDeleteActionsToExecuteStep.java | 10 +- .../DetermineServiceKeysToRecreateStep.java | 14 +- .../steps/DetermineTasksFromHookStep.java | 4 +- .../process/steps/ExecuteTaskStep.java | 6 +- ...icesWithResolvedDynamicParametersStep.java | 10 +- .../IncrementalAppInstancesUpdateStep.java | 30 +- .../steps/PollExecuteAppStatusExecution.java | 12 +- .../steps/PollExecuteTaskStatusExecution.java | 4 +- ...IncrementalAppInstanceUpdateExecution.java | 28 +- .../steps/PollOperationBaseExecution.java | 8 +- ...lServiceBindingLastOperationExecution.java | 9 +- ...BindingLastOperationFailSafeExecution.java | 3 +- ...ServiceBindingOrKeyOperationExecution.java | 11 +- ...indingUnbindingOperationBaseExecution.java | 10 +- .../PollServiceBrokerOperationsExecution.java | 5 +- ...PollServiceBrokersOperationsExecution.java | 13 +- ...viceCreateOrUpdateOperationsExecution.java | 12 +- .../PollServiceDeleteOperationsExecution.java | 3 +- ...lServiceInProgressOperationsExecution.java | 13 +- ...lServiceKeyCreationOperationExecution.java | 5 +- ...viceKeyDeletionLastOperationExecution.java | 2 +- ...lServiceKeyDeletionOperationExecution.java | 3 +- .../PollServiceKeyLastOperationExecution.java | 10 +- ...viceKeyLastOperationFailSafeExecution.java | 3 +- .../PollServiceKeyOperationExecution.java | 3 +- .../steps/PollServiceOperationsExecution.java | 21 +- ...erviceUnbindingLastOperationExecution.java | 2 +- .../steps/PollStageAppStatusExecution.java | 6 +- ...tartAppExecutionWithRollbackExecution.java | 14 +- .../steps/PollStartAppStatusExecution.java | 10 +- .../steps/PollStartLiveAppExecution.java | 5 +- ...erviceBrokerSubscriberStatusExecution.java | 6 +- .../steps/PollUploadAppStatusExecution.java | 15 +- .../PrepareApplicationForBackupStep.java | 8 +- .../PrepareBackupMtaForDeploymentStep.java | 10 +- .../steps/PrepareToExecuteTasksStep.java | 4 +- ...ToRestartServiceBrokerSubscribersStep.java | 4 +- .../process/steps/ProcessContext.java | 2 +- .../steps/RemoveMtaBackupMetadataStep.java | 6 +- .../RemoveNewApplicationsSuffixStep.java | 16 +- .../process/steps/RenameApplicationsStep.java | 17 +- .../process/steps/RestartAppStep.java | 15 +- .../RestartServiceBrokerSubscriberStep.java | 4 +- .../process/steps/RestartSubscribersStep.java | 10 +- .../process/steps/ScaleAppStep.java | 8 +- .../controller/process/steps/ServiceStep.java | 12 +- .../process/steps/StageAppStep.java | 4 +- .../controller/process/steps/StepsUtil.java | 16 +- .../controller/process/steps/StopAppStep.java | 13 +- .../StopApplicationUndeploymentStep.java | 10 +- .../process/steps/SyncFlowableStep.java | 16 +- .../UnbindServiceFromApplicationStep.java | 26 +- .../process/steps/UndeployAppStep.java | 5 +- .../UpdateServiceBrokerSubscriberStep.java | 14 +- .../steps/UpdateServiceKeysMetadataStep.java | 8 +- .../steps/UpdateServiceMetadataStep.java | 15 +- .../steps/UpdateServiceParametersStep.java | 17 +- .../process/steps/UpdateServicePlanStep.java | 7 +- .../UpdateServiceSyslogDrainUrlStep.java | 18 +- .../process/steps/UpdateServiceTagsStep.java | 12 +- .../process/steps/UpdateSubscribersStep.java | 14 +- .../steps/UploadAppAsyncExecution.java | 41 +- .../process/steps/UploadAppStep.java | 26 +- .../util/ApplicationAttributeUpdater.java | 3 +- .../ApplicationEnvironmentCalculator.java | 4 +- .../process/util/ApplicationStager.java | 20 +- ...pplicationWaitAfterStopVariableGetter.java | 4 +- .../AsyncJobToAsyncExecutionStateAdapter.java | 3 +- .../process/util/CloudPackagesGetter.java | 17 +- .../process/util/ControllerClientFacade.java | 2 +- ...aultApplicationServicesUpdateCallback.java | 9 +- ...letingServiceBindingOperationCallback.java | 9 +- .../DiskQuotaApplicationAttributeUpdater.java | 5 +- ...micResolvableParametersContextUpdater.java | 3 +- ...nvironmentApplicationAttributeUpdater.java | 3 +- .../util/ExistingAppsToBackupCalculator.java | 11 +- .../MemoryApplicationAttributeUpdater.java | 5 +- .../process/util/ModuleDependencyChecker.java | 21 +- .../process/util/ModuleDeterminer.java | 3 +- .../util/OperationInFinalStateHandler.java | 2 +- .../util/ServiceBindingParametersGetter.java | 33 +- .../util/ServiceBindingPollingFactory.java | 3 +- .../util/ServiceKeyPollingFactory.java | 3 +- .../process/util/ServiceOperationGetter.java | 10 +- .../process/util/ServiceProgressReporter.java | 6 +- .../process/util/ServiceRemover.java | 14 +- .../controller/process/util/ServiceUtil.java | 11 +- .../StagingApplicationAttributeUpdater.java | 9 +- .../controller/process/util/StagingState.java | 3 +- .../process/util/TaskHookParser.java | 5 +- .../UnbindServiceFromApplicationCallback.java | 9 +- .../util/UrisApplicationAttributeUpdater.java | 9 +- .../process/variables/Variables.java | 16 +- .../jobs/ConfigurationEntriesCleanerTest.java | 13 +- .../ConfigurationSubscriptionCleanerTest.java | 50 +- ...anageAppServiceBindingEndListenerTest.java | 15 +- .../process/steps/AddDomainsStepTest.java | 7 +- .../BindServiceToApplicationStepTest.java | 42 +- .../steps/BuildCloudDeployModelStepTest.java | 10 +- .../BuildCloudUndeployModelStepTest.java | 6 +- ...CalculateServiceKeyForWaitingStepTest.java | 20 +- .../CheckServiceBindingOperationStepTest.java | 32 +- .../CheckServiceKeyOperationStepTest.java | 16 +- .../CheckServiceOperationStateStepTest.java | 37 +- .../steps/CheckServicesToDeleteStepTest.java | 63 +- ...lectBlueGreenSystemParametersStepTest.java | 8 +- .../CollectSystemParametersStepBaseTest.java | 11 +- .../CollectSystemParametersStepTest.java | 19 +- .../steps/CreateOrUpdateAppStepTest.java | 47 +- .../CreateOrUpdateServiceBrokerStepTest.java | 21 +- ...CreateOrUpdateStepWithExistingAppTest.java | 42 +- .../steps/CreateServiceKeyStepTest.java | 35 +- .../process/steps/CreateServiceStepTest.java | 75 +- .../DeleteApplicationRoutesStepTest.java | 13 +- .../steps/DeleteApplicationStepTest.java | 9 +- .../steps/DeleteIdleRoutesStepTest.java | 63 +- .../steps/DeleteServiceBrokersStepTest.java | 21 +- .../steps/DeleteServiceKeyStepTest.java | 31 +- .../DeleteServiceMtaMetadataStepTest.java | 11 +- .../process/steps/DeleteServiceStepTest.java | 20 +- .../DetachServiceKeysFromMtaStepTest.java | 11 +- .../steps/DetachServicesFromMtaStepTest.java | 15 +- .../DetectApplicationsToRenameStepTest.java | 11 +- .../steps/DetectDeployedMtaStepTest.java | 36 +- ...licationServiceBindingActionsStepTest.java | 79 +- ...iredStateAchievingActionsStepBaseTest.java | 19 +- ...ermineServiceBindingsToDeleteStepTest.java | 11 +- ...iceCreateUpdateServiceActionsStepTest.java | 87 +- ...ServiceDeleteActionsToExecuteStepTest.java | 27 +- ...etermineServiceKeysToRecreateStepTest.java | 61 +- .../process/steps/ExecuteTaskStepTest.java | 17 +- .../IncrementalAppInstanceUpdateStepTest.java | 43 +- .../PollExecuteAppStatusExecutionTest.java | 28 +- .../steps/PollExecuteTaskStatusStepTest.java | 19 +- ...ementalAppInstanceUpdateExecutionTest.java | 13 +- ...viceBindingLastOperationExecutionTest.java | 24 +- ...lServiceBindingOperationExecutionTest.java | 11 +- ...iceBindingOrKeyOperationExecutionTest.java | 29 +- ...lServiceBrokerOperationsExecutionTest.java | 35 +- ...ServiceBrokersOperationsExecutionTest.java | 34 +- ...viceInProgressOperationsExecutionTest.java | 12 +- ...viceKeyCreationOperationExecutionTest.java | 11 +- ...lServiceKeyLastOperationExecutionTest.java | 18 +- ...KeyLastOperationFailSafeExecutionTest.java | 18 +- .../steps/PollServiceOperationsStepTest.java | 4 +- ...erviceUnbindingOperationExecutionTest.java | 11 +- .../PollStageAppStatusExecutionTest.java | 6 +- ...AppExecutionWithRollbackExecutionTest.java | 30 +- .../PollStartAppStatusExecutionTest.java | 14 +- .../steps/PollStartLiveAppExecutionTest.java | 9 +- .../PollUploadAppStatusExecutionTest.java | 32 +- .../PrepareApplicationForBackupStepTest.java | 29 +- .../steps/PrepareToExecuteTasksStepTest.java | 7 +- .../PublishConfigurationEntriesStepTest.java | 41 +- .../RemoveMtaBackupMetadataStepTest.java | 15 +- .../process/steps/RestartAppStepTest.java | 23 +- .../steps/RestartSubscribersStepTest.java | 14 +- .../process/steps/ScaleAppStepTest.java | 11 +- .../process/steps/StageAppStepTest.java | 17 +- .../process/steps/StepsTestUtil.java | 4 +- .../process/steps/StepsUtilTest.java | 16 +- .../process/steps/StopAppStepTest.java | 27 +- .../StopApplicationUndeploymentStepTest.java | 7 +- .../process/steps/SyncFlowableStepTest.java | 4 +- .../controller/process/steps/TestData.java | 7 +- .../UnbindServiceStepFromApplicationTest.java | 51 +- .../process/steps/UndeployAppStepTest.java | 276 +- .../UpdateServiceKeysMetadataStepTest.java | 24 +- .../steps/UpdateServiceMetadataStepTest.java | 20 +- .../UpdateServiceParametersStepTest.java | 5 +- .../steps/UpdateServicePlanStepTest.java | 8 +- .../UpdateServiceSyslogDrainUrlStepTest.java | 29 +- .../steps/UpdateServiceTagsStepTest.java | 8 +- ...UpdateSubscribedServiceBrokerStepTest.java | 15 +- .../steps/UpdateSubscribersStepTest.java | 31 +- .../steps/UploadAppAsyncExecutionTest.java | 54 +- .../steps/UploadAppStepGeneralTest.java | 103 +- .../util/ApplicationColorDetectorTest.java | 9 +- .../ApplicationEnvironmentCalculatorTest.java | 23 +- .../process/util/ApplicationStagerTest.java | 26 +- ...cationWaitAfterStopVariableGetterTest.java | 4 +- .../process/util/CloudPackagesGetterTest.java | 29 +- ...tionEntryDynamicParameterResolverTest.java | 45 +- .../ExistingAppsToBackupCalculatorTest.java | 230 +- .../ServiceBindingParametersGetterTest.java | 74 +- .../util/ServiceOperationGetterTest.java | 17 +- .../util/ServiceProgressReporterTest.java | 13 +- .../process/util/ServiceRemoverTest.java | 18 +- .../UrisApplicationAttributeUpdaterTest.java | 19 +- .../src/main/java/module-info.java | 2 +- .../client/ApplicationShutdownExecutor.java | 14 +- .../web/api/impl/MtasApiServiceImpl.java | 4 +- .../api/impl/OperationsApiServiceImpl.java | 11 +- .../configuration/SecurityConfiguration.java | 8 +- .../configuration/UAAClientConfiguration.java | 10 +- .../web/resources/CFExceptionMapper.java | 6 +- .../ConfigurationEntriesResource.java | 2 +- .../security/AuthenticationLoaderFilter.java | 16 +- .../web/security/AuthorizationChecker.java | 8 +- .../web/util/BasicTokenGenerator.java | 8 +- .../web/util/OauthTokenGenerator.java | 2 +- .../controller/web/util/TokenGenerator.java | 4 +- .../controller/web/util/TokenReuser.java | 2 +- .../web/api/impl/MtasApiServiceImplTest.java | 27 +- .../impl/OperationsApiServiceImplTest.java | 10 +- .../web/resources/CFExceptionMapperTest.java | 17 +- .../AuthenticationLoaderFilterTest.java | 30 +- .../security/AuthorizationCheckerTest.java | 23 +- .../web/util/BasicTokenGeneratorTest.java | 10 +- .../web/util/OauthTokenGeneratorTest.java | 19 +- .../controller/web/util/TokenReuserTest.java | 2 +- pom.xml | 19 +- 481 files changed, 15751 insertions(+), 2930 deletions(-) create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/ApplicationLogListener.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/ApplicationServicesUpdateCallback.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudControllerClient.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudControllerClientImpl.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudControllerException.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudCredentials.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudException.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudOperationException.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudServiceBrokerException.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/Constants.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/Messages.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/Nullable.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/ServiceBindingOperationCallback.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/SkipNulls.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/UploadStatusCallback.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/ApplicationLogEntity.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/ApplicationLogsResponse.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/CloudFoundryClientFactory.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/LogCacheClient.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/OAuthTokenProvider.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudApplication.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudAsyncJob.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudBuild.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudDomain.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudEntity.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudEvent.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudPackage.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudProcess.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudRoute.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceBinding.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceBroker.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceInstance.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceKey.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceOffering.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServicePlan.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudStack.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudTask.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawInstancesInfo.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawUserRole.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawV3CloudServiceInstance.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/ApplicationLog.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/ApplicationLogs.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/BitsData.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudApplication.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudAsyncJob.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudBuild.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudDomain.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudEntity.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudEvent.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudJob.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudMetadata.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudOrganization.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudPackage.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudProcess.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudRoute.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudServiceBinding.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudServiceBroker.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudServiceInstance.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudServiceKey.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudServiceOffering.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudServicePlan.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudSpace.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudStack.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudTask.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/Derivable.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/DockerCredentials.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/DockerData.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/DockerInfo.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/DropletInfo.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/ErrorDetails.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/HealthCheckType.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/InstanceInfo.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/InstanceState.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/InstancesInfo.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/Lifecycle.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/LifecycleType.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/PackageState.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/RouteDestination.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/SecurityGroupRule.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/ServiceCredentialBindingOperation.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/ServiceOperation.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/ServicePlanVisibility.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/Staging.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/Status.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/Upload.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/UserRole.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/dto/ApplicationToCreateDto.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/oauth2/OAuth2AccessTokenWithAdditionalInfo.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/oauth2/OAuthClient.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/oauth2/Oauth2AccessTokenResponse.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/oauth2/TokenFactory.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerResponseErrorHandler.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerRestClient.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerRestClientFactory.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerRestClientImpl.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudSpaceClient.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/util/AuthorizationEndpointGetter.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/util/CloudUtil.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/util/JobV3Util.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/util/JsonUtil.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/util/RestUtil.java create mode 100644 multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/util/UriUtil.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/ApplicationUtil.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/ApplicationsCloudControllerClientIntegrationTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/CloudControllerClientIntegrationTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/CloudStackIntegrationTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/DomainsCloudControllerClientIntegrationTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/ITVariable.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/IntegrationTestConstants.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/ServicesCloudControllerClientIntegrationTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudApplicationTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudAsyncJobTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudBuildTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudDomainTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudEntityTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudEventTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudPackageTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudRouteTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceBindingTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceBrokerTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceInstanceTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceKeyTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceOfferingTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServicePlanTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudStackTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudTaskTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawInstancesInfoTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawUserRoleTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/broker/FailConfiguration.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/broker/ServiceBrokerConfiguration.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/oauth2/TokenFactoryTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerResponseErrorHandlerTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerRestClientImplTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/util/JsonUtilTest.java create mode 100644 multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/util/UriUtilTest.java create mode 100644 multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/rest/v2-error.json create mode 100644 multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/rest/v3-error.json create mode 100644 multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/service-broker-env.json create mode 100644 multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/util/application.json create mode 100644 multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/util/build.json create mode 100644 multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/util/package.json create mode 100644 multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/util/service-instance.json create mode 100644 multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/util/task.json diff --git a/multiapps-controller-client/pom.xml b/multiapps-controller-client/pom.xml index 46b5c774a1..d118963a47 100644 --- a/multiapps-controller-client/pom.xml +++ b/multiapps-controller-client/pom.xml @@ -1,5 +1,5 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 multiapps-controller-client @@ -22,17 +22,13 @@ log4j-core - org.apache.logging.log4j - log4j-api + org.apache.logging.log4j + log4j-api org.slf4j slf4j-api - - com.sap.cloud.lm.sl - cloudfoundry-client-facade - org.cloudfoundry.multiapps multiapps-common @@ -44,18 +40,129 @@ org.springframework.security spring-security-config - ${spring-security.version} org.springframework.security spring-security-web - ${spring-security.version} + + + + org.springframework + spring-webflux + + + + org.springframework + spring-jcl + + org.springframework.security spring-security-oauth2-client - ${spring-security.version} + + + + com.fasterxml.jackson.core + jackson-core + + + + com.fasterxml.jackson.core + jackson-databind + + + + commons-io + commons-io + + + + org.immutables + value + provided + + + + org.cloudfoundry + cloudfoundry-client-reactor + + + + + io.projectreactor.netty + reactor-netty + + + + + io.micrometer + micrometer-core + ${micrometer.version} + + + + integration + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.5.3 + + + **/* + + + + + maven-failsafe-plugin + 3.2.5 + + + + integration-test + verify + + + + + + **/*IntegrationTest + + + + + + + + org.cloudfoundry + cloudfoundry-client-reactor + ${cloudfoundry-client.version} + + + + org.slf4j + jcl-over-slf4j + + + + + + commons-logging + commons-logging + ${commons-logging.version} + + + + \ No newline at end of file diff --git a/multiapps-controller-client/src/main/java/module-info.java b/multiapps-controller-client/src/main/java/module-info.java index f4beda24b9..4201bc0a0b 100644 --- a/multiapps-controller-client/src/main/java/module-info.java +++ b/multiapps-controller-client/src/main/java/module-info.java @@ -4,18 +4,32 @@ exports org.cloudfoundry.multiapps.controller.client.lib.domain; exports org.cloudfoundry.multiapps.controller.client.uaa; exports org.cloudfoundry.multiapps.controller.client.util; + exports org.cloudfoundry.multiapps.controller.client.facade; + exports org.cloudfoundry.multiapps.controller.client.facade.rest; + exports org.cloudfoundry.multiapps.controller.client.facade.oauth2; + exports org.cloudfoundry.multiapps.controller.client.facade.domain; + exports org.cloudfoundry.multiapps.controller.client.facade.adapters; + exports org.cloudfoundry.multiapps.controller.client.facade.util; + exports org.cloudfoundry.multiapps.controller.client.facade.dto; requires transitive org.cloudfoundry.client; - requires transitive com.sap.cloudfoundry.client.facade; requires spring.security.oauth2.core; requires transitive spring.web; + requires com.fasterxml.jackson.databind; requires org.apache.commons.collections4; + requires org.apache.commons.io; + requires org.apache.commons.logging; + requires org.cloudfoundry.client.reactor; requires org.cloudfoundry.multiapps.common; + requires org.cloudfoundry.util; requires org.slf4j; + requires java.net.http; requires spring.core; requires spring.webflux; requires reactor.core; + requires reactor.netty.core; + requires reactor.netty.http; requires org.reactivestreams; requires io.netty.handler; requires io.netty.transport; diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/CloudFoundryTokenProvider.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/CloudFoundryTokenProvider.java index e126350e74..2f50664905 100644 --- a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/CloudFoundryTokenProvider.java +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/CloudFoundryTokenProvider.java @@ -1,7 +1,7 @@ package org.cloudfoundry.multiapps.controller.client; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; -import com.sap.cloudfoundry.client.facade.oauth2.OAuthClient; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuthClient; public class CloudFoundryTokenProvider implements TokenProvider { diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/ResilientCloudControllerClient.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/ResilientCloudControllerClient.java index 1c92c5522e..51023de044 100644 --- a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/ResilientCloudControllerClient.java +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/ResilientCloudControllerClient.java @@ -11,40 +11,39 @@ import java.util.function.Supplier; import org.cloudfoundry.client.v3.Metadata; +import org.cloudfoundry.multiapps.controller.client.facade.ApplicationServicesUpdateCallback; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClientImpl; +import org.cloudfoundry.multiapps.controller.client.facade.ServiceBindingOperationCallback; +import org.cloudfoundry.multiapps.controller.client.facade.UploadStatusCallback; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudAsyncJob; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudBuild; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudDomain; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudEvent; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudProcess; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBroker; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceOffering; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudStack; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudTask; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DockerInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DropletInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstancesInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServicePlanVisibility; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Staging; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Upload; +import org.cloudfoundry.multiapps.controller.client.facade.domain.UserRole; +import org.cloudfoundry.multiapps.controller.client.facade.dto.ApplicationToCreateDto; +import org.cloudfoundry.multiapps.controller.client.facade.rest.CloudControllerRestClient; import org.cloudfoundry.multiapps.controller.client.util.ResilientCloudOperationExecutor; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.ApplicationServicesUpdateCallback; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudControllerClientImpl; -import com.sap.cloudfoundry.client.facade.ServiceBindingOperationCallback; -import com.sap.cloudfoundry.client.facade.UploadStatusCallback; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudAsyncJob; -import com.sap.cloudfoundry.client.facade.domain.CloudBuild; -import com.sap.cloudfoundry.client.facade.domain.CloudDomain; -import com.sap.cloudfoundry.client.facade.domain.CloudEvent; -import com.sap.cloudfoundry.client.facade.domain.CloudPackage; -import com.sap.cloudfoundry.client.facade.domain.CloudProcess; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBroker; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceOffering; -import com.sap.cloudfoundry.client.facade.domain.CloudSpace; -import com.sap.cloudfoundry.client.facade.domain.CloudStack; -import com.sap.cloudfoundry.client.facade.domain.CloudTask; -import com.sap.cloudfoundry.client.facade.domain.DockerInfo; -import com.sap.cloudfoundry.client.facade.domain.DropletInfo; -import com.sap.cloudfoundry.client.facade.domain.InstancesInfo; -import com.sap.cloudfoundry.client.facade.domain.ServicePlanVisibility; -import com.sap.cloudfoundry.client.facade.domain.Staging; -import com.sap.cloudfoundry.client.facade.domain.Upload; -import com.sap.cloudfoundry.client.facade.domain.UserRole; -import com.sap.cloudfoundry.client.facade.dto.ApplicationToCreateDto; -import com.sap.cloudfoundry.client.facade.rest.CloudControllerRestClient; - public class ResilientCloudControllerClient implements CloudControllerClient { private final CloudControllerClientImpl delegate; @@ -400,11 +399,11 @@ public void updateServiceSyslogDrainUrl(String serviceName, String syslogDrainUr public CloudPackage asyncUploadApplicationWithExponentialBackoff(String applicationName, Path file, UploadStatusCallback callback, Duration overrideTimeout) { if (overrideTimeout != null) { - return executeWithRetry(() -> delegate.asyncUploadApplicationWithExponentialBackoff(applicationName, file, callback, - overrideTimeout)); + return executeWithRetry( + () -> delegate.asyncUploadApplicationWithExponentialBackoff(applicationName, file, callback, overrideTimeout)); } - return executeWithExponentialBackoff(timeout -> delegate.asyncUploadApplicationWithExponentialBackoff(applicationName, file, - callback, timeout)); + return executeWithExponentialBackoff( + timeout -> delegate.asyncUploadApplicationWithExponentialBackoff(applicationName, file, callback, timeout)); } @Override @@ -550,8 +549,8 @@ public List getBuildsForApplication(UUID applicationGuid) { @Override public Optional unbindServiceInstance(String applicationName, String serviceInstanceName, ApplicationServicesUpdateCallback applicationServicesUpdateCallback) { - return executeWithRetry(() -> delegate.unbindServiceInstance(applicationName, serviceInstanceName, - applicationServicesUpdateCallback)); + return executeWithRetry( + () -> delegate.unbindServiceInstance(applicationName, serviceInstanceName, applicationServicesUpdateCallback)); } @Override diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/TokenProvider.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/TokenProvider.java index 4c62cef357..41f79f3aee 100644 --- a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/TokenProvider.java +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/TokenProvider.java @@ -1,6 +1,6 @@ package org.cloudfoundry.multiapps.controller.client; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; public interface TokenProvider { diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/ApplicationLogListener.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/ApplicationLogListener.java new file mode 100644 index 0000000000..2fa158f172 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/ApplicationLogListener.java @@ -0,0 +1,13 @@ +package org.cloudfoundry.multiapps.controller.client.facade; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.ApplicationLog; + +public interface ApplicationLogListener { + + void onComplete(); + + void onError(Throwable exception); + + void onMessage(ApplicationLog log); + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/ApplicationServicesUpdateCallback.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/ApplicationServicesUpdateCallback.java new file mode 100644 index 0000000000..f1e1bb6569 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/ApplicationServicesUpdateCallback.java @@ -0,0 +1,6 @@ +package org.cloudfoundry.multiapps.controller.client.facade; + +public interface ApplicationServicesUpdateCallback { + + void onError(CloudOperationException e, String applicationName, String serviceInstanceName); +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudControllerClient.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudControllerClient.java new file mode 100644 index 0000000000..38248b40a0 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudControllerClient.java @@ -0,0 +1,734 @@ +package org.cloudfoundry.multiapps.controller.client.facade; + +import java.nio.file.Path; +import java.time.Duration; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; + +import org.cloudfoundry.client.v3.Metadata; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudAsyncJob; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudBuild; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudDomain; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudEvent; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudProcess; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBroker; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceOffering; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudStack; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudTask; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DockerInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DropletInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstancesInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServicePlanVisibility; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Staging; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Upload; +import org.cloudfoundry.multiapps.controller.client.facade.domain.UserRole; +import org.cloudfoundry.multiapps.controller.client.facade.dto.ApplicationToCreateDto; + +/** + * The interface defining operations making up the Cloud Foundry Java client's API. + * + */ +public interface CloudControllerClient { + + CloudSpace getTarget(); + + /** + * Add a private domain in the current organization. + * + * @param domainName the domain to add + */ + void addDomain(String domainName); + + /** + * Register a new route to the a domain. + * + * @param host the host of the route to register + * @param domainName the domain of the route to register + */ + void addRoute(String host, String domainName, String path); + + /** + * Associate (provision) a service with an application. + * + * @param bindingName the binding name + * @param applicationName the application name + * @param serviceInstanceName the service instance name + * @return job id for async polling if present + */ + Optional bindServiceInstance(String bindingName, String applicationName, String serviceInstanceName); + + /** + * Associate (provision) a service with an application. + * + * @param bindingName the binding name + * @param applicationName the application name + * @param serviceInstanceName the service instance name + * @param parameters the binding parameters + * @param updateServicesCallback callback used for error handling + * @return job id for async polling if present + */ + Optional bindServiceInstance(String bindingName, String applicationName, String serviceInstanceName, + Map parameters, ApplicationServicesUpdateCallback updateServicesCallback); + + /** + * Create application + * + * @param applicationToCreateDto the application's parameters used for its creation + */ + void createApplication(ApplicationToCreateDto applicationToCreateDto); + + /** + * Create a service instance. + * + * @param serviceInstance cloud service instance info + */ + void createServiceInstance(CloudServiceInstance serviceInstance); + + /** + * Create a service broker. + * + * @param serviceBroker cloud service broker info + * @return job id for async poll + */ + String createServiceBroker(CloudServiceBroker serviceBroker); + + /** + * + * @param keyModel service-key cloud object + * @param serviceInstanceName name of related service instance + * @return the service-key object populated with new guid + */ + CloudServiceKey createAndFetchServiceKey(CloudServiceKey keyModel, String serviceInstanceName); + + /** + * + * @param keyModel service-key cloud object + * @param serviceInstanceName name of related service instance + * @return job id for async polling if present + */ + Optional createServiceKey(CloudServiceKey keyModel, String serviceInstanceName); + + /** + * Create a service key. + * + * @param serviceInstanceName name of service instance + * @param serviceKeyName name of service-key + * @param parameters parameters of service-key + * @return job id for async polling if present + */ + Optional createServiceKey(String serviceInstanceName, String serviceKeyName, Map parameters); + + /** + * Create a user-provided service instance. + * + * @param serviceInstance cloud service instance info + */ + void createUserProvidedServiceInstance(CloudServiceInstance serviceInstance); + + /** + * Delete application. + * + * @param applicationName name of application + */ + void deleteApplication(String applicationName); + + /** + * Delete a private domain in the current organization. + * + * @param domainName the domain to delete + */ + void deleteDomain(String domainName); + + /** + * Delete routes that do not have any application which is assigned to them. + */ + void deleteOrphanedRoutes(); + + /** + * Delete a registered route from the space of the current session. + * + * @param host the host of the route to delete + * @param domainName the domain of the route to delete + */ + void deleteRoute(String host, String domainName, String path); + + /** + * Delete cloud service instance. + * + * @param serviceInstance name of service instance + */ + void deleteServiceInstance(String serviceInstance); + + /** + * + * @param serviceInstance {@link CloudServiceInstance} + */ + void deleteServiceInstance(CloudServiceInstance serviceInstance); + + /** + * Delete a service broker. + * + * @param name the service broker name + * @return async job id + */ + String deleteServiceBroker(String name); + + /** + * Get a service binding + * + * @param serviceBindingId the id of the service binding + * @return the service binding + */ + CloudServiceBinding getServiceBinding(UUID serviceBindingId); + + /** + * Delete a service binding. + * + * @param serviceInstanceName name of service instance + * @param serviceKeyName name of service key + * @return job id for async polling if present + */ + Optional deleteServiceBinding(String serviceInstanceName, String serviceKeyName); + + /** + * Delete a service binding. + * + * @param bindingGuid The GUID of the binding + * @param serviceBindingOperationCallback callback used for error handling + * @return job id for async polling if present + */ + Optional deleteServiceBinding(UUID bindingGuid, ServiceBindingOperationCallback serviceBindingOperationCallback); + + /** + * Delete a service binding. + * + * @param bindingGuid The GUID of the binding + * @return job id for async polling if present + */ + Optional deleteServiceBinding(UUID bindingGuid); + + /** + * Get cloud application with the specified name. + * + * @param applicationName name of the app + * @return the cloud application + */ + CloudApplication getApplication(String applicationName); + + /** + * Get cloud application with the specified name. + * + * @param applicationName name of the app + * @param required if true, and organization is not found, throw an exception + * @return the cloud application + */ + CloudApplication getApplication(String applicationName, boolean required); + + /** + * Get the GUID of the cloud application with the specified name. + * + * @param applicationName name of the app + * @return the cloud application's guid + */ + UUID getApplicationGuid(String applicationName); + + String getApplicationName(UUID applicationGuid); + + /** + * Get application environment variables for the app with the specified name. + * + * @param applicationName name of the app + * @return the cloud application environment variables + */ + Map getApplicationEnvironment(String applicationName); + + /** + * Get application environment variables for the app with the specified GUID. + * + * @param applicationGuid GUID of the app + * @return the cloud application environment variables + */ + Map getApplicationEnvironment(UUID applicationGuid); + + /** + * Get application events. + * + * @param applicationName name of application + * @return application events + */ + List getApplicationEvents(String applicationName); + + List getEventsByActee(UUID uuid); + + /** + * Get application instances info for application. + * + * @param app the application. + * @return instances info + */ + InstancesInfo getApplicationInstances(CloudApplication app); + + InstancesInfo getApplicationInstances(UUID applicationGuid); + + CloudProcess getApplicationProcess(UUID applicationGuid); + + List getApplicationRoutes(UUID applicationGuid); + + boolean getApplicationSshEnabled(UUID applicationGuid); + + /** + * Get all applications in the currently targeted space. This method has EXTREMELY poor performance for spaces with a lot of + * applications. + * + * @return list of applications + */ + List getApplications(); + + /** + * Gets the default domain for the current org, which is the first shared domain. + * + * @return the default domain + */ + CloudDomain getDefaultDomain(); + + /** + * Get list of all domain shared and private domains. + * + * @return list of domains + */ + List getDomains(); + + /** + * Get list of all domain registered for the current organization. + * + * @return list of domains + */ + List getDomainsForOrganization(); + + /** + * Get system events. + * + * @return all system events + */ + List getEvents(); + + /** + * Get list of all private domains. + * + * @return list of private domains + */ + List getPrivateDomains(); + + /** + * Get the info for all routes for a domain. + * + * @param domainName the domain the routes belong to + * @return list of routes + */ + List getRoutes(String domainName); + + /** + * Get a service broker. + * + * @param name the service broker name + * @return the service broker + */ + CloudServiceBroker getServiceBroker(String name); + + /** + * Get a service broker. + * + * @param name the service broker name + * @param required if true, and organization is not found, throw an exception + * @return the service broker + */ + CloudServiceBroker getServiceBroker(String name, boolean required); + + /** + * Get all service brokers. + * + * @return the service brokers + */ + List getServiceBrokers(); + + /** + * Get the GUID of a service instance. + * + * @param serviceInstanceName the name of the service instance + * @return the service instance GUID + */ + UUID getRequiredServiceInstanceGuid(String serviceInstanceName); + + /** + * Get a service instance. + * + * @param serviceInstanceName name of the service instance + * @return the service instance info + */ + CloudServiceInstance getServiceInstance(String serviceInstanceName); + + /** + * Get a service instance. + * + * @param serviceInstanceName name of the service instance + * @param required if true, and service instance is not found, throw an exception + * @return the service instance info + */ + CloudServiceInstance getServiceInstance(String serviceInstanceName, boolean required); + + /** + * Get a service instance name. + * + * @param serviceInstanceGuid GUID of the service instance + * @return the service instance name + */ + String getServiceInstanceName(UUID serviceInstanceGuid); + + /** + * Get a service instance. + * + * @param serviceInstanceName name of the service instance + * @return the service instance info + */ + CloudServiceInstance getServiceInstanceWithoutAuxiliaryContent(String serviceInstanceName); + + /** + * Get a service instance. + * + * @param serviceInstanceName name of the service instance + * @param required if true, and service instance is not found, throw an exception + * @return the service instance info + */ + CloudServiceInstance getServiceInstanceWithoutAuxiliaryContent(String serviceInstanceName, boolean required); + + /** + * Get the bindings for a particular service instance. + * + * @param serviceInstanceGuid the GUID of the service instance + * @return the bindings + */ + List getServiceAppBindings(UUID serviceInstanceGuid); + + /** + * Get the bindings for a particular application. + * + * @param applicationGuid the GUID of the application + * @return the bindings + */ + List getAppBindings(UUID applicationGuid); + + /** + * Get the binding between an application and a service instance. + * + * @param applicationId the GUID of the application + * @param serviceInstanceGuid the GUID of the service instance + * @return the binding + */ + CloudServiceBinding getServiceBindingForApplication(UUID applicationId, UUID serviceInstanceGuid); + + /** + * Get all service instance parameters. + * + * @param guid The service instance guid + * @return service instance parameters in key-value pairs + */ + Map getServiceInstanceParameters(UUID guid); + + /** + * Get all user-provided service instance parameters + * + * @param guid The service instance guid + * @return user-provided service instance parameters in key-value pairs + */ + Map getUserProvidedServiceInstanceParameters(UUID guid); + + /** + * Get all service binding parameters. + * + * @param guid The service binding guid + * @return service binding parameters in key-value pairs + */ + Map getServiceBindingParameters(UUID guid); + + /** + * Get a service key. + * + * @param serviceInstanceName The service instance name + * @param serviceKeyName The service key name + * @return the service key info + */ + CloudServiceKey getServiceKey(String serviceInstanceName, String serviceKeyName); + + /** + * Get service keys for a service instance. + * + * @param serviceInstanceName name containing service keys + * @return the service keys info + */ + List getServiceKeys(String serviceInstanceName); + + List getServiceKeysWithCredentials(String serviceInstanceName); + + /** + * Get service keys for a service instance. + * + * @param serviceInstance instance containing service keys + * @return the service keys info + */ + List getServiceKeys(CloudServiceInstance serviceInstance); + + List getServiceKeysWithCredentials(CloudServiceInstance serviceInstance); + + /** + * Get all service offerings. + * + * @return list of service offerings + */ + List getServiceOfferings(); + + /** + * Get list of all shared domains. + * + * @return list of shared domains + */ + List getSharedDomains(); + + /** + * Get a stack by name. + * + * @param name the name of the stack to get + * @return the stack + */ + CloudStack getStack(String name); + + /** + * Get a stack by name. + * + * @param name the name of the stack to get + * @param required if true, and organization is not found, throw an exception + * @return the stack, or null if not found + */ + CloudStack getStack(String name, boolean required); + + /** + * Get the list of stacks available for staging applications. + * + * @return the list of available stacks + */ + List getStacks(); + + /** + * Rename an application. + * + * @param applicationName the current name + * @param newName the new name + */ + void rename(String applicationName, String newName); + + /** + * Restart application. + * + * @param applicationName name of application + */ + void restartApplication(String applicationName); + + /** + * Start application. May return starting info if the response obtained after the start request contains headers . If the response does + * not contain headers, null is returned instead. + * + * @param applicationName name of application + */ + void startApplication(String applicationName); + + /** + * Stop application. + * + * @param applicationName name of application + */ + void stopApplication(String applicationName); + + /** + * Un-associate (unprovision) a service from an application. + * + * @param applicationName the application name + * @param serviceInstanceName the service instance name + * @param applicationServicesUpdateCallback callback used for error handling + * @return job id for async polling if present + */ + Optional unbindServiceInstance(String applicationName, String serviceInstanceName, + ApplicationServicesUpdateCallback applicationServicesUpdateCallback); + + /** + * Un-associate (unprovision) a service from an application. + * + * @param applicationName the application name + * @param serviceInstanceName the service instance name + * @return job id for async polling if present + */ + Optional unbindServiceInstance(String applicationName, String serviceInstanceName); + + /** + * Un-associate (unprovision) a service from an application. + * + * @param applicationGuid the application guid + * @param serviceInstanceGuid the service instance guid + * @return job id for async polling if present + */ + Optional unbindServiceInstance(UUID applicationGuid, UUID serviceInstanceGuid); + + /** + * Update application disk quota. + * + * @param applicationName name of application + * @param disk new disk setting in MB + */ + void updateApplicationDiskQuota(String applicationName, int disk); + + /** + * Update application env using a map where the key specifies the name of the environment variable and the value the value of the + * environment variable.. + * + * @param applicationName name of application + * @param env map of environment settings + */ + void updateApplicationEnv(String applicationName, Map env); + + /** + * Update application instances. + * + * @param applicationName name of application + * @param instances number of instances to use + */ + void updateApplicationInstances(String applicationName, int instances); + + /** + * Update application memory. + * + * @param applicationName name of application + * @param memory new memory setting in MB + */ + void updateApplicationMemory(String applicationName, int memory); + + /** + * Update application staging information. + * + * @param applicationName name of appplication + * @param staging staging information for the app + */ + void updateApplicationStaging(String applicationName, Staging staging); + + /** + * Update application Routes. + * + * @param applicationName name of application + * @param routes list of route summary info for the routes the app should use + */ + void updateApplicationRoutes(String applicationName, Set routes); + + /** + * Update a service broker (unchanged forces catalog refresh). + * + * @param serviceBroker cloud service broker info + * @return async job id + */ + String updateServiceBroker(CloudServiceBroker serviceBroker); + + /** + * Service plans are private by default when a service broker's catalog is fetched/updated. This method will update the visibility of + * all plans for a broker to either public or private. + * + * @param name the service broker name + * @param visibility true for public, false for private + */ + void updateServicePlanVisibilityForBroker(String name, ServicePlanVisibility visibility); + + void updateServicePlan(String serviceName, String planName); + + void updateServiceParameters(String serviceName, Map parameters); + + void updateServiceTags(String serviceName, List tags); + + void updateServiceSyslogDrainUrl(String serviceName, String syslogDrainUrl); + + CloudPackage asyncUploadApplicationWithExponentialBackoff(String applicationName, Path file, UploadStatusCallback callback, + Duration overrideTimeout); + + Upload getUploadStatus(UUID packageGuid); + + CloudTask getTask(UUID taskGuid); + + /** + * Get the list of one-off tasks currently known for the given application. + * + * @param applicationName the application to look for tasks + * @return the list of known tasks + * @throws UnsupportedOperationException if the targeted controller does not support tasks + */ + List getTasks(String applicationName); + + /** + * Run a one-off task on an application. + * + * @param applicationName the application to run the task on + * @param task the task to run + * @return the ran task + * @throws UnsupportedOperationException if the targeted controller does not support tasks + */ + CloudTask runTask(String applicationName, CloudTask task); + + /** + * Cancel the given task. + * + * @param taskGuid the GUID of the task to cancel + * @return the cancelled task + */ + CloudTask cancelTask(UUID taskGuid); + + CloudBuild createBuild(UUID packageGuid); + + CloudBuild getBuild(UUID buildGuid); + + void bindDropletToApp(UUID dropletGuid, UUID applicationGuid); + + List getBuildsForApplication(UUID applicationGuid); + + List getBuildsForPackage(UUID packageGuid); + + List getApplicationsByMetadataLabelSelector(String labelSelector); + + void updateApplicationMetadata(UUID guid, Metadata metadata); + + void updateServiceInstanceMetadata(UUID guid, Metadata metadata); + + void updateServiceBindingMetadata(UUID guid, Metadata metadata); + + List getServiceInstancesWithoutAuxiliaryContentByNames(List names); + + List getServiceInstancesByMetadataLabelSelector(String labelSelector); + + List getServiceInstancesWithoutAuxiliaryContentByMetadataLabelSelector(String labelSelector); + + DropletInfo getCurrentDropletForApplication(UUID applicationGuid); + + CloudPackage getPackage(UUID packageGuid); + + List getPackagesForApplication(UUID applicationGuid); + + Set getUserRolesBySpaceAndUser(UUID spaceGuid, UUID userGuid); + + CloudPackage createDockerPackage(UUID applicationGuid, DockerInfo dockerInfo); + + CloudAsyncJob getAsyncJob(String jobId); + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudControllerClientImpl.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudControllerClientImpl.java new file mode 100644 index 0000000000..648d07210d --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudControllerClientImpl.java @@ -0,0 +1,669 @@ +package org.cloudfoundry.multiapps.controller.client.facade; + +import java.net.URL; +import java.nio.file.Path; +import java.time.Duration; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; +import java.util.function.Supplier; + +import org.cloudfoundry.AbstractCloudFoundryException; +import org.cloudfoundry.client.v3.Metadata; +import org.springframework.http.HttpStatus; +import org.springframework.util.Assert; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudAsyncJob; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudBuild; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudDomain; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudEvent; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudProcess; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBroker; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceOffering; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudStack; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudTask; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DockerInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DropletInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstancesInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServicePlanVisibility; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Staging; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Upload; +import org.cloudfoundry.multiapps.controller.client.facade.domain.UserRole; +import org.cloudfoundry.multiapps.controller.client.facade.dto.ApplicationToCreateDto; +import org.cloudfoundry.multiapps.controller.client.facade.rest.CloudControllerRestClient; +import org.cloudfoundry.multiapps.controller.client.facade.rest.CloudControllerRestClientFactory; +import org.cloudfoundry.multiapps.controller.client.facade.rest.ImmutableCloudControllerRestClientFactory; + +/** + * A Java client to exercise the Cloud Foundry API. + * + */ +public class CloudControllerClientImpl implements CloudControllerClient { + + private CloudControllerRestClient delegate; + + /** + * Construct client without a default organization and space. + */ + public CloudControllerClientImpl(URL controllerUrl, CloudCredentials credentials) { + this(controllerUrl, credentials, null, false); + } + + public CloudControllerClientImpl(URL controllerUrl, CloudCredentials credentials, CloudSpace target, boolean trustSelfSignedCerts) { + Assert.notNull(controllerUrl, "URL for cloud controller cannot be null"); + CloudControllerRestClientFactory restClientFactory = ImmutableCloudControllerRestClientFactory.builder() + .shouldTrustSelfSignedCertificates(trustSelfSignedCerts) + .build(); + this.delegate = restClientFactory.createClient(controllerUrl, credentials, target); + } + + /** + * Construct a client with a pre-configured CloudControllerClient + */ + public CloudControllerClientImpl(CloudControllerRestClient delegate) { + this.delegate = delegate; + } + + @Override + public CloudSpace getTarget() { + return delegate.getTarget(); + } + + @Override + public void addDomain(String domainName) { + handleExceptions(() -> delegate.addDomain(domainName)); + } + + @Override + public void addRoute(String host, String domainName, String path) { + handleExceptions(() -> delegate.addRoute(host, domainName, path)); + } + + @Override + public Optional bindServiceInstance(String bindingName, String applicationName, String serviceInstanceName) { + return handleExceptions(() -> delegate.bindServiceInstance(bindingName, applicationName, serviceInstanceName)); + } + + @Override + public Optional bindServiceInstance(String bindingName, String applicationName, String serviceInstanceName, + Map parameters, ApplicationServicesUpdateCallback updateServicesCallback) { + try { + return handleExceptions(() -> delegate.bindServiceInstance(bindingName, applicationName, serviceInstanceName, parameters)); + } catch (CloudOperationException e) { + updateServicesCallback.onError(e, applicationName, serviceInstanceName); + } + return Optional.empty(); + } + + @Override + public void createApplication(ApplicationToCreateDto applicationToCreateDto) { + handleExceptions(() -> delegate.createApplication(applicationToCreateDto)); + } + + @Override + public void createServiceInstance(CloudServiceInstance serviceInstance) { + handleExceptions(() -> delegate.createServiceInstance(serviceInstance)); + } + + @Override + public String createServiceBroker(CloudServiceBroker serviceBroker) { + return handleExceptions(() -> delegate.createServiceBroker(serviceBroker)); + } + + @Override + public CloudServiceKey createAndFetchServiceKey(CloudServiceKey keyModel, String serviceInstanceName) { + return handleExceptions(() -> delegate.createAndFetchServiceKey(keyModel, serviceInstanceName)); + } + + @Override + public Optional createServiceKey(CloudServiceKey keyModel, String serviceInstanceName) { + return handleExceptions(() -> delegate.createServiceKey(keyModel, serviceInstanceName)); + } + + @Override + public Optional createServiceKey(String serviceInstanceName, String serviceKeyName, Map parameters) { + return handleExceptions(() -> delegate.createServiceKey(serviceInstanceName, serviceKeyName, parameters)); + } + + @Override + public void createUserProvidedServiceInstance(CloudServiceInstance serviceInstance) { + handleExceptions(() -> delegate.createUserProvidedServiceInstance(serviceInstance)); + } + + @Override + public void deleteApplication(String applicationName) { + handleExceptions(() -> delegate.deleteApplication(applicationName)); + } + + @Override + public void deleteDomain(String domainName) { + handleExceptions(() -> delegate.deleteDomain(domainName)); + } + + @Override + public void deleteOrphanedRoutes() { + handleExceptions(() -> delegate.deleteOrphanedRoutes()); + } + + @Override + public void deleteRoute(String host, String domainName, String path) { + handleExceptions(() -> delegate.deleteRoute(host, domainName, path)); + } + + @Override + public void deleteServiceInstance(String serviceInstanceName) { + handleExceptions(() -> delegate.deleteServiceInstance(serviceInstanceName)); + } + + @Override + public void deleteServiceInstance(CloudServiceInstance serviceInstance) { + handleExceptions(() -> delegate.deleteServiceInstance(serviceInstance)); + } + + @Override + public String deleteServiceBroker(String name) { + return handleExceptions(() -> delegate.deleteServiceBroker(name)); + } + + @Override + public CloudServiceBinding getServiceBinding(UUID serviceBindingId) { + return handleExceptions(() -> delegate.getServiceBinding(serviceBindingId)); + } + + @Override + public Optional deleteServiceBinding(String serviceInstanceName, String serviceKeyName) { + return handleExceptions(() -> delegate.deleteServiceBinding(serviceInstanceName, serviceKeyName)); + } + + @Override + public Optional deleteServiceBinding(UUID bindingGuid, ServiceBindingOperationCallback serviceBindingOperationCallback) { + try { + return handleExceptions(() -> delegate.deleteServiceBinding(bindingGuid)); + } catch (CloudOperationException e) { + serviceBindingOperationCallback.onError(e, bindingGuid); + } + return Optional.empty(); + } + + @Override + public Optional deleteServiceBinding(UUID bindingGuid) { + return handleExceptions(() -> delegate.deleteServiceBinding(bindingGuid)); + } + + @Override + public CloudApplication getApplication(String applicationName) { + return handleExceptions(() -> delegate.getApplication(applicationName)); + } + + @Override + public CloudApplication getApplication(String applicationName, boolean required) { + return handleExceptions(() -> delegate.getApplication(applicationName, required)); + } + + @Override + public UUID getApplicationGuid(String applicationName) { + return handleExceptions(() -> delegate.getApplicationGuid(applicationName)); + } + + @Override + public String getApplicationName(UUID applicationGuid) { + return handleExceptions(() -> delegate.getApplicationName(applicationGuid)); + } + + @Override + public Map getApplicationEnvironment(UUID applicationGuid) { + return handleExceptions(() -> delegate.getApplicationEnvironment(applicationGuid)); + } + + @Override + public Map getApplicationEnvironment(String applicationName) { + return handleExceptions(() -> delegate.getApplicationEnvironment(applicationName)); + } + + @Override + public List getApplicationEvents(String applicationName) { + return handleExceptions(() -> delegate.getApplicationEvents(applicationName)); + } + + @Override + public List getEventsByActee(UUID uuid) { + return handleExceptions(() -> delegate.getEventsByTarget(uuid)); + } + + @Override + public InstancesInfo getApplicationInstances(CloudApplication app) { + return handleExceptions(() -> delegate.getApplicationInstances(app)); + } + + @Override + public InstancesInfo getApplicationInstances(UUID applicationGuid) { + return handleExceptions(() -> delegate.getApplicationInstances(applicationGuid)); + } + + @Override + public CloudProcess getApplicationProcess(UUID applicationGuid) { + return handleExceptions(() -> delegate.getApplicationProcess(applicationGuid)); + } + + @Override + public List getApplicationRoutes(UUID applicationGuid) { + return handleExceptions(() -> delegate.getApplicationRoutes(applicationGuid)); + } + + @Override + public boolean getApplicationSshEnabled(UUID applicationGuid) { + return handleExceptions(() -> delegate.getApplicationSshEnabled(applicationGuid)); + } + + @Override + public List getApplications() { + return handleExceptions(() -> delegate.getApplications()); + } + + @Override + public List getApplicationsByMetadataLabelSelector(String labelSelector) { + return handleExceptions(() -> delegate.getApplicationsByMetadataLabelSelector(labelSelector)); + } + + @Override + public CloudDomain getDefaultDomain() { + return handleExceptions(() -> delegate.getDefaultDomain()); + } + + @Override + public List getDomains() { + return handleExceptions(() -> delegate.getDomains()); + } + + @Override + public List getDomainsForOrganization() { + return handleExceptions(() -> delegate.getDomainsForOrganization()); + } + + @Override + public List getEvents() { + return handleExceptions(() -> delegate.getEvents()); + } + + @Override + public List getPrivateDomains() { + return handleExceptions(() -> delegate.getPrivateDomains()); + } + + @Override + public List getRoutes(String domainName) { + return handleExceptions(() -> delegate.getRoutes(domainName)); + } + + @Override + public CloudServiceBroker getServiceBroker(String name) { + return handleExceptions(() -> delegate.getServiceBroker(name)); + } + + @Override + public CloudServiceBroker getServiceBroker(String name, boolean required) { + return handleExceptions(() -> delegate.getServiceBroker(name, required)); + } + + @Override + public List getServiceBrokers() { + return handleExceptions(() -> delegate.getServiceBrokers()); + } + + @Override + public UUID getRequiredServiceInstanceGuid(String name) { + return handleExceptions(() -> delegate.getRequiredServiceInstanceGuid(name)); + } + + @Override + public CloudServiceInstance getServiceInstance(String serviceInstanceName) { + return handleExceptions(() -> delegate.getServiceInstance(serviceInstanceName)); + } + + @Override + public CloudServiceInstance getServiceInstance(String serviceInstanceName, boolean required) { + return handleExceptions(() -> delegate.getServiceInstance(serviceInstanceName, required)); + } + + @Override + public String getServiceInstanceName(UUID serviceInstanceGuid) { + return handleExceptions(() -> delegate.getServiceInstanceName(serviceInstanceGuid)); + } + + @Override + public CloudServiceInstance getServiceInstanceWithoutAuxiliaryContent(String serviceInstanceName) { + return handleExceptions(() -> delegate.getServiceInstanceWithoutAuxiliaryContent(serviceInstanceName)); + } + + @Override + public CloudServiceInstance getServiceInstanceWithoutAuxiliaryContent(String serviceInstanceName, boolean required) { + return handleExceptions(() -> delegate.getServiceInstanceWithoutAuxiliaryContent(serviceInstanceName, required)); + } + + @Override + public List getServiceAppBindings(UUID serviceInstanceGuid) { + return handleExceptions(() -> delegate.getServiceAppBindings(serviceInstanceGuid)); + } + + @Override + public List getAppBindings(UUID applicationGuid) { + return handleExceptions(() -> delegate.getAppBindings(applicationGuid)); + } + + @Override + public CloudServiceBinding getServiceBindingForApplication(UUID applicationId, UUID serviceInstanceGuid) { + return handleExceptions(() -> delegate.getServiceBindingForApplication(applicationId, serviceInstanceGuid)); + } + + @Override + public Map getServiceInstanceParameters(UUID guid) { + return handleExceptions(() -> delegate.getServiceInstanceParameters(guid)); + } + + @Override + public Map getUserProvidedServiceInstanceParameters(UUID guid) { + return handleExceptions(() -> delegate.getUserProvidedServiceInstanceParameters(guid)); + } + + @Override + public Map getServiceBindingParameters(UUID guid) { + return handleExceptions(() -> delegate.getServiceBindingParameters(guid)); + } + + @Override + public CloudServiceKey getServiceKey(String serviceInstanceName, String serviceKeyName) { + return handleExceptions(() -> delegate.getServiceKey(serviceInstanceName, serviceKeyName)); + } + + @Override + public List getServiceKeys(String serviceInstanceName) { + return handleExceptions(() -> delegate.getServiceKeys(serviceInstanceName)); + } + + @Override + public List getServiceKeysWithCredentials(String serviceInstanceName) { + return handleExceptions(() -> delegate.getServiceKeysWithCredentials(serviceInstanceName)); + } + + @Override + public List getServiceKeys(CloudServiceInstance serviceInstance) { + return handleExceptions(() -> delegate.getServiceKeys(serviceInstance)); + } + + @Override + public List getServiceKeysWithCredentials(CloudServiceInstance serviceInstance) { + return handleExceptions(() -> delegate.getServiceKeysWithCredentials(serviceInstance)); + } + + @Override + public List getServiceOfferings() { + return handleExceptions(() -> delegate.getServiceOfferings()); + } + + @Override + public List getServiceInstancesByMetadataLabelSelector(String labelSelector) { + return handleExceptions(() -> delegate.getServiceInstancesByMetadataLabelSelector(labelSelector)); + } + + @Override + public List getServiceInstancesWithoutAuxiliaryContentByMetadataLabelSelector(String labelSelector) { + return handleExceptions(() -> delegate.getServiceInstancesWithoutAuxiliaryContentByMetadataLabelSelector(labelSelector)); + } + + @Override + public List getSharedDomains() { + return handleExceptions(() -> delegate.getSharedDomains()); + } + + @Override + public CloudStack getStack(String name) { + return handleExceptions(() -> delegate.getStack(name)); + } + + @Override + public CloudStack getStack(String name, boolean required) { + return handleExceptions(() -> delegate.getStack(name, required)); + } + + @Override + public List getStacks() { + return handleExceptions(() -> delegate.getStacks()); + } + + @Override + public void rename(String applicationName, String newName) { + handleExceptions(() -> delegate.rename(applicationName, newName)); + } + + @Override + public void restartApplication(String applicationName) { + handleExceptions(() -> delegate.restartApplication(applicationName)); + } + + @Override + public void startApplication(String applicationName) { + handleExceptions(() -> delegate.startApplication(applicationName)); + } + + @Override + public void stopApplication(String applicationName) { + handleExceptions(() -> delegate.stopApplication(applicationName)); + } + + @Override + public Optional unbindServiceInstance(String applicationName, String serviceInstanceName, + ApplicationServicesUpdateCallback applicationServicesUpdateCallback) { + try { + return handleExceptions(() -> delegate.unbindServiceInstance(applicationName, serviceInstanceName)); + } catch (CloudOperationException e) { + applicationServicesUpdateCallback.onError(e, applicationName, serviceInstanceName); + } + return Optional.empty(); + } + + @Override + public Optional unbindServiceInstance(String applicationName, String serviceInstanceName) { + return handleExceptions(() -> delegate.unbindServiceInstance(applicationName, serviceInstanceName)); + } + + @Override + public Optional unbindServiceInstance(UUID applicationGuid, UUID serviceInstanceGuid) { + return handleExceptions(() -> delegate.unbindServiceInstance(applicationGuid, serviceInstanceGuid)); + } + + @Override + public void updateApplicationDiskQuota(String applicationName, int disk) { + handleExceptions(() -> delegate.updateApplicationDiskQuota(applicationName, disk)); + } + + @Override + public void updateApplicationEnv(String applicationName, Map env) { + handleExceptions(() -> delegate.updateApplicationEnv(applicationName, env)); + } + + @Override + public void updateApplicationInstances(String applicationName, int instances) { + handleExceptions(() -> delegate.updateApplicationInstances(applicationName, instances)); + } + + @Override + public List getServiceInstancesWithoutAuxiliaryContentByNames(List names) { + return handleExceptions(() -> delegate.getServiceInstancesWithoutAuxiliaryContentByNames(names)); + } + + @Override + public void updateApplicationMemory(String applicationName, int memory) { + handleExceptions(() -> delegate.updateApplicationMemory(applicationName, memory)); + } + + @Override + public void updateApplicationStaging(String applicationName, Staging staging) { + handleExceptions(() -> delegate.updateApplicationStaging(applicationName, staging)); + } + + @Override + public void updateApplicationRoutes(String applicationName, Set routes) { + handleExceptions(() -> delegate.updateApplicationRoutes(applicationName, routes)); + } + + @Override + public void updateApplicationMetadata(UUID guid, Metadata metadata) { + handleExceptions(() -> delegate.updateApplicationMetadata(guid, metadata)); + } + + @Override + public void updateServiceInstanceMetadata(UUID guid, Metadata metadata) { + handleExceptions(() -> delegate.updateServiceInstanceMetadata(guid, metadata)); + } + + @Override + public void updateServiceBindingMetadata(UUID guid, Metadata metadata) { + handleExceptions(() -> delegate.updateServiceBindingMetadata(guid, metadata)); + } + + @Override + public String updateServiceBroker(CloudServiceBroker serviceBroker) { + return handleExceptions(() -> delegate.updateServiceBroker(serviceBroker)); + } + + @Override + public void updateServicePlanVisibilityForBroker(String name, ServicePlanVisibility visibility) { + handleExceptions(() -> delegate.updateServicePlanVisibilityForBroker(name, visibility)); + } + + @Override + public void updateServicePlan(String serviceName, String planName) { + handleExceptions(() -> delegate.updateServicePlan(serviceName, planName)); + } + + @Override + public void updateServiceParameters(String serviceName, Map parameters) { + handleExceptions(() -> delegate.updateServiceParameters(serviceName, parameters)); + } + + @Override + public void updateServiceTags(String serviceName, List tags) { + handleExceptions(() -> delegate.updateServiceTags(serviceName, tags)); + } + + @Override + public void updateServiceSyslogDrainUrl(String serviceName, String syslogDrainUrl) { + handleExceptions(() -> delegate.updateServiceSyslogDrainUrl(serviceName, syslogDrainUrl)); + } + + @Override + public CloudPackage asyncUploadApplicationWithExponentialBackoff(String applicationName, Path file, UploadStatusCallback callback, + Duration overrideTimeout) { + return handleExceptions(() -> delegate.asyncUploadApplication(applicationName, file, callback, overrideTimeout)); + } + + @Override + public Upload getUploadStatus(UUID packageGuid) { + return handleExceptions(() -> delegate.getUploadStatus(packageGuid)); + } + + @Override + public CloudBuild createBuild(UUID packageGuid) { + return handleExceptions(() -> delegate.createBuild(packageGuid)); + } + + @Override + public CloudBuild getBuild(UUID buildGuid) { + return handleExceptions(() -> delegate.getBuild(buildGuid)); + } + + @Override + public CloudTask getTask(UUID taskGuid) { + return handleExceptions(() -> delegate.getTask(taskGuid)); + } + + @Override + public List getTasks(String applicationName) { + return handleExceptions(() -> delegate.getTasks(applicationName)); + } + + @Override + public CloudTask runTask(String applicationName, CloudTask task) { + return handleExceptions(() -> delegate.runTask(applicationName, task)); + } + + @Override + public CloudTask cancelTask(UUID taskGuid) { + return handleExceptions(() -> delegate.cancelTask(taskGuid)); + } + + @Override + public void bindDropletToApp(UUID dropletGuid, UUID applicationGuid) { + handleExceptions(() -> delegate.bindDropletToApp(dropletGuid, applicationGuid)); + } + + @Override + public List getBuildsForApplication(UUID applicationGuid) { + return handleExceptions(() -> delegate.getBuildsForApplication(applicationGuid)); + } + + @Override + public List getBuildsForPackage(UUID packageGuid) { + return handleExceptions(() -> delegate.getBuildsForPackage(packageGuid)); + } + + @Override + public DropletInfo getCurrentDropletForApplication(UUID applicationGuid) { + return handleExceptions(() -> delegate.getCurrentDropletForApplication(applicationGuid)); + } + + @Override + public CloudPackage getPackage(UUID packageGuid) { + return handleExceptions(() -> delegate.getPackage(packageGuid)); + } + + @Override + public List getPackagesForApplication(UUID applicationGuid) { + return handleExceptions(() -> delegate.getPackagesForApplication(applicationGuid)); + } + + @Override + public Set getUserRolesBySpaceAndUser(UUID spaceGuid, UUID userGuid) { + return handleExceptions(() -> delegate.getUserRolesBySpaceAndUser(spaceGuid, userGuid)); + } + + @Override + public CloudPackage createDockerPackage(UUID applicationGuid, DockerInfo dockerInfo) { + return handleExceptions(() -> delegate.createDockerPackage(applicationGuid, dockerInfo)); + } + + @Override + public CloudAsyncJob getAsyncJob(String jobId) { + return handleExceptions(() -> delegate.getAsyncJob(jobId)); + } + + private void handleExceptions(Runnable runnable) { + handleExceptions(() -> { + runnable.run(); + return null; + }); + } + + private T handleExceptions(Supplier runnable) { + try { + return runnable.get(); + } catch (AbstractCloudFoundryException e) { + throw convertV3ClientException(e); + } + } + + private CloudOperationException convertV3ClientException(AbstractCloudFoundryException e) { + HttpStatus httpStatus = HttpStatus.valueOf(e.getStatusCode()); + return new CloudOperationException(httpStatus, httpStatus.getReasonPhrase(), e.getMessage(), e); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudControllerException.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudControllerException.java new file mode 100644 index 0000000000..2021ffeab8 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudControllerException.java @@ -0,0 +1,40 @@ +package org.cloudfoundry.multiapps.controller.client.facade; + +import java.text.MessageFormat; + +import org.springframework.http.HttpStatus; + +public class CloudControllerException extends CloudOperationException { + + private static final long serialVersionUID = 1L; + private static final String DEFAULT_CLOUD_CONTROLLER_ERROR_MESSAGE = "Controller operation failed: {0}"; + + public CloudControllerException(CloudOperationException cloudOperationException) { + super(cloudOperationException.getStatusCode(), + cloudOperationException.getStatusText(), + cloudOperationException.getDescription(), + cloudOperationException); + } + + public CloudControllerException(HttpStatus statusCode) { + super(statusCode); + } + + public CloudControllerException(HttpStatus statusCode, String statusText) { + super(statusCode, statusText); + } + + public CloudControllerException(HttpStatus statusCode, String statusText, String description) { + super(statusCode, statusText, description); + } + + @Override + public String getMessage() { + return decorateExceptionMessage(super.getMessage()); + } + + private String decorateExceptionMessage(String exceptionMessage) { + return MessageFormat.format(DEFAULT_CLOUD_CONTROLLER_ERROR_MESSAGE, exceptionMessage); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudCredentials.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudCredentials.java new file mode 100644 index 0000000000..bfd843020c --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudCredentials.java @@ -0,0 +1,225 @@ +package org.cloudfoundry.multiapps.controller.client.facade; + +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; + +/** + * Class that encapsulates credentials used for authentication + * + */ +public class CloudCredentials { + + private String clientId = "cf"; + private String clientSecret = ""; + private String email; + private String password; + private String proxyUser; + private String origin; + private boolean refreshable = true; + private OAuth2AccessTokenWithAdditionalInfo token; + + /** + * Create credentials using email and password. + * + * @param email email to authenticate with + * @param password the password + */ + public CloudCredentials(String email, String password) { + this.email = email; + this.password = password; + } + + /** + * Create credentials using email, password, and client ID. + * + * @param email email to authenticate with + * @param password the password + * @param clientId the client ID to use for authorization + */ + public CloudCredentials(String email, String password, String clientId) { + this.email = email; + this.password = password; + this.clientId = clientId; + } + + /** + * Create credentials using email, password and client ID. + * + * @param email email to authenticate with + * @param password the password + * @param clientId the client ID to use for authorization + * @param clientSecret the secret for the given client + */ + public CloudCredentials(String email, String password, String clientId, String clientSecret) { + this.email = email; + this.password = password; + this.clientId = clientId; + this.clientSecret = clientSecret; + } + + /** + * Create credentials using email, password, client ID and login origin. + * + * @param email email to authenticate with + * @param password the password + * @param clientId the client ID to use for authorization + * @param clientSecret the secret for the given client + * @param origin the origin name + */ + public CloudCredentials(String email, String password, String clientId, String clientSecret, String origin) { + this.email = email; + this.password = password; + this.clientId = clientId; + this.clientSecret = clientSecret; + this.origin = origin; + } + + /** + * Create credentials using a token. + * + * @param token token to use for authorization + */ + public CloudCredentials(OAuth2AccessTokenWithAdditionalInfo token) { + this.token = token; + } + + /** + * Create credentials using a token and indicates if the token is refreshable or not. + * + * @param token token to use for authorization + * @param refreshable indicates if the token can be refreshed or not + */ + public CloudCredentials(OAuth2AccessTokenWithAdditionalInfo token, boolean refreshable) { + this.token = token; + this.refreshable = refreshable; + } + + /** + * Create credentials using a token. + * + * @param token token to use for authorization + * @param clientId the client ID to use for authorization + */ + public CloudCredentials(OAuth2AccessTokenWithAdditionalInfo token, String clientId) { + this.token = token; + this.clientId = clientId; + } + + /** + * Create credentials using a token. + * + * @param token token to use for authorization + * @param clientId the client ID to use for authorization + * @param clientSecret the password for the specified client + */ + public CloudCredentials(OAuth2AccessTokenWithAdditionalInfo token, String clientId, String clientSecret) { + this.token = token; + this.clientId = clientId; + this.clientSecret = clientSecret; + } + + /** + * Create proxy credentials. + * + * @param cloudCredentials credentials to use + * @param proxyForUser user to be proxied + */ + public CloudCredentials(CloudCredentials cloudCredentials, String proxyForUser) { + this.email = cloudCredentials.getEmail(); + this.password = cloudCredentials.getPassword(); + this.clientId = cloudCredentials.getClientId(); + this.token = cloudCredentials.getToken(); + this.proxyUser = proxyForUser; + } + + /** + * Get the client ID. + * + * @return the client ID + */ + public String getClientId() { + return clientId; + } + + /** + * Get the client secret + * + * @return the client secret + */ + public String getClientSecret() { + return clientSecret; + } + + /** + * Get the origin + * + * @return the origin + */ + public String getOrigin() { + return origin; + } + + /** + * Get the email. + * + * @return the email + */ + public String getEmail() { + return email; + } + + /** + * Get the password. + * + * @return the password + */ + public String getPassword() { + return password; + } + + /** + * Get the proxy user. + * + * @return the proxy user + */ + public String getProxyUser() { + return proxyUser; + } + + /** + * Get the token. + * + * @return the token + */ + public OAuth2AccessTokenWithAdditionalInfo getToken() { + return token; + } + + /** + * Is this a proxied set of credentials? + * + * @return whether a proxy user is set + */ + public boolean isProxyUserSet() { + return proxyUser != null; + } + + /** + * Indicates weather the token stored in the cloud credentials can be refreshed or not. This is useful when the token stored in this + * object was obtained via implicit OAuth2 authentication and therefore can not be refreshed. + * + * @return weather the token can be refreshed + */ + public boolean isRefreshable() { + return refreshable; + } + + /** + * Run commands as a different user. The authenticated user must be privileged to run as this user. + * + * @param user the user to proxy for + * @return credentials for the proxied user + */ + public CloudCredentials proxyForUser(String user) { + return new CloudCredentials(this, user); + } +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudException.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudException.java new file mode 100644 index 0000000000..ca6b64926f --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudException.java @@ -0,0 +1,18 @@ +package org.cloudfoundry.multiapps.controller.client.facade; + +@SuppressWarnings("serial") +public class CloudException extends RuntimeException { + + public CloudException(Throwable cause) { + super(cause); + } + + public CloudException(String message, Throwable cause) { + super(message, cause); + } + + public CloudException(String message) { + super(message); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudOperationException.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudOperationException.java new file mode 100644 index 0000000000..2f75d0ce85 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudOperationException.java @@ -0,0 +1,50 @@ +package org.cloudfoundry.multiapps.controller.client.facade; + +import org.springframework.http.HttpStatus; + +@SuppressWarnings("serial") +public class CloudOperationException extends CloudException { + + private final HttpStatus statusCode; + private final String statusText; + private final String description; + + public CloudOperationException(HttpStatus statusCode) { + this(statusCode, statusCode.getReasonPhrase()); + } + + public CloudOperationException(HttpStatus statusCode, String statusText) { + this(statusCode, statusText, null); + } + + public CloudOperationException(HttpStatus statusCode, String statusText, String description) { + this(statusCode, statusText, description, null); + } + + public CloudOperationException(HttpStatus statusCode, String statusText, String description, Throwable cause) { + super(getExceptionMessage(statusCode, statusText, description), cause); + this.statusCode = statusCode; + this.statusText = statusText; + this.description = description; + } + + private static String getExceptionMessage(HttpStatus statusCode, String statusText, String description) { + if (description != null) { + return String.format("%d %s: %s", statusCode.value(), statusText, description); + } + return String.format("%d %s", statusCode.value(), statusText); + } + + public HttpStatus getStatusCode() { + return statusCode; + } + + public String getStatusText() { + return statusText; + } + + public String getDescription() { + return description; + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudServiceBrokerException.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudServiceBrokerException.java new file mode 100644 index 0000000000..92a0b2cec2 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudServiceBrokerException.java @@ -0,0 +1,39 @@ +package org.cloudfoundry.multiapps.controller.client.facade; + +import java.text.MessageFormat; + +import org.springframework.http.HttpStatus; + +public class CloudServiceBrokerException extends CloudOperationException { + + private static final long serialVersionUID = 1L; + private static final String DEFAULT_SERVICE_BROKER_ERROR_MESSAGE = "Service broker operation failed: {0}"; + + public CloudServiceBrokerException(CloudOperationException cloudOperationException) { + super(cloudOperationException.getStatusCode(), + cloudOperationException.getStatusText(), + cloudOperationException.getDescription(), + cloudOperationException); + } + + public CloudServiceBrokerException(HttpStatus statusCode) { + super(statusCode); + } + + public CloudServiceBrokerException(HttpStatus statusCode, String statusText) { + super(statusCode, statusText); + } + + public CloudServiceBrokerException(HttpStatus statusCode, String statusText, String description) { + super(statusCode, statusText, description); + } + + @Override + public String getMessage() { + return decorateExceptionMessage(super.getMessage()); + } + + private String decorateExceptionMessage(String exceptionMessage) { + return MessageFormat.format(DEFAULT_SERVICE_BROKER_ERROR_MESSAGE, exceptionMessage); + } +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/Constants.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/Constants.java new file mode 100644 index 0000000000..3bc7be98c2 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/Constants.java @@ -0,0 +1,13 @@ +package org.cloudfoundry.multiapps.controller.client.facade; + +public class Constants { + + private Constants() { + + } + + public static final String PACKAGE = "package"; + + public static final String ORIGIN_KEY = "origin"; + +} \ No newline at end of file diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/Messages.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/Messages.java new file mode 100644 index 0000000000..50bf9ae64b --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/Messages.java @@ -0,0 +1,30 @@ +package org.cloudfoundry.multiapps.controller.client.facade; + +public final class Messages { + + private Messages() { + + } + + // INFO messages + public static final String CALLING_CF_ROOT_0_TO_ACCESS_LOG_CACHE_URL = "Calling CF root: {0} to access log-cache URL"; + public static final String CF_ROOT_REQUEST_FINISHED = "CF root request finished"; + public static final String TRYING_TO_GET_APP_LOGS = "Trying to get app logs"; + public static final String APP_LOGS_WERE_FETCHED_SUCCESSFULLY = "App logs were fetched successfully"; + + // WARN messages + public static final String RETRYING_OPERATION = "Retrying operation that failed with: {0}"; + public static final String CALL_TO_0_FAILED_WITH_1 = "Calling {0} failed with: {1}"; + + // ERROR messages + public static final String UNKNOWN_PACKAGE_TYPE = "Unknown package type: %s"; + public static final String CANT_CREATE_SERVICE_KEY_FOR_USER_PROVIDED_SERVICE = "Service keys can't be created for user-provided service instance \"%s\""; + public static final String NO_SERVICE_PLAN_FOUND = "Service plan with guid \"{0}\" for service instance with name \"{1}\" was not found."; + public static final String SERVICE_PLAN_WITH_GUID_0_NOT_AVAILABLE_FOR_SERVICE_INSTANCE_1 = "Service plan with guid \"{0}\" is not available for service instance \"{1}\"."; + public static final String SERVICE_OFFERING_WITH_GUID_0_IS_NOT_AVAILABLE = "Service offering with guid \"{0}\" is not available."; + public static final String SERVICE_OFFERING_WITH_GUID_0_NOT_FOUND = "Service offering with guid \"{0}\" not found."; + public static final String FAILED_TO_FETCH_APP_LOGS_FOR_APP = "Failed to fetch app logs for app: %s"; + + public static final String BUILDPACKS_ARE_REQUIRED_FOR_CNB_LIFECYCLE_TYPE = "Buildpacks are required for CNB lifecycle type."; + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/Nullable.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/Nullable.java new file mode 100644 index 0000000000..315978dea0 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/Nullable.java @@ -0,0 +1,5 @@ +package org.cloudfoundry.multiapps.controller.client.facade; + +public @interface Nullable { + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/ServiceBindingOperationCallback.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/ServiceBindingOperationCallback.java new file mode 100644 index 0000000000..c79e7ecd17 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/ServiceBindingOperationCallback.java @@ -0,0 +1,8 @@ +package org.cloudfoundry.multiapps.controller.client.facade; + +import java.util.UUID; + +public interface ServiceBindingOperationCallback { + + void onError(CloudOperationException e, UUID serviceBindingGuid); +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/SkipNulls.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/SkipNulls.java new file mode 100644 index 0000000000..62e1ea2a86 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/SkipNulls.java @@ -0,0 +1,5 @@ +package org.cloudfoundry.multiapps.controller.client.facade; + +public @interface SkipNulls { + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/UploadStatusCallback.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/UploadStatusCallback.java new file mode 100644 index 0000000000..7a22102a85 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/UploadStatusCallback.java @@ -0,0 +1,68 @@ +package org.cloudfoundry.multiapps.controller.client.facade; + +import java.util.Set; + +/** + * Reports status information when uploading an application. + */ +public interface UploadStatusCallback { + + /** + * Empty implementation + */ + UploadStatusCallback NONE = new UploadStatusCallback() { + @Override + public void onCheckResources() { + } + + @Override + public void onMatchedFileNames(Set matchedFileNames) { + } + + @Override + public void onProcessMatchedResources(int length) { + } + + @Override + public boolean onProgress(String status) { + return false; + } + + @Override + public void onError(String description) { + } + }; + + /** + * Called after the /resources call is made. + */ + void onCheckResources(); + + /** + * Called after the files to be uploaded have been identified. + * + * @param matchedFileNames the files to be uploaded + */ + void onMatchedFileNames(Set matchedFileNames); + + /** + * Called after the data to be uploaded has been processed + * + * @param length the size of the upload data (before compression) + */ + void onProcessMatchedResources(int length); + + /** + * Called during asynchronous upload process. + * + * Implementation can return true to unsubscribe from progress update reports. This is useful if the caller want to unblock the thread + * that initiated the upload. Note, however, that the upload job that has been asynchronously started will continue to execute on the + * server. + * + * @param status string such as "queued", "finished" + * @return true to unsubscribe from update report + */ + boolean onProgress(String status); + + void onError(String description); +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/ApplicationLogEntity.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/ApplicationLogEntity.java new file mode 100644 index 0000000000..69301aeda1 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/ApplicationLogEntity.java @@ -0,0 +1,43 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import org.immutables.value.Value; + +import java.util.Map; + +@Value.Immutable +@Value.Enclosing +@JsonDeserialize(as = ImmutableApplicationLogEntity.class) +public abstract class ApplicationLogEntity implements Comparable { + + @JsonProperty("timestamp") + public abstract Long getTimestampInNanoseconds(); + + @JsonProperty("source_id") + public abstract String getSourceId(); + + @JsonProperty("instance_id") + public abstract String getInstanceId(); + + public abstract Map getTags(); + + @JsonProperty("log") + public abstract LogBody getLogBody(); + + @Value.Immutable + @JsonDeserialize(as = ImmutableApplicationLogEntity.ImmutableLogBody.class) + public interface LogBody { + + @JsonProperty("payload") + String getMessage(); + + @JsonProperty("type") + String getMessageType(); + } + + @Override + public int compareTo(ApplicationLogEntity otherLog) { + return getTimestampInNanoseconds().compareTo(otherLog.getTimestampInNanoseconds()); + } +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/ApplicationLogsResponse.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/ApplicationLogsResponse.java new file mode 100644 index 0000000000..0617ded5f3 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/ApplicationLogsResponse.java @@ -0,0 +1,17 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import org.immutables.value.Value; + +import java.util.List; + +@Value.Immutable +@JsonRootName("envelopes") +@JsonDeserialize(as = ImmutableApplicationLogsResponse.class) +public interface ApplicationLogsResponse { + + @JsonProperty("batch") + List getLogs(); +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/CloudFoundryClientFactory.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/CloudFoundryClientFactory.java new file mode 100644 index 0000000000..5461f765a8 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/CloudFoundryClientFactory.java @@ -0,0 +1,155 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.text.MessageFormat; +import java.time.Duration; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; + +import org.cloudfoundry.client.CloudFoundryClient; +import org.cloudfoundry.client.v3.organizations.OrganizationsV3; +import org.cloudfoundry.client.v3.spaces.SpacesV3; +import org.cloudfoundry.reactor.ConnectionContext; +import org.cloudfoundry.reactor.DefaultConnectionContext; +import org.cloudfoundry.reactor.client.ReactorCloudFoundryClient; +import org.cloudfoundry.reactor.client.v3.organizations.ReactorOrganizationsV3; +import org.cloudfoundry.reactor.client.v3.spaces.ReactorSpacesV3; +import org.immutables.value.Value; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; + +import org.cloudfoundry.multiapps.controller.client.facade.CloudException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.Messages; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuthClient; +import org.cloudfoundry.multiapps.controller.client.facade.rest.CloudSpaceClient; +import org.cloudfoundry.multiapps.controller.client.facade.util.CloudUtil; +import org.cloudfoundry.multiapps.controller.client.facade.util.JsonUtil; + +import reactor.core.publisher.Mono; + +@Value.Immutable +public abstract class CloudFoundryClientFactory { + + private static final Logger LOGGER = LoggerFactory.getLogger(CloudFoundryClientFactory.class); + + static final HttpClient HTTP_CLIENT = HttpClient.newBuilder() + .executor(Executors.newSingleThreadExecutor()) + .followRedirects(HttpClient.Redirect.NORMAL) + .connectTimeout(Duration.ofMinutes(10)) + .build(); + + private final Map connectionContextCache = new ConcurrentHashMap<>(); + + public abstract Optional getSslHandshakeTimeout(); + + public abstract Optional getConnectTimeout(); + + public abstract Optional getConnectionPoolSize(); + + public abstract Optional getThreadPoolSize(); + + public abstract Optional getResponseTimeout(); + + public CloudFoundryClient createClient(URL controllerUrl, OAuthClient oAuthClient, Map requestTags) { + return ReactorCloudFoundryClient.builder() + .connectionContext(getOrCreateConnectionContext(controllerUrl.getHost())) + .tokenProvider(oAuthClient.getTokenProvider()) + .requestTags(requestTags) + .build(); + } + + public LogCacheClient createLogCacheClient(URL controllerUrl, OAuthClient oAuthClient, Map requestTags) { + return new LogCacheClient(oAuthClient, requestTags, getOrCreateConnectionContext(controllerUrl.getHost())); + } + + @SuppressWarnings("unchecked") + private Map callCfRoot(URL controllerUrl, Map requestTags) { + HttpResponse response; + try { + HttpRequest request = buildCfRootRequest(controllerUrl, requestTags); + LOGGER.info(MessageFormat.format(Messages.CALLING_CF_ROOT_0_TO_ACCESS_LOG_CACHE_URL, controllerUrl)); + response = HTTP_CLIENT.send(request, HttpResponse.BodyHandlers.ofString()); + if (response.statusCode() / 100 != 2) { + var status = HttpStatus.valueOf(response.statusCode()); + throw new CloudOperationException(status, status.getReasonPhrase(), response.body()); + } + LOGGER.info(Messages.CF_ROOT_REQUEST_FINISHED); + } catch (InterruptedException | URISyntaxException | IOException e) { + throw new CloudException(e.getMessage(), e); + } + var map = JsonUtil.convertJsonToMap(response.body()); + return (Map) map.get("links"); + } + + private HttpRequest buildCfRootRequest(URL controllerUrl, Map requestTags) throws URISyntaxException { + var requestBuilder = HttpRequest.newBuilder() + .GET() + .uri(controllerUrl.toURI()) + .timeout(Duration.ofMinutes(5)); + requestTags.forEach(requestBuilder::header); + return requestBuilder.build(); + } + + public CloudSpaceClient createSpaceClient(URL controllerUrl, OAuthClient oAuthClient, Map requestTags) { + String v3Api; + try { + var links = CloudUtil.executeWithRetry(() -> callCfRoot(controllerUrl, requestTags)); + @SuppressWarnings("unchecked") + var ccv3 = (Map) links.get("cloud_controller_v3"); + v3Api = (String) ccv3.get("href"); + } catch (CloudException e) { + LOGGER.warn(MessageFormat.format(Messages.CALL_TO_0_FAILED_WITH_1, controllerUrl.toString(), e.getMessage()), e); + v3Api = controllerUrl + "/v3"; + } + var spacesV3 = createV3SpacesClient(controllerUrl, v3Api, oAuthClient, requestTags); + var orgsV3 = createV3OrgsClient(controllerUrl, v3Api, oAuthClient, requestTags); + return new CloudSpaceClient(spacesV3, orgsV3); + } + + private SpacesV3 createV3SpacesClient(URL controllerUrl, String v3Api, OAuthClient oAuthClient, Map requestTags) { + return new ReactorSpacesV3(getOrCreateConnectionContext(controllerUrl.getHost()), + Mono.just(v3Api), + oAuthClient.getTokenProvider(), + requestTags); + } + + private OrganizationsV3 createV3OrgsClient(URL controllerUrl, String v3Api, OAuthClient oAuthClient, Map requestTags) { + return new ReactorOrganizationsV3(getOrCreateConnectionContext(controllerUrl.getHost()), + Mono.just(v3Api), + oAuthClient.getTokenProvider(), + requestTags); + } + + public ConnectionContext getOrCreateConnectionContext(String controllerApiHost) { + return connectionContextCache.computeIfAbsent(controllerApiHost, this::createConnectionContext); + } + + private ConnectionContext createConnectionContext(String controllerApiHost) { + DefaultConnectionContext.Builder builder = DefaultConnectionContext.builder() + .apiHost(controllerApiHost); + getSslHandshakeTimeout().ifPresent(builder::sslHandshakeTimeout); + getConnectTimeout().ifPresent(builder::connectTimeout); + getConnectionPoolSize().ifPresent(builder::connectionPoolSize); + getThreadPoolSize().ifPresent(builder::threadPoolSize); + builder.additionalHttpClientConfiguration(this::getAdditionalHttpClientConfiguration); + return builder.build(); + } + + private reactor.netty.http.client.HttpClient getAdditionalHttpClientConfiguration(reactor.netty.http.client.HttpClient client) { + var clientWithOptions = client; + if (getResponseTimeout().isPresent()) { + clientWithOptions = clientWithOptions.responseTimeout(getResponseTimeout().get()); + } + + return clientWithOptions; + } +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/LogCacheClient.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/LogCacheClient.java new file mode 100644 index 0000000000..ea8d519b3f --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/LogCacheClient.java @@ -0,0 +1,117 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import org.cloudfoundry.multiapps.controller.client.facade.CloudException; +import org.cloudfoundry.multiapps.controller.client.facade.Messages; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ApplicationLog; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableApplicationLog; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuthClient; +import org.cloudfoundry.logcache.v1.Envelope; +import org.cloudfoundry.logcache.v1.EnvelopeType; +import org.cloudfoundry.logcache.v1.ReadRequest; +import org.cloudfoundry.logcache.v1.ReadResponse; +import org.cloudfoundry.reactor.ConnectionContext; +import org.cloudfoundry.reactor.logcache.v1.ReactorLogCacheClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.nio.charset.StandardCharsets; +import java.text.MessageFormat; +import java.time.Duration; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.util.Base64; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class LogCacheClient { + + private static final Logger LOGGER = LoggerFactory.getLogger(LogCacheClient.class); + private static final String SOURCE_TYPE_KEY_NAME = "source_type"; + private static final int MAX_LOG_COUNT = 1000; + private final OAuthClient oAuthClient; + private final Map requestTags; + private final ConnectionContext connectionContext; + + public LogCacheClient(OAuthClient oAuthClient, Map requestTags, ConnectionContext connectionContext) { + this.oAuthClient = oAuthClient; + this.requestTags = requestTags; + this.connectionContext = connectionContext; + } + + public List getRecentLogs(UUID applicationGuid, LocalDateTime offset) { + LOGGER.info(Messages.TRYING_TO_GET_APP_LOGS); + org.cloudfoundry.logcache.v1.LogCacheClient logCacheClient = createReactorLogCacheClient(); + ReadResponse applicationLogsResponse = readApplicationLogs(logCacheClient, applicationGuid, offset); + + if (applicationLogsResponse != null) { + LOGGER.info(Messages.APP_LOGS_WERE_FETCHED_SUCCESSFULLY); + return applicationLogsResponse.getEnvelopes() + .getBatch() + .stream() + .map(this::mapToAppLog) + // we use a linked list so that the log messages can be a LIFO sequence + // that way, we avoid unnecessary sorting and copying to and from another collection/array + .collect(LinkedList::new, LinkedList::addFirst, LinkedList::addAll); + } else { + throw new CloudException(MessageFormat.format(Messages.FAILED_TO_FETCH_APP_LOGS_FOR_APP, applicationGuid)); + } + + } + + private ReactorLogCacheClient createReactorLogCacheClient() { + return ReactorLogCacheClient.builder() + .requestTags(requestTags) + .connectionContext(connectionContext) + .tokenProvider(oAuthClient.getTokenProvider()) + .build(); + } + + private ReadResponse readApplicationLogs(org.cloudfoundry.logcache.v1.LogCacheClient logCacheClient, UUID applicationGuid, + LocalDateTime offset) { + var instant = offset.toInstant(ZoneOffset.UTC); + var secondsInNanos = Duration.ofSeconds(instant.getEpochSecond()) + .toNanos(); + return logCacheClient.read(ReadRequest.builder() + .envelopeType(EnvelopeType.LOG) + .sourceId(applicationGuid.toString()) + .descending(Boolean.TRUE) + .limit(MAX_LOG_COUNT) + .startTime(secondsInNanos + instant.getNano() + 1) + .build()) + .block(); + } + + private ApplicationLog mapToAppLog(Envelope envelope) { + return ImmutableApplicationLog.builder() + .applicationGuid(envelope.getSourceId()) + .message(decodeLogPayload(envelope.getLog() + .getPayload())) + .timestamp(fromLogTimestamp(envelope.getTimestamp())) + .messageType(fromLogMessageType(envelope.getLog() + .getType() + .getValue())) + .sourceName(envelope.getTags() + .get(SOURCE_TYPE_KEY_NAME)) + .build(); + } + + private String decodeLogPayload(String base64Encoded) { + var result = Base64.getDecoder() + .decode(base64Encoded.getBytes(StandardCharsets.UTF_8)); + return new String(result, StandardCharsets.UTF_8); + } + + private LocalDateTime fromLogTimestamp(long timestampNanos) { + Duration duration = Duration.ofNanos(timestampNanos); + Instant instant = Instant.ofEpochSecond(duration.getSeconds(), duration.getNano()); + return LocalDateTime.ofInstant(instant, ZoneId.of("UTC")); + } + + private ApplicationLog.MessageType fromLogMessageType(String messageType) { + return "OUT".equals(messageType) ? ApplicationLog.MessageType.STDOUT : ApplicationLog.MessageType.STDERR; + } +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/OAuthTokenProvider.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/OAuthTokenProvider.java new file mode 100644 index 0000000000..ff5def4c97 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/OAuthTokenProvider.java @@ -0,0 +1,27 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import org.cloudfoundry.reactor.ConnectionContext; +import org.cloudfoundry.reactor.TokenProvider; + +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuthClient; + +import reactor.core.publisher.Mono; + +public class OAuthTokenProvider implements TokenProvider { + + private final OAuthClient oAuthClient; + + public OAuthTokenProvider(OAuthClient oAuthClient) { + this.oAuthClient = oAuthClient; + } + + @Override + public Mono getToken(ConnectionContext connectionContext) { + return Mono.fromSupplier(() -> { + OAuth2AccessTokenWithAdditionalInfo token = oAuthClient.getToken(); + return token.getAuthorizationHeaderValue(); + }); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudApplication.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudApplication.java new file mode 100644 index 0000000000..898cea1a8a --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudApplication.java @@ -0,0 +1,72 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import java.util.Collections; +import java.util.Map; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Derivable; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableLifecycle; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Lifecycle; +import org.cloudfoundry.multiapps.controller.client.facade.domain.LifecycleType; +import org.cloudfoundry.client.v3.BuildpackData; +import org.cloudfoundry.client.v3.CnbData; +import org.cloudfoundry.client.v3.LifecycleData; +import org.cloudfoundry.client.v3.applications.Application; +import org.cloudfoundry.client.v3.applications.ApplicationState; +import org.immutables.value.Value; + +@Value.Immutable +public abstract class RawCloudApplication extends RawCloudEntity { + + public static final String BUILDPACKS = "buildpacks"; + public static final String STACK = "stack"; + + public abstract Application getApplication(); + + public abstract Derivable getSpace(); + + @Override + public CloudApplication derive() { + Application app = getApplication(); + return ImmutableCloudApplication.builder() + .metadata(parseResourceMetadata(app)) + .v3Metadata(app.getMetadata()) + .name(app.getName()) + .state(parseState(app.getState())) + .lifecycle(parseLifecycle(app.getLifecycle())) + .space(getSpace().derive()) + .build(); + } + + private static CloudApplication.State parseState(ApplicationState state) { + return CloudApplication.State.valueOf(state.getValue()); + } + + private static Lifecycle parseLifecycle(org.cloudfoundry.client.v3.Lifecycle lifecycle) { + Map data = extractLifecycleData(lifecycle.getData()); + + return ImmutableLifecycle.builder() + .type(LifecycleType.valueOf(lifecycle.getType() + .toString() + .toUpperCase())) + .data(data) + .build(); + } + + private static Map extractLifecycleData(LifecycleData lifecycleData) { + if (lifecycleData instanceof BuildpackData buildpackData) { + return Map.of( + BUILDPACKS, buildpackData.getBuildpacks(), + STACK, buildpackData.getStack()); + } else if (lifecycleData instanceof CnbData cnbData) { + return Map.of( + BUILDPACKS, cnbData.getBuildpacks(), + STACK, cnbData.getStack()); + } else { + return Collections.emptyMap(); + } + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudAsyncJob.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudAsyncJob.java new file mode 100644 index 0000000000..1e8bad359c --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudAsyncJob.java @@ -0,0 +1,50 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import java.util.stream.Collectors; + +import org.cloudfoundry.client.v3.jobs.Job; +import org.cloudfoundry.client.v3.jobs.Warning; +import org.immutables.value.Value; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudAsyncJob; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudAsyncJob; + +@Value.Immutable +public abstract class RawCloudAsyncJob extends RawCloudEntity { + + @Value.Parameter + public abstract Job getJob(); + + @Override + public CloudAsyncJob derive() { + Job job = getJob(); + return ImmutableCloudAsyncJob.builder() + .metadata(parseResourceMetadata(job)) + .state(job.getState()) + .operation(job.getOperation()) + .warnings(getWarnings(job)) + .errors(getErrors(job)) + .build(); + } + + private String getWarnings(Job job) { + return job.getWarnings() + .stream() + .map(Warning::getDetail) + .collect(Collectors.joining(",")); + } + + private String getErrors(Job job) { + return job.getErrors() + .stream() + .map(this::joinErrorDetails) + .collect(Collectors.joining(",")); + } + + private String joinErrorDetails(org.cloudfoundry.client.v3.Error error) { + return String.join(" ", error.getCode() + .toString(), + error.getTitle(), error.getDetail()); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudBuild.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudBuild.java new file mode 100644 index 0000000000..2cdbc39eaa --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudBuild.java @@ -0,0 +1,67 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import java.util.Optional; + +import org.cloudfoundry.client.v3.Relationship; +import org.cloudfoundry.client.v3.builds.Build; +import org.cloudfoundry.client.v3.builds.BuildState; +import org.cloudfoundry.client.v3.builds.CreatedBy; +import org.cloudfoundry.client.v3.builds.Droplet; +import org.immutables.value.Value; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudBuild; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DropletInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudBuild; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudBuild.ImmutableCreatedBy; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudBuild.ImmutablePackageInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableDropletInfo; + +@Value.Immutable +public abstract class RawCloudBuild extends RawCloudEntity { + + private static CloudBuild.CreatedBy parseCreatedBy(Build buildResource) { + CreatedBy createdBy = buildResource.getCreatedBy(); + return ImmutableCreatedBy.builder() + .guid(parseNullableGuid(createdBy.getId())) + .name(createdBy.getName()) + .build(); + } + + private static CloudBuild.PackageInfo parsePackageInfo(Build buildResource) { + Relationship packageRelationship = buildResource.getInputPackage(); + String packageId = packageRelationship.getId(); + return ImmutablePackageInfo.of(parseNullableGuid(packageId)); + } + + private static DropletInfo parseDropletInfo(Build buildResource) { + Droplet droplet = buildResource.getDroplet(); + return Optional.ofNullable(droplet) + .map(Droplet::getId) + .map(RawCloudEntity::parseNullableGuid) + .map(dropletGuid -> ImmutableDropletInfo.builder() + .guid(dropletGuid) + .build()) + .orElse(null); + } + + private static CloudBuild.State parseState(BuildState state) { + return parseEnum(state, CloudBuild.State.class); + } + + @Value.Parameter + public abstract Build getResource(); + + @Override + public CloudBuild derive() { + Build resource = getResource(); + return ImmutableCloudBuild.builder() + .metadata(parseResourceMetadata(resource)) + .createdBy(parseCreatedBy(resource)) + .packageInfo(parsePackageInfo(resource)) + .dropletInfo(parseDropletInfo(resource)) + .state(parseState(resource.getState())) + .error(resource.getError()) + .build(); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudDomain.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudDomain.java new file mode 100644 index 0000000000..f03981dbaa --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudDomain.java @@ -0,0 +1,24 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import org.cloudfoundry.client.v3.domains.Domain; +import org.immutables.value.Value; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudDomain; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudDomain; + +@Value.Immutable +public abstract class RawCloudDomain extends RawCloudEntity { + + @Value.Parameter + public abstract Domain getResource(); + + @Override + public CloudDomain derive() { + Domain resource = getResource(); + return ImmutableCloudDomain.builder() + .metadata(parseResourceMetadata(resource)) + .name(resource.getName()) + .build(); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudEntity.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudEntity.java new file mode 100644 index 0000000000..537b1260e2 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudEntity.java @@ -0,0 +1,79 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import java.text.MessageFormat; +import java.time.LocalDateTime; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.util.Collection; +import java.util.UUID; +import java.util.stream.Collectors; + +import org.cloudfoundry.client.v3.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Derivable; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; + +public abstract class RawCloudEntity implements Derivable { + + private static final Logger LOGGER = LoggerFactory.getLogger(RawCloudEntity.class); + + protected RawCloudEntity() { + // Recommended by Sonar. + } + + public static CloudMetadata parseResourceMetadata(Resource resource) { + return ImmutableCloudMetadata.builder() + .guid(parseNullableGuid(resource.getId())) + .createdAt(parseNullableDate(resource.getCreatedAt())) + .updatedAt(parseNullableDate(resource.getUpdatedAt())) + .build(); + } + + protected static UUID parseNullableGuid(String guid) { + return guid == null ? null : parseGuid(guid); + } + + protected static UUID parseGuid(String guid) { + try { + return UUID.fromString(guid); + } catch (IllegalArgumentException e) { + LOGGER.warn(MessageFormat.format("Could not parse GUID string: \"{0}\"", guid), e); + return null; + } + } + + protected static LocalDateTime parseNullableDate(String date) { + return date == null ? null : parseDate(date); + } + + protected static LocalDateTime parseDate(String dateString) { + try { + return ZonedDateTime.parse(dateString, DateTimeFormatter.ISO_DATE_TIME) + .toLocalDateTime(); + } catch (DateTimeParseException e) { + LOGGER.warn(MessageFormat.format("Could not parse date string: \"{0}\"", dateString), e); + return null; + } + } + + protected static > E parseEnum(Enum value, Class targetEnum) { + String name = value.name() + .toUpperCase(); + return Enum.valueOf(targetEnum, name); + } + + protected static D deriveFromNullable(Derivable derivable) { + return derivable == null ? null : derivable.derive(); + } + + protected static Collection derive(Collection> derivables) { + return derivables.stream() + .map(Derivable::derive) + .collect(Collectors.toList()); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudEvent.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudEvent.java new file mode 100644 index 0000000000..7a0937f970 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudEvent.java @@ -0,0 +1,56 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import org.cloudfoundry.client.v3.auditevents.AuditEventActor; +import org.cloudfoundry.client.v3.auditevents.AuditEventResource; +import org.cloudfoundry.client.v3.auditevents.AuditEventTarget; +import org.immutables.value.Value; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudEvent; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudEvent.Participant; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudEvent; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudEvent.ImmutableParticipant; + +@Value.Immutable +public abstract class RawCloudEvent extends RawCloudEntity { + + @Value.Parameter + public abstract AuditEventResource getResource(); + + @Override + public CloudEvent derive() { + AuditEventResource resource = getResource(); + return ImmutableCloudEvent.builder() + .metadata(parseResourceMetadata(resource)) + .target(parseTarget(resource)) + .actor(parseActor(resource)) + .type(resource.getType()) + .build(); + } + + private static Participant parseTarget(AuditEventResource resource) { + AuditEventTarget target = resource.getAuditEventTarget(); + if (target == null) { + return ImmutableParticipant.builder() + .build(); + } + return ImmutableParticipant.builder() + .guid(parseNullableGuid(target.getId())) + .name(target.getName()) + .type(target.getType()) + .build(); + } + + private static Participant parseActor(AuditEventResource resource) { + AuditEventActor actor = resource.getAuditEventActor(); + if (actor == null) { + return ImmutableParticipant.builder() + .build(); + } + return ImmutableParticipant.builder() + .guid(parseNullableGuid(actor.getId())) + .name(actor.getName()) + .type(actor.getType()) + .build(); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudPackage.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudPackage.java new file mode 100644 index 0000000000..73933bf781 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudPackage.java @@ -0,0 +1,74 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import org.cloudfoundry.client.v3.Checksum; +import org.cloudfoundry.client.v3.packages.BitsData; +import org.cloudfoundry.client.v3.packages.DockerData; +import org.cloudfoundry.client.v3.packages.Package; +import org.cloudfoundry.client.v3.packages.PackageType; +import org.immutables.value.Value; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableBitsData; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableDockerData; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Status; + +@Value.Immutable +public abstract class RawCloudPackage extends RawCloudEntity { + + @Value.Parameter + public abstract Package getResource(); + + @Override + public CloudPackage derive() { + Package resource = getResource(); + return ImmutableCloudPackage.builder() + .metadata(parseResourceMetadata(resource)) + .status(parseStatus(resource)) + .data(parseData(resource)) + .type(parseType(resource)) + .build(); + } + + private static Status parseStatus(Package resource) { + return parseEnum(resource.getState(), Status.class); + } + + private static CloudPackage.PackageData parseData(Package resource) { + if (resource.getType() == PackageType.BITS) { + return parseBitsData((BitsData) resource.getData()); + } + return parseDockerData((DockerData) resource.getData()); + } + + private static CloudPackage.PackageData parseBitsData(BitsData data) { + return ImmutableBitsData.builder() + .checksum(parseBitsChecksum(data.getChecksum())) + .error(data.getError()) + .build(); + } + + private static org.cloudfoundry.multiapps.controller.client.facade.domain.BitsData.Checksum parseBitsChecksum(Checksum checksum) { + if (checksum == null) { + return null; + } + return ImmutableBitsData.ImmutableChecksum.builder() + .algorithm(checksum.getType() + .toString()) + .value(checksum.getValue()) + .build(); + } + + private static CloudPackage.PackageData parseDockerData(DockerData data) { + return ImmutableDockerData.builder() + .image(data.getImage()) + .username(data.getUsername()) + .password(data.getPassword()) + .build(); + } + + private static CloudPackage.Type parseType(Package resource) { + return parseEnum(resource.getType(), CloudPackage.Type.class); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudProcess.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudProcess.java new file mode 100644 index 0000000000..8fb386031a --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudProcess.java @@ -0,0 +1,44 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import org.cloudfoundry.client.v3.processes.Data; +import org.cloudfoundry.client.v3.processes.HealthCheck; +import org.cloudfoundry.client.v3.processes.Process; +import org.immutables.value.Value; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudProcess; +import org.cloudfoundry.multiapps.controller.client.facade.domain.HealthCheckType; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudProcess; + +@Value.Immutable +public abstract class RawCloudProcess extends RawCloudEntity { + + @Value.Parameter + public abstract Process getProcess(); + + @Override + public CloudProcess derive() { + Process process = getProcess(); + HealthCheck healthCheck = process.getHealthCheck(); + Integer healthCheckTimeout = null; + String healthCheckHttpEndpoint = null; + Integer healthCheckInvocationTimeout = null; + if (healthCheck.getData() != null) { + Data healthCheckData = healthCheck.getData(); + healthCheckTimeout = healthCheckData.getTimeout(); + healthCheckInvocationTimeout = healthCheckData.getInvocationTimeout(); + healthCheckHttpEndpoint = healthCheckData.getEndpoint(); + } + return ImmutableCloudProcess.builder() + .command(process.getCommand()) + .instances(process.getInstances()) + .memoryInMb(process.getMemoryInMb()) + .diskInMb(process.getDiskInMb()) + .healthCheckType(HealthCheckType.valueOf(healthCheck.getType() + .getValue() + .toUpperCase())) + .healthCheckHttpEndpoint(healthCheckHttpEndpoint) + .healthCheckTimeout(healthCheckTimeout) + .healthCheckInvocationTimeout(healthCheckInvocationTimeout) + .build(); + } +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudRoute.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudRoute.java new file mode 100644 index 0000000000..e2ae758814 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudRoute.java @@ -0,0 +1,99 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import java.util.List; +import java.util.Objects; +import java.util.UUID; +import java.util.stream.Collectors; + +import org.cloudfoundry.client.v3.routes.Route; +import org.immutables.value.Value; + +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudDomain; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableRouteDestination; +import org.cloudfoundry.multiapps.controller.client.facade.domain.RouteDestination; + +@Value.Immutable +public abstract class RawCloudRoute extends RawCloudEntity { + + @Value.Parameter + public abstract Route getRoute(); + + @Nullable + public abstract UUID getApplicationGuid(); + + @Override + public CloudRoute derive() { + Route route = getRoute(); + List destinations = mapDestinations(); + String domainGuid = route.getRelationships() + .getDomain() + .getData() + .getId(); + return ImmutableCloudRoute.builder() + .metadata(parseResourceMetadata(route)) + .appsUsingRoute(route.getDestinations() + .size()) + .host(route.getHost()) + .port(route.getPort()) + .domain(ImmutableCloudDomain.builder() + .name(computeDomain(route)) + .metadata(ImmutableCloudMetadata.of(UUID.fromString(domainGuid))) + .build()) + .path(route.getPath()) + .url(route.getUrl()) + .destinations(destinations) + .requestedProtocol(computeRequestedProtocol(destinations)) + .build(); + } + + private static String computeDomain(Route route) { + String domain = route.getUrl(); + if (!route.getHost() + .isEmpty()) { + domain = domain.substring(route.getHost() + .length() + + 1); + } + if (!route.getPath() + .isEmpty()) { + domain = domain.substring(0, domain.indexOf('/')); + } + if (route.getPort() != null) { + domain = domain.substring(0, domain.indexOf(':')); + } + return domain; + } + + private List mapDestinations() { + return getRoute().getDestinations() + .stream() + .map(destination -> ImmutableRouteDestination.builder() + .metadata(ImmutableCloudMetadata.builder() + .guid(UUID.fromString(destination.getDestinationId())) + .build()) + .applicationGuid(UUID.fromString(destination.getApplication() + .getApplicationId())) + .port(destination.getPort()) + .weight(destination.getWeight()) + .protocol(destination.getProtocol()) + .build()) + .collect(Collectors.toList()); + } + + private String computeRequestedProtocol(List destinations) { + UUID applicationGuid = getApplicationGuid(); + if (applicationGuid == null) { + return null; + } + return destinations.stream() + .filter(destination -> Objects.equals(destination.getApplicationGuid(), applicationGuid)) + .findFirst() + .map(RouteDestination::getProtocol) + .orElse(null); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceBinding.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceBinding.java new file mode 100644 index 0000000000..ab9ba4cad8 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceBinding.java @@ -0,0 +1,37 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import java.util.UUID; + +import org.cloudfoundry.client.v3.servicebindings.ServiceBinding; +import org.cloudfoundry.client.v3.servicebindings.ServiceBindingResource; +import org.immutables.value.Value; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; + +@Value.Immutable +public abstract class RawCloudServiceBinding extends RawCloudEntity { + + @Value.Parameter + public abstract ServiceBindingResource getServiceBinding(); + + @Override + public CloudServiceBinding derive() { + ServiceBinding serviceBinding = getServiceBinding(); + var appRelationship = serviceBinding.getRelationships() + .getApplication(); + return ImmutableCloudServiceBinding.builder() + .metadata(parseResourceMetadata(serviceBinding)) + .applicationGuid(parseNullableGuid(appRelationship == null ? null + : appRelationship.getData() + .getId())) + .serviceInstanceGuid(UUID.fromString(serviceBinding.getRelationships() + .getServiceInstance() + .getData() + .getId())) + .serviceBindingOperation(ServiceCredentialBindingOperation.from(getServiceBinding().getLastOperation())) + .build(); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceBroker.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceBroker.java new file mode 100644 index 0000000000..d76fcc5cdd --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceBroker.java @@ -0,0 +1,40 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import java.util.Optional; + +import org.cloudfoundry.client.v3.Relationship; +import org.cloudfoundry.client.v3.ToOneRelationship; +import org.cloudfoundry.client.v3.servicebrokers.ServiceBroker; +import org.cloudfoundry.client.v3.servicebrokers.ServiceBrokerRelationships; +import org.immutables.value.Value; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBroker; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceBroker; + +@Value.Immutable +public abstract class RawCloudServiceBroker extends RawCloudEntity { + + @Value.Parameter + public abstract ServiceBroker getServiceBroker(); + + @Override + public CloudServiceBroker derive() { + ServiceBroker serviceBroker = getServiceBroker(); + String spaceGuid = getSpaceGuid(serviceBroker); + return ImmutableCloudServiceBroker.builder() + .metadata(parseResourceMetadata(serviceBroker)) + .name(serviceBroker.getName()) + .url(serviceBroker.getUrl()) + .spaceGuid(spaceGuid) + .build(); + } + + private String getSpaceGuid(ServiceBroker serviceBroker) { + return Optional.ofNullable(serviceBroker.getRelationships()) + .map(ServiceBrokerRelationships::getSpace) + .map(ToOneRelationship::getData) + .map(Relationship::getId) + .orElse(null); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceInstance.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceInstance.java new file mode 100644 index 0000000000..af4d58b936 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceInstance.java @@ -0,0 +1,55 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import java.util.Optional; + +import org.cloudfoundry.client.v3.serviceinstances.ServiceInstanceResource; +import org.cloudfoundry.client.v3.serviceofferings.ServiceOffering; +import org.cloudfoundry.client.v3.serviceplans.ServicePlan; +import org.immutables.value.Value; + +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; + +@Value.Immutable +public abstract class RawCloudServiceInstance extends RawCloudEntity { + + @Value.Parameter + public abstract ServiceInstanceResource getResource(); + + @Nullable + public abstract ServicePlan getServicePlan(); + + @Nullable + public abstract ServiceOffering getServiceOffering(); + + @Override + public CloudServiceInstance derive() { + ServiceInstanceResource resource = getResource(); + return ImmutableCloudServiceInstance.builder() + .metadata(parseResourceMetadata(resource)) + .v3Metadata(resource.getMetadata()) + .name(resource.getName()) + .plan(getServicePlanName()) + .label(getLabelName()) + .type(resource.getType()) + .tags(resource.getTags()) + .lastOperation(ServiceOperation.fromLastOperation(resource.getLastOperation())) + .syslogDrainUrl(resource.getSyslogDrainUrl()) + .build(); + } + + private String getServicePlanName() { + return Optional.ofNullable(getServicePlan()) + .map(ServicePlan::getName) + .orElse(null); + } + + private String getLabelName() { + return Optional.ofNullable(getServiceOffering()) + .map(ServiceOffering::getName) + .orElse(null); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceKey.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceKey.java new file mode 100644 index 0000000000..97f6e8eb31 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceKey.java @@ -0,0 +1,41 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import java.util.Map; + +import org.cloudfoundry.AllowNulls; +import org.cloudfoundry.client.v3.servicebindings.ServiceBindingResource; +import org.immutables.value.Value; + +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Derivable; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; + +@Value.Immutable +public abstract class RawCloudServiceKey extends RawCloudEntity { + + public abstract ServiceBindingResource getServiceBindingResource(); + + @Nullable + @AllowNulls + public abstract Map getCredentials(); + + public abstract Derivable getServiceInstance(); + + @Override + public CloudServiceKey derive() { + ServiceBindingResource serviceBindingResource = getServiceBindingResource(); + Derivable serviceInstance = getServiceInstance(); + return ImmutableCloudServiceKey.builder() + .metadata(parseResourceMetadata(serviceBindingResource)) + .v3Metadata(serviceBindingResource.getMetadata()) + .name(serviceBindingResource.getName()) + .credentials(getCredentials()) + .serviceInstance(serviceInstance.derive()) + .serviceKeyOperation(ServiceCredentialBindingOperation.from(serviceBindingResource.getLastOperation())) + .build(); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceOffering.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceOffering.java new file mode 100644 index 0000000000..c252aa50bd --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceOffering.java @@ -0,0 +1,45 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import java.util.List; + +import org.cloudfoundry.client.v3.serviceofferings.ServiceOfferingResource; +import org.immutables.value.Value; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceOffering; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServicePlan; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Derivable; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceOffering; + +@Value.Immutable +public abstract class RawCloudServiceOffering extends RawCloudEntity { + + public abstract ServiceOfferingResource getServiceOffering(); + + public abstract List> getServicePlans(); + + @Override + public CloudServiceOffering derive() { + ServiceOfferingResource serviceOffering = getServiceOffering(); + return ImmutableCloudServiceOffering.builder() + .metadata(parseResourceMetadata(serviceOffering)) + .name(serviceOffering.getName()) + .isAvailable(serviceOffering.getAvailable()) + .isBindable(serviceOffering.getBrokerCatalog() + .getFeatures() + .getBindable()) + .description(serviceOffering.getDescription()) + .isShareable(serviceOffering.getShareable()) + .extra(serviceOffering.getBrokerCatalog() + .getMetadata()) + .docUrl(serviceOffering.getDocumentationUrl()) + .brokerId(serviceOffering.getRelationships() + .getServiceBroker() + .getData() + .getId()) + .uniqueId(serviceOffering.getBrokerCatalog() + .getBrokerCatalogId()) + .servicePlans(derive(getServicePlans())) + .build(); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServicePlan.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServicePlan.java new file mode 100644 index 0000000000..a79527037e --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServicePlan.java @@ -0,0 +1,37 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import org.cloudfoundry.client.v3.serviceplans.ServicePlan; +import org.cloudfoundry.client.v3.serviceplans.Visibility; +import org.immutables.value.Value; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServicePlan; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServicePlan; + +@Value.Immutable +public abstract class RawCloudServicePlan extends RawCloudEntity { + + @Value.Parameter + public abstract ServicePlan getResource(); + + @Override + public CloudServicePlan derive() { + ServicePlan resource = getResource(); + return ImmutableCloudServicePlan.builder() + .metadata(parseResourceMetadata(resource)) + .name(resource.getName()) + .description(resource.getDescription()) + .extra(resource.getBrokerCatalog() + .getMetadata()) + .uniqueId(resource.getBrokerCatalog() + .getBrokerCatalogId()) + .serviceOfferingId(resource.getRelationships() + .getServiceOffering() + .getData() + .getId()) + .isPublic(resource.getVisibilityType() + .equals(Visibility.PUBLIC)) + .isFree(resource.getFree()) + .build(); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudStack.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudStack.java new file mode 100644 index 0000000000..6c2a8ce152 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudStack.java @@ -0,0 +1,25 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import org.cloudfoundry.client.v3.stacks.Stack; +import org.immutables.value.Value; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudStack; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudStack; + +@Value.Immutable +public abstract class RawCloudStack extends RawCloudEntity { + + @Value.Parameter + public abstract Stack getStack(); + + @Override + public CloudStack derive() { + Stack stack = getStack(); + return ImmutableCloudStack.builder() + .metadata(parseResourceMetadata(stack)) + .name(stack.getName()) + .description(stack.getDescription()) + .build(); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudTask.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudTask.java new file mode 100644 index 0000000000..b963d4457a --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudTask.java @@ -0,0 +1,50 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import java.util.Optional; + +import org.cloudfoundry.client.v3.tasks.Result; +import org.cloudfoundry.client.v3.tasks.Task; +import org.cloudfoundry.client.v3.tasks.TaskState; +import org.immutables.value.Value; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudTask; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudTask; + +@Value.Immutable +public abstract class RawCloudTask extends RawCloudEntity { + + @Value.Parameter + public abstract Task getResource(); + + @Override + public CloudTask derive() { + Task resource = getResource(); + return ImmutableCloudTask.builder() + .metadata(parseResourceMetadata(resource)) + .name(resource.getName()) + .command(resource.getCommand()) + .limits(parseLimits(resource)) + .result(parseResult(resource)) + .state(parseState(resource.getState())) + .build(); + } + + private static CloudTask.Result parseResult(Task resource) { + return Optional.ofNullable(resource.getResult()) + .map(Result::getFailureReason) + .map(ImmutableCloudTask.ImmutableResult::of) + .orElse(null); + } + + private static CloudTask.Limits parseLimits(Task resource) { + return ImmutableCloudTask.ImmutableLimits.builder() + .disk(resource.getDiskInMb()) + .memory(resource.getMemoryInMb()) + .build(); + } + + private static CloudTask.State parseState(TaskState state) { + return parseEnum(state, CloudTask.State.class); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawInstancesInfo.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawInstancesInfo.java new file mode 100644 index 0000000000..0c55d9f1e5 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawInstancesInfo.java @@ -0,0 +1,47 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import org.cloudfoundry.client.v3.applications.GetApplicationProcessStatisticsResponse; +import org.cloudfoundry.client.v3.processes.ProcessStatisticsResource; +import org.immutables.value.Value; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableInstanceInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableInstancesInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstanceInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstanceState; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstancesInfo; + +@Value.Immutable +public abstract class RawInstancesInfo extends RawCloudEntity { + + @Value.Parameter + public abstract GetApplicationProcessStatisticsResponse getProcessStatisticsResponse(); + + @Override + public InstancesInfo derive() { + var processStats = getProcessStatisticsResponse(); + return ImmutableInstancesInfo.builder() + .instances(parseProcessStatistics(processStats.getResources())) + .build(); + } + + private static List parseProcessStatistics(List stats) { + if (stats == null) { + return Collections.emptyList(); + } + return stats.stream() + .map(RawInstancesInfo::parseProcessStatistic) + .collect(Collectors.toList()); + } + + private static InstanceInfo parseProcessStatistic(ProcessStatisticsResource statsResource) { + return ImmutableInstanceInfo.builder() + .index(statsResource.getIndex()) + .state(InstanceState.valueOfWithDefault(statsResource.getState())) + .build(); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawUserRole.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawUserRole.java new file mode 100644 index 0000000000..8eacc03f55 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawUserRole.java @@ -0,0 +1,21 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.Derivable; +import org.cloudfoundry.client.v3.roles.RoleResource; +import org.immutables.value.Value; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.UserRole; + +@Value.Immutable +public abstract class RawUserRole implements Derivable { + + @Value.Parameter + public abstract RoleResource getRoleResource(); + + @Override + public UserRole derive() { + RoleResource role = getRoleResource(); + return UserRole.fromRoleType(role.getType()); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawV3CloudServiceInstance.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawV3CloudServiceInstance.java new file mode 100644 index 0000000000..8155a4ad41 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawV3CloudServiceInstance.java @@ -0,0 +1,25 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceInstance; +import org.cloudfoundry.client.v3.serviceinstances.ServiceInstance; +import org.immutables.value.Value; + +@Value.Immutable +public abstract class RawV3CloudServiceInstance extends RawCloudEntity { + + @Value.Parameter + public abstract ServiceInstance getServiceInstance(); + + @Override + public CloudServiceInstance derive() { + ServiceInstance serviceInstance = getServiceInstance(); + return ImmutableCloudServiceInstance.builder() + .metadata(parseResourceMetadata(serviceInstance)) + .v3Metadata(serviceInstance.getMetadata()) + .name(serviceInstance.getName()) + .tags(serviceInstance.getTags()) + .build(); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/ApplicationLog.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/ApplicationLog.java new file mode 100644 index 0000000000..4765ea0bac --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/ApplicationLog.java @@ -0,0 +1,34 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import java.time.LocalDateTime; + +import org.immutables.value.Value; + +@Value.Immutable +public abstract class ApplicationLog implements Comparable { + + public enum MessageType { + STDOUT, STDERR + } + + public abstract String getApplicationGuid(); + + public abstract String getMessage(); + + public abstract LocalDateTime getTimestamp(); + + public abstract MessageType getMessageType(); + + public abstract String getSourceName(); + + @Override + public int compareTo(ApplicationLog other) { + return getTimestamp().compareTo(other.getTimestamp()); + } + + @Override + public String toString() { + return String.format("%s [%s] %s (%s, %s)", getApplicationGuid(), getTimestamp(), getMessage(), + getMessageType(), getSourceName()); + } +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/ApplicationLogs.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/ApplicationLogs.java new file mode 100644 index 0000000000..2601598245 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/ApplicationLogs.java @@ -0,0 +1,7 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import java.util.ArrayList; + +public class ApplicationLogs extends ArrayList { + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/BitsData.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/BitsData.java new file mode 100644 index 0000000000..e8b2a5d548 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/BitsData.java @@ -0,0 +1,33 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; +import org.immutables.value.Value; + +@Value.Immutable +@Value.Enclosing +@JsonSerialize(as = ImmutableBitsData.class) +@JsonDeserialize(as = ImmutableBitsData.class) +public interface BitsData extends CloudPackage.PackageData { + + @Nullable + Checksum getChecksum(); + + @Nullable + String getError(); + + @Value.Immutable + @JsonSerialize(as = ImmutableBitsData.ImmutableChecksum.class) + @JsonDeserialize(as = ImmutableBitsData.ImmutableChecksum.class) + interface Checksum { + + @Nullable + String getAlgorithm(); + + @Nullable + String getValue(); + + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudApplication.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudApplication.java new file mode 100644 index 0000000000..f3ed3eb59b --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudApplication.java @@ -0,0 +1,32 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; + +@Value.Immutable +@JsonSerialize(as = ImmutableCloudApplication.class) +@JsonDeserialize(as = ImmutableCloudApplication.class) +public abstract class CloudApplication extends CloudEntity implements Derivable { + + public enum State { + STARTED, STOPPED + } + + @Nullable + public abstract State getState(); + + @Nullable + public abstract Lifecycle getLifecycle(); + + @Nullable + public abstract CloudSpace getSpace(); + + @Override + public CloudApplication derive() { + return this; + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudAsyncJob.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudAsyncJob.java new file mode 100644 index 0000000000..394a40c3b7 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudAsyncJob.java @@ -0,0 +1,31 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import org.cloudfoundry.client.v3.jobs.JobState; +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; + +@Value.Immutable +@JsonSerialize(as = ImmutableCloudAsyncJob.class) +@JsonDeserialize(as = ImmutableCloudAsyncJob.class) +public abstract class CloudAsyncJob extends CloudEntity implements Derivable { + + public abstract JobState getState(); + + @Nullable + public abstract String getOperation(); + + @Nullable + public abstract String getWarnings(); + + @Nullable + public abstract String getErrors(); + + @Override + public CloudAsyncJob derive() { + return this; + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudBuild.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudBuild.java new file mode 100644 index 0000000000..6992277f62 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudBuild.java @@ -0,0 +1,67 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import java.util.UUID; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudBuild.ImmutableCreatedBy; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudBuild.ImmutablePackageInfo; + +@Value.Enclosing +@Value.Immutable +@JsonSerialize(as = ImmutableCloudBuild.class) +@JsonDeserialize(as = ImmutableCloudBuild.class) +public abstract class CloudBuild extends CloudEntity implements Derivable { + + @Nullable + public abstract State getState(); + + @Nullable + public abstract CreatedBy getCreatedBy(); + + @Nullable + public abstract DropletInfo getDropletInfo(); + + @Nullable + public abstract PackageInfo getPackageInfo(); + + @Nullable + public abstract String getError(); + + @Override + public CloudBuild derive() { + return this; + } + + public enum State { + FAILED, STAGED, STAGING + } + + @Value.Immutable + @JsonSerialize(as = ImmutablePackageInfo.class) + @JsonDeserialize(as = ImmutablePackageInfo.class) + public interface PackageInfo { + + @Nullable + @Value.Parameter + UUID getGuid(); + + } + + @Value.Immutable + @JsonSerialize(as = ImmutableCreatedBy.class) + @JsonDeserialize(as = ImmutableCreatedBy.class) + public interface CreatedBy { + + @Nullable + UUID getGuid(); + + @Nullable + String getName(); + + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudDomain.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudDomain.java new file mode 100644 index 0000000000..93ecbab450 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudDomain.java @@ -0,0 +1,18 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +@Value.Immutable +@JsonSerialize(as = ImmutableCloudDomain.class) +@JsonDeserialize(as = ImmutableCloudDomain.class) +public abstract class CloudDomain extends CloudEntity implements Derivable { + + @Override + public CloudDomain derive() { + return this; + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudEntity.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudEntity.java new file mode 100644 index 0000000000..16bf0aef9b --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudEntity.java @@ -0,0 +1,29 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import java.util.UUID; + +import org.cloudfoundry.client.v3.Metadata; + +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; + +/** + * Do not extend {@code Derivable} in this interface. It is tempting, because all of its children have the same implementation, but + * implementing the {@code derive()} method here leads to this bug: https://github.com/immutables/immutables/issues/1045 + * + */ +public abstract class CloudEntity { + + @Nullable + public abstract String getName(); + + @Nullable + public abstract CloudMetadata getMetadata(); + + @Nullable + public abstract Metadata getV3Metadata(); + + public UUID getGuid() { + return getMetadata().getGuid(); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudEvent.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudEvent.java new file mode 100644 index 0000000000..3afabb6db0 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudEvent.java @@ -0,0 +1,54 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import java.time.LocalDateTime; +import java.util.UUID; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudEvent.ImmutableParticipant; + +@Value.Enclosing +@Value.Immutable +@JsonSerialize(as = ImmutableCloudEvent.class) +@JsonDeserialize(as = ImmutableCloudEvent.class) +public abstract class CloudEvent extends CloudEntity implements Derivable { + + @Nullable + public abstract String getType(); + + @Nullable + public abstract Participant getActor(); + + @Nullable + public abstract Participant getTarget(); + + @Nullable + public LocalDateTime getTimestamp() { + return getMetadata().getCreatedAt(); + } + + @Override + public CloudEvent derive() { + return this; + } + + @Value.Immutable + @JsonSerialize(as = ImmutableParticipant.class) + @JsonDeserialize(as = ImmutableParticipant.class) + public interface Participant { + + @Nullable + UUID getGuid(); + + @Nullable + String getName(); + + @Nullable + String getType(); + + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudJob.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudJob.java new file mode 100644 index 0000000000..431c2350ee --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudJob.java @@ -0,0 +1,51 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; + +@Value.Immutable +@JsonSerialize(as = ImmutableCloudJob.class) +@JsonDeserialize(as = ImmutableCloudJob.class) +public abstract class CloudJob extends CloudEntity implements Derivable { + + @Nullable + public abstract Status getStatus(); + + @Nullable + public abstract ErrorDetails getErrorDetails(); + + @Override + public CloudJob derive() { + return this; + } + + public enum Status { + + FAILED("failed"), FINISHED("finished"), QUEUED("queued"), RUNNING("running"); + + private final String value; + + Status(String value) { + this.value = value; + } + + public static Status fromString(String value) { + for (Status status : Status.values()) { + if (status.value.equals(value)) { + return status; + } + } + throw new IllegalArgumentException("Invalid job status: " + value); + } + + @Override + public String toString() { + return value; + } + + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudMetadata.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudMetadata.java new file mode 100644 index 0000000000..8565216bbf --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudMetadata.java @@ -0,0 +1,35 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import java.time.LocalDateTime; +import java.util.UUID; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; + +@Value.Immutable +@JsonSerialize(as = ImmutableCloudMetadata.class) +@JsonDeserialize(as = ImmutableCloudMetadata.class) +public interface CloudMetadata { + + @Nullable + @Value.Parameter + UUID getGuid(); + + @Nullable + LocalDateTime getCreatedAt(); + + @Nullable + LocalDateTime getUpdatedAt(); + + @Nullable + String getUrl(); + + static CloudMetadata defaultMetadata() { + return ImmutableCloudMetadata.builder() + .build(); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudOrganization.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudOrganization.java new file mode 100644 index 0000000000..2e5231e7e2 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudOrganization.java @@ -0,0 +1,18 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +@Value.Immutable +@JsonSerialize(as = ImmutableCloudOrganization.class) +@JsonDeserialize(as = ImmutableCloudOrganization.class) +public abstract class CloudOrganization extends CloudEntity implements Derivable { + + @Override + public CloudOrganization derive() { + return this; + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudPackage.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudPackage.java new file mode 100644 index 0000000000..fe9ddd124d --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudPackage.java @@ -0,0 +1,62 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import java.util.Arrays; +import java.util.Objects; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonValue; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Messages; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; + +@Value.Immutable +@JsonSerialize(as = ImmutableCloudPackage.class) +@JsonDeserialize(as = ImmutableCloudPackage.class) +public abstract class CloudPackage extends CloudEntity implements Derivable { + + @Nullable + public abstract Type getType(); + + @Nullable + @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type") + @JsonSubTypes({ @JsonSubTypes.Type(name = "bits", value = BitsData.class), + @JsonSubTypes.Type(name = "docker", value = DockerData.class) }) + public abstract PackageData getData(); + + @Nullable + public abstract Status getStatus(); + + @Override + public CloudPackage derive() { + return this; + } + + public enum Type { + BITS, DOCKER; + + @JsonCreator + public static Type from(String s) { + Objects.requireNonNull(s); + return Arrays.stream(Type.values()) + .filter(type -> s.toLowerCase() + .equals(type.toString())) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(String.format(Messages.UNKNOWN_PACKAGE_TYPE, s))); + } + + @JsonValue + @Override + public String toString() { + return name().toLowerCase(); + } + } + + public interface PackageData { + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudProcess.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudProcess.java new file mode 100644 index 0000000000..8176d4cf66 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudProcess.java @@ -0,0 +1,37 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; + +@Value.Immutable +@JsonSerialize(as = ImmutableCloudProcess.class) +@JsonDeserialize(as = ImmutableCloudProcess.class) +public abstract class CloudProcess extends CloudEntity implements Derivable { + + public abstract String getCommand(); + + public abstract Integer getDiskInMb(); + + public abstract Integer getInstances(); + + public abstract Integer getMemoryInMb(); + + public abstract HealthCheckType getHealthCheckType(); + + @Nullable + public abstract String getHealthCheckHttpEndpoint(); + + @Nullable + public abstract Integer getHealthCheckInvocationTimeout(); + + @Nullable + public abstract Integer getHealthCheckTimeout(); + + @Override + public CloudProcess derive() { + return this; + } +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudRoute.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudRoute.java new file mode 100644 index 0000000000..c769706512 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudRoute.java @@ -0,0 +1,83 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import java.util.List; +import java.util.Objects; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; + +@Value.Immutable +@JsonSerialize(as = ImmutableCloudRoute.class) +@JsonDeserialize(as = ImmutableCloudRoute.class) +public abstract class CloudRoute extends CloudEntity implements Derivable { + + @Value.Default + public int getAppsUsingRoute() { + return 0; + } + + public abstract CloudDomain getDomain(); + + @Nullable + public abstract String getHost(); + + @Nullable + public abstract String getPath(); + + @Nullable + public abstract Integer getPort(); + + @Nullable + public abstract String getRequestedProtocol(); + + @Nullable + public abstract List getDestinations(); + + public abstract String getUrl(); + + @Override + public CloudRoute derive() { + return this; + } + + @Override + public String toString() { + return getUrl(); + } + + @Override + public int hashCode() { + return Objects.hash(getDomain().getName(), getHost(), getPath(), getPort()); + } + + @Override + public boolean equals(Object object) { + if (object == this) { + return true; + } + if (!(object instanceof CloudRoute)) { + return false; + } + var otherRoute = (CloudRoute) object; + var thisDomain = getDomain().getName(); + var otherDomain = otherRoute.getDomain() + .getName(); + // @formatter:off + return thisDomain.equals(otherDomain) + && areEmptyOrEqual(getHost(), otherRoute.getHost()) + && areEmptyOrEqual(getPath(), otherRoute.getPath()) + && Objects.equals(getPort(), otherRoute.getPort()); + // @formatter:on + } + + private static boolean areEmptyOrEqual(String lhs, String rhs) { + if (lhs == null || lhs.isEmpty()) { + return rhs == null || rhs.isEmpty(); + } + return lhs.equals(rhs); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudServiceBinding.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudServiceBinding.java new file mode 100644 index 0000000000..bceb94223b --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudServiceBinding.java @@ -0,0 +1,29 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import java.util.UUID; + +import org.cloudfoundry.Nullable; +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +@Value.Immutable +@JsonSerialize(as = ImmutableCloudServiceBinding.class) +@JsonDeserialize(as = ImmutableCloudServiceBinding.class) +public abstract class CloudServiceBinding extends CloudEntity implements Derivable { + + @Nullable + public abstract UUID getApplicationGuid(); + + public abstract UUID getServiceInstanceGuid(); + + @Nullable + public abstract ServiceCredentialBindingOperation getServiceBindingOperation(); + + @Override + public CloudServiceBinding derive() { + return this; + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudServiceBroker.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudServiceBroker.java new file mode 100644 index 0000000000..bfc6170166 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudServiceBroker.java @@ -0,0 +1,31 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; + +@Value.Immutable +@JsonSerialize(as = ImmutableCloudServiceBroker.class) +@JsonDeserialize(as = ImmutableCloudServiceBroker.class) +public abstract class CloudServiceBroker extends CloudEntity implements Derivable { + + @Nullable + public abstract String getUsername(); + + @Nullable + public abstract String getPassword(); + + @Nullable + public abstract String getUrl(); + + @Nullable + public abstract String getSpaceGuid(); + + @Override + public CloudServiceBroker derive() { + return this; + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudServiceInstance.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudServiceInstance.java new file mode 100644 index 0000000000..78db202828 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudServiceInstance.java @@ -0,0 +1,57 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import java.util.List; +import java.util.Map; + +import org.cloudfoundry.AllowNulls; +import org.cloudfoundry.client.v3.serviceinstances.ServiceInstanceType; +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; + +@Value.Immutable +@JsonSerialize(as = ImmutableCloudServiceInstance.class) +@JsonDeserialize(as = ImmutableCloudServiceInstance.class) +public abstract class CloudServiceInstance extends CloudEntity implements Derivable { + + @Nullable + public abstract String getLabel(); + + @Nullable + public abstract String getPlan(); + + @Nullable + public abstract String getProvider(); + + @Nullable + public abstract String getBroker(); + + @Nullable + public abstract String getVersion(); + + @AllowNulls + public abstract Map getCredentials(); + + @Nullable + public abstract String getSyslogDrainUrl(); + + public abstract List getTags(); + + @Nullable + public abstract ServiceInstanceType getType(); + + @Nullable + public abstract ServiceOperation getLastOperation(); + + public boolean isUserProvided() { + return getType() != null && getType().equals(ServiceInstanceType.USER_PROVIDED); + } + + @Override + public CloudServiceInstance derive() { + return this; + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudServiceKey.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudServiceKey.java new file mode 100644 index 0000000000..a77cad1967 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudServiceKey.java @@ -0,0 +1,32 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import java.util.Map; + +import org.cloudfoundry.AllowNulls; +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; + +@Value.Immutable +@JsonSerialize(as = ImmutableCloudServiceKey.class) +@JsonDeserialize(as = ImmutableCloudServiceKey.class) +public abstract class CloudServiceKey extends CloudEntity implements Derivable { + + @Nullable + @AllowNulls + public abstract Map getCredentials(); + + @Nullable + public abstract CloudServiceInstance getServiceInstance(); + + @Nullable + public abstract ServiceCredentialBindingOperation getServiceKeyOperation(); + + @Override + public CloudServiceKey derive() { + return this; + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudServiceOffering.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudServiceOffering.java new file mode 100644 index 0000000000..a7a29cec57 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudServiceOffering.java @@ -0,0 +1,48 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import java.util.List; +import java.util.Map; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; + +@Value.Immutable +@JsonSerialize(as = ImmutableCloudServiceOffering.class) +@JsonDeserialize(as = ImmutableCloudServiceOffering.class) +public abstract class CloudServiceOffering extends CloudEntity implements Derivable { + + @Nullable + public abstract Boolean isAvailable(); + + @Nullable + public abstract Boolean isBindable(); + + @Nullable + public abstract Boolean isShareable(); + + public abstract List getServicePlans(); + + @Nullable + public abstract String getDescription(); + + @Nullable + public abstract String getDocUrl(); + + @Nullable + public abstract Map getExtra(); + + @Nullable + public abstract String getBrokerId(); + + @Nullable + public abstract String getUniqueId(); + + @Override + public CloudServiceOffering derive() { + return this; + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudServicePlan.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudServicePlan.java new file mode 100644 index 0000000000..02dddfb231 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudServicePlan.java @@ -0,0 +1,39 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import java.util.Map; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; + +@Value.Immutable +@JsonSerialize(as = ImmutableCloudServicePlan.class) +@JsonDeserialize(as = ImmutableCloudServicePlan.class) +public abstract class CloudServicePlan extends CloudEntity implements Derivable { + + @Nullable + public abstract String getDescription(); + + @Nullable + public abstract Map getExtra(); + + @Nullable + public abstract String getUniqueId(); + + @Nullable + public abstract String getServiceOfferingId(); + + @Nullable + public abstract Boolean isFree(); + + @Nullable + public abstract Boolean isPublic(); + + @Override + public CloudServicePlan derive() { + return this; + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudSpace.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudSpace.java new file mode 100644 index 0000000000..7af5890352 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudSpace.java @@ -0,0 +1,22 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; + +@Value.Immutable +@JsonSerialize(as = ImmutableCloudSpace.class) +@JsonDeserialize(as = ImmutableCloudSpace.class) +public abstract class CloudSpace extends CloudEntity implements Derivable { + + @Nullable + public abstract CloudOrganization getOrganization(); + + @Override + public CloudSpace derive() { + return this; + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudStack.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudStack.java new file mode 100644 index 0000000000..269dc5b6df --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudStack.java @@ -0,0 +1,22 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; + +@Value.Immutable +@JsonSerialize(as = ImmutableCloudStack.class) +@JsonDeserialize(as = ImmutableCloudStack.class) +public abstract class CloudStack extends CloudEntity implements Derivable { + + @Nullable + public abstract String getDescription(); + + @Override + public CloudStack derive() { + return this; + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudTask.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudTask.java new file mode 100644 index 0000000000..f37f9d8f99 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudTask.java @@ -0,0 +1,61 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudTask.ImmutableLimits; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudTask.ImmutableResult; +import org.immutables.value.Value; + +@Value.Enclosing +@Value.Immutable +@JsonSerialize(as = ImmutableCloudTask.class) +@JsonDeserialize(as = ImmutableCloudTask.class) +public abstract class CloudTask extends CloudEntity implements Derivable { + + @Nullable + public abstract String getCommand(); + + @Nullable + public abstract Limits getLimits(); + + @Nullable + public abstract Result getResult(); + + @Nullable + public abstract State getState(); + + @Override + public CloudTask derive() { + return this; + } + + public enum State { + PENDING, RUNNING, SUCCEEDED, CANCELING, FAILED + } + + @Value.Immutable + @JsonSerialize(as = ImmutableResult.class) + @JsonDeserialize(as = ImmutableResult.class) + public interface Result { + + @Nullable + @Value.Parameter + String getFailureReason(); + + } + + @Value.Immutable + @JsonSerialize(as = ImmutableLimits.class) + @JsonDeserialize(as = ImmutableLimits.class) + public interface Limits { + + @Nullable + Integer getDisk(); + + @Nullable + Integer getMemory(); + + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/Derivable.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/Derivable.java new file mode 100644 index 0000000000..bcf68886e0 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/Derivable.java @@ -0,0 +1,7 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +public interface Derivable { + + T derive(); + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/DockerCredentials.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/DockerCredentials.java new file mode 100644 index 0000000000..00530d05d3 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/DockerCredentials.java @@ -0,0 +1,17 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +@Value.Immutable +@JsonSerialize(as = ImmutableDockerCredentials.class) +@JsonDeserialize(as = ImmutableDockerCredentials.class) +public interface DockerCredentials { + + String getUsername(); + + String getPassword(); + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/DockerData.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/DockerData.java new file mode 100644 index 0000000000..d250baa17b --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/DockerData.java @@ -0,0 +1,21 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; +import org.immutables.value.Value; + +@Value.Immutable +@JsonSerialize(as = ImmutableDockerData.class) +@JsonDeserialize(as = ImmutableDockerData.class) +public interface DockerData extends CloudPackage.PackageData { + + String getImage(); + + @Nullable + String getUsername(); + + @Nullable + String getPassword(); + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/DockerInfo.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/DockerInfo.java new file mode 100644 index 0000000000..84491ce5ff --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/DockerInfo.java @@ -0,0 +1,19 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; + +@Value.Immutable +@JsonSerialize(as = ImmutableDockerInfo.class) +@JsonDeserialize(as = ImmutableDockerInfo.class) +public interface DockerInfo { + + String getImage(); + + @Nullable + DockerCredentials getCredentials(); + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/DropletInfo.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/DropletInfo.java new file mode 100644 index 0000000000..22376f1a69 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/DropletInfo.java @@ -0,0 +1,23 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import java.util.UUID; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; + +@Value.Immutable +@JsonSerialize(as = ImmutableDropletInfo.class) +@JsonDeserialize(as = ImmutableDropletInfo.class) +public interface DropletInfo { + + @Nullable + @Value.Parameter + UUID getGuid(); + + @Nullable + @Value.Parameter + UUID getPackageGuid(); +} \ No newline at end of file diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/ErrorDetails.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/ErrorDetails.java new file mode 100644 index 0000000000..de2672a9e8 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/ErrorDetails.java @@ -0,0 +1,25 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; + +@Value.Immutable +@JsonSerialize(as = ImmutableErrorDetails.class) +@JsonDeserialize(as = ImmutableErrorDetails.class) +public interface ErrorDetails { + + @Value.Default + default long getCode() { + return 0; + } + + @Nullable + String getDescription(); + + @Nullable + String getErrorCode(); + +} \ No newline at end of file diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/HealthCheckType.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/HealthCheckType.java new file mode 100644 index 0000000000..6cd1a86842 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/HealthCheckType.java @@ -0,0 +1,10 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +public enum HealthCheckType { + HTTP, PORT, PROCESS, @Deprecated NONE; + + @Override + public String toString() { + return this.name().toLowerCase(); + } +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/InstanceInfo.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/InstanceInfo.java new file mode 100644 index 0000000000..f984108fff --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/InstanceInfo.java @@ -0,0 +1,17 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +@Value.Immutable +@JsonSerialize(as = ImmutableInstanceInfo.class) +@JsonDeserialize(as = ImmutableInstanceInfo.class) +public interface InstanceInfo { + + int getIndex(); + + InstanceState getState(); + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/InstanceState.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/InstanceState.java new file mode 100644 index 0000000000..89d88d803d --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/InstanceState.java @@ -0,0 +1,18 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import org.cloudfoundry.client.v3.processes.ProcessState; + +public enum InstanceState { + CRASHED, DOWN, RUNNING, STARTING, UNKNOWN; + + public static InstanceState valueOfWithDefault(ProcessState state) { + if (state == null) { + return UNKNOWN; + } + try { + return InstanceState.valueOf(state.getValue()); + } catch (IllegalArgumentException e) { + return InstanceState.UNKNOWN; + } + } +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/InstancesInfo.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/InstancesInfo.java new file mode 100644 index 0000000000..e569e52821 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/InstancesInfo.java @@ -0,0 +1,21 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import java.util.Collections; +import java.util.List; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +@Value.Immutable +@JsonSerialize(as = ImmutableInstancesInfo.class) +@JsonDeserialize(as = ImmutableInstancesInfo.class) +public interface InstancesInfo { + + @Value.Default + default List getInstances() { + return Collections.emptyList(); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/Lifecycle.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/Lifecycle.java new file mode 100644 index 0000000000..f448f2c668 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/Lifecycle.java @@ -0,0 +1,22 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; +import org.cloudfoundry.AllowNulls; +import org.immutables.value.Value; + +import java.util.Map; + +@Value.Immutable +@JsonSerialize(as = ImmutableLifecycle.class) +@JsonDeserialize(as = ImmutableLifecycle.class) +public interface Lifecycle { + + LifecycleType getType(); + + @Nullable + @AllowNulls + Map getData(); + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/LifecycleType.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/LifecycleType.java new file mode 100644 index 0000000000..0fd6463d42 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/LifecycleType.java @@ -0,0 +1,12 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +public enum LifecycleType { + + BUILDPACK, DOCKER, KPACK, CNB; + + public String toString() { + return this.name() + .toLowerCase(); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/PackageState.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/PackageState.java new file mode 100644 index 0000000000..6079c7135a --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/PackageState.java @@ -0,0 +1,5 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +public enum PackageState { + PENDING, STAGED, FAILED, +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/RouteDestination.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/RouteDestination.java new file mode 100644 index 0000000000..b8b23d5093 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/RouteDestination.java @@ -0,0 +1,30 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import java.util.UUID; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; + +@Value.Immutable +@JsonSerialize(as = ImmutableRouteDestination.class) +@JsonDeserialize(as = ImmutableRouteDestination.class) +public abstract class RouteDestination extends CloudEntity implements Derivable { + + public abstract UUID getApplicationGuid(); + + @Nullable + public abstract Integer getPort(); + + @Nullable + public abstract Integer getWeight(); + + public abstract String getProtocol(); + + @Override + public RouteDestination derive() { + return this; + } +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/SecurityGroupRule.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/SecurityGroupRule.java new file mode 100644 index 0000000000..38047bfb58 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/SecurityGroupRule.java @@ -0,0 +1,29 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; + +@Value.Immutable +@JsonSerialize(as = ImmutableSecurityGroupRule.class) +@JsonDeserialize(as = ImmutableSecurityGroupRule.class) +public interface SecurityGroupRule { + + String getProtocol(); + + String getPorts(); + + String getDestination(); + + @Nullable + Boolean getLog(); + + @Nullable + Integer getType(); + + @Nullable + Integer getCode(); + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/ServiceCredentialBindingOperation.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/ServiceCredentialBindingOperation.java new file mode 100644 index 0000000000..4f202834cc --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/ServiceCredentialBindingOperation.java @@ -0,0 +1,92 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import java.text.MessageFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; + +import org.cloudfoundry.client.v3.LastOperation; +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; + +@Value.Immutable +@JsonSerialize(as = ImmutableServiceCredentialBindingOperation.class) +@JsonDeserialize(as = ImmutableServiceCredentialBindingOperation.class) +public abstract class ServiceCredentialBindingOperation { + + public abstract Type getType(); + + public abstract State getState(); + + @Nullable + public abstract String getDescription(); + + @Nullable + public abstract LocalDateTime getCreatedAt(); + + @Nullable + public abstract LocalDateTime getUpdatedAt(); + + public static ServiceCredentialBindingOperation from(LastOperation lastOperation) { + String lastOperationType = lastOperation.getType(); + String lastOperationState = lastOperation.getState(); + String lastOperationDescription = lastOperation.getDescription(); + String lastOperationCreatedAt = lastOperation.getCreatedAt(); + String lastOperationUpdatedAt = lastOperation.getUpdatedAt(); + return ImmutableServiceCredentialBindingOperation.builder() + .type(ServiceCredentialBindingOperation.Type.fromString(lastOperationType)) + .state(ServiceCredentialBindingOperation.State.fromString(lastOperationState)) + .description(lastOperationDescription) + .createdAt(LocalDateTime.parse(lastOperationCreatedAt, + DateTimeFormatter.ISO_DATE_TIME)) + .updatedAt(LocalDateTime.parse(lastOperationUpdatedAt, + DateTimeFormatter.ISO_DATE_TIME)) + .build(); + } + + public enum Type { + CREATE, DELETE; + + public static Type fromString(String value) { + return Arrays.stream(values()) + .filter(type -> type.toString() + .equals(value)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(MessageFormat.format("Illegal service binding operation type: \"{0}\"", + value))); + } + + @Override + public String toString() { + return name().toLowerCase(); + } + } + + public enum State { + INITIAL("initial"), IN_PROGRESS("in progress"), SUCCEEDED("succeeded"), FAILED("failed"); + + private final String name; + + State(String name) { + this.name = name; + } + + @Override + public String toString() { + return name; + } + + public static State fromString(String value) { + return Arrays.stream(values()) + .filter(state -> state.toString() + .equals(value)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(MessageFormat.format("Illegal service binding state: \"{0}\"", + value))); + } + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/ServiceOperation.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/ServiceOperation.java new file mode 100644 index 0000000000..151dae6bfa --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/ServiceOperation.java @@ -0,0 +1,114 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import java.text.MessageFormat; +import java.util.Objects; + +import org.cloudfoundry.client.v3.LastOperation; + +public class ServiceOperation { + + public enum Type { + + CREATE, UPDATE, DELETE; + + @Override + public String toString() { + return name().toLowerCase(); + } + + public static Type fromString(String value) { + for (Type type : Type.values()) { + if (type.toString() + .equals(value)) { + return type; + } + } + throw new IllegalArgumentException(MessageFormat.format("Illegal service operation type: {0}", value)); + } + + } + + public enum State { + + SUCCEEDED("succeeded"), FAILED("failed"), IN_PROGRESS("in progress"), INITIAL("initial"); + + private final String name; + + State(String name) { + this.name = name; + } + + @Override + public String toString() { + return name; + } + + public static State fromString(String value) { + for (State state : State.values()) { + if (state.toString() + .equals(value)) { + return state; + } + } + throw new IllegalArgumentException(MessageFormat.format("Illegal service operation state: {0}", value)); + } + + } + + private Type type; + private String description; + private State state; + + ServiceOperation() { + // Required by Jackson. + } + + public ServiceOperation(Type type, String description, State state) { + this.type = type; + this.description = description; + this.state = state; + } + + public Type getType() { + return type; + } + + public String getDescription() { + return description; + } + + public State getState() { + return state; + } + + public static ServiceOperation fromLastOperation(LastOperation lastOperation) { + if (lastOperation == null || lastOperation.getType() == null || lastOperation.getState() == null) { + return null; + } + Type type = Type.fromString(lastOperation.getType()); + State state = State.fromString(lastOperation.getState()); + String description = lastOperation.getDescription(); + return new ServiceOperation(type, description, state); + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + ServiceOperation that = (ServiceOperation) o; + return type == that.type && state == that.state; + } + + @Override + public int hashCode() { + return Objects.hash(type, state); + } + + @Override + public String toString() { + return String.format("%s %s", type, state); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/ServicePlanVisibility.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/ServicePlanVisibility.java new file mode 100644 index 0000000000..4d550e1fad --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/ServicePlanVisibility.java @@ -0,0 +1,11 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +public enum ServicePlanVisibility { + + PUBLIC, ADMIN, ORGANIZATION; + + @Override + public String toString() { + return name().toLowerCase(); + } +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/Staging.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/Staging.java new file mode 100644 index 0000000000..a613849536 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/Staging.java @@ -0,0 +1,77 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import java.util.List; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; +import org.cloudfoundry.multiapps.controller.client.facade.SkipNulls; +import org.immutables.value.Value; + +@Value.Immutable +@JsonSerialize(as = ImmutableStaging.class) +@JsonDeserialize(as = ImmutableStaging.class) +public interface Staging { + /** + * @return The buildpacks, or empty to use the default buildpack detected based on application content + */ + @SkipNulls + List getBuildpacks(); + + /** + * @return The start command to use + */ + @Nullable + String getCommand(); + + /** + * @return Raw, free-form information regarding a detected buildpack, or null if no detected buildpack was resolved. For example, if the + * application is stopped, the detected buildpack may be null. + */ + @Nullable + String getDetectedBuildpack(); + + /** + * @return the health check timeout value + */ + @Nullable + Integer getHealthCheckTimeout(); + + /** + * @return health check type + */ + @Nullable + String getHealthCheckType(); + + /** + * @return health check http endpoint value + */ + @Nullable + String getHealthCheckHttpEndpoint(); + + /** + * @return boolean value to see if ssh is enabled + */ + @Nullable + Boolean isSshEnabled(); + + /** + * @return the stack to use when staging the application, or null to use the default stack + */ + @Nullable + String getStackName(); + + @Nullable + DockerInfo getDockerInfo(); + + @Nullable + Integer getInvocationTimeout(); + + @Nullable + LifecycleType getLifecycleType(); + + default String getBuildpack() { + return getBuildpacks().isEmpty() ? null : getBuildpacks().get(0); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/Status.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/Status.java new file mode 100644 index 0000000000..bead1fdff0 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/Status.java @@ -0,0 +1,5 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +public enum Status { + AWAITING_UPLOAD, COPYING, EXPIRED, PROCESSING_UPLOAD, READY, FAILED, +} \ No newline at end of file diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/Upload.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/Upload.java new file mode 100644 index 0000000000..bcd8f3afc9 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/Upload.java @@ -0,0 +1,19 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; + +@Value.Immutable +@JsonSerialize(as = ImmutableUpload.class) +@JsonDeserialize(as = ImmutableUpload.class) +public interface Upload { + + Status getStatus(); + + @Nullable + ErrorDetails getErrorDetails(); + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/UserRole.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/UserRole.java new file mode 100644 index 0000000000..3ee5e84386 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/UserRole.java @@ -0,0 +1,35 @@ +package org.cloudfoundry.multiapps.controller.client.facade.domain; + +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +import org.cloudfoundry.client.v3.roles.RoleType; + +public enum UserRole { + + ORGANIZATION_AUDITOR, + ORGANIZATION_BILLING_MANAGER, + ORGANIZATION_MANAGER, + ORGANIZATION_USER, + SPACE_AUDITOR, + SPACE_DEVELOPER, + SPACE_MANAGER; + + private static final Map NAMES_TO_VALUES = Arrays.stream(values()) + .collect(Collectors.toMap(UserRole::getName, + roleType -> roleType)); + + public static UserRole fromRoleType(RoleType roleType) { + UserRole userRole = NAMES_TO_VALUES.get(roleType.getValue()); + if (userRole == null) { + throw new IllegalArgumentException("Unknown user role: " + roleType.getValue()); + } + return userRole; + } + + public String getName() { + return name().toLowerCase(); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/dto/ApplicationToCreateDto.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/dto/ApplicationToCreateDto.java new file mode 100644 index 0000000000..e23244f2f4 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/dto/ApplicationToCreateDto.java @@ -0,0 +1,40 @@ +package org.cloudfoundry.multiapps.controller.client.facade.dto; + +import java.util.Map; +import java.util.Set; + +import org.cloudfoundry.client.v3.Metadata; +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Staging; + +@Value.Immutable +@JsonSerialize(as = ImmutableApplicationToCreateDto.class) +@JsonDeserialize(as = ImmutableApplicationToCreateDto.class) +public interface ApplicationToCreateDto { + + String getName(); + + @Nullable + Staging getStaging(); + + @Nullable + Integer getDiskQuotaInMb(); + + @Nullable + Integer getMemoryInMb(); + + @Nullable + Metadata getMetadata(); + + @Nullable + Set getRoutes(); + + @Nullable + Map getEnv(); + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/oauth2/OAuth2AccessTokenWithAdditionalInfo.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/oauth2/OAuth2AccessTokenWithAdditionalInfo.java new file mode 100644 index 0000000000..79fa50da32 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/oauth2/OAuth2AccessTokenWithAdditionalInfo.java @@ -0,0 +1,35 @@ +package org.cloudfoundry.multiapps.controller.client.facade.oauth2; + +import java.util.Map; + +import org.springframework.security.oauth2.core.OAuth2AccessToken; + +public class OAuth2AccessTokenWithAdditionalInfo { + + private OAuth2AccessToken oAuth2AccessToken; + private Map additionalInfo; + + public OAuth2AccessTokenWithAdditionalInfo(OAuth2AccessToken oAuth2AccessToken) { + this.oAuth2AccessToken = oAuth2AccessToken; + } + + public OAuth2AccessTokenWithAdditionalInfo(OAuth2AccessToken oAuth2AccessToken, Map additionalInfo) { + this.oAuth2AccessToken = oAuth2AccessToken; + this.additionalInfo = additionalInfo; + } + + public OAuth2AccessToken getOAuth2AccessToken() { + return oAuth2AccessToken; + } + + public Map getAdditionalInfo() { + return additionalInfo; + } + + public String getAuthorizationHeaderValue() { + return getOAuth2AccessToken().getTokenType() + .getValue() + + " " + getOAuth2AccessToken().getTokenValue(); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/oauth2/OAuthClient.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/oauth2/OAuthClient.java new file mode 100644 index 0000000000..79ccfe3e59 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/oauth2/OAuthClient.java @@ -0,0 +1,135 @@ +package org.cloudfoundry.multiapps.controller.client.facade.oauth2; + +import java.net.URL; +import java.time.Duration; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.HashMap; +import java.util.Map; + +import org.cloudfoundry.multiapps.controller.client.facade.Constants; +import org.cloudfoundry.multiapps.controller.client.facade.util.JsonUtil; +import org.cloudfoundry.reactor.TokenProvider; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.util.StringUtils; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.reactive.function.client.WebClientResponseException; +import org.springframework.web.server.ResponseStatusException; + +import org.cloudfoundry.multiapps.controller.client.facade.CloudCredentials; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.OAuthTokenProvider; +import reactor.util.retry.Retry; +import reactor.util.retry.RetryBackoffSpec; + +/** + * Client that can handle authentication against a UAA instance + */ +public class OAuthClient { + + private static final long MAX_RETRY_ATTEMPTS = 3; + private static final Duration RETRY_INTERVAL = Duration.ofSeconds(3); + + private final URL authorizationUrl; + protected OAuth2AccessTokenWithAdditionalInfo token; + protected CloudCredentials credentials; + protected final WebClient webClient; + protected final TokenFactory tokenFactory; + + public OAuthClient(URL authorizationUrl, WebClient webClient) { + this.authorizationUrl = authorizationUrl; + this.webClient = webClient; + this.tokenFactory = new TokenFactory(); + } + + public void init(CloudCredentials credentials) { + if (credentials != null) { + this.credentials = credentials; + if (credentials.getToken() != null) { + this.token = credentials.getToken(); + } else { + this.token = createToken(); + } + } + } + + public void clear() { + this.token = null; + this.credentials = null; + } + + public OAuth2AccessTokenWithAdditionalInfo getToken() { + if (token == null) { + return null; + } + if (shouldRefreshToken()) { + token = createToken(); + } + return token; + } + + public String getAuthorizationHeaderValue() { + OAuth2AccessTokenWithAdditionalInfo accessToken = getToken(); + if (accessToken != null) { + return accessToken.getAuthorizationHeaderValue(); + } + return null; + } + + public TokenProvider getTokenProvider() { + return new OAuthTokenProvider(this); + } + + private boolean shouldRefreshToken() { + return credentials.isRefreshable() && token.getOAuth2AccessToken() + .getExpiresAt() + .isBefore(Instant.now() + .plus(50, ChronoUnit.SECONDS)); + } + + protected OAuth2AccessTokenWithAdditionalInfo createToken() { + MultiValueMap formData = new LinkedMultiValueMap<>(); + formData.add("grant_type", "password"); + formData.add("client_id", credentials.getClientId()); + formData.add("client_secret", credentials.getClientSecret()); + formData.add("username", credentials.getEmail()); + formData.add("password", credentials.getPassword()); + formData.add("response_type", "token"); + addLoginHintIfPresent(formData); + + Oauth2AccessTokenResponse oauth2AccessTokenResponse = fetchOauth2AccessToken(formData); + return tokenFactory.createToken(oauth2AccessTokenResponse); + } + + private void addLoginHintIfPresent(MultiValueMap formData) { + if (StringUtils.hasLength(credentials.getOrigin())) { + Map loginHintMap = new HashMap<>(); + loginHintMap.put(Constants.ORIGIN_KEY, credentials.getOrigin()); + formData.add("login_hint", JsonUtil.convertToJson(loginHintMap)); + } + } + + private Oauth2AccessTokenResponse fetchOauth2AccessToken(MultiValueMap formData) { + try { + return webClient.post() + .uri(authorizationUrl + "/oauth/token") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE) + .body(BodyInserters.fromFormData(formData)) + .retrieve() + .bodyToFlux(Oauth2AccessTokenResponse.class) + .retryWhen(Retry.fixedDelay(MAX_RETRY_ATTEMPTS, RETRY_INTERVAL) + .onRetryExhaustedThrow(this::throwOriginalError)) + .blockFirst(); + } catch (WebClientResponseException e) { + throw new ResponseStatusException(e.getStatusCode(), e.getMessage(), e); + } + } + + private Throwable throwOriginalError(RetryBackoffSpec retrySpec, Retry.RetrySignal signal) { + return signal.failure(); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/oauth2/Oauth2AccessTokenResponse.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/oauth2/Oauth2AccessTokenResponse.java new file mode 100644 index 0000000000..c38781e8cd --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/oauth2/Oauth2AccessTokenResponse.java @@ -0,0 +1,32 @@ +package org.cloudfoundry.multiapps.controller.client.facade.oauth2; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +@Value.Immutable +@JsonSerialize(as = ImmutableOauth2AccessTokenResponse.class) +@JsonDeserialize(as = ImmutableOauth2AccessTokenResponse.class) +public interface Oauth2AccessTokenResponse { + + @JsonProperty("access_token") + String getAccessToken(); + + @JsonProperty("token_type") + String getTokenType(); + + @JsonProperty("id_token") + String getIdToken(); + + @JsonProperty("refresh_token") + String getRefreshToken(); + + @JsonProperty("expires_in") + long getExpiresIn(); + + String getScope(); + + String getJti(); +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/oauth2/TokenFactory.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/oauth2/TokenFactory.java new file mode 100644 index 0000000000..6d9f8c25e2 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/oauth2/TokenFactory.java @@ -0,0 +1,83 @@ +package org.cloudfoundry.multiapps.controller.client.facade.oauth2; + +import java.nio.charset.StandardCharsets; +import java.text.MessageFormat; +import java.time.Instant; +import java.util.Base64; +import java.util.Base64.Decoder; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; + +import org.springframework.http.HttpStatus; +import org.springframework.security.oauth2.core.OAuth2AccessToken; +import org.springframework.web.server.ResponseStatusException; + +import org.cloudfoundry.multiapps.controller.client.facade.util.JsonUtil; + +public class TokenFactory { + + private static final int JWT_TOKEN_PARTS_COUNT = 3; + + // Scopes: + public static final String SCOPE_CC_READ = "cloud_controller.read"; + public static final String SCOPE_CC_WRITE = "cloud_controller.write"; + public static final String SCOPE_CC_ADMIN = "cloud_controller.admin"; + + // Token Body elements: + public static final String SCOPE = "scope"; + public static final String EXPIRES_AT_KEY = "exp"; + public static final String ISSUED_AT_KEY = "iat"; + public static final String USER_NAME = "user_name"; + public static final String USER_ID = "user_id"; + public static final String CLIENT_ID = "client_id"; + + public OAuth2AccessTokenWithAdditionalInfo createToken(String tokenString) { + Map tokenInfo = parseToken(tokenString); + return createToken(tokenString, tokenInfo); + } + + @SuppressWarnings("unchecked") + public OAuth2AccessTokenWithAdditionalInfo createToken(String tokenString, Map tokenInfo) { + List scope = (List) tokenInfo.get(SCOPE); + Number expiresAt = (Number) tokenInfo.get(EXPIRES_AT_KEY); + Number instantiatedAt = (Number) tokenInfo.get(ISSUED_AT_KEY); + if (scope == null || expiresAt == null || instantiatedAt == null) { + throw new IllegalStateException(MessageFormat.format("One or more of the following elements are missing from the token: \"{0}\"", + List.of(SCOPE, EXPIRES_AT_KEY, ISSUED_AT_KEY))); + } + return new OAuth2AccessTokenWithAdditionalInfo(createOAuth2AccessToken(tokenString, scope, expiresAt, instantiatedAt), tokenInfo); + } + + private OAuth2AccessToken createOAuth2AccessToken(String tokenString, List scope, Number expiresAt, Number instantiatedAt) { + try { + return new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER, + tokenString, + Instant.ofEpochSecond(instantiatedAt.longValue()), + Instant.ofEpochSecond(expiresAt.longValue()), + new HashSet<>(scope)); + } catch (IllegalArgumentException e) { + throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, e.getMessage(), e); + } + } + + private Map parseToken(String tokenString) { + String[] headerBodySignature = tokenString.split("\\."); + if (headerBodySignature.length != JWT_TOKEN_PARTS_COUNT) { + return Collections.emptyMap(); + } + String body = decode(headerBodySignature[1]); + return JsonUtil.convertJsonToMap(body); + } + + private String decode(String string) { + Decoder decoder = Base64.getUrlDecoder(); + return new String(decoder.decode(string), StandardCharsets.UTF_8); + } + + public OAuth2AccessTokenWithAdditionalInfo createToken(Oauth2AccessTokenResponse oauth2AccessTokenResponse) { + return createToken(oauth2AccessTokenResponse.getAccessToken()); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerResponseErrorHandler.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerResponseErrorHandler.java new file mode 100644 index 0000000000..006e6051f4 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerResponseErrorHandler.java @@ -0,0 +1,76 @@ +package org.cloudfoundry.multiapps.controller.client.facade.rest; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.util.CloudUtil; +import org.springframework.http.HttpStatus; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.web.client.DefaultResponseErrorHandler; +import org.springframework.web.client.RestClientException; + +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CloudControllerResponseErrorHandler extends DefaultResponseErrorHandler { + + private static CloudOperationException getException(ClientHttpResponse response) throws IOException { + HttpStatus statusCode = HttpStatus.valueOf(response.getStatusCode() + .value()); + String statusText = response.getStatusText(); + + ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally + + if (response.getBody() != null) { + try { + @SuppressWarnings("unchecked") Map responseBody = mapper.readValue(response.getBody(), Map.class); + String description = getTrimmedDescription(responseBody); + return new CloudOperationException(statusCode, statusText, description); + } catch (IOException e) { + // Fall through. Handled below. + } + } + return new CloudOperationException(statusCode, statusText); + } + + private static String getTrimmedDescription(Map responseBody) { + String description = getDescription(responseBody); + return description == null ? null : description.trim(); + } + + private static String getDescription(Map responseBody) { + String description = getV2Description(responseBody); + return description == null ? getV3Description(responseBody) : description; + } + + private static String getV2Description(Map responseBody) { + return CloudUtil.parse(String.class, responseBody.get("description")); + } + + @SuppressWarnings("unchecked") + private static String getV3Description(Map responseBody) { + List> errors = (List>) responseBody.get("errors"); + return errors == null ? null : concatenateErrorMessages(errors); + } + + private static String concatenateErrorMessages(List> errors) { + return errors.stream() + .map(error -> (String) error.get("detail")) + .collect(Collectors.joining("\n")); + } + + @Override + public void handleError(ClientHttpResponse response) throws IOException { + HttpStatus statusCode = HttpStatus.valueOf(response.getStatusCode() + .value()); + switch (statusCode.series()) { + case CLIENT_ERROR: + case SERVER_ERROR: + throw getException(response); + default: + throw new RestClientException("Unknown status code [" + statusCode + "]"); + } + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerRestClient.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerRestClient.java new file mode 100644 index 0000000000..aaab7f1977 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerRestClient.java @@ -0,0 +1,263 @@ +package org.cloudfoundry.multiapps.controller.client.facade.rest; + +import java.nio.file.Path; +import java.time.Duration; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; + +import org.cloudfoundry.multiapps.controller.client.facade.dto.ApplicationToCreateDto; +import org.cloudfoundry.client.v3.Metadata; + +import org.cloudfoundry.multiapps.controller.client.facade.UploadStatusCallback; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudAsyncJob; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudBuild; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudDomain; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudEvent; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudProcess; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBroker; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceOffering; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudStack; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudTask; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DockerInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DropletInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstancesInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServicePlanVisibility; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Staging; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Upload; +import org.cloudfoundry.multiapps.controller.client.facade.domain.UserRole; + +/** + * Interface defining operations available for the cloud controller REST client implementations + * + */ +public interface CloudControllerRestClient { + + CloudSpace getTarget(); + + void addDomain(String domainName); + + void addRoute(String host, String domainName, String path); + + Optional bindServiceInstance(String bindingName, String applicationName, String serviceInstanceName); + + Optional bindServiceInstance(String bindingName, String applicationName, String serviceInstanceName, Map parameters); + + void createApplication(ApplicationToCreateDto applicationToCreateDto); + + void createServiceInstance(CloudServiceInstance serviceInstance); + + String createServiceBroker(CloudServiceBroker serviceBroker); + + CloudServiceKey createAndFetchServiceKey(CloudServiceKey keyModel, String serviceInstanceName); + + Optional createServiceKey(CloudServiceKey keyModel, String serviceInstanceName); + + Optional createServiceKey(String serviceInstanceName, String serviceKeyName, Map parameters); + + void createUserProvidedServiceInstance(CloudServiceInstance serviceInstance); + + void deleteApplication(String applicationName); + + void deleteDomain(String domainName); + + void deleteOrphanedRoutes(); + + void deleteRoute(String host, String domainName, String path); + + void deleteServiceInstance(String serviceInstanceName); + + void deleteServiceInstance(CloudServiceInstance serviceInstance); + + String deleteServiceBroker(String name); + + Optional deleteServiceBinding(String serviceInstanceName, String serviceKeyName); + + Optional deleteServiceBinding(UUID bindingGuid); + + CloudApplication getApplication(String applicationName); + + CloudApplication getApplication(String applicationName, boolean required); + + UUID getApplicationGuid(String applicationName); + + String getApplicationName(UUID applicationGuid); + + Map getApplicationEnvironment(UUID applicationGuid); + + Map getApplicationEnvironment(String applicationName); + + List getApplicationEvents(String applicationName); + + List getEventsByTarget(UUID uuid); + + InstancesInfo getApplicationInstances(CloudApplication app); + + InstancesInfo getApplicationInstances(UUID applicationGuid); + + CloudProcess getApplicationProcess(UUID applicationGuid); + + List getApplicationRoutes(UUID applicationGuid); + + boolean getApplicationSshEnabled(UUID applicationGuid); + + List getApplications(); + + CloudDomain getDefaultDomain(); + + List getDomains(); + + List getDomainsForOrganization(); + + List getEvents(); + + List getPrivateDomains(); + + List getRoutes(String domainName); + + UUID getRequiredServiceInstanceGuid(String name); + + CloudServiceInstance getServiceInstance(String serviceInstanceName); + + CloudServiceInstance getServiceInstance(String serviceInstanceName, boolean required); + + String getServiceInstanceName(UUID serviceInstanceGuid); + + CloudServiceInstance getServiceInstanceWithoutAuxiliaryContent(String serviceInstanceName); + + CloudServiceInstance getServiceInstanceWithoutAuxiliaryContent(String serviceInstanceName, boolean required); + + CloudServiceBinding getServiceBinding(UUID serviceBindingGuid); + + List getServiceAppBindings(UUID serviceInstanceGuid); + + List getAppBindings(UUID applicationGuid); + + CloudServiceBinding getServiceBindingForApplication(UUID applicationId, UUID serviceInstanceGuid); + + CloudServiceBroker getServiceBroker(String name); + + CloudServiceBroker getServiceBroker(String name, boolean required); + + List getServiceBrokers(); + + CloudServiceKey getServiceKey(String serviceInstanceName, String serviceKeyName); + + List getServiceKeys(String serviceInstanceName); + + List getServiceKeysWithCredentials(String serviceInstanceName); + + List getServiceKeys(CloudServiceInstance serviceInstance); + + List getServiceKeysWithCredentials(CloudServiceInstance serviceInstance); + + List getServiceOfferings(); + + List getSharedDomains(); + + CloudStack getStack(String name); + + CloudStack getStack(String name, boolean required); + + List getStacks(); + + void rename(String applicationName, String newName); + + void restartApplication(String applicationName); + + void startApplication(String applicationName); + + void stopApplication(String applicationName); + + Optional unbindServiceInstance(String applicationName, String serviceInstanceName); + + Optional unbindServiceInstance(UUID applicationGuid, UUID serviceInstanceGuid); + + void updateApplicationDiskQuota(String applicationName, int disk); + + void updateApplicationEnv(String applicationName, Map env); + + void updateApplicationInstances(String applicationName, int instances); + + void updateApplicationMemory(String applicationName, int memory); + + void updateApplicationStaging(String applicationName, Staging staging); + + void updateApplicationRoutes(String applicationName, Set routes); + + String updateServiceBroker(CloudServiceBroker serviceBroker); + + void updateServicePlanVisibilityForBroker(String name, ServicePlanVisibility visibility); + + void updateServicePlan(String serviceName, String planName); + + void updateServiceParameters(String serviceName, Map parameters); + + void updateServiceSyslogDrainUrl(String serviceName, String syslogDrainUrl); + + void updateServiceTags(String serviceName, List tags); + + CloudPackage asyncUploadApplication(String applicationName, Path file, UploadStatusCallback callback, Duration uploadTimeout); + + Upload getUploadStatus(UUID packageGuid); + + CloudTask getTask(UUID taskGuid); + + List getTasks(String applicationName); + + CloudTask runTask(String applicationName, CloudTask task); + + CloudTask cancelTask(UUID taskGuid); + + CloudBuild createBuild(UUID packageGuid); + + CloudBuild getBuild(UUID packageGuid); + + void bindDropletToApp(UUID dropletGuid, UUID applicationGuid); + + List getBuildsForApplication(UUID applicationGuid); + + Map getServiceInstanceParameters(UUID guid); + + Map getUserProvidedServiceInstanceParameters(UUID guid); + + Map getServiceBindingParameters(UUID guid); + + List getBuildsForPackage(UUID packageGuid); + + List getApplicationsByMetadataLabelSelector(String labelSelector); + + List getServiceInstancesWithoutAuxiliaryContentByNames(List names); + + List getServiceInstancesByMetadataLabelSelector(String labelSelector); + + List getServiceInstancesWithoutAuxiliaryContentByMetadataLabelSelector(String labelSelector); + + void updateApplicationMetadata(UUID guid, Metadata metadata); + + void updateServiceInstanceMetadata(UUID guid, Metadata metadata); + + void updateServiceBindingMetadata(UUID guid, Metadata metadata); + + DropletInfo getCurrentDropletForApplication(UUID applicationGuid); + + CloudPackage getPackage(UUID packageGuid); + + List getPackagesForApplication(UUID applicationGuid); + + Set getUserRolesBySpaceAndUser(UUID spaceGuid, UUID userGuid); + + CloudPackage createDockerPackage(UUID applicationGuid, DockerInfo dockerInfo); + + CloudAsyncJob getAsyncJob(String jobId); + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerRestClientFactory.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerRestClientFactory.java new file mode 100644 index 0000000000..d2258ed03c --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerRestClientFactory.java @@ -0,0 +1,72 @@ +package org.cloudfoundry.multiapps.controller.client.facade.rest; + +import org.cloudfoundry.multiapps.controller.client.facade.CloudCredentials; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.CloudFoundryClientFactory; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.ImmutableCloudFoundryClientFactory; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuthClient; +import org.cloudfoundry.multiapps.controller.client.facade.util.RestUtil; +import org.cloudfoundry.client.CloudFoundryClient; +import org.immutables.value.Value; + +import java.net.URL; +import java.time.Duration; +import java.util.Collections; +import java.util.Map; +import java.util.Optional; + +@Value.Immutable +public abstract class CloudControllerRestClientFactory { + private final RestUtil restUtil = new RestUtil(); + + public abstract Optional getSslHandshakeTimeout(); + + public abstract Optional getConnectTimeout(); + + public abstract Optional getConnectionPoolSize(); + + public abstract Optional getThreadPoolSize(); + + public abstract Optional getResponseTimeout(); + + @Value.Default + public boolean shouldTrustSelfSignedCertificates() { + return false; + } + + @Value.Derived + public CloudFoundryClientFactory getCloudFoundryClientFactory() { + ImmutableCloudFoundryClientFactory.Builder builder = ImmutableCloudFoundryClientFactory.builder(); + getSslHandshakeTimeout().ifPresent(builder::sslHandshakeTimeout); + getConnectTimeout().ifPresent(builder::connectTimeout); + getConnectionPoolSize().ifPresent(builder::connectionPoolSize); + getThreadPoolSize().ifPresent(builder::threadPoolSize); + getResponseTimeout().ifPresent(builder::responseTimeout); + return builder.build(); + } + + public CloudControllerRestClient createClient(URL controllerUrl, CloudCredentials credentials, String organizationName, + String spaceName, OAuthClient oAuthClient, Map requestTags) { + oAuthClient.init(credentials); + CloudSpaceClient spaceGetter = getCloudFoundryClientFactory().createSpaceClient(controllerUrl, oAuthClient, requestTags); + CloudSpace target = spaceGetter.getSpace(organizationName, spaceName); + return createClient(controllerUrl, credentials, target, oAuthClient, requestTags); + } + + public CloudControllerRestClient createClient(URL controllerUrl, CloudCredentials credentials, CloudSpace target) { + return createClient(controllerUrl, credentials, target, createOAuthClient(controllerUrl, credentials.getOrigin()), + Collections.emptyMap()); + } + + public CloudControllerRestClient createClient(URL controllerUrl, CloudCredentials credentials, CloudSpace target, + OAuthClient oAuthClient, Map requestTags) { + oAuthClient.init(credentials); + CloudFoundryClient delegate = getCloudFoundryClientFactory().createClient(controllerUrl, oAuthClient, requestTags); + return new CloudControllerRestClientImpl(delegate, target); + } + + private OAuthClient createOAuthClient(URL controllerUrl, String origin) { + return restUtil.createOAuthClientByControllerUrl(controllerUrl, shouldTrustSelfSignedCertificates()); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerRestClientImpl.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerRestClientImpl.java new file mode 100644 index 0000000000..8d1c65c75f --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerRestClientImpl.java @@ -0,0 +1,2572 @@ +package org.cloudfoundry.multiapps.controller.client.facade.rest; + +import java.nio.file.Path; +import java.text.MessageFormat; +import java.time.Duration; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.EnumSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.TimeUnit; +import java.util.function.Function; +import java.util.function.IntFunction; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.Constants; +import org.cloudfoundry.multiapps.controller.client.facade.Messages; +import org.cloudfoundry.multiapps.controller.client.facade.UploadStatusCallback; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.ImmutableRawCloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.ImmutableRawCloudAsyncJob; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.ImmutableRawCloudBuild; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.ImmutableRawCloudDomain; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.ImmutableRawCloudEvent; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.ImmutableRawCloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.ImmutableRawCloudProcess; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.ImmutableRawCloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.ImmutableRawCloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.ImmutableRawCloudServiceBroker; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.ImmutableRawCloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.ImmutableRawCloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.ImmutableRawCloudServiceOffering; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.ImmutableRawCloudServicePlan; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.ImmutableRawCloudStack; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.ImmutableRawCloudTask; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.ImmutableRawInstancesInfo; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.ImmutableRawUserRole; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.ImmutableRawV3CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.BitsData; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudAsyncJob; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudBuild; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudDomain; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudEntity; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudEvent; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudProcess; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBroker; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceOffering; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServicePlan; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudStack; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudTask; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Derivable; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DockerCredentials; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DockerInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DropletInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ErrorDetails; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableDropletInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableErrorDetails; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableInstancesInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableUpload; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstancesInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.RouteDestination; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServicePlanVisibility; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Staging; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Status; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Upload; +import org.cloudfoundry.multiapps.controller.client.facade.domain.UserRole; +import org.cloudfoundry.multiapps.controller.client.facade.dto.ApplicationToCreateDto; +import org.cloudfoundry.multiapps.controller.client.facade.util.JobV3Util; +import org.cloudfoundry.AbstractCloudFoundryException; +import org.cloudfoundry.client.CloudFoundryClient; +import org.cloudfoundry.client.v3.BuildpackData; +import org.cloudfoundry.client.v3.DockerData; +import org.cloudfoundry.client.v3.Lifecycle; +import org.cloudfoundry.client.v3.LifecycleType; +import org.cloudfoundry.client.v3.Metadata; +import org.cloudfoundry.client.v3.Relationship; +import org.cloudfoundry.client.v3.Resource; +import org.cloudfoundry.client.v3.ToOneRelationship; +import org.cloudfoundry.client.v3.applications.Application; +import org.cloudfoundry.client.v3.applications.ApplicationRelationships; +import org.cloudfoundry.client.v3.applications.ApplicationState; +import org.cloudfoundry.client.v3.applications.CreateApplicationRequest; +import org.cloudfoundry.client.v3.applications.CreateApplicationResponse; +import org.cloudfoundry.client.v3.applications.DeleteApplicationRequest; +import org.cloudfoundry.client.v3.applications.GetApplicationCurrentDropletRequest; +import org.cloudfoundry.client.v3.applications.GetApplicationCurrentDropletResponse; +import org.cloudfoundry.client.v3.applications.GetApplicationEnvironmentVariablesRequest; +import org.cloudfoundry.client.v3.applications.GetApplicationEnvironmentVariablesResponse; +import org.cloudfoundry.client.v3.applications.GetApplicationProcessRequest; +import org.cloudfoundry.client.v3.applications.GetApplicationProcessResponse; +import org.cloudfoundry.client.v3.applications.GetApplicationProcessStatisticsRequest; +import org.cloudfoundry.client.v3.applications.GetApplicationProcessStatisticsResponse; +import org.cloudfoundry.client.v3.applications.GetApplicationRequest; +import org.cloudfoundry.client.v3.applications.GetApplicationSshEnabledRequest; +import org.cloudfoundry.client.v3.applications.GetApplicationSshEnabledResponse; +import org.cloudfoundry.client.v3.applications.ListApplicationBuildsRequest; +import org.cloudfoundry.client.v3.applications.ListApplicationPackagesRequest; +import org.cloudfoundry.client.v3.applications.ListApplicationRoutesRequest; +import org.cloudfoundry.client.v3.applications.ListApplicationsRequest; +import org.cloudfoundry.client.v3.applications.ScaleApplicationRequest; +import org.cloudfoundry.client.v3.applications.SetApplicationCurrentDropletRequest; +import org.cloudfoundry.client.v3.applications.StartApplicationRequest; +import org.cloudfoundry.client.v3.applications.StopApplicationRequest; +import org.cloudfoundry.client.v3.applications.UpdateApplicationEnvironmentVariablesRequest; +import org.cloudfoundry.client.v3.applications.UpdateApplicationFeatureRequest; +import org.cloudfoundry.client.v3.applications.UpdateApplicationRequest; +import org.cloudfoundry.client.v3.applications.UpdateApplicationResponse; +import org.cloudfoundry.client.v3.auditevents.AuditEventResource; +import org.cloudfoundry.client.v3.auditevents.ListAuditEventsRequest; +import org.cloudfoundry.client.v3.builds.Build; +import org.cloudfoundry.client.v3.builds.CreateBuildRequest; +import org.cloudfoundry.client.v3.builds.GetBuildRequest; +import org.cloudfoundry.client.v3.builds.ListBuildsRequest; +import org.cloudfoundry.client.v3.domains.CreateDomainRequest; +import org.cloudfoundry.client.v3.domains.DeleteDomainRequest; +import org.cloudfoundry.client.v3.domains.Domain; +import org.cloudfoundry.client.v3.domains.DomainRelationships; +import org.cloudfoundry.client.v3.domains.DomainResource; +import org.cloudfoundry.client.v3.domains.ListDomainsRequest; +import org.cloudfoundry.client.v3.jobs.GetJobRequest; +import org.cloudfoundry.client.v3.organizations.GetOrganizationDefaultDomainRequest; +import org.cloudfoundry.client.v3.organizations.ListOrganizationDomainsRequest; +import org.cloudfoundry.client.v3.packages.CreatePackageRequest; +import org.cloudfoundry.client.v3.packages.CreatePackageResponse; +import org.cloudfoundry.client.v3.packages.GetPackageRequest; +import org.cloudfoundry.client.v3.packages.Package; +import org.cloudfoundry.client.v3.packages.PackageRelationships; +import org.cloudfoundry.client.v3.packages.PackageResource; +import org.cloudfoundry.client.v3.packages.PackageType; +import org.cloudfoundry.client.v3.packages.UploadPackageRequest; +import org.cloudfoundry.client.v3.processes.Data; +import org.cloudfoundry.client.v3.processes.HealthCheck; +import org.cloudfoundry.client.v3.processes.HealthCheckType; +import org.cloudfoundry.client.v3.processes.UpdateProcessRequest; +import org.cloudfoundry.client.v3.roles.ListRolesRequest; +import org.cloudfoundry.client.v3.roles.RoleResource; +import org.cloudfoundry.client.v3.roles.RoleType; +import org.cloudfoundry.client.v3.routes.CreateRouteRequest; +import org.cloudfoundry.client.v3.routes.CreateRouteResponse; +import org.cloudfoundry.client.v3.routes.DeleteRouteRequest; +import org.cloudfoundry.client.v3.routes.Destination; +import org.cloudfoundry.client.v3.routes.InsertRouteDestinationsRequest; +import org.cloudfoundry.client.v3.routes.ListRoutesRequest; +import org.cloudfoundry.client.v3.routes.RemoveRouteDestinationsRequest; +import org.cloudfoundry.client.v3.routes.RouteRelationships; +import org.cloudfoundry.client.v3.routes.RouteResource; +import org.cloudfoundry.client.v3.servicebindings.CreateServiceBindingRequest; +import org.cloudfoundry.client.v3.servicebindings.CreateServiceBindingResponse; +import org.cloudfoundry.client.v3.servicebindings.DeleteServiceBindingRequest; +import org.cloudfoundry.client.v3.servicebindings.GetServiceBindingDetailsRequest; +import org.cloudfoundry.client.v3.servicebindings.GetServiceBindingDetailsResponse; +import org.cloudfoundry.client.v3.servicebindings.GetServiceBindingParametersRequest; +import org.cloudfoundry.client.v3.servicebindings.GetServiceBindingParametersResponse; +import org.cloudfoundry.client.v3.servicebindings.ListServiceBindingsRequest; +import org.cloudfoundry.client.v3.servicebindings.ServiceBindingRelationships; +import org.cloudfoundry.client.v3.servicebindings.ServiceBindingResource; +import org.cloudfoundry.client.v3.servicebindings.ServiceBindingType; +import org.cloudfoundry.client.v3.servicebindings.UpdateServiceBindingRequest; +import org.cloudfoundry.client.v3.servicebrokers.BasicAuthentication; +import org.cloudfoundry.client.v3.servicebrokers.CreateServiceBrokerRequest; +import org.cloudfoundry.client.v3.servicebrokers.DeleteServiceBrokerRequest; +import org.cloudfoundry.client.v3.servicebrokers.ListServiceBrokersRequest; +import org.cloudfoundry.client.v3.servicebrokers.ServiceBrokerRelationships; +import org.cloudfoundry.client.v3.servicebrokers.ServiceBrokerResource; +import org.cloudfoundry.client.v3.servicebrokers.UpdateServiceBrokerRequest; +import org.cloudfoundry.client.v3.serviceinstances.CreateServiceInstanceRequest; +import org.cloudfoundry.client.v3.serviceinstances.DeleteServiceInstanceRequest; +import org.cloudfoundry.client.v3.serviceinstances.GetManagedServiceParametersRequest; +import org.cloudfoundry.client.v3.serviceinstances.GetManagedServiceParametersResponse; +import org.cloudfoundry.client.v3.serviceinstances.GetServiceInstanceRequest; +import org.cloudfoundry.client.v3.serviceinstances.GetUserProvidedCredentialsRequest; +import org.cloudfoundry.client.v3.serviceinstances.GetUserProvidedCredentialsResponse; +import org.cloudfoundry.client.v3.serviceinstances.ListServiceInstancesRequest; +import org.cloudfoundry.client.v3.serviceinstances.ServiceInstance; +import org.cloudfoundry.client.v3.serviceinstances.ServiceInstanceRelationships; +import org.cloudfoundry.client.v3.serviceinstances.ServiceInstanceResource; +import org.cloudfoundry.client.v3.serviceinstances.ServiceInstanceType; +import org.cloudfoundry.client.v3.serviceinstances.UpdateServiceInstanceRequest; +import org.cloudfoundry.client.v3.serviceofferings.GetServiceOfferingRequest; +import org.cloudfoundry.client.v3.serviceofferings.ListServiceOfferingsRequest; +import org.cloudfoundry.client.v3.serviceofferings.ServiceOffering; +import org.cloudfoundry.client.v3.serviceofferings.ServiceOfferingResource; +import org.cloudfoundry.client.v3.serviceplans.GetServicePlanRequest; +import org.cloudfoundry.client.v3.serviceplans.ListServicePlansRequest; +import org.cloudfoundry.client.v3.serviceplans.ServicePlan; +import org.cloudfoundry.client.v3.serviceplans.ServicePlanResource; +import org.cloudfoundry.client.v3.serviceplans.UpdateServicePlanVisibilityRequest; +import org.cloudfoundry.client.v3.serviceplans.Visibility; +import org.cloudfoundry.client.v3.spaces.DeleteUnmappedRoutesRequest; +import org.cloudfoundry.client.v3.stacks.ListStacksRequest; +import org.cloudfoundry.client.v3.stacks.Stack; +import org.cloudfoundry.client.v3.tasks.CancelTaskRequest; +import org.cloudfoundry.client.v3.tasks.CreateTaskRequest; +import org.cloudfoundry.client.v3.tasks.GetTaskRequest; +import org.cloudfoundry.client.v3.tasks.ListTasksRequest; +import org.cloudfoundry.client.v3.tasks.Task; +import org.cloudfoundry.util.PaginationUtils; +import org.springframework.http.HttpStatus; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +/** + * Abstract implementation of the CloudControllerClient intended to serve as the base. + */ +public class CloudControllerRestClientImpl implements CloudControllerRestClient { + + private static final long PACKAGE_UPLOAD_JOB_POLLING_PERIOD = TimeUnit.SECONDS.toMillis(5); + private static final Duration DELETE_JOB_TIMEOUT = Duration.ofMinutes(5); + private static final Duration BINDING_OPERATIONS_TIMEOUT = Duration.ofMinutes(10); + private static final int MAX_CHAR_LENGTH_FOR_PARAMS_IN_REQUEST = 4000; + + private CloudSpace target; // optional, as some operations do not require a targeted space + private CloudFoundryClient delegate; + + /** + * Only for unit tests. This works around the fact that the initialize method is called within the constructor and hence can not be + * overloaded, making it impossible to write unit tests that don't trigger network calls. + */ + protected CloudControllerRestClientImpl() { + } + + public CloudControllerRestClientImpl(CloudFoundryClient delegate) { + this(delegate, null); + } + + public CloudControllerRestClientImpl(CloudFoundryClient delegate, CloudSpace target) { + this.target = target; + this.delegate = delegate; + } + + @Override + public CloudSpace getTarget() { + return target; + } + + @Override + public void addDomain(String domainName) { + assertSpaceProvided("add domain"); + CloudDomain domain = findDomainByName(domainName); + if (domain == null) { + doCreateDomain(domainName); + } + } + + @Override + public void addRoute(String host, String domainName, String path) { + assertSpaceProvided("add route for domain"); + UUID domainGuid = getRequiredDomainGuid(domainName); + doAddRoute(domainGuid, host, path); + } + + @Override + public Optional bindServiceInstance(String bindingName, String applicationName, String serviceInstanceName) { + return bindServiceInstance(bindingName, applicationName, serviceInstanceName, null); + } + + @Override + public Optional bindServiceInstance(String bindingName, String applicationName, String serviceInstanceName, + Map parameters) { + UUID applicationGuid = getRequiredApplicationGuid(applicationName); + UUID serviceInstanceGuid = getRequiredServiceInstanceGuid(serviceInstanceName); + + var createBindingRequest = CreateServiceBindingRequest.builder() + .name(bindingName) + .type(ServiceBindingType.APPLICATION) + .relationships(ServiceBindingRelationships.builder() + .application(buildToOneRelationship( + applicationGuid)) + .serviceInstance( + buildToOneRelationship( + serviceInstanceGuid)) + .build()); + if (!CollectionUtils.isEmpty(parameters)) { + createBindingRequest.parameters(parameters); + } + return delegate.serviceBindingsV3() + .create(createBindingRequest.build()) + .map(CreateServiceBindingResponse::getJobId) + .block(); + } + + @Override + public void createApplication(ApplicationToCreateDto applicationToCreateDto) { + assertSpaceProvided("create application"); + CreateApplicationRequest createApplicationRequest = CreateApplicationRequest.builder() + .name(applicationToCreateDto.getName()) + .metadata(applicationToCreateDto.getMetadata()) + .lifecycle(buildApplicationLifecycle( + applicationToCreateDto.getStaging())) + .relationships(buildApplicationRelationships()) + .environmentVariables(applicationToCreateDto.getEnv()) + .build(); + CreateApplicationResponse createApplicationResponse = delegate.applicationsV3() + .create(createApplicationRequest) + .block(); + updateApplicationAttributes(applicationToCreateDto, createApplicationResponse.getId()); + } + + private Lifecycle buildApplicationLifecycle(Staging staging) { + // Prioritize Docker lifecycle if DockerInfo is provided + if (staging.getDockerInfo() != null) { + return createDockerLifecycle(); + } + + // Determine lifecycle type, defaulting to BUILDPACK if lifecycleType is null + LifecycleType lifecycleType = staging.getLifecycleType() != null ? LifecycleType.valueOf(staging.getLifecycleType() + .name()) + : LifecycleType.BUILDPACK; + + return createLifecycleByType(staging, lifecycleType); + } + + private Lifecycle createLifecycleByType(Staging staging, LifecycleType lifecycleType) { + validateLifecycleConfiguration(staging, lifecycleType); + BuildpackData buildpackData = createBuildpackData(staging); + return Lifecycle.builder() + .type(lifecycleType) + .data(buildpackData) + .build(); + } + + private Lifecycle createDockerLifecycle() { + return Lifecycle.builder() + .type(LifecycleType.DOCKER) + .data(DockerData.builder() + .build()) + .build(); + } + + private void validateLifecycleConfiguration(Staging staging, LifecycleType lifecycleType) { + if (lifecycleType == LifecycleType.CNB && CollectionUtils.isEmpty(staging.getBuildpacks())) { + throw new IllegalArgumentException(Messages.BUILDPACKS_ARE_REQUIRED_FOR_CNB_LIFECYCLE_TYPE); + } + } + + private BuildpackData createBuildpackData(Staging staging) { + BuildpackData.Builder buildpackDataBuilder = BuildpackData.builder() + .stack(staging.getStackName()); + if (staging.getBuildpacks() != null) { + buildpackDataBuilder.addAllBuildpacks(staging.getBuildpacks()); + } + return buildpackDataBuilder.build(); + } + + private ApplicationRelationships buildApplicationRelationships() { + return ApplicationRelationships.builder() + .space(buildToOneRelationship(getTargetSpaceGuid())) + .build(); + } + + private void updateApplicationAttributes(ApplicationToCreateDto applicationToCreateDto, String applicationGuid) { + UUID createdApplicationGuid = UUID.fromString(applicationGuid); + updateApplicationProcess(createdApplicationGuid, applicationToCreateDto.getStaging()); + delegate.applicationsV3() + .scale(ScaleApplicationRequest.builder() + .applicationId(createdApplicationGuid.toString()) + .type("web") + .memoryInMb(applicationToCreateDto.getMemoryInMb()) + .diskInMb(applicationToCreateDto.getDiskQuotaInMb()) + .build()) + .block(); + if (!CollectionUtils.isEmpty(applicationToCreateDto.getRoutes())) { + addRoutes(applicationToCreateDto.getRoutes(), createdApplicationGuid); + } + } + + private void updateApplicationProcess(UUID applicationGuid, Staging staging) { + if (staging.isSshEnabled() != null) { + updateSsh(applicationGuid, staging.isSshEnabled()); + } + GetApplicationProcessResponse getApplicationProcessResponse = getApplicationProcessResource(applicationGuid); + UpdateProcessRequest.Builder updateProcessRequestBuilder = UpdateProcessRequest.builder() + .processId(getApplicationProcessResponse.getId()) + .command(staging.getCommand()); + if (staging.getHealthCheckType() != null) { + updateProcessRequestBuilder.healthCheck(buildHealthCheck(staging)); + } + delegate.processes() + .update(updateProcessRequestBuilder.build()) + .block(); + } + + private void updateSsh(UUID applicationGuid, boolean isSshEnabled) { + delegate.applicationsV3() + .updateFeature(UpdateApplicationFeatureRequest.builder() + .featureName("ssh") + .enabled(isSshEnabled) + .applicationId(applicationGuid.toString()) + .build()) + .block(); + } + + private GetApplicationProcessResponse getApplicationProcessResource(UUID applicationGuid) { + return delegate.applicationsV3() + .getProcess(GetApplicationProcessRequest.builder() + .type("web") + .applicationId(applicationGuid.toString()) + .build()) + .block(); + } + + private HealthCheck buildHealthCheck(Staging staging) { + HealthCheckType healthCheckType = HealthCheckType.from(staging.getHealthCheckType()); + return HealthCheck.builder() + .type(healthCheckType) + .data(Data.builder() + .endpoint(staging.getHealthCheckHttpEndpoint()) + .timeout(staging.getHealthCheckTimeout()) + .invocationTimeout(staging.getInvocationTimeout()) + .build()) + .build(); + } + + private void addRoutes(Set routes, UUID applicationGuid) { + Map domains = getDomainsFromRoutes(routes); + for (CloudRoute route : routes) { + validateDomainForRoute(route, domains); + UUID domainGuid = domains.get(route.getDomain() + .getName()); + UUID routeGuid = getOrAddRoute(domainGuid, route.getHost(), route.getPath()); + bindRoute(routeGuid, applicationGuid, route.getRequestedProtocol()); + } + } + + @Override + public void createServiceInstance(CloudServiceInstance serviceInstance) { + assertSpaceProvided("create service instance"); + Assert.notNull(serviceInstance, "Service instance must not be null."); + CloudServicePlan servicePlan = findPlanForService(serviceInstance, serviceInstance.getPlan()); + UUID servicePlanGuid = servicePlan.getGuid(); + + delegate.serviceInstancesV3() + .create(CreateServiceInstanceRequest.builder() + .type(ServiceInstanceType.MANAGED) + .name(serviceInstance.getName()) + .metadata(serviceInstance.getV3Metadata()) + .relationships(ServiceInstanceRelationships.builder() + .servicePlan(buildToOneRelationship( + servicePlanGuid.toString())) + .space(buildToOneRelationship( + getTargetSpaceGuid().toString())) + .build()) + .tags(serviceInstance.getTags()) + .parameters(serviceInstance.getCredentials()) + .build()) + .block(); + } + + @Override + public String createServiceBroker(CloudServiceBroker serviceBroker) { + Assert.notNull(serviceBroker, "Service broker must not be null."); + + ServiceBrokerRelationships serviceBrokerRelationship = Optional.ofNullable(serviceBroker.getSpaceGuid()) + .map(UUID::fromString) + .map(this::buildToOneRelationship) + .map(spaceRelationship -> ServiceBrokerRelationships.builder() + .space( + spaceRelationship) + .build()) + .orElse(null); + + return delegate.serviceBrokersV3() + .create(CreateServiceBrokerRequest.builder() + .name(serviceBroker.getName()) + .url(serviceBroker.getUrl()) + .authentication(BasicAuthentication.builder() + .username(serviceBroker.getUsername()) + .password(serviceBroker.getPassword()) + .build()) + .relationships(serviceBrokerRelationship) + .build()) + .block(); + } + + @Override + public CloudServiceKey createAndFetchServiceKey(CloudServiceKey keyModel, String serviceInstanceName) { + CloudServiceInstance serviceInstance = getServiceInstance(serviceInstanceName); + doCreateServiceKeySync(keyModel.getName(), keyModel.getCredentials(), keyModel.getV3Metadata(), serviceInstance); + + return fetchWithAuxiliaryContent(() -> getServiceKeyResourceByNameAndServiceInstanceGuid(keyModel.getName(), + getGuid(serviceInstance)), + fetchedKey -> zipWithAuxiliaryServiceKeyContent(fetchedKey, serviceInstance)); + } + + @Override + public Optional createServiceKey(CloudServiceKey keyModel, String serviceInstanceName) { + CloudServiceInstance serviceInstance = getServiceInstance(serviceInstanceName); + return doCreateServiceKey(keyModel.getName(), keyModel.getCredentials(), keyModel.getV3Metadata(), serviceInstance); + } + + @Override + public Optional createServiceKey(String serviceInstanceName, String serviceKeyName, Map parameters) { + CloudServiceInstance serviceInstance = getServiceInstance(serviceInstanceName); + return doCreateServiceKey(serviceKeyName, parameters, null, serviceInstance); + } + + private void doCreateServiceKeySync(String name, Map parameters, Metadata metadata, + CloudServiceInstance serviceInstance) { + CreateServiceBindingRequest createServiceBindingRequest = buildServiceCredentialBindingRequest(name, parameters, metadata, + serviceInstance); + delegate.serviceBindingsV3() + .create(createServiceBindingRequest) + .map(response -> response.getJobId() + .get()) + .flatMap(jobId -> JobV3Util.waitForCompletion(delegate, BINDING_OPERATIONS_TIMEOUT, jobId)) + .block(); + } + + private Optional doCreateServiceKey(String name, Map parameters, Metadata metadata, + CloudServiceInstance serviceInstance) { + CreateServiceBindingRequest createServiceBindingRequest = buildServiceCredentialBindingRequest(name, parameters, metadata, + serviceInstance); + return delegate.serviceBindingsV3() + .create(createServiceBindingRequest) + .map(CreateServiceBindingResponse::getJobId) + .block(); + } + + private CreateServiceBindingRequest buildServiceCredentialBindingRequest(String name, Map parameters, Metadata metadata, + CloudServiceInstance serviceInstance) { + if (serviceInstance.getType() != ServiceInstanceType.MANAGED) { + throw new IllegalArgumentException(String.format(Messages.CANT_CREATE_SERVICE_KEY_FOR_USER_PROVIDED_SERVICE, + serviceInstance.getName())); + } + UUID serviceInstanceGuid = getGuid(serviceInstance); + + var createBindingRequest = CreateServiceBindingRequest.builder() + .type(ServiceBindingType.KEY) + .name(name) + .metadata(metadata) + .relationships(ServiceBindingRelationships.builder() + .serviceInstance( + buildToOneRelationship( + serviceInstanceGuid)) + .build()); + if (!CollectionUtils.isEmpty(parameters)) { + createBindingRequest.parameters(parameters); + } + return createBindingRequest.build(); + } + + @Override + public void createUserProvidedServiceInstance(CloudServiceInstance serviceInstance) { + assertSpaceProvided("create service instance"); + Assert.notNull(serviceInstance, "Service instance must not be null."); + String syslogDrainUrl = StringUtils.hasText(serviceInstance.getSyslogDrainUrl()) ? serviceInstance.getSyslogDrainUrl() : ""; + delegate.serviceInstancesV3() + .create(CreateServiceInstanceRequest.builder() + .name(serviceInstance.getName()) + .metadata(serviceInstance.getV3Metadata()) + .type(ServiceInstanceType.USER_PROVIDED) + .credentials(serviceInstance.getCredentials()) + .syslogDrainUrl(syslogDrainUrl) + .tags(serviceInstance.getTags()) + .relationships(ServiceInstanceRelationships.builder() + .space(buildToOneRelationship( + getTargetSpaceGuid().toString())) + .build()) + .build()) + .block(); + } + + @Override + public void deleteApplication(String applicationName) { + UUID applicationGuid = getRequiredApplicationGuid(applicationName); + deleteApplication(applicationGuid); + } + + private void deleteApplication(UUID applicationGuid) { + delegate.applicationsV3() + .delete(DeleteApplicationRequest.builder() + .applicationId(applicationGuid.toString()) + .build()) + .flatMap(jobId -> JobV3Util.waitForCompletion(delegate, DELETE_JOB_TIMEOUT, jobId)) + .block(); + } + + @Override + public void deleteDomain(String domainName) { + assertSpaceProvided("delete domain"); + CloudDomain domain = findDomainByName(domainName, true); + List routes = findRoutes(domain); + if (!routes.isEmpty()) { + throw new IllegalStateException("Unable to remove domain that is in use --" + " it has " + routes.size() + " routes."); + } + doDeleteDomain(getGuid(domain)); + } + + /** + * Delete routes that do not have any application which is assigned to them. + */ + @Override + public void deleteOrphanedRoutes() { + delegate.spacesV3() + .deleteUnmappedRoutes(DeleteUnmappedRoutesRequest.builder() + .spaceId(getTargetSpaceGuid().toString()) + .build()) + .flatMap(jobId -> JobV3Util.waitForCompletion(delegate, DELETE_JOB_TIMEOUT, jobId)) + .block(); + } + + @Override + public void deleteRoute(String host, String domainName, String path) { + assertSpaceProvided("delete route for domain"); + UUID routeGuid = getRouteGuid(getRequiredDomainGuid(domainName), host, path); + if (routeGuid == null) { + throw new CloudOperationException(HttpStatus.NOT_FOUND, + "Not Found", + "Host " + host + " not found for domain " + domainName + "."); + } + doDeleteRoute(routeGuid); + } + + @Override + public void deleteServiceInstance(String serviceInstanceName) { + CloudServiceInstance serviceInstance = getServiceInstanceWithoutAuxiliaryContent(serviceInstanceName); + doDeleteServiceInstance(serviceInstance.getGuid()); + } + + @Override + public void deleteServiceInstance(CloudServiceInstance serviceInstance) { + doDeleteServiceInstance(serviceInstance.getGuid()); + } + + @Override + public String deleteServiceBroker(String name) { + CloudServiceBroker broker = getServiceBroker(name); + UUID guid = broker.getMetadata() + .getGuid(); + return delegate.serviceBrokersV3() + .delete(DeleteServiceBrokerRequest.builder() + .serviceBrokerId(guid.toString()) + .build()) + .block(); + } + + @Override + public Optional deleteServiceBinding(String serviceInstanceName, String serviceKeyName) { + CloudServiceKey serviceKey = getServiceKey(serviceInstanceName, serviceKeyName); + if (serviceKey == null) { + throw new CloudOperationException(HttpStatus.NOT_FOUND, "Not Found", "Service key " + serviceKeyName + " not found."); + } + return doDeleteServiceBinding(serviceKey.getGuid()); + } + + @Override + public CloudApplication getApplication(String applicationName) { + return getApplication(applicationName, true); + } + + @Override + public CloudApplication getApplication(String applicationName, boolean required) { + return findApplicationByName(applicationName, required); + } + + @Override + public UUID getApplicationGuid(String applicationName) { + return getRequiredApplicationGuid(applicationName); + } + + @Override + public String getApplicationName(UUID applicationGuid) { + // This will throw a CloudOperationException with a 404 if no app with given GUID is present + return getApplicationByGuid(applicationGuid).block() + .getName(); + } + + @Override + public Map getApplicationEnvironment(UUID applicationGuid) { + return delegate.applicationsV3() + .getEnvironmentVariables(GetApplicationEnvironmentVariablesRequest.builder() + .applicationId(applicationGuid.toString()) + .build()) + .map(GetApplicationEnvironmentVariablesResponse::getVars) + .block(); + } + + @Override + public Map getApplicationEnvironment(String applicationName) { + UUID applicationGuid = getRequiredApplicationGuid(applicationName); + return getApplicationEnvironment(applicationGuid); + } + + @Override + public List getApplicationEvents(String applicationName) { + UUID applicationGuid = getRequiredApplicationGuid(applicationName); + return getEventsByTarget(applicationGuid); + } + + @Override + public List getEventsByTarget(UUID uuid) { + return findEventsByTarget(uuid.toString()); + } + + @Override + public InstancesInfo getApplicationInstances(CloudApplication application) { + if (application.getState() + .equals(CloudApplication.State.STARTED)) { + return findApplicationInstances(getGuid(application)); + } + return ImmutableInstancesInfo.builder() + .instances(Collections.emptyList()) + .build(); + } + + @Override + public InstancesInfo getApplicationInstances(UUID applicationGuid) { + return findApplicationInstances(applicationGuid); + } + + @Override + public CloudProcess getApplicationProcess(UUID applicationGuid) { + return fetch(() -> Mono.just(getApplicationProcessResource(applicationGuid)), ImmutableRawCloudProcess::of); + } + + @Override + public List getApplicationRoutes(UUID applicationGuid) { + return fetchList(() -> getRouteResourcesByAppGuid(applicationGuid), routeResource -> ImmutableRawCloudRoute.builder() + .route(routeResource) + .applicationGuid( + applicationGuid) + .build()); + } + + @Override + public boolean getApplicationSshEnabled(UUID applicationGuid) { + return delegate.applicationsV3() + .getSshEnabled(GetApplicationSshEnabledRequest.builder() + .applicationId(applicationGuid.toString()) + .build()) + .map(GetApplicationSshEnabledResponse::getEnabled) + .defaultIfEmpty(false) + .block(); + } + + @Override + public List getApplications() { + return fetchList(this::getApplicationResources, application -> ImmutableRawCloudApplication.builder() + .application(application) + .space(target) + .build()); + } + + @Override + public List getApplicationsByMetadataLabelSelector(String labelSelector) { + assertSpaceProvided("get applications"); + return fetchList(() -> getApplicationsByLabelSelector(labelSelector), application -> ImmutableRawCloudApplication.builder() + .application( + application) + .space(target) + .build()); + } + + private Flux getApplicationsByLabelSelector(String labelSelector) { + IntFunction pageRequestSupplier = page -> ListApplicationsRequest.builder() + .spaceId(getTargetSpaceGuid().toString()) + .labelSelector(labelSelector) + .page(page) + .build(); + return PaginationUtils.requestClientV3Resources(page -> delegate.applicationsV3() + .list(pageRequestSupplier.apply(page))); + } + + @Override + public CloudDomain getDefaultDomain() { + return fetch(() -> getDefaultDomainResource(getTargetOrganizationGuid().toString()), ImmutableRawCloudDomain::of); + } + + private Mono getDefaultDomainResource(String guid) { + return delegate.organizationsV3() + .getDefaultDomain(GetOrganizationDefaultDomainRequest.builder() + .organizationId(guid) + .build()); + } + + @Override + public List getSharedDomains() { + return fetchList(this::getSharedDomainResources, ImmutableRawCloudDomain::of); + } + + @Override + public List getDomains() { + return fetchList(this::getDomainResources, ImmutableRawCloudDomain::of); + } + + @Override + public List getDomainsForOrganization() { + assertSpaceProvided("access organization domains"); + return findDomainsByOrganizationGuid(getTargetOrganizationGuid()); + } + + @Override + public List getPrivateDomains() { + return fetchList(this::getPrivateDomainResources, ImmutableRawCloudDomain::of); + } + + @Override + public List getEvents() { + return fetchList(this::getEventResources, ImmutableRawCloudEvent::of); + } + + @Override + public List getRoutes(String domainName) { + assertSpaceProvided("get routes for domain"); + CloudDomain domain = findDomainByName(domainName, true); + return findRoutes(domain); + } + + @Override + public UUID getRequiredServiceInstanceGuid(String name) { + Resource serviceInstanceResource = getServiceInstanceByName(name).block(); + if (serviceInstanceResource == null) { + throw new CloudOperationException(HttpStatus.NOT_FOUND, "Not Found", "Service instance " + name + " not found."); + } + return UUID.fromString(serviceInstanceResource.getId()); + } + + @Override + public CloudServiceInstance getServiceInstance(String serviceInstanceName) { + return getServiceInstance(serviceInstanceName, true); + } + + @Override + public CloudServiceInstance getServiceInstance(String serviceInstanceName, boolean required) { + CloudServiceInstance serviceInstance = findServiceInstanceByName(serviceInstanceName); + return getServiceInstanceIfRequired(serviceInstanceName, serviceInstance, required); + } + + private CloudServiceInstance getServiceInstanceIfRequired(String serviceInstanceName, CloudServiceInstance serviceInstance, + boolean required) { + if (serviceInstance == null && required) { + throw new CloudOperationException(HttpStatus.NOT_FOUND, "Not Found", "Service instance " + serviceInstanceName + " not found."); + } + return serviceInstance; + } + + @Override + public CloudServiceBinding getServiceBinding(UUID serviceBindingGuid) { + // TODO: Refactor and use serviceBindingsV3.get() when https://github.com/cloudfoundry/cf-java-client/pull/1171 is merged and + // released + return fetch(() -> getServiceBindingResource(serviceBindingGuid), ImmutableRawCloudServiceBinding::of); + } + + private Mono getServiceBindingResource(UUID serviceBindingGuid) { + IntFunction pageRequestSupplier = page -> ListServiceBindingsRequest.builder() + .page(page) + .id(serviceBindingGuid.toString()) + .build(); + return PaginationUtils.requestClientV3Resources(page -> delegate.serviceBindingsV3() + .list(pageRequestSupplier.apply(page))) + .singleOrEmpty(); + } + + @Override + public List getServiceAppBindings(UUID serviceInstanceGuid) { + return fetchList(() -> getServiceBindingResourcesByServiceInstanceGuid(serviceInstanceGuid), ImmutableRawCloudServiceBinding::of); + } + + @Override + public List getAppBindings(UUID applicationGuid) { + return fetchList(() -> getServiceBindingResourcesByApplicationGuid(applicationGuid), ImmutableRawCloudServiceBinding::of); + } + + @Override + public CloudServiceBinding getServiceBindingForApplication(UUID applicationId, UUID serviceInstanceGuid) { + return fetch(() -> getServiceBindingResourceByApplicationGuidAndServiceInstanceGuid(applicationId, serviceInstanceGuid), + ImmutableRawCloudServiceBinding::of); + } + + @Override + public CloudServiceBroker getServiceBroker(String name) { + return getServiceBroker(name, true); + } + + @Override + public CloudServiceBroker getServiceBroker(String name, boolean required) { + CloudServiceBroker serviceBroker = findServiceBrokerByName(name); + if (serviceBroker == null && required) { + throw new CloudOperationException(HttpStatus.NOT_FOUND, "Not Found", "Service broker " + name + " not found."); + } + return serviceBroker; + } + + @Override + public List getServiceBrokers() { + return fetchList(this::getServiceBrokerResources, ImmutableRawCloudServiceBroker::of); + } + + @Override + public CloudServiceKey getServiceKey(String serviceInstanceName, String serviceKeyName) { + CloudServiceInstance serviceInstance = getServiceInstance(serviceInstanceName); + return fetchWithAuxiliaryContent(() -> getServiceKeyResourceByNameAndServiceInstanceGuid(serviceKeyName, serviceInstance.getGuid()), + serviceKey -> zipWithAuxiliaryServiceKeyContent(serviceKey, serviceInstance)); + } + + @Override + public List getServiceKeys(String serviceInstanceName) { + CloudServiceInstance serviceInstance = getServiceInstance(serviceInstanceName); + return getServiceKeys(serviceInstance); + } + + @Override + public List getServiceKeysWithCredentials(String serviceInstanceName) { + CloudServiceInstance serviceInstance = getServiceInstance(serviceInstanceName); + return getServiceKeysWithCredentials(serviceInstance); + } + + @Override + public List getServiceKeys(CloudServiceInstance serviceInstance) { + return fetchList(() -> getServiceKeyResource(serviceInstance), serviceKey -> ImmutableRawCloudServiceKey.builder() + .serviceInstance( + serviceInstance) + .serviceBindingResource( + serviceKey) + .build()); + } + + @Override + public List getServiceKeysWithCredentials(CloudServiceInstance serviceInstance) { + return fetchListWithAuxiliaryContent(() -> getServiceKeyResource(serviceInstance), + serviceKey -> zipWithAuxiliaryServiceKeyContent(serviceKey, serviceInstance)); + } + + private Mono> zipWithAuxiliaryServiceKeyContent(ServiceBindingResource key, + CloudServiceInstance serviceInstance) { + return getServiceKeyCredentials(key.getId()).map(credentials -> ImmutableRawCloudServiceKey.builder() + .serviceBindingResource(key) + .credentials(credentials) + .serviceInstance(serviceInstance) + .build()); + } + + private Mono> getServiceKeyCredentials(String keyGuid) { + return delegate.serviceBindingsV3() + .getDetails(GetServiceBindingDetailsRequest.builder() + .serviceBindingId(keyGuid) + .build()) + // CF V3 API returns 404 when fetching credentials of a service key which creation failed + .onErrorResume(t -> doesErrorMatchStatusCode(t, HttpStatus.NOT_FOUND), + t -> Mono.just(GetServiceBindingDetailsResponse.builder() + .volumeMounts(Collections.emptyList()) + .credentials(Collections.emptyMap()) + .build())) + .map(GetServiceBindingDetailsResponse::getCredentials); + } + + @Override + public Map getServiceInstanceParameters(UUID guid) { + return delegate.serviceInstancesV3() + .getManagedServiceParameters(GetManagedServiceParametersRequest.builder() + .serviceInstanceId(guid.toString()) + .build()) + .map(GetManagedServiceParametersResponse::getParameters) + .block(); + } + + @Override + public Map getUserProvidedServiceInstanceParameters(UUID guid) { + return delegate.serviceInstancesV3() + .getUserProvidedCredentials(GetUserProvidedCredentialsRequest.builder() + .serviceInstanceId(guid.toString()) + .build()) + .map(GetUserProvidedCredentialsResponse::getCredentials) + .block(); + } + + @Override + public Map getServiceBindingParameters(UUID guid) { + return delegate.serviceBindingsV3() + .getParameters(GetServiceBindingParametersRequest.builder() + .serviceBindingId(guid.toString()) + .build()) + .map(GetServiceBindingParametersResponse::getParameters) + .block(); + } + + @Override + public List getServiceOfferings() { + return fetchListWithAuxiliaryContent(this::getServiceResources, this::zipWithAuxiliaryServiceOfferingContent); + } + + @Override + public void updateServicePlan(String serviceName, String planName) { + CloudServiceInstance service = getServiceInstance(serviceName); + if (service.isUserProvided()) { + return; + } + CloudServicePlan plan = findPlanForService(service, planName); + delegate.serviceInstancesV3() + .update(UpdateServiceInstanceRequest.builder() + .serviceInstanceId(service.getGuid() + .toString()) + .relationships(ServiceInstanceRelationships.builder() + .servicePlan( + buildToOneRelationship(plan.getGuid())) + .build()) + .build()) + .block(); + } + + @Override + public String getServiceInstanceName(UUID serviceInstanceGuid) { + return getServiceInstanceByGuid(serviceInstanceGuid).block() + .getName(); + } + + @Override + public CloudServiceInstance getServiceInstanceWithoutAuxiliaryContent(String serviceInstanceName) { + return getServiceInstanceWithoutAuxiliaryContent(serviceInstanceName, true); + } + + @Override + public CloudServiceInstance getServiceInstanceWithoutAuxiliaryContent(String serviceInstanceName, boolean required) { + CloudServiceInstance serviceInstance = fetch(() -> getServiceInstanceResourceByName(serviceInstanceName), + ImmutableRawCloudServiceInstance::of); + return getServiceInstanceIfRequired(serviceInstanceName, serviceInstance, required); + } + + @Override + public void updateServiceParameters(String serviceName, Map parameters) { + CloudServiceInstance service = getServiceInstanceWithoutAuxiliaryContent(serviceName); + var updateServiceInstanceRequest = UpdateServiceInstanceRequest.builder() + .serviceInstanceId(service.getGuid() + .toString()); + if (service.isUserProvided()) { + updateServiceInstanceRequest.credentials(parameters); + } else { + updateServiceInstanceRequest.parameters(parameters); + } + delegate.serviceInstancesV3() + .update(updateServiceInstanceRequest.build()) + .block(); + } + + @Override + public void updateServiceTags(String serviceName, List tags) { + UUID serviceInstanceGuid = getRequiredServiceInstanceGuid(serviceName); + delegate.serviceInstancesV3() + .update(UpdateServiceInstanceRequest.builder() + .serviceInstanceId(serviceInstanceGuid.toString()) + .tags(tags) + .build()) + .block(); + } + + @Override + public void updateServiceSyslogDrainUrl(String serviceName, String syslogDrainUrl) { + CloudServiceInstance service = getServiceInstanceWithoutAuxiliaryContent(serviceName); + if (!service.isUserProvided()) { + return; + } + String updatedSyslogDrain = StringUtils.hasText(syslogDrainUrl) ? syslogDrainUrl : ""; + delegate.serviceInstancesV3() + .update(UpdateServiceInstanceRequest.builder() + .serviceInstanceId(service.getGuid() + .toString()) + .syslogDrainUrl(updatedSyslogDrain) + .build()) + .block(); + } + + private List> toBatches(Collection largeList, int maxCharLength) { + if (largeList.isEmpty()) { + return Collections.emptyList(); + } + + List> batches = new ArrayList<>(); + int currentBatchLength = 0, currentBatchIndex = 0; + batches.add(new ArrayList<>()); + + for (T element : largeList) { + int elementLength = element.toString() + .length(); + if (elementLength + currentBatchLength >= maxCharLength) { + batches.add(new ArrayList<>()); + currentBatchIndex++; + currentBatchLength = 0; + } + batches.get(currentBatchIndex) + .add(element); + currentBatchLength += elementLength; + } + return batches; + } + + private Flux getServiceInstancesByNames(List serviceInstanceNames) { + String spaceGuid = getTargetSpaceGuid().toString(); + IntFunction pageRequestSupplier = page -> ListServiceInstancesRequest.builder() + .spaceId(spaceGuid) + .addAllServiceInstanceNames( + serviceInstanceNames) + .page(page) + .build(); + return PaginationUtils.requestClientV3Resources(page -> delegate.serviceInstancesV3() + .list(pageRequestSupplier.apply(page))); + } + + @Override + public List getServiceInstancesWithoutAuxiliaryContentByNames(List names) { + List allServiceInstances = new ArrayList<>(); + for (List batchOfServiceInstanceNames : toBatches(names, MAX_CHAR_LENGTH_FOR_PARAMS_IN_REQUEST)) { + List serviceInstances = fetchList(() -> getServiceInstancesByNames(batchOfServiceInstanceNames), + ImmutableRawV3CloudServiceInstance::of); + allServiceInstances.addAll(serviceInstances); + } + return allServiceInstances; + } + + @Override + public List getServiceInstancesByMetadataLabelSelector(String labelSelector) { + IntFunction pageRequestSupplier = page -> ListServiceInstancesRequest.builder() + .labelSelector(labelSelector) + .spaceId( + getTargetSpaceGuid().toString()) + .page(page) + .build(); + + return fetchListWithAuxiliaryContent(() -> getServiceInstanceResources(pageRequestSupplier), + this::zipWithAuxiliaryServiceInstanceContent); + } + + @Override + public List getServiceInstancesWithoutAuxiliaryContentByMetadataLabelSelector(String labelSelector) { + IntFunction pageRequestSupplier = page -> ListServiceInstancesRequest.builder() + .labelSelector(labelSelector) + .spaceId( + getTargetSpaceGuid().toString()) + .page(page) + .build(); + + return fetchList(() -> getServiceInstanceResources(pageRequestSupplier), ImmutableRawCloudServiceInstance::of); + } + + @Override + public CloudStack getStack(String name) { + return getStack(name, true); + } + + @Override + public CloudStack getStack(String name, boolean required) { + CloudStack stack = findStackResource(name); + if (stack == null && required) { + throw new CloudOperationException(HttpStatus.NOT_FOUND, "Not Found", "Stack " + name + " not found."); + } + return stack; + } + + @Override + public List getStacks() { + return fetchList(this::getStackResources, ImmutableRawCloudStack::of); + } + + @Override + public void rename(String applicationName, String newName) { + UUID applicationGuid = getRequiredApplicationGuid(applicationName); + delegate.applicationsV3() + .update(UpdateApplicationRequest.builder() + .applicationId(applicationGuid.toString()) + .name(newName) + .build()) + .onErrorResume(t -> doesErrorMatchStatusCode(t, HttpStatus.SERVICE_UNAVAILABLE), + exception -> fallbackApplicationRename(newName, applicationGuid, exception)) + .block(); + } + + private Mono fallbackApplicationRename(String newName, UUID applicationGuid, Throwable exception) { + String existingApplicationName = getApplicationByGuid(applicationGuid).block() + .getName(); + if (newName.equals(existingApplicationName)) { + return Mono.empty(); + } + return Mono.error(exception); + } + + @Override + public void restartApplication(String applicationName) { + stopApplication(applicationName); + startApplication(applicationName); + } + + @Override + public void startApplication(String applicationName) { + Application application = getApplicationByName(applicationName).block(); + if (application.getState() == ApplicationState.STARTED) { + return; + } + UUID applicationGuid = UUID.fromString(application.getId()); + delegate.applicationsV3() + .start(StartApplicationRequest.builder() + .applicationId(applicationGuid.toString()) + .build()) + .block(); + } + + @Override + public void stopApplication(String applicationName) { + Application application = getApplicationByName(applicationName).block(); + if (application.getState() == ApplicationState.STOPPED) { + return; + } + UUID applicationGuid = UUID.fromString(application.getId()); + delegate.applicationsV3() + .stop(StopApplicationRequest.builder() + .applicationId(applicationGuid.toString()) + .build()) + .block(); + } + + @Override + public Optional unbindServiceInstance(String applicationName, String serviceInstanceName) { + UUID applicationGuid = getRequiredApplicationGuid(applicationName); + UUID serviceInstanceGuid = getRequiredServiceInstanceGuid(serviceInstanceName); + + return doUnbindServiceInstance(applicationGuid, serviceInstanceGuid); + } + + @Override + public Optional deleteServiceBinding(UUID serviceBindingGuid) { + return doDeleteServiceBinding(serviceBindingGuid); + } + + @Override + public Optional unbindServiceInstance(UUID applicationGuid, UUID serviceInstanceGuid) { + return doUnbindServiceInstance(applicationGuid, serviceInstanceGuid); + } + + @Override + public void updateApplicationDiskQuota(String applicationName, int diskQuota) { + UUID applicationGuid = getRequiredApplicationGuid(applicationName); + delegate.applicationsV3() + .scale(ScaleApplicationRequest.builder() + .applicationId(applicationGuid.toString()) + .type("web") + .diskInMb(diskQuota) + .build()) + .block(); + } + + @Override + public void updateApplicationEnv(String applicationName, Map env) { + UUID applicationGuid = getRequiredApplicationGuid(applicationName); + delegate.applicationsV3() + .updateEnvironmentVariables(UpdateApplicationEnvironmentVariablesRequest.builder() + .applicationId(applicationGuid.toString()) + .vars(env) + .build()) + .block(); + } + + @Override + public void updateApplicationInstances(String applicationName, int instances) { + UUID applicationGuid = getRequiredApplicationGuid(applicationName); + delegate.applicationsV3() + .scale(ScaleApplicationRequest.builder() + .applicationId(applicationGuid.toString()) + .type("web") + .instances(instances) + .build()) + .block(); + } + + @Override + public void updateApplicationMemory(String applicationName, int memory) { + UUID applicationGuid = getRequiredApplicationGuid(applicationName); + delegate.applicationsV3() + .scale(ScaleApplicationRequest.builder() + .applicationId(applicationGuid.toString()) + .type("web") + .memoryInMb(memory) + .build()) + .block(); + } + + @Override + public void updateApplicationMetadata(UUID guid, org.cloudfoundry.client.v3.Metadata metadata) { + delegate.applicationsV3() + .update(org.cloudfoundry.client.v3.applications.UpdateApplicationRequest.builder() + .applicationId(guid.toString()) + .metadata(metadata) + .build()) + .block(); + } + + @Override + public void updateApplicationStaging(String applicationName, Staging staging) { + UUID applicationGuid = getRequiredApplicationGuid(applicationName); + delegate.applicationsV3() + .update(UpdateApplicationRequest.builder() + .applicationId(applicationGuid.toString()) + .lifecycle(buildApplicationLifecycle(staging)) + .build()) + .block(); + updateApplicationProcess(applicationGuid, staging); + } + + @Override + public void updateApplicationRoutes(String applicationName, Set updatedRoutes) { + UUID applicationGuid = getApplicationGuid(applicationName); + List appRoutes = fetchList(() -> getRouteResourcesByAppGuid(applicationGuid), ImmutableRawCloudRoute::of); + Set outdatedRoutes = getOutdatedRoutes(applicationGuid, appRoutes, updatedRoutes); + Set newRoutes = getNewRoutes(applicationGuid, appRoutes, updatedRoutes); + removeRoutes(outdatedRoutes, applicationGuid); + addRoutes(newRoutes, applicationGuid); + } + + private Set getOutdatedRoutes(UUID applicationGuid, List currentRoutes, Set updatedRoutes) { + return currentRoutes.stream() + .filter(currentRoute -> isRouteOutdated(applicationGuid, currentRoute, updatedRoutes)) + .collect(Collectors.toSet()); + } + + private boolean isRouteOutdated(UUID applicationGuid, CloudRoute currentRoute, Set updatedRoutes) { + Optional updatedRoute = findRoute(currentRoute.getUrl(), updatedRoutes); + if (updatedRoute.isEmpty()) { + return true; + } + return isProtocolChanged(applicationGuid, currentRoute, updatedRoute.get()); + } + + private Optional findRoute(String url, Collection routes) { + return routes.stream() + .filter(route -> Objects.equals(url, route.getUrl())) + .findFirst(); + } + + private boolean isProtocolChanged(UUID applicationGuid, CloudRoute currentRoute, CloudRoute updatedRoute) { + if (updatedRoute.getRequestedProtocol() == null) { + return false; + } + return currentRoute.getDestinations() + .stream() + .filter(routeDestination -> Objects.equals(routeDestination.getApplicationGuid(), applicationGuid)) + .noneMatch(routeDestination -> Objects.equals(routeDestination.getProtocol(), + updatedRoute.getRequestedProtocol())); + } + + private Set getNewRoutes(UUID applicationGuid, List currentRoutes, Set updatedRoutes) { + return updatedRoutes.stream() + .filter(updatedRoute -> isRouteUpdated(applicationGuid, updatedRoute, currentRoutes)) + .collect(Collectors.toSet()); + } + + private boolean isRouteUpdated(UUID applicationGuid, CloudRoute updatedRoute, List currentRoutes) { + Optional currentRoute = findRoute(updatedRoute.getUrl(), currentRoutes); + if (currentRoute.isEmpty()) { + return true; + } + return isProtocolChanged(applicationGuid, currentRoute.get(), updatedRoute); + } + + @Override + public String updateServiceBroker(CloudServiceBroker serviceBroker) { + Assert.notNull(serviceBroker, "Service broker must not be null."); + + CloudServiceBroker existingBroker = getServiceBroker(serviceBroker.getName()); + UUID brokerGuid = existingBroker.getMetadata() + .getGuid(); + + return delegate.serviceBrokersV3() + .update(UpdateServiceBrokerRequest.builder() + .serviceBrokerId(brokerGuid.toString()) + .name(serviceBroker.getName()) + .authentication(BasicAuthentication.builder() + .username(serviceBroker.getUsername()) + .password(serviceBroker.getPassword()) + .build()) + .url(serviceBroker.getUrl()) + .build()) + .flatMap(response -> Mono.justOrEmpty(response.jobId())) + .block(); + } + + @Override + public void updateServiceInstanceMetadata(UUID guid, org.cloudfoundry.client.v3.Metadata metadata) { + delegate.serviceInstancesV3() + .update(UpdateServiceInstanceRequest.builder() + .serviceInstanceId(guid.toString()) + .metadata(metadata) + .build()) + .block(); + } + + @Override + public void updateServiceBindingMetadata(UUID guid, org.cloudfoundry.client.v3.Metadata metadata) { + delegate.serviceBindingsV3() + .update(UpdateServiceBindingRequest.builder() + .serviceBindingId(guid.toString()) + .metadata(metadata) + .build()) + .block(); + } + + @Override + public void updateServicePlanVisibilityForBroker(String name, ServicePlanVisibility visibility) { + CloudServiceBroker broker = getServiceBroker(name); + List servicePlans = findServicePlansByBrokerGuid(getGuid(broker)); + for (CloudServicePlan servicePlan : servicePlans) { + updateServicePlanVisibility(servicePlan, visibility); + } + } + + @Override + public CloudTask getTask(UUID taskGuid) { + return fetch(() -> getTaskResource(taskGuid), ImmutableRawCloudTask::of); + } + + @Override + public List getTasks(String applicationName) { + UUID applicationGuid = getRequiredApplicationGuid(applicationName); + return fetchList(() -> getTaskResourcesByApplicationGuid(applicationGuid), ImmutableRawCloudTask::of); + } + + @Override + public CloudTask runTask(String applicationName, CloudTask task) { + UUID applicationGuid = getRequiredApplicationGuid(applicationName); + return createTask(applicationGuid, task); + } + + @Override + public CloudTask cancelTask(UUID taskGuid) { + return fetch(() -> cancelTaskResource(taskGuid), ImmutableRawCloudTask::of); + } + + @Override + public CloudPackage asyncUploadApplication(String applicationName, Path file, UploadStatusCallback callback, Duration uploadTimeout) { + CloudPackage cloudPackage = startUpload(applicationName, file, uploadTimeout); + processAsyncUploadInBackground(cloudPackage, callback); + return cloudPackage; + } + + @Override + public Upload getUploadStatus(UUID packageGuid) { + CloudPackage cloudPackage = getPackage(packageGuid); + ErrorDetails errorDetails = null; + if (cloudPackage.getType() == CloudPackage.Type.BITS) { + errorDetails = ImmutableErrorDetails.builder() + .description(((BitsData) cloudPackage.getData()).getError()) + .build(); + } + return ImmutableUpload.builder() + .status(cloudPackage.getStatus()) + .errorDetails(errorDetails) + .build(); + } + + @Override + public CloudBuild getBuild(UUID buildGuid) { + return fetch(() -> getBuildResource(buildGuid), ImmutableRawCloudBuild::of); + } + + @Override + public List getBuildsForApplication(UUID applicationGuid) { + return fetchList(() -> getBuildResourcesByApplicationGuid(applicationGuid), ImmutableRawCloudBuild::of); + } + + @Override + public List getBuildsForPackage(UUID packageGuid) { + return fetchList(() -> getBuildResourcesByPackageGuid(packageGuid), ImmutableRawCloudBuild::of); + } + + @Override + public CloudBuild createBuild(UUID packageGuid) { + return fetch(() -> createBuildResource(packageGuid), ImmutableRawCloudBuild::of); + } + + @Override + public void bindDropletToApp(UUID dropletGuid, UUID applicationGuid) { + delegate.applicationsV3() + .setCurrentDroplet(SetApplicationCurrentDropletRequest.builder() + .applicationId(applicationGuid.toString()) + .data(Relationship.builder() + .id(dropletGuid.toString()) + .build()) + .build()) + .block(); + } + + @Override + public DropletInfo getCurrentDropletForApplication(UUID applicationGuid) { + GetApplicationCurrentDropletResponse dropletResponse = delegate.applicationsV3() + .getCurrentDroplet(GetApplicationCurrentDropletRequest.builder() + .applicationId( + applicationGuid.toString()) + .build()) + .block(); + if (dropletResponse == null) { + throw new CloudOperationException(HttpStatus.NOT_FOUND, + "Not found", + "Application with guid " + applicationGuid + " does not have a droplet"); + } + return parseDropletInfo(dropletResponse); + } + + private DropletInfo parseDropletInfo(GetApplicationCurrentDropletResponse getApplicationCurrentDropletResponse) { + String packageUrl = getApplicationCurrentDropletResponse.getLinks() + .get(Constants.PACKAGE) + .getHref(); + if (packageUrl.endsWith("/")) { + packageUrl = packageUrl.substring(0, packageUrl.lastIndexOf("/")); + } + String packageGuid = packageUrl.substring(packageUrl.lastIndexOf("/") + 1); + return ImmutableDropletInfo.builder() + .guid(UUID.fromString(getApplicationCurrentDropletResponse.getId())) + .packageGuid(UUID.fromString(packageGuid)) + .build(); + } + + @Override + public List getPackagesForApplication(UUID applicationGuid) { + return fetchList(() -> getPackages(applicationGuid.toString()), ImmutableRawCloudPackage::of); + } + + private Flux getPackages(String applicationGuid) { + IntFunction pageRequestSupplier = page -> ListApplicationPackagesRequest.builder() + .page(page) + .applicationId( + applicationGuid) + .build(); + return PaginationUtils.requestClientV3Resources(page -> delegate.applicationsV3() + .listPackages(pageRequestSupplier.apply(page))); + } + + @Override + public Set getUserRolesBySpaceAndUser(UUID spaceGuid, UUID userGuid) { + Supplier> setFactory = () -> EnumSet.noneOf(UserRole.class); + return fetchFlux(() -> getRoles(spaceGuid, userGuid), ImmutableRawUserRole::of).collect(Collectors.toCollection(setFactory)) + .block(); + } + + public CloudPackage createDockerPackage(UUID applicationGuid, DockerInfo dockerInfo) { + org.cloudfoundry.client.v3.packages.DockerData.Builder dockerDataBuilder = org.cloudfoundry.client.v3.packages.DockerData.builder() + .image( + dockerInfo.getImage()); + if (dockerInfo.getCredentials() != null) { + addNonNullDockerCredentials(dockerInfo.getCredentials(), dockerDataBuilder); + } + CreatePackageRequest packageRequest = CreatePackageRequest.builder() + .type(PackageType.DOCKER) + .data(dockerDataBuilder.build()) + .relationships(buildPackageRelationships(applicationGuid)) + .build(); + CreatePackageResponse packageResponse = delegate.packages() + .create(packageRequest) + .block(); + return getPackage(UUID.fromString(packageResponse.getId())); + } + + @Override + public CloudAsyncJob getAsyncJob(String jobId) { + return fetch(() -> delegate.jobsV3() + .get(GetJobRequest.builder() + .jobId(jobId) + .build()), + ImmutableRawCloudAsyncJob::of); + } + + private void addNonNullDockerCredentials(DockerCredentials dockerCredentials, + org.cloudfoundry.client.v3.packages.DockerData.Builder dockerDataBuilder) { + String username = dockerCredentials.getUsername(); + if (username != null) { + dockerDataBuilder.username(username); + } + String password = dockerCredentials.getPassword(); + if (password != null) { + dockerDataBuilder.password(password); + } + } + + private Flux getRoles(UUID spaceGuid, UUID userGuid) { + IntFunction pageRequestSupplier = page -> ListRolesRequest.builder() + .page(page) + .spaceId(spaceGuid.toString()) + .userId(userGuid.toString()) + .types(RoleType.values()) + .build(); + return PaginationUtils.requestClientV3Resources(page -> delegate.rolesV3() + .list(pageRequestSupplier.apply(page))); + } + + private CloudApplication findApplicationByName(String name, boolean required) { + CloudApplication application = findApplicationByName(name); + if (application == null && required) { + throw new CloudOperationException(HttpStatus.NOT_FOUND, "Not Found", "Application " + name + " not found."); + } + return application; + } + + private CloudApplication findApplicationByName(String name) { + return fetch(() -> getApplicationByName(name), application -> ImmutableRawCloudApplication.builder() + .application(application) + .space(target) + .build()); + } + + private Flux getApplicationResources() { + assertSpaceProvided("get application"); + IntFunction pageRequestSupplier = page -> ListApplicationsRequest.builder() + .spaceId(getTargetSpaceGuid().toString()) + .page(page) + .build(); + return PaginationUtils.requestClientV3Resources(page -> delegate.applicationsV3() + .list(pageRequestSupplier.apply(page))); + } + + private Mono getApplicationByGuid(UUID guid) { + return delegate.applicationsV3() + .get(GetApplicationRequest.builder() + .applicationId(guid.toString()) + .build()); + } + + private Mono getApplicationByName(String name) { + assertSpaceProvided("get application"); + IntFunction pageRequestSupplier = page -> ListApplicationsRequest.builder() + .spaceId(getTargetSpaceGuid().toString()) + .name(name) + .page(page) + .build(); + return PaginationUtils.requestClientV3Resources(page -> delegate.applicationsV3() + .list(pageRequestSupplier.apply(page))) + .singleOrEmpty(); + } + + private CloudServiceInstance findServiceInstanceByName(String name) { + return fetchWithAuxiliaryContent(() -> getServiceInstanceResourceByName(name), this::zipWithAuxiliaryServiceInstanceContent); + } + + private Mono getServiceInstanceByGuid(UUID serviceInstanceGuid) { + return delegate.serviceInstancesV3() + .get(GetServiceInstanceRequest.builder() + .serviceInstanceId(serviceInstanceGuid.toString()) + .build()); + } + + private Mono getServiceInstanceResourceByName(String name) { + IntFunction pageRequestSupplier = page -> ListServiceInstancesRequest.builder() + .spaceId( + getTargetSpaceGuid().toString()) + .serviceInstanceName(name) + .page(page) + .build(); + return getServiceInstanceResources(pageRequestSupplier).singleOrEmpty(); + } + + private Flux getServiceInstanceResources(IntFunction pageRequestSupplier) { + return PaginationUtils.requestClientV3Resources(page -> delegate.serviceInstancesV3() + .list(pageRequestSupplier.apply(page))); + } + + private Mono> zipWithAuxiliaryServiceInstanceContent(ServiceInstanceResource serviceInstanceResource) { + if (isUserProvided(serviceInstanceResource)) { + return Mono.just(ImmutableRawCloudServiceInstance.of(serviceInstanceResource)); + } + String servicePlanGuid = serviceInstanceResource.getRelationships() + .getServicePlan() + .getData() + .getId(); + + return getServicePlanResource(servicePlanGuid, + serviceInstanceResource.getName()).zipWhen( + servicePlan -> getServiceOffering(servicePlan.getRelationships() + .getServiceOffering() + .getData() + .getId())) + .map(tuple -> ImmutableRawCloudServiceInstance.builder() + .resource( + serviceInstanceResource) + .servicePlan( + tuple.getT1()) + .serviceOffering( + tuple.getT2()) + .build()); + } + + private boolean isUserProvided(ServiceInstanceResource serviceInstanceResource) { + return ServiceInstanceType.USER_PROVIDED.equals(serviceInstanceResource.getType()); + } + + private Flux getServiceBindingResourcesByServiceInstanceGuid(UUID serviceInstanceGuid) { + IntFunction pageRequestSupplier = page -> ListServiceBindingsRequest.builder() + .serviceInstanceId( + serviceInstanceGuid.toString()) + .type( + ServiceBindingType.APPLICATION) + .page(page) + .build(); + return PaginationUtils.requestClientV3Resources(page -> delegate.serviceBindingsV3() + .list(pageRequestSupplier.apply(page))); + } + + private Mono + getServiceBindingResourceByApplicationGuidAndServiceInstanceGuid(UUID applicationGuid, UUID serviceInstanceGuid) { + IntFunction pageRequestSupplier = page -> ListServiceBindingsRequest.builder() + .applicationId( + applicationGuid.toString()) + .serviceInstanceId( + serviceInstanceGuid.toString()) + .page(page) + .build(); + return getApplicationServiceBindingResources(pageRequestSupplier).singleOrEmpty(); + } + + private Flux getServiceBindingResourcesByApplicationGuid(UUID applicationGuid) { + IntFunction pageRequestSupplier = page -> ListServiceBindingsRequest.builder() + .applicationId( + applicationGuid.toString()) + .page(page) + .build(); + return getApplicationServiceBindingResources(pageRequestSupplier); + } + + private Flux + getApplicationServiceBindingResources(IntFunction pageRequestSupplier) { + return PaginationUtils.requestClientV3Resources(page -> delegate.serviceBindingsV3() + .list(pageRequestSupplier.apply(page))); + } + + private List findServicePlansByBrokerGuid(UUID brokerGuid) { + List offerings = findServiceOfferingsByBrokerGuid(brokerGuid); + return getPlans(offerings); + } + + private List getPlans(List offerings) { + return offerings.stream() + .map(CloudServiceOffering::getServicePlans) + .flatMap(Collection::stream) + .collect(Collectors.toList()); + } + + private void updateServicePlanVisibility(CloudServicePlan servicePlan, ServicePlanVisibility visibility) { + updateServicePlanVisibility(getGuid(servicePlan), visibility); + } + + private void updateServicePlanVisibility(UUID servicePlanGuid, ServicePlanVisibility visibility) { + delegate.servicePlansV3() + .updateVisibility(UpdateServicePlanVisibilityRequest.builder() + .servicePlanId(servicePlanGuid.toString()) + .type(Visibility.from(visibility.toString())) + .build()) + .block(); + } + + private Mono getTaskResource(UUID guid) { + GetTaskRequest request = GetTaskRequest.builder() + .taskId(guid.toString()) + .build(); + return delegate.tasks() + .get(request); + } + + private Flux getTaskResourcesByApplicationGuid(UUID applicationGuid) { + IntFunction pageRequestSupplier = page -> ListTasksRequest.builder() + .applicationId(applicationGuid.toString()) + .page(page) + .build(); + return PaginationUtils.requestClientV3Resources(page -> delegate.tasks() + .list(pageRequestSupplier.apply(page))); + } + + private CloudTask createTask(UUID applicationGuid, CloudTask task) { + return fetch(() -> createTaskResource(applicationGuid, task), ImmutableRawCloudTask::of); + } + + private Mono createTaskResource(UUID applicationGuid, CloudTask task) { + CreateTaskRequest request = CreateTaskRequest.builder() + .applicationId(applicationGuid.toString()) + .command(task.getCommand()) + .name(task.getName()) + .memoryInMb(task.getLimits() + .getMemory()) + .diskInMb(task.getLimits() + .getDisk()) + .build(); + return delegate.tasks() + .create(request); + } + + private Mono cancelTaskResource(UUID taskGuid) { + CancelTaskRequest request = CancelTaskRequest.builder() + .taskId(taskGuid.toString()) + .build(); + return delegate.tasks() + .cancel(request); + } + + private CloudPackage startUpload(String applicationName, Path file, Duration uploadTimeout) { + Assert.notNull(applicationName, "AppName must not be null"); + Assert.notNull(file, "File must not be null"); + + UUID applicationGuid = getRequiredApplicationGuid(applicationName); + UUID packageGuid = getGuid(createPackageForApplication(applicationGuid)); + + delegate.packages() + .upload(UploadPackageRequest.builder() + .bits(file) + .packageId(packageGuid.toString()) + .build()) + .timeout(uploadTimeout) + .block(); + + return getPackage(packageGuid); + } + + private CloudPackage createPackageForApplication(UUID applicationGuid) { + return fetch(() -> createPackageResource(applicationGuid), ImmutableRawCloudPackage::of); + } + + private Mono createPackageResource(UUID applicationGuid) { + CreatePackageRequest request = CreatePackageRequest.builder() + .type(PackageType.BITS) + .relationships(buildPackageRelationships(applicationGuid)) + .build(); + return delegate.packages() + .create(request); + } + + private PackageRelationships buildPackageRelationships(UUID applicationGuid) { + return PackageRelationships.builder() + .application(buildToOneRelationship(applicationGuid)) + .build(); + } + + private ToOneRelationship buildToOneRelationship(UUID guid) { + return ToOneRelationship.builder() + .data(buildRelationship(guid.toString())) + .build(); + } + + private ToOneRelationship buildToOneRelationship(String guid) { + return ToOneRelationship.builder() + .data(buildRelationship(guid)) + .build(); + } + + private Relationship buildRelationship(String guid) { + return Relationship.builder() + .id(guid) + .build(); + } + + private Mono createBuildResource(UUID packageGuid) { + CreateBuildRequest request = CreateBuildRequest.builder() + .getPackage(buildRelationship(packageGuid.toString())) + .build(); + return delegate.builds() + .create(request); + } + + private Mono getBuildResource(UUID buildGuid) { + GetBuildRequest request = GetBuildRequest.builder() + .buildId(buildGuid.toString()) + .build(); + return delegate.builds() + .get(request); + } + + private Flux getBuildResourcesByApplicationGuid(UUID applicationGuid) { + IntFunction pageRequestSupplier = page -> ListApplicationBuildsRequest.builder() + .applicationId( + applicationGuid.toString()) + .page(page) + .build(); + return PaginationUtils.requestClientV3Resources(page -> delegate.applicationsV3() + .listBuilds(pageRequestSupplier.apply(page))); + } + + private Flux getBuildResourcesByPackageGuid(UUID packageGuid) { + IntFunction pageRequestSupplier = page -> ListBuildsRequest.builder() + .packageId(packageGuid.toString()) + .page(page) + .build(); + return PaginationUtils.requestClientV3Resources(page -> delegate.builds() + .list(pageRequestSupplier.apply(page))); + } + + private void assertSpaceProvided(String operation) { + Assert.notNull(target, "Unable to " + operation + " without specifying organization and space to use."); + } + + private void removeRoutes(Set routes, UUID applicationGuid) { + for (CloudRoute route : routes) { + for (RouteDestination destination : route.getDestinations()) { + if (destination.getApplicationGuid() + .equals(applicationGuid)) { + unbindRoute(route.getGuid(), destination.getGuid()); + } + } + } + } + + private void validateDomainForRoute(CloudRoute route, Map existingDomains) { + String domain = route.getDomain() + .getName(); + if (!StringUtils.hasLength(domain) || !existingDomains.containsKey(domain)) { + throw new CloudOperationException(HttpStatus.NOT_FOUND, + HttpStatus.NOT_FOUND.getReasonPhrase(), + "Domain '" + domain + "' not found for URI " + route.getUrl()); + } + } + + private void unbindRoute(UUID routeGuid, UUID destinationGuid) { + delegate.routesV3() + .removeDestinations(RemoveRouteDestinationsRequest.builder() + .routeId(routeGuid.toString()) + .destinationId(destinationGuid.toString()) + .build()) + .block(); + } + + private void bindRoute(UUID routeGuid, UUID applicationGuid, String protocol) { + delegate.routesV3() + .insertDestinations(InsertRouteDestinationsRequest.builder() + .routeId(routeGuid.toString()) + .destination(createDestination(applicationGuid, protocol)) + .build()) + .block(); + } + + private Destination createDestination(UUID applicationGuid, String protocol) { + return Destination.builder() + .application(org.cloudfoundry.client.v3.routes.Application.builder() + .applicationId(applicationGuid.toString()) + .build()) + .protocol(protocol) + .build(); + } + + private UUID getOrAddRoute(UUID domainGuid, String host, String path) { + UUID routeGuid = getRouteGuid(domainGuid, host, path); + if (routeGuid == null) { + routeGuid = doAddRoute(domainGuid, host, path); + } + return routeGuid; + } + + private UUID doAddRoute(UUID domainGuid, String host, String path) { + assertSpaceProvided("add route"); + CreateRouteResponse response = delegate.routesV3() + .create(CreateRouteRequest.builder() + .host(host) + .path(path) + .relationships(RouteRelationships.builder() + .domain(buildToOneRelationship( + domainGuid)) + .space(buildToOneRelationship( + getTargetSpaceGuid())) + .build()) + .build()) + .block(); + return getGuid(response); + } + + private void doCreateDomain(String name) { + delegate.domainsV3() + .create(CreateDomainRequest.builder() + .name(name) + .relationships(DomainRelationships.builder() + .organization( + buildToOneRelationship(getTargetOrganizationGuid())) + .build()) + .build()) + .block(); + } + + private void doDeleteDomain(UUID guid) { + delegate.domainsV3() + .delete(DeleteDomainRequest.builder() + .domainId(guid.toString()) + .build()) + .flatMap(jobId -> JobV3Util.waitForCompletion(delegate, DELETE_JOB_TIMEOUT, jobId)) + .block(); + } + + private void doDeleteRoute(UUID guid) { + delegate.routesV3() + .delete(DeleteRouteRequest.builder() + .routeId(guid.toString()) + .build()) + .flatMap(jobId -> JobV3Util.waitForCompletion(delegate, DELETE_JOB_TIMEOUT, jobId)) + .block(); + } + + private void doDeleteServiceInstance(UUID serviceInstanceGuid) { + delegate.serviceInstancesV3() + .delete(DeleteServiceInstanceRequest.builder() + .serviceInstanceId(serviceInstanceGuid.toString()) + .build()) + .block(); + } + + private Optional doUnbindServiceInstance(UUID applicationGuid, UUID serviceInstanceGuid) { + UUID serviceBindingGuid = getServiceBindingGuid(applicationGuid, serviceInstanceGuid); + if (serviceBindingGuid == null) { + throw new CloudOperationException(HttpStatus.NOT_FOUND, + "Not Found", + "Service binding between service with GUID " + serviceInstanceGuid + + " and application with GUID " + applicationGuid + " not found."); + } + return doDeleteServiceBinding(serviceBindingGuid); + } + + private Optional doDeleteServiceBinding(UUID guid) { + String jobId = delegate.serviceBindingsV3() + .delete(DeleteServiceBindingRequest.builder() + .serviceBindingId(guid.toString()) + .build()) + .block(); + return Optional.ofNullable(jobId); + } + + private CloudDomain findDomainByName(String name, boolean required) { + CloudDomain domain = findDomainByName(name); + if (domain == null && required) { + throw new CloudOperationException(HttpStatus.NOT_FOUND, "Not Found", "Domain " + name + " not found."); + } + return domain; + } + + private CloudDomain findDomainByName(String name) { + return fetch(() -> getDomainResourceByName(name), ImmutableRawCloudDomain::of); + } + + private List findDomainsByOrganizationGuid(UUID organizationGuid) { + return fetchList(() -> getDomainResourcesByOrganizationGuid(organizationGuid), ImmutableRawCloudDomain::of); + } + + private Mono getDomainResourceByName(String name) { + IntFunction pageRequestSupplier = page -> ListDomainsRequest.builder() + .name(name) + .page(page) + .build(); + return PaginationUtils.requestClientV3Resources(page -> delegate.domainsV3() + .list(pageRequestSupplier.apply(page))) + .singleOrEmpty(); + } + + private Flux getDomainResources() { + IntFunction pageRequestSupplier = page -> ListDomainsRequest.builder() + .page(page) + .build(); + return PaginationUtils.requestClientV3Resources(page -> delegate.domainsV3() + .list(pageRequestSupplier.apply(page))); + } + + private Flux getSharedDomainResources() { + return getDomainResources().filter(domain -> domain.getRelationships() + .getOrganization() + .getData() == null); + } + + private Flux getPrivateDomainResources() { + return getDomainResources().filter(domain -> domain.getRelationships() + .getOrganization() + .getData() != null); + } + + private Flux getDomainResourcesByOrganizationGuid(UUID organizationGuid) { + IntFunction pageRequestSupplier = page -> ListOrganizationDomainsRequest.builder() + .organizationId( + organizationGuid.toString()) + .page(page) + .build(); + return PaginationUtils.requestClientV3Resources(page -> delegate.organizationsV3() + .listDomains(pageRequestSupplier.apply(page))); + } + + private Flux getDomainResourcesByNamesInBatches(Set names) { + return Flux.fromIterable(toBatches(names, MAX_CHAR_LENGTH_FOR_PARAMS_IN_REQUEST)) + .flatMap(this::getDomainResourcesByNames); + } + + private Flux getDomainResourcesByNames(Collection names) { + if (names.isEmpty()) { + return Flux.empty(); + } + IntFunction pageRequestSupplier = page -> ListDomainsRequest.builder() + .names(names) + .page(page) + .build(); + return PaginationUtils.requestClientV3Resources(page -> delegate.domainsV3() + .list(pageRequestSupplier.apply(page))); + } + + private List findRoutes(CloudDomain domain) { + return fetchList(() -> getRouteResourcesByDomainGuidAndSpaceGuid(domain.getGuid(), getTargetSpaceGuid()), + ImmutableRawCloudRoute::of); + } + + private Flux getRouteResourcesByDomainGuidAndSpaceGuid(UUID domainGuid, UUID spaceGuid) { + IntFunction pageRequestSupplier = page -> ListRoutesRequest.builder() + .domainId(domainGuid.toString()) + .spaceId(spaceGuid.toString()) + .page(page) + .build(); + return PaginationUtils.requestClientV3Resources(page -> delegate.routesV3() + .list(pageRequestSupplier.apply(page))); + } + + private Flux getRouteResourcesByDomainGuidHostAndPath(UUID domainGuid, String host, String path) { + ListRoutesRequest.Builder requestBuilder = ListRoutesRequest.builder(); + if (host != null) { + requestBuilder.host(host); + } + if (path != null) { + requestBuilder.path(path); + } + requestBuilder.spaceId(getTargetSpaceGuid().toString()) + .domainId(domainGuid.toString()); + + return PaginationUtils.requestClientV3Resources(page -> delegate.routesV3() + .list(requestBuilder.page(page) + .build())); + } + + private Flux getRouteResourcesByAppGuid(UUID applicationGuid) { + IntFunction pageSupplier = page -> ListApplicationRoutesRequest.builder() + .applicationId( + applicationGuid.toString()) + .page(page) + .build(); + return PaginationUtils.requestClientV3Resources(page -> delegate.applicationsV3() + .listRoutes(pageSupplier.apply(page))); + } + + private List findServiceOfferingsByBrokerGuid(UUID brokerGuid) { + return fetchListWithAuxiliaryContent(() -> getServiceResourcesByBrokerGuid(brokerGuid), + this::zipWithAuxiliaryServiceOfferingContent); + } + + private List findServiceOfferingsByLabel(String label) { + Assert.notNull(label, "Service label must not be null"); + return fetchListWithAuxiliaryContent(() -> getServiceResourcesByLabel(label), this::zipWithAuxiliaryServiceOfferingContent); + } + + private List findServiceOfferingsByLabelAndBrokerName(String label, String brokerName) { + Assert.notNull(label, "Service label must not be null"); + Assert.notNull(brokerName, "Service broker must not be null"); + return fetchListWithAuxiliaryContent(() -> getServiceResourcesByLabelAndBrokerName(label, brokerName), + this::zipWithAuxiliaryServiceOfferingContent); + } + + private Flux getServiceResources() { + IntFunction pageRequestSupplier = page -> ListServiceOfferingsRequest.builder() + .spaceId( + getTargetSpaceGuid().toString()) + .page(page) + .build(); + return getServiceResources(pageRequestSupplier); + } + + protected Mono getServiceOffering(String offeringId) { + GetServiceOfferingRequest request = GetServiceOfferingRequest.builder() + .serviceOfferingId(offeringId) + .build(); + return delegate.serviceOfferingsV3() + .get(request) + .onErrorMap(t -> doesErrorMatchStatusCode(t, HttpStatus.FORBIDDEN), + t -> new CloudOperationException(HttpStatus.FORBIDDEN, + HttpStatus.FORBIDDEN.getReasonPhrase(), + MessageFormat.format( + Messages.SERVICE_OFFERING_WITH_GUID_0_IS_NOT_AVAILABLE, + offeringId), + t)) + .onErrorMap(t -> doesErrorMatchStatusCode(t, HttpStatus.NOT_FOUND), + t -> new CloudOperationException(HttpStatus.NOT_FOUND, + HttpStatus.NOT_FOUND.getReasonPhrase(), + MessageFormat.format(Messages.SERVICE_OFFERING_WITH_GUID_0_NOT_FOUND, + offeringId), + t)); + } + + private Flux getServiceResourcesByBrokerGuid(UUID brokerGuid) { + IntFunction pageRequestSupplier = page -> ListServiceOfferingsRequest.builder() + .serviceBrokerId( + brokerGuid.toString()) + .spaceId( + getTargetSpaceGuid().toString()) + .page(page) + .build(); + return getServiceResources(pageRequestSupplier); + } + + private Flux getServiceResourcesByLabel(String label) { + IntFunction pageRequestSupplier = page -> ListServiceOfferingsRequest.builder() + .name(label) + .spaceId( + getTargetSpaceGuid().toString()) + .page(page) + .build(); + return getServiceResources(pageRequestSupplier); + } + + private Flux getServiceResourcesByLabelAndBrokerName(String label, String brokerName) { + IntFunction pageRequestSupplier = page -> ListServiceOfferingsRequest.builder() + .name(label) + .serviceBrokerName(brokerName) + .spaceId( + getTargetSpaceGuid().toString()) + .page(page) + .build(); + return getServiceResources(pageRequestSupplier); + } + + private Flux getServiceResources(IntFunction pageRequestSupplier) { + return PaginationUtils.requestClientV3Resources(page -> delegate.serviceOfferingsV3() + .list(pageRequestSupplier.apply(page))); + } + + private Mono> zipWithAuxiliaryServiceOfferingContent(ServiceOfferingResource serviceOffering) { + UUID serviceOfferingGuid = getGuid(serviceOffering); + return getServicePlansFlux(serviceOfferingGuid).collectList() + .map(servicePlans -> ImmutableRawCloudServiceOffering.builder() + .serviceOffering( + serviceOffering) + .servicePlans(servicePlans) + .build()); + } + + private Flux getServicePlansFlux(UUID serviceOfferingGuid) { + return fetchFlux(() -> getServicePlanResourcesByServiceOfferingGuid(serviceOfferingGuid), ImmutableRawCloudServicePlan::of); + } + + protected Mono getServicePlanResource(String servicePlanGuid, String serviceInstanceName) { + GetServicePlanRequest request = GetServicePlanRequest.builder() + .servicePlanId(servicePlanGuid) + .build(); + + return delegate.servicePlansV3() + .get(request) + .onErrorMap(t -> doesErrorMatchStatusCode(t, HttpStatus.FORBIDDEN), + t -> new CloudOperationException(HttpStatus.FORBIDDEN, + HttpStatus.FORBIDDEN.getReasonPhrase(), + MessageFormat.format( + Messages.SERVICE_PLAN_WITH_GUID_0_NOT_AVAILABLE_FOR_SERVICE_INSTANCE_1, + servicePlanGuid, serviceInstanceName), + t)) + .onErrorMap(t -> doesErrorMatchStatusCode(t, HttpStatus.NOT_FOUND), + t -> new CloudOperationException(HttpStatus.NOT_FOUND, + HttpStatus.NOT_FOUND.getReasonPhrase(), + MessageFormat.format(Messages.NO_SERVICE_PLAN_FOUND, servicePlanGuid, + serviceInstanceName), + t)); + } + + private Flux getServicePlanResourcesByServiceOfferingGuid(UUID serviceOfferingGuid) { + IntFunction pageRequestSupplier = page -> ListServicePlansRequest.builder() + .serviceOfferingId( + serviceOfferingGuid.toString()) + .page(page) + .build(); + return PaginationUtils.requestClientV3Resources(page -> delegate.servicePlansV3() + .list(pageRequestSupplier.apply(page))); + } + + private Flux getServiceKeyResource(CloudServiceInstance serviceInstance) { + UUID serviceInstanceGuid = getGuid(serviceInstance); + return getServiceKeyResourcesByServiceInstanceGuid(serviceInstanceGuid); + } + + private Flux getServiceKeyResourcesByServiceInstanceGuid(UUID serviceInstanceGuid) { + IntFunction pageRequestSupplier = page -> ListServiceBindingsRequest.builder() + .serviceInstanceId( + serviceInstanceGuid.toString()) + .type(ServiceBindingType.KEY) + .page(page) + .build(); + return PaginationUtils.requestClientV3Resources(page -> delegate.serviceBindingsV3() + .list(pageRequestSupplier.apply(page))); + } + + private Mono getServiceKeyResourceByNameAndServiceInstanceGuid(String name, UUID guid) { + IntFunction pageRequestSupplier = page -> ListServiceBindingsRequest.builder() + .serviceInstanceId(guid.toString()) + .type(ServiceBindingType.KEY) + .name(name) + .page(page) + .build(); + return PaginationUtils.requestClientV3Resources(page -> delegate.serviceBindingsV3() + .list(pageRequestSupplier.apply(page))) + .singleOrEmpty(); + } + + private CloudStack findStackResource(String name) { + return fetch(() -> getStackResourceByName(name), ImmutableRawCloudStack::of); + } + + private Flux getStackResources() { + IntFunction pageRequestSupplier = page -> ListStacksRequest.builder() + .page(page) + .build(); + return getStackResources(pageRequestSupplier); + } + + private Mono getStackResourceByName(String name) { + IntFunction pageRequestSupplier = page -> ListStacksRequest.builder() + .name(name) + .page(page) + .build(); + return getStackResources(pageRequestSupplier).singleOrEmpty(); + } + + private Flux getStackResources(IntFunction requestForPage) { + return PaginationUtils.requestClientV3Resources(page -> delegate.stacksV3() + .list(requestForPage.apply(page))); + } + + private List findEventsByTarget(String target) { + return fetchList(() -> getEventResourcesByTarget(target), ImmutableRawCloudEvent::of); + } + + private Flux getEventResources() { + IntFunction pageRequestSupplier = page -> ListAuditEventsRequest.builder() + .page(page) + .build(); + return PaginationUtils.requestClientV3Resources(page -> delegate.auditEventsV3() + .list(pageRequestSupplier.apply(page))); + } + + private Flux getEventResourcesByTarget(String target) { + IntFunction pageRequestSupplier = page -> ListAuditEventsRequest.builder() + .targetId(target) + .page(page) + .build(); + return PaginationUtils.requestClientV3Resources(page -> delegate.auditEventsV3() + .list(pageRequestSupplier.apply(page))); + } + + private InstancesInfo findApplicationInstances(UUID applicationGuid) { + return fetch(() -> getApplicationProcessStatsResource(applicationGuid), ImmutableRawInstancesInfo::of); + } + + private Mono getApplicationProcessStatsResource(UUID applicationGuid) { + return delegate.applicationsV3() + .getProcessStatistics(GetApplicationProcessStatisticsRequest.builder() + .applicationId(applicationGuid.toString()) + .type("web") + .build()); + } + + private CloudServiceBroker findServiceBrokerByName(String name) { + return fetch(() -> getServiceBrokerResourceByName(name), ImmutableRawCloudServiceBroker::of); + } + + private Flux getServiceBrokerResources() { + IntFunction pageRequestSupplier = page -> ListServiceBrokersRequest.builder() + .page(page) + .build(); + return getServiceBrokerResources(pageRequestSupplier); + } + + private Mono getServiceBrokerResourceByName(String name) { + IntFunction pageRequestSupplier = page -> ListServiceBrokersRequest.builder() + .page(page) + .name(name) + .build(); + return getServiceBrokerResources(pageRequestSupplier).singleOrEmpty(); + } + + private Flux getServiceBrokerResources(IntFunction pageRequestSupplier) { + return PaginationUtils.requestClientV3Resources(page -> delegate.serviceBrokersV3() + .list(pageRequestSupplier.apply(page))); + } + + private CloudServicePlan findPlanForService(CloudServiceInstance service, String planName) { + List offerings = getServiceOfferings(service); + for (var offering : offerings) { + for (var plan : offering.getServicePlans()) { + if (planName.equals(plan.getName())) { + return plan; + } + } + } + throw new CloudOperationException(HttpStatus.NOT_FOUND, "Not Found", "Service plan " + service.getPlan() + " not found."); + } + + private List getServiceOfferings(CloudServiceInstance service) { + if (service.getBroker() == null) { + return findServiceOfferingsByLabel(service.getLabel()); + } + return findServiceOfferingsByLabelAndBrokerName(service.getLabel(), service.getBroker()); + } + + private UUID getRequiredApplicationGuid(String name) { + Resource applicationResource = getApplicationByName(name).block(); + if (applicationResource == null) { + throw new CloudOperationException(HttpStatus.NOT_FOUND, "Not Found", "Application " + name + " not found."); + } + return UUID.fromString(applicationResource.getId()); + } + + private Mono getServiceInstanceByName(String name) { + IntFunction pageRequestSupplier = page -> ListServiceInstancesRequest.builder() + .spaceId( + getTargetSpaceGuid().toString()) + .serviceInstanceName(name) + .page(page) + .build(); + return PaginationUtils.requestClientV3Resources(page -> delegate.serviceInstancesV3() + .list(pageRequestSupplier.apply(page))) + .singleOrEmpty(); + } + + private UUID getRequiredDomainGuid(String name) { + return getGuid(findDomainByName(name, true)); + } + + private Map getDomainsFromRoutes(Set routes) { + Set domainNames = routes.stream() + .map(route -> route.getDomain() + .getName()) + .filter(StringUtils::hasLength) + .collect(Collectors.toSet()); + return getDomainResourcesByNamesInBatches(domainNames).collectMap(DomainResource::getName, + domain -> UUID.fromString(domain.getId())) + .block(); + } + + private UUID getRouteGuid(UUID domainGuid, String host, String path) { + List routeEntitiesResource = getRouteResourcesByDomainGuidHostAndPath(domainGuid, host, + path).collect(Collectors.toList()) + .block(); + if (CollectionUtils.isEmpty(routeEntitiesResource)) { + return null; + } + return getGuid(routeEntitiesResource.get(0)); + } + + private UUID getServiceBindingGuid(UUID applicationGuid, UUID serviceInstanceGuid) { + return getServiceBindingResourceByApplicationGuidAndServiceInstanceGuid(applicationGuid, serviceInstanceGuid).map(this::getGuid) + .block(); + } + + private void processAsyncUploadInBackground(CloudPackage cloudPackage, UploadStatusCallback callback) { + String threadName = String.format("App upload monitor: %s", cloudPackage.getGuid()); + new Thread(() -> processAsyncUpload(cloudPackage, callback), threadName).start(); + } + + private void processAsyncUpload(CloudPackage cloudPackage, UploadStatusCallback callback) { + while (true) { + Upload upload = getUploadStatus(cloudPackage.getGuid()); + Status uploadStatus = upload.getStatus(); + boolean unsubscribe = callback.onProgress(uploadStatus.toString()); + if (unsubscribe || isUploadReady(uploadStatus)) { + return; + } + if (hasUploadFailed(uploadStatus)) { + callback.onError(upload.getErrorDetails() + .getDescription()); + return; + } + try { + Thread.sleep(PACKAGE_UPLOAD_JOB_POLLING_PERIOD); + } catch (InterruptedException e) { + return; + } + } + } + + private boolean isUploadReady(Status status) { + return status == Status.READY; + } + + private boolean hasUploadFailed(Status status) { + return status == Status.EXPIRED || status == Status.FAILED; + } + + @Override + public CloudPackage getPackage(UUID packageGuid) { + return fetch(() -> getPackageResource(packageGuid), ImmutableRawCloudPackage::of); + } + + private Mono getPackageResource(UUID guid) { + GetPackageRequest request = GetPackageRequest.builder() + .packageId(guid.toString()) + .build(); + return delegate.packages() + .get(request); + } + + private UUID getTargetOrganizationGuid() { + return getGuid(target.getOrganization()); + } + + private UUID getTargetSpaceGuid() { + return getGuid(target); + } + + private UUID getGuid(CloudEntity entity) { + return Optional.ofNullable(entity) + .map(CloudEntity::getMetadata) + .map(CloudMetadata::getGuid) + .orElse(null); + } + + private UUID getGuid(Resource resource) { + return Optional.ofNullable(resource) + .map(Resource::getId) + .map(UUID::fromString) + .orElse(null); + } + + private boolean doesErrorMatchStatusCode(Throwable t, HttpStatus status) { + if (t instanceof AbstractCloudFoundryException e) { + return e.getStatusCode() == status.value(); + } + return false; + } + + private > Flux fetchFluxWithAuxiliaryContent(Supplier> resourceSupplier, + Function> resourceMapper) { + return resourceSupplier.get() + .flatMap(resourceMapper) + .map(Derivable::derive); + } + + private > List fetchListWithAuxiliaryContent(Supplier> resourceSupplier, + Function> resourceMapper) { + return fetchFluxWithAuxiliaryContent(resourceSupplier, resourceMapper).collectList() + .block(); + } + + private > List fetchList(Supplier> resourceSupplier, Function resourceMapper) { + return fetchFlux(resourceSupplier, resourceMapper).collectList() + .block(); + } + + private > Flux fetchFlux(Supplier> resourceSupplier, Function resourceMapper) { + return resourceSupplier.get() + .map(resourceMapper) + .map(Derivable::derive); + } + + private > T fetchWithAuxiliaryContent(Supplier> resourceSupplier, + Function> resourceMapper) { + return fetchMonoWithAuxiliaryContent(resourceSupplier, resourceMapper).block(); + } + + private > T fetch(Supplier> resourceSupplier, Function resourceMapper) { + return fetchMono(resourceSupplier, resourceMapper).block(); + } + + private > Mono fetchMonoWithAuxiliaryContent(Supplier> resourceSupplier, + Function> resourceMapper) { + return resourceSupplier.get() + .flatMap(resourceMapper) + .map(Derivable::derive); + } + + private > Mono fetchMono(Supplier> resourceSupplier, Function resourceMapper) { + return resourceSupplier.get() + .map(resourceMapper) + .map(Derivable::derive); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudSpaceClient.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudSpaceClient.java new file mode 100644 index 0000000000..0eb52d8e0d --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudSpaceClient.java @@ -0,0 +1,127 @@ +package org.cloudfoundry.multiapps.controller.client.facade.rest; + +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.RawCloudEntity; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudOrganization; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.util.UriUtil; + +import org.cloudfoundry.AbstractCloudFoundryException; +import org.cloudfoundry.client.v3.ClientV3Exception; +import org.cloudfoundry.client.v3.organizations.GetOrganizationRequest; +import org.cloudfoundry.client.v3.organizations.ListOrganizationsRequest; +import org.cloudfoundry.client.v3.organizations.Organization; +import org.cloudfoundry.client.v3.organizations.OrganizationsV3; +import org.cloudfoundry.client.v3.spaces.GetSpaceRequest; +import org.cloudfoundry.client.v3.spaces.ListSpacesRequest; +import org.cloudfoundry.client.v3.spaces.Space; +import org.cloudfoundry.client.v3.spaces.SpacesV3; +import org.springframework.http.HttpStatus; +import reactor.util.retry.Retry; +import reactor.util.retry.RetryBackoffSpec; + +import java.time.Duration; +import java.util.List; +import java.util.UUID; + +public class CloudSpaceClient { + + private static final List CHARS_TO_ENCODE = List.of(","); + private static final long RETRIES = 3; + private static final Duration RETRY_INTERVAL = Duration.ofSeconds(3); + + private final SpacesV3 spacesClient; + private final OrganizationsV3 orgsClient; + + public CloudSpaceClient(SpacesV3 spacesClient, OrganizationsV3 orgsClient) { + this.spacesClient = spacesClient; + this.orgsClient = orgsClient; + } + + public CloudSpace getSpace(UUID spaceGuid) { + Space space = spacesClient.get(GetSpaceRequest.builder() + .spaceId(spaceGuid.toString()) + .build()) + .retryWhen(Retry.fixedDelay(RETRIES, RETRY_INTERVAL) + .onRetryExhaustedThrow(this::throwOriginalError)) + .onErrorMap(ClientV3Exception.class, this::convertV3ClientException) + .block(); + if (space == null) { + throw new CloudOperationException(HttpStatus.NOT_FOUND, "Not Found", "Space with GUID " + spaceGuid + " not found."); + } + + String orgGuid = space.getRelationships() + .getOrganization() + .getData() + .getId(); + Organization org = orgsClient.get(GetOrganizationRequest.builder() + .organizationId(orgGuid) + .build()) + .retryWhen(Retry.fixedDelay(RETRIES, RETRY_INTERVAL) + .onRetryExhaustedThrow(this::throwOriginalError)) + .onErrorMap(ClientV3Exception.class, this::convertV3ClientException) + .block(); + if (org == null) { + throw new CloudOperationException(HttpStatus.NOT_FOUND, "Not Found", "Organization with GUID " + orgGuid + " not found."); + } + return mapToCloudSpace(space, org); + } + + public CloudSpace getSpace(String organizationName, String spaceName) { + var orgsResponse = orgsClient.list(ListOrganizationsRequest.builder() + .name(encodeAsQueryParam(organizationName)) + .build()) + .retryWhen(Retry.fixedDelay(RETRIES, RETRY_INTERVAL) + .onRetryExhaustedThrow(this::throwOriginalError)) + .onErrorMap(ClientV3Exception.class, this::convertV3ClientException) + .block(); + List orgs = orgsResponse.getResources(); + if (orgs.isEmpty()) { + throw new CloudOperationException(HttpStatus.NOT_FOUND, "Not Found", "Organization " + organizationName + " not found."); + } + + Organization org = orgs.get(0); + + var spacesResponse = spacesClient.list(ListSpacesRequest.builder() + .organizationId(org.getId()) + .name(encodeAsQueryParam(spaceName)) + .build()) + .retryWhen(Retry.fixedDelay(RETRIES, RETRY_INTERVAL) + .onRetryExhaustedThrow(this::throwOriginalError)) + .onErrorMap(ClientV3Exception.class, this::convertV3ClientException) + .block(); + List spaces = spacesResponse.getResources(); + if (spaces.isEmpty()) { + throw new CloudOperationException(HttpStatus.NOT_FOUND, "Not Found", "Space " + spaceName + " not found in organization " + organizationName); + } + + Space space = spaces.get(0); + return mapToCloudSpace(space, org); + } + + private String encodeAsQueryParam(String param) { + return UriUtil.encodeChars(param, CHARS_TO_ENCODE); + } + + private CloudSpace mapToCloudSpace(Space space, Organization org) { + return ImmutableCloudSpace.builder() + .metadata(RawCloudEntity.parseResourceMetadata(space)) + .name(space.getName()) + .organization(ImmutableCloudOrganization.builder() + .metadata(RawCloudEntity.parseResourceMetadata(org)) + .name(org.getName()) + .build()) + .build(); + } + + private Throwable throwOriginalError(RetryBackoffSpec retrySpec, Retry.RetrySignal signal) { + return signal.failure(); + } + + private CloudOperationException convertV3ClientException(AbstractCloudFoundryException e) { + HttpStatus httpStatus = HttpStatus.valueOf(e.getStatusCode()); + return new CloudOperationException(httpStatus, httpStatus.getReasonPhrase(), e.getMessage(), e); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/util/AuthorizationEndpointGetter.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/util/AuthorizationEndpointGetter.java new file mode 100644 index 0000000000..ca42aff02f --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/util/AuthorizationEndpointGetter.java @@ -0,0 +1,36 @@ +package org.cloudfoundry.multiapps.controller.client.facade.util; + +import java.util.Map; + +import org.springframework.web.reactive.function.client.WebClient; + +public class AuthorizationEndpointGetter { + + private final WebClient webClient; + + public AuthorizationEndpointGetter(WebClient webClient) { + this.webClient = webClient; + } + + public String getAuthorizationEndpoint() { + return getAuthorizationEndpoint(""); + } + + public String getAuthorizationEndpoint(String controllerUrl) { + String response = webClient.get() + .uri(controllerUrl + "/") + .retrieve() + .bodyToMono(String.class) + .block(); + return getLoginHref(response); + } + + @SuppressWarnings("unchecked") + private String getLoginHref(String response) { + Map resource = JsonUtil.convertJsonToMap(response); + Map links = (Map) resource.get("links"); + Map login = (Map) links.get("login"); + return (String) login.get("href"); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/util/CloudUtil.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/util/CloudUtil.java new file mode 100644 index 0000000000..d7d6bc172d --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/util/CloudUtil.java @@ -0,0 +1,105 @@ +package org.cloudfoundry.multiapps.controller.client.facade.util; + +import java.text.MessageFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.util.Date; +import java.util.Locale; +import java.util.function.Supplier; + +import org.cloudfoundry.multiapps.controller.client.facade.Messages; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Some helper utilities used by the Cloud Foundry Java client. + * + */ +public class CloudUtil { + + private static final Double DEFAULT_DOUBLE = 0.0; + private static final Integer DEFAULT_INTEGER = 0; + private static final Long DEFAULT_LONG = 0L; + private static final int RETRIES = 3; + private static final Duration RETRY_INTERVAL = Duration.ofSeconds(3); + private static final Logger LOGGER = LoggerFactory.getLogger(CloudUtil.class); + + private CloudUtil() { + } + + @SuppressWarnings("unchecked") + public static T parse(Class clazz, Object object) { + T defaultValue = null; + try { + if (clazz == Date.class) { + String stringValue = parse(String.class, object); + return clazz.cast(new SimpleDateFormat("EEE MMM d HH:mm:ss Z yyyy", Locale.US).parse(stringValue)); + } + + if (clazz == Integer.class) { + defaultValue = (T) DEFAULT_INTEGER; + } else if (clazz == Long.class) { + defaultValue = (T) DEFAULT_LONG; + } else if (clazz == Double.class) { + defaultValue = (T) DEFAULT_DOUBLE; + } + + if (object == null) { + return defaultValue; + } + + // special handling for int and long since smaller numbers become ints + // but may be requested as long and vice versa + if (clazz == Integer.class) { + if (object instanceof Number) { + return clazz.cast(((Number) object).intValue()); + } else if (object instanceof String) { + return clazz.cast(Integer.valueOf(((String) object))); + } + } + if (clazz == Long.class) { + if (object instanceof Number) { + return clazz.cast(((Number) object).longValue()); + } else if (object instanceof String) { + return clazz.cast(Long.valueOf(((String) object))); + } + } + if (clazz == Double.class) { + if (object instanceof Number) { + return clazz.cast(((Number) object).doubleValue()); + } else if (object instanceof String) { + return clazz.cast(Double.valueOf(((String) object))); + } + } + + return clazz.cast(object); + } catch (ClassCastException | ParseException e) { + // ignore + } + return defaultValue; + } + + public static T executeWithRetry(Supplier operation) { + for (int i = 1; i < RETRIES; i++) { + try { + return operation.get(); + } catch (Exception e) { + LOGGER.warn(MessageFormat.format(Messages.RETRYING_OPERATION, e.getMessage()), e); + sleep(RETRY_INTERVAL); + } + } + return operation.get(); + } + + public static void sleep(Duration duration) { + try { + Thread.sleep(duration.toMillis()); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new IllegalStateException("Interrupted!", e); + } + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/util/JobV3Util.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/util/JobV3Util.java new file mode 100644 index 0000000000..e7e293c426 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/util/JobV3Util.java @@ -0,0 +1,48 @@ +package org.cloudfoundry.multiapps.controller.client.facade.util; + +import java.time.Duration; +import java.util.EnumSet; +import java.util.List; +import java.util.Set; + +import org.cloudfoundry.client.CloudFoundryClient; +import org.cloudfoundry.client.v3.ClientV3Exception; +import org.cloudfoundry.client.v3.Error; +import org.cloudfoundry.client.v3.jobs.GetJobRequest; +import org.cloudfoundry.client.v3.jobs.GetJobResponse; +import org.cloudfoundry.client.v3.jobs.Job; +import org.cloudfoundry.client.v3.jobs.JobState; +import org.cloudfoundry.util.DelayUtils; + +import reactor.core.publisher.Mono; + +public class JobV3Util { + + private JobV3Util() { + } + + private static final Set FINAL_STATES = EnumSet.of(JobState.COMPLETE, JobState.FAILED); + + public static Mono waitForCompletion(CloudFoundryClient cloudFoundryClient, Duration completionTimeout, String jobId) { + return requestJobV3(cloudFoundryClient, jobId).filter(job -> FINAL_STATES.contains(job.getState())) + .repeatWhenEmpty(DelayUtils.exponentialBackOff(Duration.ofSeconds(1), + Duration.ofSeconds(15), + completionTimeout)) + .filter(job -> JobState.FAILED == job.getState()) + .flatMap(JobV3Util::getError); + } + + private static Mono requestJobV3(CloudFoundryClient cloudFoundryClient, String jobId) { + return cloudFoundryClient.jobsV3() + .get(GetJobRequest.builder() + .jobId(jobId) + .build()); + } + + private static Mono getError(Job job) { + List errors = job.getErrors(); + // Status code must be set, otherwise it will throw NPE during getStatusCode() invocation + return Mono.error(new ClientV3Exception(200, errors)); + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/util/JsonUtil.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/util/JsonUtil.java new file mode 100644 index 0000000000..593d6b9375 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/util/JsonUtil.java @@ -0,0 +1,102 @@ +package org.cloudfoundry.multiapps.controller.client.facade.util; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.http.MediaType; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectWriter; + +/** + * Some JSON helper utilities used by the Cloud Foundry Java client. + * + */ +public class JsonUtil { + + public static final MediaType JSON_MEDIA_TYPE = new MediaType(MediaType.APPLICATION_JSON.getType(), + MediaType.APPLICATION_JSON.getSubtype(), + StandardCharsets.UTF_8); + + protected static final Log logger = LogFactory.getLog(JsonUtil.class); + + private static final ObjectMapper mapper = new ObjectMapper(); + + public static List convertJsonToList(String json) { + List retList = new ArrayList<>(); + if (json != null) { + try { + retList = mapper.readValue(json, new TypeReference>() { + }); + } catch (IOException e) { + logger.warn("Error while reading Java List from JSON response: " + json, e); + } + } + return retList; + } + + public static Map convertJsonToMap(String json) { + Map retMap = new HashMap<>(); + if (json != null) { + try { + retMap = mapper.readValue(json, new TypeReference>() { + }); + } catch (IOException e) { + logger.warn("Error while reading Java Map from JSON response: " + json, e); + } + } + return retMap; + } + + public static String convertToJson(Object value) { + return convertToJson(value, false); + } + + public static String convertToJson(Object value, boolean shouldPrettyPrint) { + if (shouldPrettyPrint) { + return convertToJsonStringUsingWriter(mapper.writerWithDefaultPrettyPrinter(), value); + } + + return convertToJsonStringUsingWriter(mapper.writer(), value); + } + + private static String convertToJsonStringUsingWriter(ObjectWriter writer, Object value) { + if (value == null || writer.canSerialize(value.getClass())) { + try { + return writer.writeValueAsString(value); + } catch (IOException e) { + logger.warn("Error while serializing " + value + " to JSON", e); + return null; + } + + } else { + throw new IllegalArgumentException("Value of type " + value.getClass() + .getName() + + " can not be serialized to JSON."); + } + } + + @SuppressWarnings("unchecked") + public static List> convertToJsonList(InputStream jsonInputStream) { + try { + return mapper.readValue(jsonInputStream, List.class); + } catch (JsonParseException | JsonMappingException e) { + logger.error("Unable to parse JSON from InputStream", e); + throw new IllegalArgumentException("Unable to parse JSON from InputStream", e); + } catch (IOException e) { + logger.error("Unable to process InputStream", e); + throw new IllegalArgumentException("Unable to parse JSON from InputStream", e); + } + } + +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/util/RestUtil.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/util/RestUtil.java new file mode 100644 index 0000000000..aba72b8fe2 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/util/RestUtil.java @@ -0,0 +1,102 @@ +package org.cloudfoundry.multiapps.controller.client.facade.util; + +import java.net.MalformedURLException; +import java.net.URL; +import java.security.cert.X509Certificate; +import java.text.MessageFormat; + +import javax.net.ssl.SSLException; +import javax.net.ssl.X509TrustManager; + +import org.springframework.http.client.reactive.ClientHttpConnector; +import org.springframework.http.client.reactive.ReactorClientHttpConnector; +import org.springframework.web.reactive.function.client.ExchangeStrategies; +import org.springframework.web.reactive.function.client.WebClient; + +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuthClient; + +import io.netty.handler.ssl.SslContext; +import io.netty.handler.ssl.SslContextBuilder; +import reactor.netty.http.client.HttpClient; + +/** + * Some helper utilities for creating classes used for the REST support. + * + */ +public class RestUtil { + + private static final int MAX_IN_MEMORY_SIZE = 1024 * 1024; // 1MB + + public OAuthClient createOAuthClientByControllerUrl(URL controllerUrl, boolean shouldTrustSelfSignedCertificates) { + WebClient webClient = createWebClient(shouldTrustSelfSignedCertificates); + URL authorizationUrl = getAuthorizationUrl(controllerUrl, webClient); + return new OAuthClient(authorizationUrl, webClient); + } + + private URL getAuthorizationUrl(URL controllerUrl, WebClient webClient) { + AuthorizationEndpointGetter authorizationEndpointGetter = new AuthorizationEndpointGetter(webClient); + return getAuthorizationUrl(authorizationEndpointGetter.getAuthorizationEndpoint(controllerUrl.toString())); + } + + private URL getAuthorizationUrl(String authorizationEndpoint) { + try { + return new URL(authorizationEndpoint); + } catch (MalformedURLException e) { + throw new IllegalArgumentException(MessageFormat.format("Error creating authorization endpoint URL for endpoint {0}.", + authorizationEndpoint), + e); + } + } + + public WebClient createWebClient(boolean trustSelfSignedCerts) { + return WebClient.builder() + .exchangeStrategies(ExchangeStrategies.builder() + .codecs(configurer -> configurer.defaultCodecs() + .maxInMemorySize(MAX_IN_MEMORY_SIZE)) + .build()) + .clientConnector(buildClientConnector(trustSelfSignedCerts)) + .build(); + } + + private ClientHttpConnector buildClientConnector(boolean trustSelfSignedCerts) { + HttpClient httpClient = HttpClient.create() + .followRedirect(true); + if (trustSelfSignedCerts) { + httpClient = httpClient.secure(sslContextSpec -> sslContextSpec.sslContext(buildSslContext())); + } else { + httpClient = httpClient.secure(); + } + return new ReactorClientHttpConnector(httpClient); + } + + private SslContext buildSslContext() { + try { + return SslContextBuilder.forClient() + .trustManager(createDummyTrustManager()) + .build(); + } catch (SSLException e) { + throw new RuntimeException("An error occurred setting up the SSLContext", e); + } + } + + private X509TrustManager createDummyTrustManager() { + return new X509TrustManager() { + + @Override + public void checkClientTrusted(X509Certificate[] xcs, String string) { + // NOSONAR + } + + @Override + public void checkServerTrusted(X509Certificate[] xcs, String string) { + // NOSONAR + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[] {}; + } + + }; + } +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/util/UriUtil.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/util/UriUtil.java new file mode 100644 index 0000000000..fb1d4a9647 --- /dev/null +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/util/UriUtil.java @@ -0,0 +1,20 @@ +package org.cloudfoundry.multiapps.controller.client.facade.util; + +import org.springframework.web.util.UriUtils; + +import java.nio.charset.Charset; +import java.util.List; + +public class UriUtil { + + private UriUtil() { + // prevents initialization + } + + public static String encodeChars(String queryParam, List charsToEncode) { + for (String charToEncode: charsToEncode) { + queryParam = queryParam.replaceAll(charToEncode, UriUtils.encode(charToEncode, Charset.defaultCharset())); + } + return queryParam; + } +} diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/CloudApplicationExtended.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/CloudApplicationExtended.java index 7ab23e15e1..bb7a2fa8e2 100644 --- a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/CloudApplicationExtended.java +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/CloudApplicationExtended.java @@ -4,18 +4,17 @@ import java.util.Map; import java.util.Set; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.cloudfoundry.multiapps.common.AllowNulls; import org.cloudfoundry.multiapps.common.Nullable; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudTask; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DockerInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Staging; import org.immutables.value.Value; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; -import com.sap.cloudfoundry.client.facade.domain.CloudTask; -import com.sap.cloudfoundry.client.facade.domain.DockerInfo; -import com.sap.cloudfoundry.client.facade.domain.Staging; - @Value.Enclosing @Value.Immutable @JsonSerialize(as = ImmutableCloudApplicationExtended.class) @@ -68,8 +67,8 @@ public int getInstances() { public abstract AttributeUpdateStrategy getAttributesUpdateStrategy(); @Value.Immutable - @JsonSerialize(as = ImmutableCloudApplicationExtended.AttributeUpdateStrategy.class) - @JsonDeserialize(as = ImmutableCloudApplicationExtended.AttributeUpdateStrategy.class) + @JsonSerialize(as = ImmutableCloudApplicationExtended.ImmutableAttributeUpdateStrategy.class) + @JsonDeserialize(as = ImmutableCloudApplicationExtended.ImmutableAttributeUpdateStrategy.class) public interface AttributeUpdateStrategy { @Value.Default diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/CloudRouteExtended.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/CloudRouteExtended.java index 2b3a93fcbc..a6ab632f5a 100644 --- a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/CloudRouteExtended.java +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/CloudRouteExtended.java @@ -1,12 +1,12 @@ package org.cloudfoundry.multiapps.controller.client.lib.domain; +import java.util.List; + import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; import org.immutables.value.Value; -import java.util.List; - @JsonSerialize(as = ImmutableCloudRouteExtended.class) @JsonDeserialize(as = ImmutableCloudRouteExtended.class) @Value.Immutable diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/CloudServiceInstanceExtended.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/CloudServiceInstanceExtended.java index 656447df97..3e0c375695 100644 --- a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/CloudServiceInstanceExtended.java +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/CloudServiceInstanceExtended.java @@ -2,8 +2,8 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; import org.cloudfoundry.multiapps.common.Nullable; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; import org.immutables.value.Value; @Value.Immutable diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/DropletInfoFactory.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/DropletInfoFactory.java index af168d2ed7..4982bafc54 100644 --- a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/DropletInfoFactory.java +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/DropletInfoFactory.java @@ -2,11 +2,11 @@ import java.util.List; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.DockerData; -import com.sap.cloudfoundry.client.facade.domain.LifecycleType; -import com.sap.cloudfoundry.client.facade.domain.Staging; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DockerData; +import org.cloudfoundry.multiapps.controller.client.facade.domain.LifecycleType; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Staging; public class DropletInfoFactory { diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/HealthCheckInfo.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/HealthCheckInfo.java index 96b69a0287..11bc0d49ec 100644 --- a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/HealthCheckInfo.java +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/HealthCheckInfo.java @@ -1,10 +1,10 @@ package org.cloudfoundry.multiapps.controller.client.lib.domain; -import com.sap.cloudfoundry.client.facade.domain.CloudProcess; -import com.sap.cloudfoundry.client.facade.domain.Staging; - import java.util.Objects; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudProcess; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Staging; + public class HealthCheckInfo { private final String type; diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/UploadStatusCallbackExtended.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/UploadStatusCallbackExtended.java index 6fa1ec91ab..44a1725cd0 100644 --- a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/UploadStatusCallbackExtended.java +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/UploadStatusCallbackExtended.java @@ -1,6 +1,6 @@ package org.cloudfoundry.multiapps.controller.client.lib.domain; -import com.sap.cloudfoundry.client.facade.UploadStatusCallback; +import org.cloudfoundry.multiapps.controller.client.facade.UploadStatusCallback; public interface UploadStatusCallbackExtended extends UploadStatusCallback { diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/package-info.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/package-info.java index 7e8f160665..b7aed6b4c3 100644 --- a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/package-info.java +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/package-info.java @@ -1,4 +1,4 @@ @MultiappsImmutablesStyle package org.cloudfoundry.multiapps.controller.client; -import org.cloudfoundry.multiapps.common.MultiappsImmutablesStyle; +import org.cloudfoundry.multiapps.common.MultiappsImmutablesStyle; \ No newline at end of file diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/util/ResilientCloudOperationExecutor.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/util/ResilientCloudOperationExecutor.java index a6b6a087db..54bae27e32 100644 --- a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/util/ResilientCloudOperationExecutor.java +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/util/ResilientCloudOperationExecutor.java @@ -12,12 +12,11 @@ import org.apache.commons.collections4.SetUtils; import org.cloudfoundry.multiapps.common.util.MiscUtil; import org.cloudfoundry.multiapps.controller.Messages; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudOperationException; - public class ResilientCloudOperationExecutor extends ResilientOperationExecutor { private static final Logger LOGGER = LoggerFactory.getLogger(ResilientCloudOperationExecutor.class); diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/util/TokenProperties.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/util/TokenProperties.java index dfba17c89a..6528bfc833 100644 --- a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/util/TokenProperties.java +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/util/TokenProperties.java @@ -1,9 +1,9 @@ package org.cloudfoundry.multiapps.controller.client.util; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; - import java.util.Map; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; + public class TokenProperties { public static final String CLIENT_ID_KEY = "client_id"; diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/ApplicationUtil.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/ApplicationUtil.java new file mode 100644 index 0000000000..b65d0067d5 --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/ApplicationUtil.java @@ -0,0 +1,94 @@ +package org.cloudfoundry.multiapps.controller.client.facade; + +import static org.junit.jupiter.api.Assertions.fail; + +import java.nio.file.Path; +import java.text.MessageFormat; +import java.time.Duration; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudBuild; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstanceInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstanceState; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Status; + +public class ApplicationUtil { + + public static final Duration UPLOAD_TIMEOUT = Duration.ofMinutes(15); + + public static CloudPackage uploadApplication(CloudControllerClient client, String applicationName, Path pathToFile) + throws InterruptedException { + CloudPackage cloudPackage = client.asyncUploadApplicationWithExponentialBackoff(applicationName, pathToFile, + UploadStatusCallback.NONE, UPLOAD_TIMEOUT); + while (cloudPackage.getStatus() != Status.READY && !hasUploadFailed(cloudPackage.getStatus())) { + Thread.sleep(TimeUnit.SECONDS.toMillis(1)); + cloudPackage = client.getPackage(cloudPackage.getGuid()); + } + if (hasUploadFailed(cloudPackage.getStatus())) { + fail(MessageFormat.format("Cloud package is in invalid state: \"{0}\"", cloudPackage.getStatus())); + } + return cloudPackage; + } + + private static boolean hasUploadFailed(Status status) { + return status == Status.EXPIRED || status == Status.FAILED; + } + + public static void stageApplication(CloudControllerClient client, String applicationName, CloudPackage cloudPackage) + throws InterruptedException { + UUID applicationGuid = client.getApplicationGuid(applicationName); + CloudBuild build = createBuildForPackage(client, cloudPackage); + client.bindDropletToApp(build.getDropletInfo() + .getGuid(), + applicationGuid); + } + + public static CloudBuild createBuildForPackage(CloudControllerClient client, CloudPackage cloudPackage) throws InterruptedException { + CloudBuild build = client.createBuild(cloudPackage.getGuid()); + while (build.getState() == CloudBuild.State.STAGING) { + Thread.sleep(TimeUnit.SECONDS.toMillis(1)); + build = client.getBuild(build.getGuid()); + } + if (build.getState() == CloudBuild.State.FAILED) { + fail(MessageFormat.format("Cloud build is in invalid state: \"{0}\"", build.getState())); + } + return build; + } + + public static void startApplication(CloudControllerClient client, String applicationName) throws InterruptedException { + client.startApplication(applicationName); + + CloudApplication app = client.getApplication(applicationName); + List appInstances = client.getApplicationInstances(app) + .getInstances(); + while (!hasAppInstancesStarted(appInstances) && !hasAppInstancesFailed(appInstances)) { + Thread.sleep(TimeUnit.SECONDS.toMillis(1)); + appInstances = client.getApplicationInstances(app) + .getInstances(); + } + + if (hasAppInstancesFailed(appInstances)) { + fail(MessageFormat.format("Some or all application instances of application \"{0}\" failed to start", applicationName)); + } + } + + private static boolean hasAppInstancesStarted(List appInstances) { + return appInstances.stream() + .allMatch(appInstance -> appInstance.getState() + .equals(InstanceState.RUNNING)); + } + + private static boolean hasAppInstancesFailed(List appInstances) { + return appInstances.stream() + .anyMatch(appInstance -> hasAppInstanceStartFailed(appInstance.getState())); + } + + private static boolean hasAppInstanceStartFailed(InstanceState instanceState) { + return instanceState == InstanceState.DOWN || instanceState == InstanceState.CRASHED; + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/ApplicationsCloudControllerClientIntegrationTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/ApplicationsCloudControllerClientIntegrationTest.java new file mode 100644 index 0000000000..dd185a4695 --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/ApplicationsCloudControllerClientIntegrationTest.java @@ -0,0 +1,503 @@ +package org.cloudfoundry.multiapps.controller.client.facade; + +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudBuild; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudProcess; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DockerInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudDomain; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableDockerInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableStaging; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstancesInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.LifecycleType; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Staging; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Status; +import org.cloudfoundry.multiapps.controller.client.facade.dto.ApplicationToCreateDto; +import org.cloudfoundry.multiapps.controller.client.facade.dto.ImmutableApplicationToCreateDto; +import org.cloudfoundry.client.v3.Metadata; +import org.cloudfoundry.client.v3.processes.HealthCheckType; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.http.HttpStatus; + +import static org.cloudfoundry.multiapps.controller.client.facade.IntegrationTestConstants.APPLICATION_HOST; +import static org.cloudfoundry.multiapps.controller.client.facade.IntegrationTestConstants.DEFAULT_DOMAIN; +import static org.cloudfoundry.multiapps.controller.client.facade.IntegrationTestConstants.DISK_IN_MB; +import static org.cloudfoundry.multiapps.controller.client.facade.IntegrationTestConstants.HEALTH_CHECK_ENDPOINT; +import static org.cloudfoundry.multiapps.controller.client.facade.IntegrationTestConstants.HEALTH_CHECK_TIMEMOUT; +import static org.cloudfoundry.multiapps.controller.client.facade.IntegrationTestConstants.JAVA_BUILDPACK; +import static org.cloudfoundry.multiapps.controller.client.facade.IntegrationTestConstants.JAVA_BUILDPACK_URL; +import static org.cloudfoundry.multiapps.controller.client.facade.IntegrationTestConstants.MEMORY_IN_MB; +import static org.cloudfoundry.multiapps.controller.client.facade.IntegrationTestConstants.NODEJS_BUILDPACK; +import static org.cloudfoundry.multiapps.controller.client.facade.IntegrationTestConstants.NODEJS_BUILDPACK_URL; +import static org.cloudfoundry.multiapps.controller.client.facade.IntegrationTestConstants.STATICFILE_APPLICATION_CONTENT; +import static org.cloudfoundry.multiapps.controller.client.facade.IntegrationTestConstants.STATICFILE_BUILDPACK; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +class ApplicationsCloudControllerClientIntegrationTest extends CloudControllerClientIntegrationTest { + + private static final Path STATICFILE_APPLICATION_PATH = getStaticfileApplicationContentPath(); + + @BeforeAll + static void createDefaultDomain() { + client.addDomain(DEFAULT_DOMAIN); + } + + @BeforeAll + static void deleteExistingApps() { + var allApps = client.getApplications(); + for (var app : allApps) { + client.deleteApplication(app.getName()); + } + } + + @AfterAll + static void deleteDefaultDomain() { + List routes = client.getRoutes(DEFAULT_DOMAIN); + for (CloudRoute route : routes) { + client.deleteRoute(route.getHost(), DEFAULT_DOMAIN, null); + } + client.deleteDomain(DEFAULT_DOMAIN); + } + + @Test + @DisplayName("Create application and verify its attributes") + void createApplication() { + String applicationName = "test-app-1"; + Staging staging = ImmutableStaging.builder() + .addBuildpack(JAVA_BUILDPACK) + .healthCheckType(HealthCheckType.PROCESS.getValue()) + .healthCheckHttpEndpoint(HEALTH_CHECK_ENDPOINT) + .healthCheckTimeout(HEALTH_CHECK_TIMEMOUT) + .build(); + CloudRoute route = getImmutableCloudRoute(); + try { + verifyApplicationWillBeCreated(applicationName, staging, Set.of(route)); + } catch (Exception e) { + fail(e); + } finally { + client.deleteApplication(applicationName); + } + } + + @Test + @DisplayName("Create, delete and verify the application is deleted") + void deleteApplication() { + String applicationName = "test-application-2"; + + try { + createAndVerifyDefaultApplication(applicationName); + client.deleteApplication(applicationName); + Exception exception = assertThrows(CloudOperationException.class, () -> client.getApplication(applicationName)); + assertTrue(exception.getMessage() + .contains(HttpStatus.NOT_FOUND.getReasonPhrase())); + } catch (Exception e) { + fail(e); + } finally { + CloudApplication app = client.getApplication(applicationName, false); + if (app != null) { + client.deleteApplication(applicationName); + } + } + } + + @Test + @DisplayName("Create application and verify its GUID") + void getApplicationGuid() { + String applicationName = "test-application-3"; + try { + createAndVerifyDefaultApplication(applicationName); + assertNotNull(client.getApplicationGuid(applicationName)); + } catch (Exception e) { + fail(e); + } finally { + client.deleteApplication(applicationName); + } + } + + @Test + @DisplayName("Create application, update and update its environment") + void testApplicationEnvironment() { + String applicationName = "test-application-4"; + try { + createAndVerifyDefaultApplication(applicationName); + client.updateApplicationEnv(applicationName, Map.of("foo", "bar")); + UUID applicationGuid = client.getApplicationGuid(applicationName); + Map applicationEnvironment = client.getApplicationEnvironment(applicationGuid); + assertEquals("bar", applicationEnvironment.get("foo")); + } catch (Exception e) { + fail(e); + } finally { + client.deleteApplication(applicationName); + } + } + + @Test + @DisplayName("Create application, update its healthcheck type and verify it ") + void updateApplicationHealthcheckType() { + String applicationName = "test-application-16"; + try { + createAndVerifyDefaultApplication(applicationName); + UUID applicationGuid = client.getApplicationGuid(applicationName); + delegate.applicationsV2() + .update(org.cloudfoundry.client.v2.applications.UpdateApplicationRequest.builder() + .applicationId(applicationGuid.toString()) + .healthCheckType( + HealthCheckType.NONE.getValue()) + .build()) + .block(); + CloudProcess cloudProcess = client.getApplicationProcess(applicationGuid); + assertEquals(org.cloudfoundry.multiapps.controller.client.facade.domain.HealthCheckType.NONE, cloudProcess.getHealthCheckType()); + } catch (Exception e) { + fail(e); + } finally { + client.deleteApplication(applicationName); + } + } + + @Test + @DisplayName("Create application, upload a package, verify package exists") + void uploadApplication() { + String applicationName = "test-application-5"; + try { + createAndVerifyDefaultApplication(applicationName); + CloudPackage cloudPackage = ApplicationUtil.uploadApplication(client, applicationName, STATICFILE_APPLICATION_PATH); + assertEquals(Status.READY, cloudPackage.getStatus()); + } catch (Exception e) { + fail(e); + } finally { + client.deleteApplication(applicationName); + } + } + + @Test + @DisplayName("Create application, upload a package, create a build and restart the application") + void restartApplication() { + String applicationName = "test-application-6"; + try { + createAndVerifyDefaultApplication(applicationName); + CloudPackage cloudPackage = ApplicationUtil.uploadApplication(client, applicationName, STATICFILE_APPLICATION_PATH); + ApplicationUtil.stageApplication(client, applicationName, cloudPackage); + client.startApplication(applicationName); + assertEquals(CloudApplication.State.STARTED, client.getApplication(applicationName) + .getState()); + client.stopApplication(applicationName); + assertEquals(CloudApplication.State.STOPPED, client.getApplication(applicationName) + .getState()); + client.startApplication(applicationName); + assertEquals(CloudApplication.State.STARTED, client.getApplication(applicationName) + .getState()); + } catch (Exception e) { + fail(e); + } finally { + client.deleteApplication(applicationName); + } + } + + @Test + @DisplayName("Create, upload, stage start and get instances") + void getAppInstances() { + String applicationName = "test-application-7"; + try { + createAndVerifyDefaultApplication(applicationName); + CloudPackage cloudPackage = ApplicationUtil.uploadApplication(client, applicationName, STATICFILE_APPLICATION_PATH); + client.updateApplicationInstances(applicationName, 3); + ApplicationUtil.stageApplication(client, applicationName, cloudPackage); + client.startApplication(applicationName); + CloudApplication application = client.getApplication(applicationName); + InstancesInfo applicationInstances = client.getApplicationInstances(application); + assertEquals(3, applicationInstances.getInstances() + .size()); + } catch (Exception e) { + fail(e); + } finally { + client.deleteApplication(applicationName); + } + } + + @Test + @DisplayName("Create an application, rename it, and verify its GUID") + void renameApplication() { + String applicationName = "test-application-8"; + String newApplicationName = "new-test-application-8"; + try { + createAndVerifyDefaultApplication(applicationName); + UUID applicationGuid = client.getApplicationGuid(applicationName); + client.rename(applicationName, newApplicationName); + assertEquals(applicationGuid, client.getApplication(newApplicationName) + .getGuid()); + } catch (Exception e) { + fail(e); + } finally { + client.deleteApplication(newApplicationName); + } + } + + @Test + @DisplayName("Create app and update its memory") + void updateApplicationMemory() { + String applicationName = "test-application-9"; + try { + createAndVerifyDefaultApplication(applicationName); + client.updateApplicationMemory(applicationName, 256); + CloudApplication application = client.getApplication(applicationName); + var process = client.getApplicationProcess(application.getGuid()); + assertEquals(256, process.getMemoryInMb()); + } catch (Exception e) { + fail(e); + } finally { + client.deleteApplication(applicationName); + } + } + + @Test + @DisplayName("Create app and update its staging") + void updateApplicationStaging() { + String applicationName = "test-application-10"; + try { + createAndVerifyDefaultApplication(applicationName); + client.updateApplicationStaging(applicationName, ImmutableStaging.builder() + .command("echo 1") + .build()); + CloudApplication application = client.getApplication(applicationName); + var process = client.getApplicationProcess(application.getGuid()); + assertEquals("echo 1", process.getCommand()); + } catch (Exception e) { + fail(e); + } finally { + client.deleteApplication(applicationName); + } + } + + @Test + @DisplayName("Create application with docker package") + void createDockerPackage() { + String applicationName = "test-application-11"; + DockerInfo dockerInfo = ImmutableDockerInfo.builder() + .image("test/image") + .build(); + try { + verifyApplicationWillBeCreated(applicationName, ImmutableStaging.builder() + .dockerInfo(dockerInfo) + .build(), + Set.of(getImmutableCloudRoute())); + UUID applicationGuid = client.getApplicationGuid(applicationName); + CloudPackage dockerPackage = client.createDockerPackage(applicationGuid, dockerInfo); + assertEquals(CloudPackage.Type.DOCKER, dockerPackage.getType()); + } catch (Exception e) { + fail(e); + } finally { + client.deleteApplication(applicationName); + } + } + + @Test + @DisplayName("Create application and update its routes") + void updateApplicationRoutes() { + String applicationName = "test-application-12"; + Set newRoutes = Set.of(ImmutableCloudRoute.builder() + .host("test-application-hostname-modified") + .url("test-application-hostname-modified." + DEFAULT_DOMAIN) + .domain(ImmutableCloudDomain.builder() + .name(DEFAULT_DOMAIN) + .build()) + .build()); + try { + createAndVerifyDefaultApplication(applicationName); + client.updateApplicationRoutes(applicationName, newRoutes); + CloudApplication application = client.getApplication(applicationName); + var routes = client.getApplicationRoutes(application.getGuid()); + assertEquals(List.copyOf(newRoutes), routes); + } catch (Exception e) { + fail(e); + } finally { + client.deleteApplication(applicationName); + } + } + + @Test + @DisplayName("Create application with docker package and check packages") + void getPackagesForApplication() { + String applicationName = "test-application-13"; + DockerInfo dockerInfo = ImmutableDockerInfo.builder() + .image("test/image") + .build(); + try { + verifyApplicationWillBeCreated(applicationName, ImmutableStaging.builder() + .dockerInfo(dockerInfo) + .build(), + Set.of(getImmutableCloudRoute())); + UUID applicationGuid = client.getApplicationGuid(applicationName); + CloudPackage dockerPackage = client.createDockerPackage(applicationGuid, dockerInfo); + List packagesForApplication = client.getPackagesForApplication(applicationGuid); + assertTrue(packagesForApplication.stream() + .map(CloudPackage::getGuid) + .anyMatch(packageGuid -> packageGuid.equals(dockerPackage.getGuid()))); + } catch (Exception e) { + fail(e); + } finally { + client.deleteApplication(applicationName); + } + } + + @Test + @DisplayName("Create application, upload a package, create a build and test its builds") + void getBuildsForApplication() { + String applicationName = "test-application-14"; + try { + createAndVerifyDefaultApplication(applicationName); + CloudPackage cloudPackage = ApplicationUtil.uploadApplication(client, applicationName, STATICFILE_APPLICATION_PATH); + UUID applicationGuid = client.getApplicationGuid(applicationName); + CloudBuild build = ApplicationUtil.createBuildForPackage(client, cloudPackage); + List buildsForApplication = client.getBuildsForApplication(applicationGuid); + assertTrue(buildsForApplication.stream() + .map(CloudBuild::getMetadata) + .map(CloudMetadata::getGuid) + .anyMatch(buildGuid -> buildGuid.equals(build.getGuid()))); + assertEquals(build.getMetadata() + .getGuid(), + client.getBuild(build.getMetadata() + .getGuid()) + .getGuid()); + } catch (Exception e) { + fail(e); + } finally { + client.deleteApplication(applicationName); + } + } + + @Test + @DisplayName("Create application and update its metadata") + void updateApplicationMetadata() { + String applicationName = "test-application-15"; + Metadata metadata = Metadata.builder() + .label("test-app", "test-app") + .build(); + try { + createAndVerifyDefaultApplication(applicationName); + UUID applicationGuid = client.getApplicationGuid(applicationName); + client.updateApplicationMetadata(applicationGuid, metadata); + List applicationsByMetadataLabelSelector = client.getApplicationsByMetadataLabelSelector("test-app"); + assertEquals(1, applicationsByMetadataLabelSelector.size()); + assertEquals(applicationName, applicationsByMetadataLabelSelector.get(0) + .getName()); + } catch (Exception e) { + fail(e); + } finally { + client.deleteApplication(applicationName); + } + } + + @Test + @DisplayName("Create application with multiple buildpacks") + void createApplicationWithBuildpacks() { + String applicationName = "test-app-16"; + List buildpacks = List.of(JAVA_BUILDPACK, NODEJS_BUILDPACK, STATICFILE_BUILDPACK); + Staging staging = ImmutableStaging.builder() + .addAllBuildpacks(buildpacks) + .build(); + try { + verifyApplicationWillBeCreated(applicationName, staging, Set.of(getImmutableCloudRoute())); + } catch (Exception e) { + fail(e); + } finally { + client.deleteApplication(applicationName); + } + } + + @Test + @DisplayName("Create application with CNB lifecycle and verify attributes") + void createCnbApplication() { + String applicationName = "test-app-17"; + List buildpacks = List.of(JAVA_BUILDPACK_URL, NODEJS_BUILDPACK_URL); + + Staging staging = ImmutableStaging.builder() + .lifecycleType(LifecycleType.CNB) + .addAllBuildpacks(buildpacks) + .build(); + CloudRoute route = getImmutableCloudRoute(); + try { + verifyApplicationWillBeCreated(applicationName, staging, Set.of(route)); + } catch (Exception e) { + fail(e); + } finally { + client.deleteApplication(applicationName); + } + } + + private void verifyApplicationWillBeCreated(String applicationName, Staging staging, Set routes) { + ApplicationToCreateDto applicationToCreateDto = ImmutableApplicationToCreateDto.builder() + .name(applicationName) + .staging(staging) + .diskQuotaInMb(DISK_IN_MB) + .memoryInMb(MEMORY_IN_MB) + .routes(routes) + .build(); + client.createApplication(applicationToCreateDto); + assertApplicationExists(ImmutableCloudApplication.builder() + .name(applicationName) + .state(CloudApplication.State.STOPPED) + .lifecycle(createLifecycle(staging)) + .build(), + staging, routes); + } + + private static void assertApplicationExists(CloudApplication cloudApplication, Staging staging, Set routes) { + CloudApplication application = client.getApplication(cloudApplication.getName()); + var realRoutes = client.getApplicationRoutes(application.getGuid()); + var process = client.getApplicationProcess(application.getGuid()); + assertEquals(cloudApplication.getState(), application.getState()); + assertEquals(cloudApplication.getLifecycle(), application.getLifecycle()); + assertEquals(List.copyOf(routes), realRoutes); + if (staging.getCommand() != null) { + assertEquals(staging.getCommand(), process.getCommand()); + } + assertEquals(MEMORY_IN_MB, process.getMemoryInMb()); + assertEquals(DISK_IN_MB, process.getDiskInMb()); + } + + private void createAndVerifyDefaultApplication(String applicationName) { + verifyApplicationWillBeCreated(applicationName, ImmutableStaging.builder() + .build(), + Set.of(getImmutableCloudRoute())); + } + + private ImmutableCloudRoute getImmutableCloudRoute() { + return ImmutableCloudRoute.builder() + .host(APPLICATION_HOST) + .domain(ImmutableCloudDomain.builder() + .name(DEFAULT_DOMAIN) + .build()) + .url(APPLICATION_HOST + "." + DEFAULT_DOMAIN) + .build(); + } + + private static Path getStaticfileApplicationContentPath() { + URL url = ApplicationsCloudControllerClientIntegrationTest.class.getResource(STATICFILE_APPLICATION_CONTENT); + try { + return Paths.get(url.toURI()); + } catch (URISyntaxException e) { + throw new IllegalStateException(e); + } + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/CloudControllerClientIntegrationTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/CloudControllerClientIntegrationTest.java new file mode 100644 index 0000000000..b394252229 --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/CloudControllerClientIntegrationTest.java @@ -0,0 +1,107 @@ +package org.cloudfoundry.multiapps.controller.client.facade; + +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.cloudfoundry.multiapps.controller.client.facade.adapters.ImmutableCloudFoundryClientFactory; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableLifecycle; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Lifecycle; +import org.cloudfoundry.multiapps.controller.client.facade.domain.LifecycleType; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Staging; +import org.cloudfoundry.multiapps.controller.client.facade.rest.CloudSpaceClient; +import org.cloudfoundry.multiapps.controller.client.facade.util.RestUtil; +import org.cloudfoundry.client.CloudFoundryClient; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.TestInfo; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +abstract class CloudControllerClientIntegrationTest { + + private static final String DEFAULT_CLIENT_ID = "cf"; + private static final String DEFAULT_CLIENT_SECRET = ""; + protected static final String DEFAULT_STACK = "cflinuxfs4"; + + protected static CloudControllerClient client; + protected static CloudFoundryClient delegate; + protected static CloudSpace target; + + @BeforeAll + static void login() throws MalformedURLException { + assertAllRequiredVariablesAreDefined(); + CloudCredentials credentials = getCloudCredentials(); + URL apiUrl = URI.create(ITVariable.CF_API.getValue()) + .toURL(); + var clientFactory = ImmutableCloudFoundryClientFactory.builder() + .build(); + var oauthClient = new RestUtil().createOAuthClientByControllerUrl(apiUrl, true); + oauthClient.init(credentials); + CloudSpaceClient spaceClient = clientFactory.createSpaceClient(apiUrl, oauthClient, Collections.emptyMap()); + target = spaceClient.getSpace(ITVariable.ORG.getValue(), ITVariable.SPACE.getValue()); + client = new CloudControllerClientImpl(apiUrl, credentials, target, true); + delegate = clientFactory.createClient(apiUrl, oauthClient, Collections.emptyMap()); + } + + @BeforeEach + public void setUp(TestInfo testInfo) { + System.out.println("================================"); + System.out.printf("Test started: %s%n", testInfo.getDisplayName()); + } + + @AfterEach + public void tearDown(TestInfo testInfo) { + System.out.printf("Test finished: %s%n", testInfo.getDisplayName()); + } + + protected Lifecycle createLifecycle(Staging staging) { + if (staging.getDockerInfo() != null) { + return ImmutableLifecycle.builder() + .type(LifecycleType.DOCKER) + .data(Map.of()) + .build(); + } + + var data = new HashMap(); + data.put("buildpacks", staging.getBuildpacks()); + data.put("stack", DEFAULT_STACK); + + // Default to BUILDPACK if lifecycleType is null + LifecycleType lifecycleType = staging.getLifecycleType() != null + ? staging.getLifecycleType() + : LifecycleType.BUILDPACK; + + return ImmutableLifecycle.builder() + .type(lifecycleType) + .data(data) + .build(); + } + + private static void assertAllRequiredVariablesAreDefined() { + for (ITVariable itVariable : ITVariable.values()) { + if (!itVariable.isRequired()) { + continue; + } + assertNotNull(itVariable.getValue(), String.format("Missing required value defined by env var %s or system property %s", + itVariable.getEnvVariable(), itVariable.getProperty())); + } + } + + private static CloudCredentials getCloudCredentials() { + if (ITVariable.USER_ORIGIN.getValue() == null) { + return new CloudCredentials(ITVariable.USER_EMAIL.getValue(), ITVariable.USER_PASSWORD.getValue()); + } + return new CloudCredentials(ITVariable.USER_EMAIL.getValue(), + ITVariable.USER_PASSWORD.getValue(), + DEFAULT_CLIENT_ID, + DEFAULT_CLIENT_SECRET, + ITVariable.USER_ORIGIN.getValue()); + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/CloudStackIntegrationTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/CloudStackIntegrationTest.java new file mode 100644 index 0000000000..534aa6cb0b --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/CloudStackIntegrationTest.java @@ -0,0 +1,128 @@ +package org.cloudfoundry.multiapps.controller.client.facade; + +import static org.cloudfoundry.multiapps.controller.client.facade.IntegrationTestConstants.APPLICATION_HOST; +import static org.cloudfoundry.multiapps.controller.client.facade.IntegrationTestConstants.DEFAULT_DOMAIN; +import static org.cloudfoundry.multiapps.controller.client.facade.IntegrationTestConstants.DISK_IN_MB; +import static org.cloudfoundry.multiapps.controller.client.facade.IntegrationTestConstants.MEMORY_IN_MB; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.util.List; +import java.util.Set; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudDomain; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableStaging; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Staging; +import org.cloudfoundry.multiapps.controller.client.facade.dto.ApplicationToCreateDto; +import org.cloudfoundry.multiapps.controller.client.facade.dto.ImmutableApplicationToCreateDto; + +class CloudStackIntegrationTest extends CloudControllerClientIntegrationTest { + + private static final String INCORRECT_STACK_NAME = "Non-existent-stack-name"; + private static final CloudRoute DEFAULT_ROUTE = ImmutableCloudRoute.builder() + .host(APPLICATION_HOST) + .domain(ImmutableCloudDomain.builder() + .name(DEFAULT_DOMAIN) + .build()) + .url(APPLICATION_HOST + "." + DEFAULT_DOMAIN) + .build(); + + @BeforeAll + static void createDefaultDomain() { + client.addDomain(DEFAULT_DOMAIN); + } + + @AfterAll + static void deleteDefaultDomain() { + List routes = client.getRoutes(DEFAULT_DOMAIN); + for (CloudRoute route : routes) { + client.deleteRoute(route.getHost(), DEFAULT_DOMAIN, null); + } + client.deleteDomain(DEFAULT_DOMAIN); + } + + @Test + @DisplayName("Create application and verify default cloud stack") + void createApplicationWithDefaultCloudStack() { + String applicationName = "test-stack-app-1"; + Staging staging = ImmutableStaging.builder() + .addBuildpack(IntegrationTestConstants.JAVA_BUILDPACK) + .build(); + try { + verifyExistenceOfDefaultStack(applicationName, staging, Set.of(DEFAULT_ROUTE)); + } finally { + client.deleteApplication(applicationName); + } + } + + private void verifyExistenceOfDefaultStack(String applicationName, Staging staging, Set routes) { + ApplicationToCreateDto applicationToCreateDto = ImmutableApplicationToCreateDto.builder() + .name(applicationName) + .staging(staging) + .diskQuotaInMb(DISK_IN_MB) + .memoryInMb(MEMORY_IN_MB) + .routes(routes) + .build(); + client.createApplication(applicationToCreateDto); + assertDefaultCloudStack(ImmutableCloudApplication.builder() + .name(applicationName) + .state(CloudApplication.State.STARTED) + .lifecycle(createLifecycle(staging)) + .build()); + + } + + private void assertDefaultCloudStack(CloudApplication application) { + CloudApplication app = client.getApplication(application.getName()); + var appStack = app.getLifecycle() + .getData() + .get("stack"); + assertNotNull(appStack); + assertEquals(DEFAULT_STACK, appStack); + } + + @Test + @DisplayName("Create application with incorrect stack and verify that exception is thrown") + void createApplicationWithIncorrectStack() { + String applicationName = "test-stack-app-2"; + Staging staging = ImmutableStaging.builder() + .addBuildpack(IntegrationTestConstants.JAVA_BUILDPACK) + .build(); + try { + verifyIncorrectStack(applicationName, staging, Set.of(DEFAULT_ROUTE)); + } finally { + client.deleteApplication(applicationName); + } + } + + private void verifyIncorrectStack(String applicationName, Staging staging, Set routes) { + ApplicationToCreateDto applicationToCreateDto = ImmutableApplicationToCreateDto.builder() + .name(applicationName) + .staging(staging) + .diskQuotaInMb(DISK_IN_MB) + .memoryInMb(MEMORY_IN_MB) + .routes(routes) + .build(); + client.createApplication(applicationToCreateDto); + assertThrows(CloudOperationException.class, () -> client.getStack(INCORRECT_STACK_NAME, true)); + } + + @Test + @DisplayName("Verify existence of at least one valid Cloud Stack") + void getStackList() { + assertNotNull(client.getStacks()); + assertFalse(client.getStacks() + .isEmpty()); + } +} \ No newline at end of file diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/DomainsCloudControllerClientIntegrationTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/DomainsCloudControllerClientIntegrationTest.java new file mode 100644 index 0000000000..297d134d95 --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/DomainsCloudControllerClientIntegrationTest.java @@ -0,0 +1,72 @@ +package org.cloudfoundry.multiapps.controller.client.facade; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +import java.io.IOException; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.http.HttpStatus; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudDomain; + +class DomainsCloudControllerClientIntegrationTest extends CloudControllerClientIntegrationTest { + + @Test + @DisplayName("Add missing domain") + void addDomain() throws IOException { + String domainName = ITVariable.DOMAIN_NAME.getValue(); + assertDomainExists(domainName, false); + try { + client.addDomain(domainName); + assertDomainExists(domainName, true); + } finally { + client.deleteDomain(domainName); + } + } + + @Test + @DisplayName("Add existing domain and verify addition does not fail") + void addDomainAlreadyExists() throws IOException { + String domainName = ITVariable.DOMAIN_NAME.getValue(); + try { + client.addDomain(domainName); + assertDomainExists(domainName, true); + client.addDomain(domainName); + } finally { + client.deleteDomain(domainName); + } + } + + @Test + @DisplayName("Delete existing domain") + void deleteDomain() throws IOException { + String domainName = "delete-domain" + ITVariable.DOMAIN_NAME.getValue(); + client.addDomain(domainName); + assertDomainExists(domainName, true); + client.deleteDomain(domainName); + assertDomainExists(domainName, false); + } + + @Test + @DisplayName("Delete missing domain and verify deletion fails") + void deleteDomainMissing() throws IOException { + String domainName = "delete-domain-missing" + ITVariable.DOMAIN_NAME.getValue(); + assertDomainExists(domainName, false); + try { + client.deleteDomain(domainName); + fail(); + } catch (CloudOperationException e) { + assertEquals(HttpStatus.NOT_FOUND, e.getStatusCode()); + } + } + + private static void assertDomainExists(String domainName, boolean domainExists) { + boolean actualDomainExists = client.getDomainsForOrganization() + .stream() + .map(CloudDomain::getName) + .anyMatch(domainName::equals); + assertEquals(domainExists, actualDomainExists); + } +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/ITVariable.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/ITVariable.java new file mode 100644 index 0000000000..cce411eac6 --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/ITVariable.java @@ -0,0 +1,69 @@ +package org.cloudfoundry.multiapps.controller.client.facade; + +public enum ITVariable { + + // @formatter:off + CF_API(Constants.CF_API_ENV, Constants.CF_API_PROPERTY), + USER_EMAIL(Constants.USER_EMAIL_ENV, Constants.USER_EMAIL_PROPERTY), + USER_PASSWORD(Constants.USER_PASSWORD_ENV, Constants.USER_PASSWORD_PROPERTY), + USER_ORIGIN(Constants.USER_ORIGIN_ENV, Constants.USER_ORIGIN_PROPERTY, false), + ORG(Constants.ORG_ENV, Constants.ORG_PROPERTY), + SPACE(Constants.SPACE_ENV, Constants.SPACE_PROPERTY), + DOMAIN_NAME(Constants.DOMAIN_NAME_ENV, Constants.DOMAIN_NAME_PROPERTY), + PATH_TO_SERVICE_BROKER_APPLICATION(Constants.PATH_TO_SERVICE_BROKER_ENV, Constants.PATH_TO_SERVICE_BROKER_PROPERTY, false); + // @formatter:on + + private final String envVariable; + private final String property; + private final boolean required; + + ITVariable(String envVariable, String property, boolean required) { + this.envVariable = envVariable; + this.property = property; + this.required = required; + } + + ITVariable(String envVariable, String property) { + this.envVariable = envVariable; + this.property = property; + this.required = true; + } + + public String getEnvVariable() { + return envVariable; + } + + public String getProperty() { + return property; + } + + public boolean isRequired() { + return required; + } + + public String getValue() { + String envVariable = System.getenv(this.getEnvVariable()); + String property = System.getProperty(this.getProperty()); + return property != null ? property : envVariable; + } + + private static class Constants { + public static final String CF_API_ENV = "CF_API"; + public static final String USER_EMAIL_ENV = "CF_USER_EMAIL"; + public static final String USER_PASSWORD_ENV = "CF_USER_PASSWORD"; + public static final String USER_ORIGIN_ENV = "CF_USER_ORIGIN"; + public static final String ORG_ENV = "CF_ORG"; + public static final String SPACE_ENV = "CF_SPACE"; + public static final String DOMAIN_NAME_ENV = "DOMAIN_NAME"; + public static final String PATH_TO_SERVICE_BROKER_ENV = "PATH_TO_SERVICE_BROKER"; + + public static final String CF_API_PROPERTY = "api"; + public static final String USER_EMAIL_PROPERTY = "user.email"; + public static final String USER_PASSWORD_PROPERTY = "user.password"; + public static final String USER_ORIGIN_PROPERTY = "user.origin"; + public static final String ORG_PROPERTY = "org"; + public static final String SPACE_PROPERTY = "space"; + public static final String DOMAIN_NAME_PROPERTY = "domain.name"; + public static final String PATH_TO_SERVICE_BROKER_PROPERTY = "path.servicebroker"; + } +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/IntegrationTestConstants.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/IntegrationTestConstants.java new file mode 100644 index 0000000000..70a7b1742e --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/IntegrationTestConstants.java @@ -0,0 +1,33 @@ +package org.cloudfoundry.multiapps.controller.client.facade; + +public class IntegrationTestConstants { + + private IntegrationTestConstants() { + } + + public static final String HEALTH_CHECK_ENDPOINT = "/public/ping"; + public static final String JAVA_BUILDPACK = "java_buildpack"; + public static final String NODEJS_BUILDPACK = "nodejs_buildpack"; + public static final String STATICFILE_BUILDPACK = "staticfile_buildpack"; + public static final int HEALTH_CHECK_TIMEMOUT = 100; + public static final int DISK_IN_MB = 128; + public static final int MEMORY_IN_MB = 128; + public static final String DEFAULT_DOMAIN = "deploy-service.custom.domain.for.integration.tests"; + public static final String APPLICATION_HOST = "test-application-hostname-ztana-test"; + public static final String STATICFILE_APPLICATION_CONTENT = "staticfile.zip"; + public static final String JAVA_BUILDPACK_URL = "https://github.com/paketo-buildpacks/java"; + public static final String NODEJS_BUILDPACK_URL = "https://github.com/paketo-buildpacks/nodejs"; + + // Service broker constants + public static final int SERVICE_BROKER_DISK_IN_MB = 256; + public static final int SERVICE_BROKER_MEMORY_IN_MB = 1024; + public static final String SERVICE_BROKER_HOST = "test-service-foo-broker"; + public static final String SERVICE_BROKER_APP_NAME = "test-service-broker-app"; + public static final String SERVICE_BROKER_NAME = "test-service-broker"; + public static final String SERVICE_BROKER_ENV_CONTENT = "service-broker-env.json"; + public static final String SERVICE_BROKER_USERNAME = "test-user"; + public static final String SERVICE_BROKER_PASSWORD = "test-password"; + public static final String SERVICE_OFFERING = "finch"; + public static final String SERVICE_PLAN = "grey"; + public static final String SERVICE_PLAN_2 = "white"; +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/ServicesCloudControllerClientIntegrationTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/ServicesCloudControllerClientIntegrationTest.java new file mode 100644 index 0000000000..c0de6f9023 --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/ServicesCloudControllerClientIntegrationTest.java @@ -0,0 +1,641 @@ +package org.cloudfoundry.multiapps.controller.client.facade; + +import static org.cloudfoundry.multiapps.controller.client.facade.IntegrationTestConstants.APPLICATION_HOST; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.text.MessageFormat; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.cloudfoundry.client.v3.jobs.JobState; +import org.cloudfoundry.client.v3.serviceinstances.ServiceInstanceType; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.client.WebClient; + +import org.cloudfoundry.multiapps.controller.client.facade.broker.FailConfiguration; +import org.cloudfoundry.multiapps.controller.client.facade.broker.ImmutableFailConfiguration; +import org.cloudfoundry.multiapps.controller.client.facade.broker.ImmutableServiceBrokerConfiguration; +import org.cloudfoundry.multiapps.controller.client.facade.broker.ServiceBrokerConfiguration; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudAsyncJob; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBroker; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudDomain; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceBroker; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableStaging; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Staging; +import org.cloudfoundry.multiapps.controller.client.facade.dto.ApplicationToCreateDto; +import org.cloudfoundry.multiapps.controller.client.facade.dto.ImmutableApplicationToCreateDto; +import org.cloudfoundry.multiapps.controller.client.facade.util.JsonUtil; + +class ServicesCloudControllerClientIntegrationTest extends CloudControllerClientIntegrationTest { + + private static final String SYSLOG_DRAIN_URL = "https://syslogDrain.com"; + private static final Map USER_SERVICE_CREDENTIALS = Map.of("testCredentialsKey", "testCredentialsValue"); + private static final String SERVICE_BROKER_ENDPOINT = "configurations/1"; + private static final List SERVICE_TAGS = List.of("custom-tag-1", "custom-tag-2"); + + private static boolean pushedServiceBroker = false; + + @BeforeAll + static void setUp() throws InterruptedException { + String brokerPathString = ITVariable.PATH_TO_SERVICE_BROKER_APPLICATION.getValue(); + if (brokerPathString == null) { + return; + } + Path brokerPath = Paths.get(brokerPathString); + if (Files.notExists(brokerPath)) { + fail(MessageFormat.format("Specified service broker path \"{0}\" not exists", brokerPathString)); + } + pushServiceBrokerApplication(brokerPath); + try { + createServiceBroker(IntegrationTestConstants.SERVICE_BROKER_NAME, SERVICE_BROKER_ENDPOINT); + pushedServiceBroker = true; + } catch (CloudOperationException e) { + if (e.getStatusCode() == HttpStatus.UNPROCESSABLE_ENTITY) { + //Ignore because service broker with this name exists + } else { + fail("Service broker creation failed!", e); + } + } + } + + @AfterAll + static void tearDown() { + if (pushedServiceBroker) { + String jobId = client.deleteServiceBroker(IntegrationTestConstants.SERVICE_BROKER_NAME); + pollServiceBrokerOperation(jobId, IntegrationTestConstants.SERVICE_BROKER_NAME); + client.deleteApplication(IntegrationTestConstants.SERVICE_BROKER_APP_NAME); + client.deleteRoute(IntegrationTestConstants.SERVICE_BROKER_HOST, client.getDefaultDomain() + .getName(), + null); + } + } + + @Test + @DisplayName("Create a user provided service and verify its parameters") + void createUserProvidedServiceTest() { + String serviceName = "test-service-1"; + try { + client.createUserProvidedServiceInstance(buildUserProvidedService(serviceName)); + CloudServiceInstance service = client.getServiceInstance(serviceName); + Map serviceCredentials = client.getUserProvidedServiceInstanceParameters(service.getGuid()); + assertEquals(SYSLOG_DRAIN_URL, service.getSyslogDrainUrl()); + assertEquals(USER_SERVICE_CREDENTIALS, serviceCredentials); + assertEquals(SERVICE_TAGS, service.getTags()); + assertTrue(service.isUserProvided()); + } catch (Exception e) { + fail(e); + } finally { + client.deleteServiceInstance(serviceName); + } + } + + @Test + @DisplayName("Create a user provided service and update its parameters") + void updateUserProvidedServiceTest() { + String serviceName = "test-service-2"; + Map updatedServiceCredentials = Map.of("newTestCredentialsKey", "newTestCredentialsValue"); + String updatedSyslogDrainUrl = "https://newSyslogDrain.com"; + List updatedTags = List.of("tag1", "tag2"); + try { + client.createUserProvidedServiceInstance(buildUserProvidedService(serviceName)); + + client.updateServiceParameters(serviceName, updatedServiceCredentials); + + client.updateServiceSyslogDrainUrl(serviceName, updatedSyslogDrainUrl); + + client.updateServiceTags(serviceName, updatedTags); + + CloudServiceInstance service = client.getServiceInstance(serviceName); + Map serviceCredentials = client.getUserProvidedServiceInstanceParameters(service.getGuid()); + + assertEquals(updatedSyslogDrainUrl, service.getSyslogDrainUrl()); + assertEquals(updatedServiceCredentials, serviceCredentials); + assertTrue(service.getTags() + .containsAll(updatedTags), + MessageFormat.format("Expected tags \"{0}\" but was \"{1}\"", updatedTags, service.getTags())); + } catch (Exception e) { + fail(e); + } finally { + client.deleteServiceInstance(serviceName); + } + } + + static Stream createManagedService() { + return Stream.of( + // (1) Without specified broker name + Arguments.of("test-managed-service", null), + // (2) With specified broker name + Arguments.of("test-managed-service-with-broker", "test-service-broker")); + } + + @ParameterizedTest + @MethodSource + @DisplayName("Create a managed service") + void createManagedService(String serviceName, String brokerName) { + if (!pushedServiceBroker) { + return; + } + try { + client.createServiceInstance(ImmutableCloudServiceInstance.builder() + .name(serviceName) + .label(IntegrationTestConstants.SERVICE_OFFERING) + .plan(IntegrationTestConstants.SERVICE_PLAN) + .broker(brokerName) + .build()); + pollLastOperationServiceInstanceState(serviceName); + CloudServiceInstance service = client.getServiceInstance(serviceName); + assertEquals(serviceName, service.getName()); + assertEquals(IntegrationTestConstants.SERVICE_OFFERING, service.getLabel()); + assertEquals(IntegrationTestConstants.SERVICE_PLAN, service.getPlan()); + } catch (Exception e) { + fail(e); + } finally { + client.deleteServiceInstance(serviceName); + verifyServiceIsOrBeingDeleted(serviceName); + } + } + + @Test + @DisplayName("Update managed service") + void updateManagedService() { + if (!pushedServiceBroker) { + return; + } + String serviceName = "test-service"; + Map parameters = Map.of("test-key", "test-value", "test-key-2", "test-value-2"); + List serviceTags = List.of("test", "prod"); + + try { + client.createServiceInstance(ImmutableCloudServiceInstance.builder() + .name(serviceName) + .label(IntegrationTestConstants.SERVICE_OFFERING) + .plan(IntegrationTestConstants.SERVICE_PLAN) + .build()); + pollLastOperationServiceInstanceState(serviceName); + + client.updateServicePlan(serviceName, IntegrationTestConstants.SERVICE_PLAN_2); + pollLastOperationServiceInstanceState(serviceName); + + client.updateServiceParameters(serviceName, parameters); + pollLastOperationServiceInstanceState(serviceName); + + client.updateServiceTags(serviceName, serviceTags); + pollLastOperationServiceInstanceState(serviceName); + + CloudServiceInstance service = client.getServiceInstance(serviceName); + Map resultParameters = client.getServiceInstanceParameters(service.getGuid()); + + assertEquals(serviceName, service.getName()); + assertEquals(IntegrationTestConstants.SERVICE_OFFERING, service.getLabel()); + assertEquals(IntegrationTestConstants.SERVICE_PLAN_2, service.getPlan()); + assertEquals(parameters, resultParameters); + assertTrue(service.getTags() + .containsAll(serviceTags), + MessageFormat.format("Expected tags \"{0}\" but was \"{1}\"", serviceTags, service.getTags())); + } catch (Exception e) { + fail(e); + } finally { + client.deleteServiceInstance(serviceName); + verifyServiceIsOrBeingDeleted(serviceName); + } + } + + private void pollLastOperationServiceInstanceState(String serviceInstanceName) { + int times = 0; + ServiceOperation lastOperation = client.getServiceInstance(serviceInstanceName) + .getLastOperation(); + while (!lastOperation.getState() + .equals(ServiceOperation.State.SUCCEEDED)) { + sleep(TimeUnit.SECONDS, 1); + lastOperation = client.getServiceInstance(serviceInstanceName) + .getLastOperation(); + if (lastOperation.getState() + .equals(ServiceOperation.State.FAILED)) { + System.err.println(JsonUtil.convertToJson(lastOperation)); + throw new IllegalStateException(String.format("Service operation failed for service: %s", serviceInstanceName)); + } + if (times++ > 60) { + System.err.println(JsonUtil.convertToJson(lastOperation)); + throw new IllegalStateException(String.format("Service operation timeout exceeded for service: %s", serviceInstanceName)); + } + } + } + + static Stream getServiceInstance() { + return Stream.of(Arguments.of("test-service", true, null, true), + Arguments.of("not-exist", true, CloudOperationException.class, false), + Arguments.of("not-exist-optional", false, null, false)); + } + + @ParameterizedTest + @MethodSource + @DisplayName("Get service instance") + void getServiceInstance(String serviceName, boolean required, Class expectedException, boolean expectedService) { + if (!pushedServiceBroker) { + return; + } + String serviceNameToCreate = "test-service"; + + try { + client.createServiceInstance(ImmutableCloudServiceInstance.builder() + .name(serviceNameToCreate) + .label(IntegrationTestConstants.SERVICE_OFFERING) + .plan(IntegrationTestConstants.SERVICE_PLAN) + .build()); + pollLastOperationServiceInstanceState(serviceNameToCreate); + if (expectedException != null) { + assertThrows(expectedException, () -> client.getServiceInstance(serviceName, required)); + return; + } + CloudServiceInstance service = client.getServiceInstance(serviceName, required); + if (expectedService) { + assertEquals(serviceName, service.getName()); + return; + } + assertNull(service); + } catch (Exception e) { + fail(e); + } finally { + client.deleteServiceInstance(serviceNameToCreate); + verifyServiceIsOrBeingDeleted(serviceNameToCreate); + } + } + + @Test + @DisplayName("Delete service instance") + void deleteServiceInstance() { + if (!pushedServiceBroker) { + return; + } + String serviceName = "test-service"; + + try { + client.createServiceInstance(ImmutableCloudServiceInstance.builder() + .name(serviceName) + .label(IntegrationTestConstants.SERVICE_OFFERING) + .plan(IntegrationTestConstants.SERVICE_PLAN) + .build()); + pollLastOperationServiceInstanceState(serviceName); + client.deleteServiceInstance(serviceName); + verifyServiceIsOrBeingDeleted(serviceName); + } catch (Exception e) { + fail(e); + } finally { + CloudServiceInstance service = client.getServiceInstance(serviceName, false); + if (service != null) { + client.deleteServiceInstance(service); + } + } + } + + private void verifyServiceIsOrBeingDeleted(String serviceName) { + CloudServiceInstance serviceInstance = client.getServiceInstance(serviceName, false); + int times = 0; + while (serviceInstance != null) { + if (times++ > 30) { + fail(MessageFormat.format("Timeout when waiting for service deletion, error \"{0}\"", serviceInstance.getLastOperation() + .getDescription())); + } + sleep(TimeUnit.SECONDS, 1); + serviceInstance = client.getServiceInstance(serviceName, false); + } + } + + @Test + @DisplayName("Create space scoped service broker") + void createSpaceScopedServiceBroker() { + if (!pushedServiceBroker) { + return; + } + String serviceBrokerName = "test-space-scoped-service-broker"; + String defaultDomain = client.getDefaultDomain() + .getName(); + String expectedServiceBrokerUrl = MessageFormat.format("https://{0}.{1}/{2}", IntegrationTestConstants.SERVICE_BROKER_HOST, + defaultDomain, "configurations/2"); + + try { + createServiceBroker(serviceBrokerName, "configurations/2"); + + CloudServiceBroker broker = client.getServiceBroker(serviceBrokerName); + assertEquals(serviceBrokerName, broker.getName()); + assertEquals(target.getMetadata() + .getGuid() + .toString(), + broker.getSpaceGuid()); + assertEquals(expectedServiceBrokerUrl, broker.getUrl()); + } catch (Exception e) { + fail(e); + } finally { + String jobId = client.deleteServiceBroker(serviceBrokerName); + pollServiceBrokerOperation(jobId, serviceBrokerName); + } + } + + @Test + @DisplayName("Update space scoped service broker") + void updateSpaceScopedServiceBroker() { + if (!pushedServiceBroker) { + return; + } + String serviceBrokerName = "test-space-scoped-service-broker"; + String targetSpaceGuid = target.getMetadata() + .getGuid() + .toString(); + String defaultDomain = client.getDefaultDomain() + .getName(); + String expectedServiceBrokerUrl = MessageFormat.format("https://{0}.{1}/{2}", IntegrationTestConstants.SERVICE_BROKER_HOST, + defaultDomain, "configurations/3"); + + try { + createServiceBroker(serviceBrokerName, "configurations/2"); + + String jobId = client.updateServiceBroker(ImmutableCloudServiceBroker.builder() + .name(serviceBrokerName) + .username("new-user") + .password("new-password") + .url(MessageFormat.format("https://{0}.{1}/{2}", + IntegrationTestConstants.SERVICE_BROKER_HOST, + defaultDomain, + "configurations/3")) + .spaceGuid(targetSpaceGuid) + .build()); + pollServiceBrokerOperation(jobId, serviceBrokerName); + + CloudServiceBroker broker = client.getServiceBroker(serviceBrokerName); + assertEquals(serviceBrokerName, broker.getName()); + assertEquals(target.getMetadata() + .getGuid() + .toString(), + broker.getSpaceGuid()); + assertEquals(expectedServiceBrokerUrl, broker.getUrl()); + } catch (Exception e) { + fail(e); + } finally { + String jobId = client.deleteServiceBroker(serviceBrokerName); + pollServiceBrokerOperation(jobId, serviceBrokerName); + } + } + + @Test + @DisplayName("Delete space scoped service broker") + void deleteSpaceScopedServiceBroker() { + if (!pushedServiceBroker) { + return; + } + String serviceBrokerName = "test-space-scoped-service-broker"; + + try { + createServiceBroker(serviceBrokerName, "configurations/2"); + + String jobId = client.deleteServiceBroker(serviceBrokerName); + pollServiceBrokerOperation(jobId, serviceBrokerName); + + assertThrows(CloudOperationException.class, () -> client.getServiceBroker(serviceBrokerName)); + } catch (Exception e) { + fail(e); + } finally { + CloudServiceBroker broker = client.getServiceBroker(serviceBrokerName, false); + if (broker != null) { + String jobId = client.deleteServiceBroker(serviceBrokerName); + pollServiceBrokerOperation(jobId, serviceBrokerName); + } + } + } + + @Test + void testFetchingOfFailedServiceKey() { + if (!pushedServiceBroker) { + return; + } + String testServiceInstanceName = "service-instance-with-failed-service-keys"; + try { + client.createServiceInstance(ImmutableCloudServiceInstance.builder() + .name(testServiceInstanceName) + .label(IntegrationTestConstants.SERVICE_OFFERING) + .plan(IntegrationTestConstants.SERVICE_PLAN) + .build()); + pollLastOperationServiceInstanceState(testServiceInstanceName); + CloudServiceInstance serviceInstance = client.getServiceInstance(testServiceInstanceName); + createServiceKeySync(testServiceInstanceName, "successful-key", Map.of("test-key", "test-value")); + FailConfiguration failConfiguration = ImmutableFailConfiguration.builder() + .operationType(FailConfiguration.OperationType.CREATE_SERVICE_KEY.toString()) + .addInstanceId(serviceInstance.getGuid()) + .status(HttpStatus.INTERNAL_SERVER_ERROR.value()) + .build(); + configureServiceBroker(List.of(failConfiguration)); + createServiceKeySilently(testServiceInstanceName, "failed-key", Collections.emptyMap()); + List serviceKeys = client.getServiceKeysWithCredentials(testServiceInstanceName); + assertEquals(2, serviceKeys.size()); + assertEquals(Map.of("test-key", "test-value"), findServiceKeyByName("successful-key", serviceKeys).getCredentials()); + assertEquals(Collections.emptyMap(), findServiceKeyByName("failed-key", serviceKeys).getCredentials()); + } catch (Exception e) { + fail(e); + } finally { + List serviceKeys = client.getServiceKeys(testServiceInstanceName); + deleteServiceKeys(serviceKeys); + client.deleteServiceInstance(testServiceInstanceName); + verifyServiceIsOrBeingDeleted(testServiceInstanceName); + } + } + + private void deleteServiceKeys(List serviceKeys) { + serviceKeys.parallelStream() + .map(serviceKey -> client.deleteServiceBinding(serviceKey.getGuid())) + .filter(Optional::isPresent) + .map(Optional::get) + .forEach(this::waitAsyncJobToComplete); + } + + private void waitAsyncJobToComplete(String jobId) { + CloudAsyncJob asyncJob = client.getAsyncJob(jobId); + JobState state = asyncJob.getState(); + while (state == JobState.PROCESSING || state == JobState.POLLING) { + asyncJob = client.getAsyncJob(jobId); + state = asyncJob.getState(); + sleep(TimeUnit.SECONDS, 1); + } + if (state == JobState.FAILED) { + throw new IllegalStateException(MessageFormat.format("Error while polling service key job \"{0}\"", asyncJob.getErrors())); + } + } + + private static void sleep(TimeUnit timeUnit, int value) { + try { + Thread.sleep(timeUnit.toMillis(value)); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + private void configureServiceBroker(List failConfigurations) { + ServiceBrokerConfiguration serviceBrokerConfiguration = ImmutableServiceBrokerConfiguration.builder() + .asyncDurationForServiceCredentialBindingsInMillis(100) + .failConfigurations(failConfigurations) + .build(); + String serviceBrokerUrl = getServiceBrokerUrl(SERVICE_BROKER_ENDPOINT, client.getDefaultDomain() + .getName()); + WebClient.create() + .put() + .uri(serviceBrokerUrl) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .body(BodyInserters.fromValue(serviceBrokerConfiguration)) + .retrieve() + .toBodilessEntity() + .block(); + } + + private void createServiceKeySilently(String serviceInstanceName, String serviceKeyName, Map serviceKeyCredentials) { + try { + createServiceKeySync(serviceInstanceName, serviceKeyName, serviceKeyCredentials); + } catch (Exception e) { + // Do nothing + } + } + + private void createServiceKeySync(String serviceInstanceName, String serviceKeyName, Map serviceKeyCredentials) { + Optional jobId = client.createServiceKey(serviceInstanceName, serviceKeyName, serviceKeyCredentials); + jobId.ifPresent(this::waitAsyncJobToComplete); + } + + private CloudServiceKey findServiceKeyByName(String keyName, List serviceKeys) { + return serviceKeys.stream() + .filter(serviceKey -> keyName.equals(serviceKey.getName())) + .findFirst() + .orElseThrow(() -> new IllegalStateException(MessageFormat.format("Service key with name: \"{0}\" not found!", + keyName))); + } + + private static void pushServiceBrokerApplication(Path brokerPath) throws InterruptedException { + client.createApplication(getServiceBrokerApplicationToCreate()); + CloudPackage cloudPackage = ApplicationUtil.uploadApplication(client, IntegrationTestConstants.SERVICE_BROKER_APP_NAME, brokerPath); + ApplicationUtil.stageApplication(client, IntegrationTestConstants.SERVICE_BROKER_APP_NAME, cloudPackage); + ApplicationUtil.startApplication(client, IntegrationTestConstants.SERVICE_BROKER_APP_NAME); + } + + private static ApplicationToCreateDto getServiceBrokerApplicationToCreate() { + String defaultDomain = client.getDefaultDomain() + .getName(); + Staging staging = ImmutableStaging.builder() + .addBuildpack(IntegrationTestConstants.JAVA_BUILDPACK) + .build(); + Set routes = Set.of(ImmutableCloudRoute.builder() + .host(IntegrationTestConstants.SERVICE_BROKER_HOST) + .domain(ImmutableCloudDomain.builder() + .name(defaultDomain) + .build()) + .url(APPLICATION_HOST + "." + defaultDomain) + .build()); + Map appEnv = getServiceBrokerEnvConfiguration(); + return ImmutableApplicationToCreateDto.builder() + .name(IntegrationTestConstants.SERVICE_BROKER_APP_NAME) + .staging(staging) + .diskQuotaInMb(IntegrationTestConstants.SERVICE_BROKER_DISK_IN_MB) + .memoryInMb(IntegrationTestConstants.SERVICE_BROKER_MEMORY_IN_MB) + .routes(routes) + .env(appEnv) + .build(); + } + + private static Map getServiceBrokerEnvConfiguration() { + URL url = ServicesCloudControllerClientIntegrationTest.class.getResource(IntegrationTestConstants.SERVICE_BROKER_ENV_CONTENT); + String configuration; + try { + configuration = Files.readString(Paths.get(url.toURI())); + } catch (URISyntaxException | IOException e) { + throw new IllegalStateException(e); + } + return JsonUtil.convertJsonToMap(configuration) + .entrySet() + .stream() + .collect(Collectors.toMap(Map.Entry::getKey, + ServicesCloudControllerClientIntegrationTest::convertMapEntryValueToString)); + + } + + private static String convertMapEntryValueToString(Map.Entry entry) { + if (entry.getValue() instanceof String) { + return (String) entry.getValue(); + } + return JsonUtil.convertToJson(entry.getValue(), true); + } + + private static void createServiceBroker(String serviceBrokerName, String serviceBrokerEndpoint) { + String defaultDomain = client.getDefaultDomain() + .getName(); + String targetSpaceGuid = target.getMetadata() + .getGuid() + .toString(); + String jobId = client.createServiceBroker(ImmutableCloudServiceBroker.builder() + .name(serviceBrokerName) + .username(IntegrationTestConstants.SERVICE_BROKER_USERNAME) + .password(IntegrationTestConstants.SERVICE_BROKER_PASSWORD) + .url(getServiceBrokerUrl(serviceBrokerEndpoint, defaultDomain)) + .spaceGuid(targetSpaceGuid) + .build()); + pollServiceBrokerOperation(jobId, serviceBrokerName); + } + + private static String getServiceBrokerUrl(String serviceBrokerEndpoint, String domain) { + return MessageFormat.format("https://{0}.{1}/{2}", IntegrationTestConstants.SERVICE_BROKER_HOST, domain, serviceBrokerEndpoint); + } + + private static void pollServiceBrokerOperation(String jobId, String serviceBrokerName) { + CloudAsyncJob job = client.getAsyncJob(jobId); + while (job.getState() != JobState.COMPLETE && !hasAsyncJobFailed(job)) { + sleep(TimeUnit.SECONDS, 1); + job = client.getAsyncJob(jobId); + } + if (hasAsyncJobFailed(job)) { + fail(MessageFormat.format("Polling async operation of service broker \"{0}\" failed with \"{1}\"", serviceBrokerName, + job.getErrors())); + } + } + + private static boolean hasAsyncJobFailed(CloudAsyncJob job) { + return job.getState() == JobState.FAILED; + } + + private CloudServiceInstance buildUserProvidedService(String serviceName) { + return ImmutableCloudServiceInstance.builder() + .name(serviceName) + .type(ServiceInstanceType.USER_PROVIDED) + .credentials(USER_SERVICE_CREDENTIALS) + .syslogDrainUrl(SYSLOG_DRAIN_URL) + .tags(SERVICE_TAGS) + .build(); + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudApplicationTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudApplicationTest.java new file mode 100644 index 0000000000..514fe959c6 --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudApplicationTest.java @@ -0,0 +1,132 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import java.util.List; +import java.util.Map; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableLifecycle; +import org.cloudfoundry.client.v3.BuildpackData; +import org.cloudfoundry.client.v3.DockerData; +import org.cloudfoundry.client.v3.Lifecycle; +import org.cloudfoundry.client.v3.LifecycleType; +import org.cloudfoundry.client.v3.applications.ApplicationResource; +import org.cloudfoundry.client.v3.applications.ApplicationState; +import org.junit.jupiter.api.Test; + +class RawCloudApplicationTest { + + private static final String STATE = "STARTED"; + private static final String BUILDPACK = "ruby_buildpack"; + private static final String STACK_NAME = "cflinuxfs3"; + private static final String SPACE_NAME = "test"; + private static final CloudSpace SPACE = ImmutableCloudSpace.builder() + .name(SPACE_NAME) + .build(); + private static final String EXPECTED_BUILDPACK = "ruby_buildpack"; + private static final String BUILDPACK_URL = "custom-buildpack-url"; + + private static final String EXPECTED_STACK = "cflinuxfs3"; + private static final CloudApplication.State EXPECTED_STATE = CloudApplication.State.STARTED; + + @Test + void testDeriveForBuildpackApp() { + RawCloudEntityTest.testDerive(buildApplication(buildBuildpackLifecycle()), buildRawApplication(buildBuildpackLifecycleResource())); + } + + @Test + void testDeriveForDockerApp() { + RawCloudEntityTest.testDerive(buildApplication(buildDockerLifecycle()), buildRawApplication(buildDockerLifecycleResource())); + } + + @Test + void testDeriveForCnbApp() { + RawCloudEntityTest.testDerive(buildApplication(buildCnbLifecycle()), buildRawApplication(buildCnbLifecycleResource())); + } + + private static CloudApplication buildApplication(org.cloudfoundry.multiapps.controller.client.facade.domain.Lifecycle lifecycle) { + return ImmutableCloudApplication.builder() + .metadata(RawCloudEntityTest.EXPECTED_METADATA_V3) + .v3Metadata(RawCloudEntityTest.V3_METADATA) + .name(RawCloudEntityTest.NAME) + .state(EXPECTED_STATE) + .lifecycle(lifecycle) + .space(SPACE) + .build(); + } + + private static org.cloudfoundry.multiapps.controller.client.facade.domain.Lifecycle buildBuildpackLifecycle() { + return ImmutableLifecycle.builder() + .type(org.cloudfoundry.multiapps.controller.client.facade.domain.LifecycleType.BUILDPACK) + .data(buildLifecycleData(EXPECTED_BUILDPACK)) + .build(); + } + + private org.cloudfoundry.multiapps.controller.client.facade.domain.Lifecycle buildCnbLifecycle() { + return ImmutableLifecycle.builder() + .type(org.cloudfoundry.multiapps.controller.client.facade.domain.LifecycleType.CNB) + .data(buildLifecycleData(BUILDPACK_URL)) + .build(); + } + + private static org.cloudfoundry.multiapps.controller.client.facade.domain.Lifecycle buildDockerLifecycle() { + return ImmutableLifecycle.builder() + .type(org.cloudfoundry.multiapps.controller.client.facade.domain.LifecycleType.DOCKER) + .data(Map.of()) + .build(); + } + + private static Map buildLifecycleData(String buildpack) { + return Map.of("buildpacks", List.of(buildpack), "stack", EXPECTED_STACK); + } + + private static RawCloudApplication buildRawApplication(Lifecycle lifecycle) { + return ImmutableRawCloudApplication.builder() + .application(buildApplicationResource(lifecycle)) + .space(SPACE) + .build(); + } + + private static ApplicationResource buildApplicationResource(Lifecycle lifecycle) { + return ApplicationResource.builder() + .metadata(RawCloudEntityTest.V3_METADATA) + .createdAt(RawCloudEntityTest.CREATED_AT_STRING) + .updatedAt(RawCloudEntityTest.UPDATED_AT_STRING) + .state(ApplicationState.valueOf(STATE)) + .id(RawCloudEntityTest.GUID.toString()) + .lifecycle(lifecycle) + .name("foo") + .build(); + } + + private static Lifecycle buildBuildpackLifecycleResource() { + return Lifecycle.builder() + .type(LifecycleType.BUILDPACK) + .data(BuildpackData.builder() + .buildpack(BUILDPACK) + .stack(STACK_NAME) + .build()) + .build(); + } + + private Lifecycle buildCnbLifecycleResource() { + return Lifecycle.builder() + .type(LifecycleType.CNB) + .data(BuildpackData.builder() + .buildpack(BUILDPACK_URL) + .stack(STACK_NAME) + .build()) + .build(); + } + + private static Lifecycle buildDockerLifecycleResource() { + return Lifecycle.builder() + .type(LifecycleType.DOCKER) + .data(DockerData.builder() + .build()) + .build(); + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudAsyncJobTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudAsyncJobTest.java new file mode 100644 index 0000000000..1340e590ff --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudAsyncJobTest.java @@ -0,0 +1,82 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import java.util.List; + +import org.cloudfoundry.client.v3.Error; +import org.cloudfoundry.client.v3.jobs.GetJobResponse; +import org.cloudfoundry.client.v3.jobs.Job; +import org.cloudfoundry.client.v3.jobs.JobState; +import org.cloudfoundry.client.v3.jobs.Warning; +import org.junit.jupiter.api.Test; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudAsyncJob; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudAsyncJob; + +class RawCloudAsyncJobTest { + + private static final String OPERATION = "service_broker.delete"; + private static final String WARNING_1 = "warning1"; + private static final String WARNING_2 = "warning2"; + private static final String WARNINGS = "warning1,warning2"; + private static final int ERROR_CODE_1 = 10008; + private static final int ERROR_CODE_2 = 1000; + private static final String ERROR_TITLE_1 = "CF-UnprocessableEntity"; + private static final String ERROR_TITLE_2 = "CF-InvalidAuthToken"; + private static final String ERROR_DETAIL_1 = "something went wrong"; + private static final String ERROR_DETAIL_2 = "not valid token"; + private static final String ERRORS = "10008 CF-UnprocessableEntity something went wrong,1000 CF-InvalidAuthToken not valid token"; + + @Test + void testDerive() { + RawCloudEntityTest.testDerive(buildExpectedTask(), buildRawTask()); + } + + private CloudAsyncJob buildExpectedTask() { + return ImmutableCloudAsyncJob.builder() + .metadata(RawCloudEntityTest.EXPECTED_METADATA_PARSED_FROM_V3_RESOURCE) + .state(JobState.FAILED) + .operation(OPERATION) + .warnings(WARNINGS) + .errors(ERRORS) + .build(); + } + + private RawCloudAsyncJob buildRawTask() { + return ImmutableRawCloudAsyncJob.of(buildTestResource()); + } + + private Job buildTestResource() { + return GetJobResponse.builder() + .id(RawCloudEntityTest.GUID_STRING) + .createdAt(RawCloudEntityTest.CREATED_AT_STRING) + .updatedAt(RawCloudEntityTest.UPDATED_AT_STRING) + .state(JobState.FAILED) + .operation(OPERATION) + .warnings(buildWarnings()) + .errors(buildErrors()) + .build(); + } + + private List buildWarnings() { + return List.of(Warning.builder() + .detail(WARNING_1) + .build(), + Warning.builder() + .detail(WARNING_2) + .build()); + } + + private List buildErrors() { + return List.of(Error.builder() + .code(ERROR_CODE_1) + .title(ERROR_TITLE_1) + .detail(ERROR_DETAIL_1) + .build(), + Error.builder() + .code(ERROR_CODE_2) + .title(ERROR_TITLE_2) + .detail(ERROR_DETAIL_2) + .build()); + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudBuildTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudBuildTest.java new file mode 100644 index 0000000000..c35ec79de0 --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudBuildTest.java @@ -0,0 +1,137 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import java.util.UUID; + +import org.cloudfoundry.client.v3.BuildpackData; +import org.cloudfoundry.client.v3.Lifecycle; +import org.cloudfoundry.client.v3.LifecycleType; +import org.cloudfoundry.client.v3.Relationship; +import org.cloudfoundry.client.v3.builds.Build; +import org.cloudfoundry.client.v3.builds.BuildResource; +import org.cloudfoundry.client.v3.builds.BuildState; +import org.cloudfoundry.client.v3.builds.CreatedBy; +import org.cloudfoundry.client.v3.builds.Droplet; +import org.junit.jupiter.api.Test; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudBuild; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DropletInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudBuild; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableDropletInfo; + +class RawCloudBuildTest { + + private static final String PACKAGE_GUID_STRING = "d0bd1437-f112-48cd-b777-6b160cf2fff0"; + private static final String DROPLET_GUID_STRING = "47e172c9-bfb2-41df-bf3f-850108c241ef"; + private static final Droplet DROPLET = buildTestDroplet(); + private static final String CREATED_BY_GUID_STRING = "37964fd8-a234-4c04-af31-c3fe5e477bed"; + private static final String CREATED_BY_NAME = "admin"; + private static final LifecycleType LIFECYCLE_TYPE = LifecycleType.BUILDPACK; + private static final BuildState STATE = BuildState.FAILED; + private static final String ERROR = "blabla"; + + private static final UUID PACKAGE_GUID = UUID.fromString(PACKAGE_GUID_STRING); + private static final UUID DROPLET_GUID = UUID.fromString(DROPLET_GUID_STRING); + private static final UUID CREATED_BY_GUID = UUID.fromString(CREATED_BY_GUID_STRING); + + private static final CloudBuild.State EXPECTED_STATE = CloudBuild.State.FAILED; + private static final DropletInfo EXPECTED_DROPLET_INFO = buildExpectedDropletInfo(); + + private static CloudBuild buildExpectedBuild() { + return buildExpectedBuild(null); + } + + private static CloudBuild buildExpectedBuild(DropletInfo dropletInfo) { + return ImmutableCloudBuild.builder() + .metadata(RawCloudEntityTest.EXPECTED_METADATA_PARSED_FROM_V3_RESOURCE) + .createdBy(buildExpectedCreatedBy()) + .dropletInfo(dropletInfo) + .packageInfo(buildExpectedPackageInfo()) + .state(EXPECTED_STATE) + .error(ERROR) + .build(); + } + + private static CloudBuild.CreatedBy buildExpectedCreatedBy() { + return ImmutableCloudBuild.ImmutableCreatedBy.builder() + .guid(CREATED_BY_GUID) + .name(CREATED_BY_NAME) + .build(); + } + + private static DropletInfo buildExpectedDropletInfo() { + return ImmutableDropletInfo.builder() + .guid(DROPLET_GUID) + .build(); + } + + private static CloudBuild.PackageInfo buildExpectedPackageInfo() { + return ImmutableCloudBuild.ImmutablePackageInfo.builder() + .guid(PACKAGE_GUID) + .build(); + } + + private static Build buildTestResource(Droplet droplet) { + return BuildResource.builder() + .id(RawCloudEntityTest.GUID_STRING) + .createdAt(RawCloudEntityTest.CREATED_AT_STRING) + .updatedAt(RawCloudEntityTest.UPDATED_AT_STRING) + .inputPackage(buildTestPackage()) + .createdBy(buildTestCreatedBy()) + .lifecycle(buildTestLifecycle()) + .droplet(droplet) + .state(STATE) + .error(ERROR) + .build(); + } + + private static Relationship buildTestPackage() { + return Relationship.builder() + .id(PACKAGE_GUID_STRING) + .build(); + } + + private static Droplet buildTestDroplet() { + return Droplet.builder() + .id(DROPLET_GUID_STRING) + .build(); + } + + private static CreatedBy buildTestCreatedBy() { + return CreatedBy.builder() + .id(CREATED_BY_GUID_STRING) + .name(CREATED_BY_NAME) + .email(CREATED_BY_NAME) + .build(); + } + + private static Lifecycle buildTestLifecycle() { + return Lifecycle.builder() + .data(buildTestLifecycleData()) + .type(LIFECYCLE_TYPE) + .build(); + } + + private static BuildpackData buildTestLifecycleData() { + return BuildpackData.builder() + .build(); + } + + @Test + void testDeriveWithoutDroplet() { + RawCloudEntityTest.testDerive(buildExpectedBuild(), buildRawBuild()); + } + + @Test + void testDerive() { + RawCloudEntityTest.testDerive(buildExpectedBuild(EXPECTED_DROPLET_INFO), buildRawBuild(DROPLET)); + } + + private RawCloudBuild buildRawBuild() { + return buildRawBuild(null); + } + + private RawCloudBuild buildRawBuild(Droplet droplet) { + return ImmutableRawCloudBuild.of(buildTestResource(droplet)); + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudDomainTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudDomainTest.java new file mode 100644 index 0000000000..65fd5a6642 --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudDomainTest.java @@ -0,0 +1,49 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import org.cloudfoundry.client.v3.ToManyRelationship; +import org.cloudfoundry.client.v3.ToOneRelationship; +import org.cloudfoundry.client.v3.domains.Domain; +import org.cloudfoundry.client.v3.domains.DomainRelationships; +import org.cloudfoundry.client.v3.organizations.GetOrganizationDefaultDomainResponse; +import org.junit.jupiter.api.Test; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudDomain; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudDomain; + +class RawCloudDomainTest { + + private static final String DOMAIN_NAME = "example.com"; + + @Test + void testDerive() { + RawCloudEntityTest.testDerive(buildExpectedDomain(), buildRawDomain()); + } + + private static CloudDomain buildExpectedDomain() { + return ImmutableCloudDomain.builder() + .metadata(RawCloudEntityTest.EXPECTED_METADATA_PARSED_FROM_V3_RESOURCE) + .name(DOMAIN_NAME) + .build(); + } + + private static RawCloudDomain buildRawDomain() { + return ImmutableRawCloudDomain.of(buildTestResource()); + } + + private static Domain buildTestResource() { + return GetOrganizationDefaultDomainResponse.builder() + .id(RawCloudEntityTest.GUID_STRING) + .createdAt(RawCloudEntityTest.CREATED_AT_STRING) + .updatedAt(RawCloudEntityTest.UPDATED_AT_STRING) + .name(DOMAIN_NAME) + .isInternal(false) + .relationships(DomainRelationships.builder() + .organization(ToOneRelationship.builder() + .build()) + .sharedOrganizations(ToManyRelationship.builder() + .build()) + .build()) + .build(); + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudEntityTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudEntityTest.java new file mode 100644 index 0000000000..51b1fb5007 --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudEntityTest.java @@ -0,0 +1,151 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import org.cloudfoundry.client.v3.Metadata; +import org.cloudfoundry.client.v3.Relationship; +import org.cloudfoundry.client.v3.ToOneRelationship; +import org.cloudfoundry.client.v3.applications.ApplicationState; +import org.cloudfoundry.client.v3.organizations.Organization; +import org.cloudfoundry.client.v3.organizations.OrganizationResource; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudBuild; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Derivable; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; + +class RawCloudEntityTest { + + static final String GUID_STRING = "3725650a-8725-4401-a949-c68f83d54a86"; + static final String CREATED_AT_STRING = "2017-06-22T13:38:41Z"; + static final String UPDATED_AT_STRING = "2019-03-21T12:29:24Z"; + + static final String NAME = "foo"; + static final UUID GUID = UUID.fromString(GUID_STRING); + static final LocalDateTime CREATED_AT = fromZonedDateTime(ZonedDateTime.of(2017, 6, 22, 13, 38, 41, 0, ZoneId.of("Z"))); + static final LocalDateTime UPDATED_AT = fromZonedDateTime(ZonedDateTime.of(2019, 3, 21, 12, 29, 24, 0, ZoneId.of("Z"))); + static final Map V3_ANNOTATIONS = Map.of("annotation1", "value1", "annotation2", "value2"); + static final Map V3_LABELS = Map.of("label1", "value1", "label2", "value2"); + + static final Metadata V3_METADATA = Metadata.builder() + .annotations(V3_ANNOTATIONS) + .labels(V3_LABELS) + .build(); + + static final CloudMetadata EXPECTED_METADATA_PARSED_FROM_V3_RESOURCE = ImmutableCloudMetadata.builder() + .guid(GUID) + .createdAt(CREATED_AT) + .updatedAt(UPDATED_AT) + .build(); + static final CloudMetadata EXPECTED_METADATA_V3 = ImmutableCloudMetadata.builder() + .guid(GUID) + .createdAt(CREATED_AT) + .updatedAt(UPDATED_AT) + .build(); + + static LocalDateTime fromZonedDateTime(ZonedDateTime dateTime) { + return dateTime.toLocalDateTime(); + } + + @Test + void testParseV3ResourceMetadata() { + Organization resource = OrganizationResource.builder() + .id(GUID_STRING) + .createdAt(CREATED_AT_STRING) + .updatedAt(UPDATED_AT_STRING) + .name(NAME) + .metadata(V3_METADATA) + .build(); + + CloudMetadata metadata = RawCloudEntity.parseResourceMetadata(resource); + assertEquals(EXPECTED_METADATA_PARSED_FROM_V3_RESOURCE, metadata); + } + + @Test + void testParseNullableGuid() { + assertNull(RawCloudEntity.parseNullableGuid(null)); + } + + @Test + void testParseNullableDate() { + assertNull(RawCloudEntity.parseNullableDate(null)); + } + + @Test + void testParseGuid() { + assertEquals(GUID, RawCloudEntity.parseGuid(GUID_STRING)); + } + + @Test + void testParseGuidWithInvalidGuid() { + assertNull(RawCloudEntity.parseGuid("foo")); + } + + @Test + void testParseDateWithInvalidDate() { + assertNull(RawCloudEntity.parseDate("foo")); + } + + @Test + void testParseDateWithInvalidFormat() { + assertNull(RawCloudEntity.parseDate("16.07.2019 15:30:25")); + } + + @Test + void testParseDate() { + assertEquals(CREATED_AT, RawCloudEntity.parseDate(CREATED_AT_STRING)); + } + + @Test + void testParseEnum() { + CloudApplication.State state = RawCloudEntity.parseEnum(ApplicationState.STARTED, CloudApplication.State.class); + assertEquals(CloudApplication.State.STARTED, state); + } + + @Test + void testParseEnumWithIncompatibleEnumTypes() { + Assertions.assertThrows(IllegalArgumentException.class, + () -> RawCloudEntity.parseEnum(ApplicationState.STARTED, CloudBuild.State.class)); + } + + @Test + void testDeriveFromNullable() { + assertEquals(NAME, RawCloudEntity.deriveFromNullable(() -> NAME)); + } + + @Test + void testDeriveFromNullableWithNull() { + assertNull(RawCloudEntity.deriveFromNullable(null)); + } + + @Test + void testDerive() { + List> derivables = Arrays.asList(() -> NAME, () -> GUID_STRING); + assertEquals(Arrays.asList(NAME, GUID_STRING), RawCloudEntity.derive(derivables)); + } + + static void testDerive(T expected, Derivable derivable) { + assertEquals(expected, derivable.derive()); + } + + static ToOneRelationship buildToOneRelationship(String id) { + return ToOneRelationship.builder() + .data(Relationship.builder() + .id(id) + .build()) + .build(); + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudEventTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudEventTest.java new file mode 100644 index 0000000000..2a826d312a --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudEventTest.java @@ -0,0 +1,126 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.UUID; + +import org.cloudfoundry.client.v3.auditevents.AuditEventActor; +import org.cloudfoundry.client.v3.auditevents.AuditEventResource; +import org.cloudfoundry.client.v3.auditevents.AuditEventTarget; +import org.junit.jupiter.api.Test; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudEvent; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudEvent.Participant; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudEvent; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudEvent.ImmutableParticipant; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; + +class RawCloudEventTest { + + private static final String TARGET_GUID_STRING = "b7c57058-afc0-43c9-afee-64019e850bef"; + private static final String TARGET_NAME = "foo"; + private static final String TARGET_TYPE = "app"; + private static final String ACTOR_GUID_STRING = "72c1e48a-9629-4cfe-a64c-f53851d81f61"; + private static final String ACTOR_NAME = "john"; + private static final String ACTOR_TYPE = "user"; + private static final String TIMESTAMP_STRING = "2019-07-03T20:00:46Z"; + private static final String TYPE = "audit.app.create"; + + private static final UUID TARGET_GUID = UUID.fromString(TARGET_GUID_STRING); + private static final UUID ACTOR_GUID = UUID.fromString(ACTOR_GUID_STRING); + private static final LocalDateTime TIMESTAMP = RawCloudEntityTest.fromZonedDateTime(ZonedDateTime.of(2019, 7, 3, 20, 0, 46, 0, + ZoneId.of("Z"))); + + @Test + void testDerive() { + RawCloudEntityTest.testDerive(buildExpectedEvent(), buildRawEvent()); + } + + @Test + void testDeriveWithEmptyResponse() { + RawCloudEntityTest.testDerive(buildEmptyExpectedEvent(), buildEmptyRawEvent()); + } + + private CloudEvent buildExpectedEvent() { + return ImmutableCloudEvent.builder() + .metadata(ImmutableCloudMetadata.builder() + .guid(RawCloudEntityTest.GUID) + .createdAt(TIMESTAMP) + .updatedAt(RawCloudEntityTest.UPDATED_AT) + .build()) + .target(buildExpectedTarget()) + .actor(buildExpectedActor()) + .type(TYPE) + .build(); + } + + private Participant buildExpectedTarget() { + return ImmutableParticipant.builder() + .guid(TARGET_GUID) + .name(TARGET_NAME) + .type(TARGET_TYPE) + .build(); + } + + private Participant buildExpectedActor() { + return ImmutableParticipant.builder() + .guid(ACTOR_GUID) + .name(ACTOR_NAME) + .type(ACTOR_TYPE) + .build(); + } + + private CloudEvent buildEmptyExpectedEvent() { + return ImmutableCloudEvent.builder() + .metadata(ImmutableCloudMetadata.builder() + .guid(RawCloudEntityTest.GUID) + .createdAt(TIMESTAMP) + .updatedAt(RawCloudEntityTest.UPDATED_AT) + .build()) + .target(buildEmptyParticipant()) + .actor(buildEmptyParticipant()) + .build(); + } + + private Participant buildEmptyParticipant() { + return ImmutableParticipant.builder() + .build(); + } + + private RawCloudEvent buildRawEvent() { + return ImmutableRawCloudEvent.of(buildTestResource()); + } + + private AuditEventResource buildTestResource() { + return AuditEventResource.builder() + .id(RawCloudEntityTest.GUID_STRING) + .createdAt(TIMESTAMP_STRING) + .updatedAt(RawCloudEntityTest.UPDATED_AT_STRING) + .type(TYPE) + .auditEventActor(AuditEventActor.builder() + .id(ACTOR_GUID_STRING) + .name(ACTOR_NAME) + .type(ACTOR_TYPE) + .build()) + .auditEventTarget(AuditEventTarget.builder() + .id(TARGET_GUID_STRING) + .type(TARGET_TYPE) + .name(TARGET_NAME) + .build()) + .build(); + } + + private RawCloudEvent buildEmptyRawEvent() { + return ImmutableRawCloudEvent.of(buildEmptyTestResource()); + } + + private AuditEventResource buildEmptyTestResource() { + return AuditEventResource.builder() + .id(RawCloudEntityTest.GUID_STRING) + .createdAt(TIMESTAMP_STRING) + .updatedAt(RawCloudEntityTest.UPDATED_AT_STRING) + .build(); + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudPackageTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudPackageTest.java new file mode 100644 index 0000000000..2f636ea79b --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudPackageTest.java @@ -0,0 +1,113 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import org.cloudfoundry.client.v3.Checksum; +import org.cloudfoundry.client.v3.ChecksumType; +import org.cloudfoundry.client.v3.packages.BitsData; +import org.cloudfoundry.client.v3.packages.DockerData; +import org.cloudfoundry.client.v3.packages.Package; +import org.cloudfoundry.client.v3.packages.PackageData; +import org.cloudfoundry.client.v3.packages.PackageResource; +import org.cloudfoundry.client.v3.packages.PackageState; +import org.cloudfoundry.client.v3.packages.PackageType; +import org.junit.jupiter.api.Test; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableBitsData; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableDockerData; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Status; + +class RawCloudPackageTest { + + private static final PackageState STATE = PackageState.EXPIRED; + private static final String ERROR = "blabla"; + private static final String DOCKER_IMAGE = "cloudfoundry/test"; + private static final ChecksumType CHECKSUM_TYPE = ChecksumType.SHA256; + private static final String CHECKSUM_VALUE = "7251a608605c0f45710f8415bba0d117c90598824697a2a5d00850ea9b179112"; + + private static final Status EXPECTED_STATUS = Status.EXPIRED; + private static final String EXPECTED_CHECKSUM_ALGORITHM = CHECKSUM_TYPE.toString(); + + @Test + void testDeriveWithBitsData() { + RawCloudEntityTest.testDerive(buildExpectedPackage(CloudPackage.Type.BITS), buildRawPackage(PackageType.BITS)); + } + + @Test + void testDeriveWithDockerData() { + RawCloudEntityTest.testDerive(buildExpectedPackage(CloudPackage.Type.DOCKER), buildRawPackage(PackageType.DOCKER)); + } + + private static CloudPackage buildExpectedPackage(CloudPackage.Type type) { + return ImmutableCloudPackage.builder() + .metadata(RawCloudEntityTest.EXPECTED_METADATA_PARSED_FROM_V3_RESOURCE) + .data(buildExpectedData(type)) + .type(type) + .status(EXPECTED_STATUS) + .build(); + } + + private static CloudPackage.PackageData buildExpectedData(CloudPackage.Type type) { + if (type == CloudPackage.Type.DOCKER) { + return ImmutableDockerData.builder() + .image(DOCKER_IMAGE) + .build(); + } + return ImmutableBitsData.builder() + .checksum(buildExpectedChecksum()) + .error(ERROR) + .build(); + } + + private static org.cloudfoundry.multiapps.controller.client.facade.domain.BitsData.Checksum buildExpectedChecksum() { + return ImmutableBitsData.ImmutableChecksum.builder() + .algorithm(EXPECTED_CHECKSUM_ALGORITHM) + .value(CHECKSUM_VALUE) + .build(); + } + + private static RawCloudPackage buildRawPackage(PackageType type) { + return ImmutableRawCloudPackage.builder() + .resource(buildTestResource(type)) + .build(); + } + + private static Package buildTestResource(PackageType type) { + return PackageResource.builder() + .id(RawCloudEntityTest.GUID_STRING) + .createdAt(RawCloudEntityTest.CREATED_AT_STRING) + .updatedAt(RawCloudEntityTest.UPDATED_AT_STRING) + .type(type) + .data(buildTestData(type)) + .state(STATE) + .build(); + } + + private static PackageData buildTestData(PackageType type) { + if (type == PackageType.DOCKER) { + return buildDockerData(); + } + return buildBitsData(); + } + + private static DockerData buildDockerData() { + return DockerData.builder() + .image(DOCKER_IMAGE) + .build(); + } + + private static BitsData buildBitsData() { + return BitsData.builder() + .checksum(buildTestChecksum()) + .error(ERROR) + .build(); + } + + private static Checksum buildTestChecksum() { + return Checksum.builder() + .type(CHECKSUM_TYPE) + .value(CHECKSUM_VALUE) + .build(); + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudRouteTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudRouteTest.java new file mode 100644 index 0000000000..94f19d18d3 --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudRouteTest.java @@ -0,0 +1,107 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import java.util.List; +import java.util.UUID; + +import org.cloudfoundry.client.v3.Relationship; +import org.cloudfoundry.client.v3.ToOneRelationship; +import org.cloudfoundry.client.v3.routes.Application; +import org.cloudfoundry.client.v3.routes.Destination; +import org.cloudfoundry.client.v3.routes.Route; +import org.cloudfoundry.client.v3.routes.RouteRelationships; +import org.cloudfoundry.client.v3.routes.RouteResource; +import org.junit.jupiter.api.Test; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudDomain; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudDomain; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudRoute; + +class RawCloudRouteTest { + + private static final String HOST = "foo"; + private static final String DOMAIN_NAME = "example.com"; + private static final CloudDomain DOMAIN = buildTestDomain(); + private static final Integer APPS_USING_ROUTE = 2; + private static final UUID DESTINATION_1_GUID = UUID.randomUUID(); + private static final UUID APPLICATION_1_GUID = UUID.randomUUID(); + private static final String DESTINATION_1_PROTOCOL = "http2"; + private static final UUID DESTINATION_2_GUID = UUID.randomUUID(); + private static final UUID APPLICATION_2_GUID = UUID.randomUUID(); + private static final String DESTINATION_2_PROTOCOL = "http1"; + private static final List DESTINATIONS = buildTestDestinations(); + + @Test + void testDerive() { + RawCloudEntityTest.testDerive(buildExpectedRoute(), buildRawRoute()); + } + + private static CloudRoute buildExpectedRoute() { + return ImmutableCloudRoute.builder() + .metadata(RawCloudEntityTest.EXPECTED_METADATA_V3) + .host(HOST) + .domain(DOMAIN) + .path("") + .appsUsingRoute(APPS_USING_ROUTE) + .url(HOST + "." + DOMAIN_NAME) + .build(); + } + + private static RawCloudRoute buildRawRoute() { + return ImmutableRawCloudRoute.builder() + .route(buildTestRoute()) + .build(); + } + + private static Route buildTestRoute() { + return RouteResource.builder() + .id(RawCloudEntityTest.GUID_STRING) + .createdAt(RawCloudEntityTest.CREATED_AT_STRING) + .updatedAt(RawCloudEntityTest.UPDATED_AT_STRING) + .relationships(RouteRelationships.builder() + .space(buildToOneRelationship(RawCloudEntityTest.GUID)) + .domain(buildToOneRelationship(RawCloudEntityTest.GUID)) + .build()) + .metadata(RawCloudEntityTest.V3_METADATA) + .host(HOST) + .path("") + .url(HOST + "." + DOMAIN_NAME) + .addAllDestinations(DESTINATIONS) + .build(); + } + + private static CloudDomain buildTestDomain() { + return ImmutableCloudDomain.builder() + .metadata(RawCloudEntityTest.EXPECTED_METADATA_V3) + .name(DOMAIN_NAME) + .build(); + } + + private static List buildTestDestinations() { + return List.of(buildDestination(DESTINATION_1_GUID.toString(), APPLICATION_1_GUID.toString(), DESTINATION_1_PROTOCOL), + buildDestination(DESTINATION_2_GUID.toString(), APPLICATION_2_GUID.toString(), DESTINATION_2_PROTOCOL)); + } + + private static Destination buildDestination(String destinationGuid, String applicationGuid, String protocol) { + return Destination.builder() + .destinationId(destinationGuid) + .application(Application.builder() + .applicationId(applicationGuid) + .build()) + .protocol(protocol) + .build(); + } + + private static ToOneRelationship buildToOneRelationship(UUID guid) { + return ToOneRelationship.builder() + .data(buildRelationship(guid)) + .build(); + } + + private static Relationship buildRelationship(UUID guid) { + return Relationship.builder() + .id(guid.toString()) + .build(); + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceBindingTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceBindingTest.java new file mode 100644 index 0000000000..41d468060a --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceBindingTest.java @@ -0,0 +1,71 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import java.time.LocalDateTime; +import java.util.UUID; + +import org.cloudfoundry.client.v3.LastOperation; +import org.cloudfoundry.client.v3.servicebindings.ServiceBindingRelationships; +import org.cloudfoundry.client.v3.servicebindings.ServiceBindingResource; +import org.cloudfoundry.client.v3.servicebindings.ServiceBindingType; +import org.junit.jupiter.api.Test; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; + +class RawCloudServiceBindingTest { + + private static final String APPLICATION_GUID_STRING = "3725650a-8725-4401-a949-c68f83d54a86"; + private static final String SERVICE_INSTANCE_GUID_STRING = "3725650a-8725-4401-a949-c68f83d54a86"; + private static final UUID APPLICATION_GUID = UUID.fromString(APPLICATION_GUID_STRING); + private static final UUID SERVICE_INSTANCE_GUID = UUID.fromString(SERVICE_INSTANCE_GUID_STRING); + private static final LastOperation LAST_OPERATION = buildLastOperation(); + + @Test + void testDerive() { + RawCloudEntityTest.testDerive(buildExpectedServiceBinding(), buildRawServiceBinding()); + } + + private static CloudServiceBinding buildExpectedServiceBinding() { + return ImmutableCloudServiceBinding.builder() + .metadata(RawCloudEntityTest.EXPECTED_METADATA_V3) + .applicationGuid(APPLICATION_GUID) + .serviceInstanceGuid(SERVICE_INSTANCE_GUID) + .serviceBindingOperation(ServiceCredentialBindingOperation.from(LAST_OPERATION)) + .build(); + } + + private static RawCloudServiceBinding buildRawServiceBinding() { + return ImmutableRawCloudServiceBinding.builder() + .serviceBinding(buildTestResource()) + + .build(); + } + + private static ServiceBindingResource buildTestResource() { + return ServiceBindingResource.builder() + .id(RawCloudEntityTest.GUID_STRING) + .createdAt(RawCloudEntityTest.CREATED_AT_STRING) + .updatedAt(RawCloudEntityTest.UPDATED_AT_STRING) + .type(ServiceBindingType.APPLICATION) + .lastOperation(LAST_OPERATION) + .relationships(ServiceBindingRelationships.builder() + .serviceInstance(RawCloudEntityTest.buildToOneRelationship(SERVICE_INSTANCE_GUID_STRING)) + .application(RawCloudEntityTest.buildToOneRelationship(APPLICATION_GUID_STRING)) + .build()) + .build(); + } + + private static LastOperation buildLastOperation() { + return LastOperation.builder() + .state(ServiceCredentialBindingOperation.State.SUCCEEDED.toString()) + .type(ServiceCredentialBindingOperation.Type.CREATE.toString()) + .createdAt(LocalDateTime.now() + .toString()) + .updatedAt(LocalDateTime.now() + .toString()) + .description("Service binding created") + .build(); + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceBrokerTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceBrokerTest.java new file mode 100644 index 0000000000..c3c9dca252 --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceBrokerTest.java @@ -0,0 +1,55 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import org.cloudfoundry.client.v3.Relationship; +import org.cloudfoundry.client.v3.ToOneRelationship; +import org.cloudfoundry.client.v3.servicebrokers.ServiceBrokerRelationships; +import org.cloudfoundry.client.v3.servicebrokers.ServiceBrokerResource; +import org.junit.jupiter.api.Test; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBroker; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceBroker; + +class RawCloudServiceBrokerTest { + + private static final String NAME = "auditlog-broker"; + private static final String URL = "https://auditlog-broker.example.com"; + private static final String SPACE_GUID_STRING = "ef93547f-74c3-4bad-ba69-b7dc4f212622"; + + @Test + void testDerive() { + RawCloudEntityTest.testDerive(buildExpectedServiceBroker(), buildRawServiceBroker()); + } + + private static CloudServiceBroker buildExpectedServiceBroker() { + return ImmutableCloudServiceBroker.builder() + .metadata(RawCloudEntityTest.EXPECTED_METADATA_PARSED_FROM_V3_RESOURCE) + .name(NAME) + .spaceGuid(SPACE_GUID_STRING) + .url(URL) + .build(); + } + + private static RawCloudServiceBroker buildRawServiceBroker() { + return ImmutableRawCloudServiceBroker.builder() + .serviceBroker(buildTestServiceBroker()) + .build(); + } + + private static ServiceBrokerResource buildTestServiceBroker() { + return ServiceBrokerResource.builder() + .id(RawCloudEntityTest.GUID_STRING) + .createdAt(RawCloudEntityTest.CREATED_AT_STRING) + .updatedAt(RawCloudEntityTest.UPDATED_AT_STRING) + .name(NAME) + .url(URL) + .relationships(ServiceBrokerRelationships.builder() + .space(ToOneRelationship.builder() + .data(Relationship.builder() + .id(SPACE_GUID_STRING) + .build()) + .build()) + .build()) + .build(); + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceInstanceTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceInstanceTest.java new file mode 100644 index 0000000000..9645cca49a --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceInstanceTest.java @@ -0,0 +1,117 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import org.cloudfoundry.client.v3.LastOperation; +import org.cloudfoundry.client.v3.MaintenanceInfo; +import org.cloudfoundry.client.v3.Metadata; +import org.cloudfoundry.client.v3.Relationship; +import org.cloudfoundry.client.v3.ToOneRelationship; +import org.cloudfoundry.client.v3.serviceinstances.ServiceInstanceRelationships; +import org.cloudfoundry.client.v3.serviceinstances.ServiceInstanceResource; +import org.cloudfoundry.client.v3.serviceinstances.ServiceInstanceType; +import org.junit.jupiter.api.Test; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceInstance; + +class RawCloudServiceInstanceTest { + + private static final String SERVICE_INSTANCE_ID = "7cb26016-342d-11ed-a261-0242ac120002"; + private static final String SERVICE_INSTANCE_NAME = "v3-service-instance"; + private static final String DATE = "2022-01-01T13:35:11Z"; + private static final String DASHBOARD_URL = "dashboard-url"; + private static final String LAST_OPERATION_DESCRIPTION = "Last operation has succeeded"; + private static final String LAST_OPERATION_STATE = "succeeded"; + private static final String LAST_OPERATION_TYPE = "create"; + private static final String MAINTENANCE_INFO_DESCRIPTION = "A long time ago"; + private static final String MAINTENANCE_INFO_VERSION = "0.9.9"; + private static final Map METADATA_ANNOTATIONS = Map.of("foo", "bar"); + private static final Map METADATA_LABELS = Map.of("baz", "mop"); + private static final String SPACE_GUID = "5f5a8db4-342c-11ed-a261-0242ac120002"; + private static final String SERVICE_PLAN_GUID = "810a0322-342c-11ed-a261-0242ac120002"; + private static final String ROUTE_SERVICE_URL = "https://route-service-url"; + private static final String SYSLOG_DRAIN_URL = "https://syslog-drain"; + private static final List TAGS = List.of("one", "two", "three"); + private static final ServiceInstanceType SERVICE_INSTANCE_TYPE = ServiceInstanceType.MANAGED; + private static final boolean UPDATE_AVAILABLE = false; + + @Test + void testDerive() { + RawCloudEntityTest.testDerive(buildExpectedServiceInstance(), buildRawServiceInstance()); + } + + private CloudServiceInstance buildExpectedServiceInstance() { + return ImmutableCloudServiceInstance.builder() + .metadata(ImmutableCloudMetadata.builder() + .createdAt(ZonedDateTime.parse(DATE, + DateTimeFormatter.ISO_DATE_TIME) + .toLocalDateTime()) + .updatedAt(ZonedDateTime.parse(DATE, + DateTimeFormatter.ISO_DATE_TIME) + .toLocalDateTime()) + .guid(UUID.fromString(SERVICE_INSTANCE_ID)) + .build()) + .name(SERVICE_INSTANCE_NAME) + .v3Metadata(Metadata.builder() + .annotations(METADATA_ANNOTATIONS) + .labels(METADATA_LABELS) + .build()) + .tags(TAGS) + .build(); + } + + private RawV3CloudServiceInstance buildRawServiceInstance() { + return ImmutableRawV3CloudServiceInstance.builder() + .serviceInstance(buildServiceInstanceResource()) + .build(); + } + + private ServiceInstanceResource buildServiceInstanceResource() { + return ServiceInstanceResource.builder() + .id(SERVICE_INSTANCE_ID) + .name(SERVICE_INSTANCE_NAME) + .createdAt(DATE) + .updatedAt(DATE) + .dashboardUrl(DASHBOARD_URL) + .lastOperation(LastOperation.builder() + .createdAt(DATE) + .description(LAST_OPERATION_DESCRIPTION) + .state(LAST_OPERATION_STATE) + .type(LAST_OPERATION_TYPE) + .updatedAt(DATE) + .build()) + .maintenanceInfo(MaintenanceInfo.builder() + .description(MAINTENANCE_INFO_DESCRIPTION) + .version(MAINTENANCE_INFO_VERSION) + .build()) + .metadata(Metadata.builder() + .annotations(METADATA_ANNOTATIONS) + .labels(METADATA_LABELS) + .build()) + .relationships(ServiceInstanceRelationships.builder() + .space(ToOneRelationship.builder() + .data(Relationship.builder() + .id(SPACE_GUID) + .build()) + .build()) + .servicePlan(ToOneRelationship.builder() + .data(Relationship.builder() + .id(SERVICE_PLAN_GUID) + .build()) + .build()) + .build()) + .routeServiceUrl(ROUTE_SERVICE_URL) + .syslogDrainUrl(SYSLOG_DRAIN_URL) + .tags(TAGS) + .type(SERVICE_INSTANCE_TYPE) + .updateAvailable(UPDATE_AVAILABLE) + .build(); + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceKeyTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceKeyTest.java new file mode 100644 index 0000000000..e8c49dc920 --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceKeyTest.java @@ -0,0 +1,88 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; + +import org.cloudfoundry.client.v3.LastOperation; +import org.cloudfoundry.client.v3.servicebindings.ServiceBindingRelationships; +import org.cloudfoundry.client.v3.servicebindings.ServiceBindingResource; +import org.cloudfoundry.client.v3.servicebindings.ServiceBindingType; +import org.junit.jupiter.api.Test; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; + +class RawCloudServiceKeyTest { + + private static final String SERVICE_NAME = "foo"; + private static final String NAME = "bar"; + private static final Map CREDENTIALS = buildTestCredentials(); + private static final CloudServiceInstance SERVICE_INSTANCE = ImmutableCloudServiceInstance.builder() + .name(SERVICE_NAME) + .build(); + private static final LastOperation LAST_OPERATION = buildLastOperation(); + + @Test + void testDerive() { + RawCloudEntityTest.testDerive(buildExpectedServiceKey(), buildRawServiceKey()); + } + + private static CloudServiceKey buildExpectedServiceKey() { + return ImmutableCloudServiceKey.builder() + .metadata(RawCloudEntityTest.EXPECTED_METADATA_V3) + .v3Metadata(RawCloudEntityTest.V3_METADATA) + .name(NAME) + .credentials(CREDENTIALS) + .serviceInstance(SERVICE_INSTANCE) + .serviceKeyOperation(ServiceCredentialBindingOperation.from(LAST_OPERATION)) + .build(); + } + + private static RawCloudServiceKey buildRawServiceKey() { + return ImmutableRawCloudServiceKey.builder() + .serviceBindingResource(buildTestResource()) + .serviceInstance(SERVICE_INSTANCE) + .credentials(CREDENTIALS) + .build(); + } + + private static ServiceBindingResource buildTestResource() { + return ServiceBindingResource.builder() + .id(RawCloudEntityTest.GUID_STRING) + .createdAt(RawCloudEntityTest.CREATED_AT_STRING) + .updatedAt(RawCloudEntityTest.UPDATED_AT_STRING) + .metadata(RawCloudEntityTest.V3_METADATA) + .name(NAME) + .type(ServiceBindingType.KEY) + .lastOperation(LAST_OPERATION) + .relationships(ServiceBindingRelationships.builder() + .serviceInstance(RawCloudEntityTest.buildToOneRelationship("")) + .build()) + .build(); + } + + private static Map buildTestCredentials() { + Map parameters = new HashMap<>(); + parameters.put("foo", "bar"); + parameters.put("baz", false); + parameters.put("qux", 3.141); + return parameters; + } + + private static LastOperation buildLastOperation() { + return LastOperation.builder() + .state(ServiceCredentialBindingOperation.State.SUCCEEDED.toString()) + .type(ServiceCredentialBindingOperation.Type.CREATE.toString()) + .createdAt(LocalDateTime.now() + .toString()) + .updatedAt(LocalDateTime.now() + .toString()) + .description("Service key created") + .build(); + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceOfferingTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceOfferingTest.java new file mode 100644 index 0000000000..b80fd6d986 --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceOfferingTest.java @@ -0,0 +1,107 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import org.cloudfoundry.client.v3.Relationship; +import org.cloudfoundry.client.v3.ToOneRelationship; +import org.cloudfoundry.client.v3.serviceofferings.BrokerCatalog; +import org.cloudfoundry.client.v3.serviceofferings.Features; +import org.cloudfoundry.client.v3.serviceofferings.ServiceOfferingRelationships; +import org.cloudfoundry.client.v3.serviceofferings.ServiceOfferingResource; +import org.junit.jupiter.api.Test; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceOffering; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServicePlan; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceOffering; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServicePlan; + +public class RawCloudServiceOfferingTest { + + private static final String NAME = "postgresql"; + static final boolean AVAILABLE = true; + static final boolean BINDABLE = true; + static final boolean ALLOW_CONTEXT_UPDATES = false; + static final boolean BINDINGS_RETRIEVABLE = true; + static final boolean INSTANCES_RETRIEVABLE = true; + static final boolean PLAN_UPDATEABLE = false; + static final boolean SHAREABLE = true; + static final String DESCRIPTION = "description"; + static final String DOCUMENTATION_URL = "/documentation"; + static final String UNIQUE_ID = "unique-id"; + static final String SERVICE_BROKER_GUID = UUID.randomUUID() + .toString(); + private static final Map EXTRA = Map.of("key-metadata", "value-metadata"); + private static final List PLANS = buildTestServiceBindings(); + + @Test + void testDerive() { + RawCloudEntityTest.testDerive(buildExpectedServiceOffering(), buildRawServiceOffering()); + } + + private static CloudServiceOffering buildExpectedServiceOffering() { + return ImmutableCloudServiceOffering.builder() + .metadata(RawCloudEntityTest.EXPECTED_METADATA_PARSED_FROM_V3_RESOURCE) + .brokerId(SERVICE_BROKER_GUID) + .name(NAME) + .isAvailable(AVAILABLE) + .isBindable(BINDABLE) + .isShareable(SHAREABLE) + .description(DESCRIPTION) + .extra(EXTRA) + .docUrl(DOCUMENTATION_URL) + .uniqueId(UNIQUE_ID) + .servicePlans(PLANS) + .build(); + } + + private static RawCloudServiceOffering buildRawServiceOffering() { + return ImmutableRawCloudServiceOffering.builder() + .serviceOffering(buildTestServiceOffering()) + .servicePlans(PLANS) + .build(); + } + + public static ServiceOfferingResource buildTestServiceOffering() { + return ServiceOfferingResource.builder() + .id(RawCloudEntityTest.GUID_STRING) + .createdAt(RawCloudEntityTest.CREATED_AT_STRING) + .updatedAt(RawCloudEntityTest.UPDATED_AT_STRING) + .available(AVAILABLE) + .name(NAME) + .brokerCatalog(BrokerCatalog.builder() + .brokerCatalogId(UNIQUE_ID) + .features(Features.builder() + .bindable(BINDABLE) + .allowContextUpdates(ALLOW_CONTEXT_UPDATES) + .bindingsRetrievable(BINDINGS_RETRIEVABLE) + .instancesRetrievable(INSTANCES_RETRIEVABLE) + .planUpdateable(PLAN_UPDATEABLE) + .build()) + .metadata(EXTRA) + .build()) + .relationships(ServiceOfferingRelationships.builder() + .serviceBroker(ToOneRelationship.builder() + .data(Relationship.builder() + .id(SERVICE_BROKER_GUID) + .build()) + .build()) + .build()) + .shareable(SHAREABLE) + .description(DESCRIPTION) + .documentationUrl(DOCUMENTATION_URL) + .build(); + } + + private static List buildTestServiceBindings() { + return List.of(buildTestServiceBinding()); + } + + private static CloudServicePlan buildTestServiceBinding() { + return ImmutableCloudServicePlan.builder() + .name("v9.4-small") + .build(); + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServicePlanTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServicePlanTest.java new file mode 100644 index 0000000000..f43f5e6a6a --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServicePlanTest.java @@ -0,0 +1,92 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import java.util.Map; +import java.util.UUID; + +import org.cloudfoundry.client.v3.Relationship; +import org.cloudfoundry.client.v3.ToOneRelationship; +import org.cloudfoundry.client.v3.serviceplans.BrokerCatalog; +import org.cloudfoundry.client.v3.serviceplans.Features; +import org.cloudfoundry.client.v3.serviceplans.Schema; +import org.cloudfoundry.client.v3.serviceplans.Schemas; +import org.cloudfoundry.client.v3.serviceplans.ServiceInstanceSchema; +import org.cloudfoundry.client.v3.serviceplans.ServicePlan; +import org.cloudfoundry.client.v3.serviceplans.ServicePlanRelationships; +import org.cloudfoundry.client.v3.serviceplans.ServicePlanResource; +import org.cloudfoundry.client.v3.serviceplans.Visibility; +import org.junit.jupiter.api.Test; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServicePlan; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServicePlan; + +public class RawCloudServicePlanTest { + + private static final String NAME = "v9.4-small"; + private static final String DESCRIPTION = "description"; + private static final Map EXTRA = Map.of("extra", "value"); + private static final String UNIQUE_ID = "unique-id"; + private static final boolean PUBLIC = true; + private static final boolean FREE = false; + private static final boolean PLAN_BINDABLE = true; + private static final boolean PLAN_UPDATABLE = true; + private static final boolean AVAILABLE = true; + private static final String SERVICE_OFFERING_ID = UUID.randomUUID() + .toString(); + + @Test + void testDerive() { + RawCloudEntityTest.testDerive(buildExpectedPlan(), buildRawServicePlan()); + } + + private static CloudServicePlan buildExpectedPlan() { + return ImmutableCloudServicePlan.builder() + .metadata(RawCloudEntityTest.EXPECTED_METADATA_PARSED_FROM_V3_RESOURCE) + .name(NAME) + .description(DESCRIPTION) + .extra(EXTRA) + .uniqueId(UNIQUE_ID) + .isPublic(PUBLIC) + .isFree(FREE) + .serviceOfferingId(SERVICE_OFFERING_ID) + .build(); + } + + private static RawCloudServicePlan buildRawServicePlan() { + return ImmutableRawCloudServicePlan.of(buildTestServicePlan(NAME)); + } + + public static ServicePlan buildTestServicePlan(String planName) { + return ServicePlanResource.builder() + .id(RawCloudEntityTest.GUID_STRING) + .createdAt(RawCloudEntityTest.CREATED_AT_STRING) + .updatedAt(RawCloudEntityTest.UPDATED_AT_STRING) + .available(AVAILABLE) + .name(planName) + .description(DESCRIPTION) + .brokerCatalog(BrokerCatalog.builder() + .metadata(EXTRA) + .brokerCatalogId(UNIQUE_ID) + .features(Features.builder() + .bindable(PLAN_BINDABLE) + .planUpdateable(PLAN_UPDATABLE) + .build()) + .build()) + .visibilityType(Visibility.PUBLIC) + .free(FREE) + .relationships(ServicePlanRelationships.builder() + .serviceOffering(ToOneRelationship.builder() + .data(Relationship.builder() + .id(SERVICE_OFFERING_ID) + .build()) + .build()) + .build()) + .schemas(Schemas.builder() + .serviceInstance(ServiceInstanceSchema.builder() + .create(Schema.builder() + .build()) + .build()) + .build()) + .build(); + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceTest.java new file mode 100644 index 0000000000..8a4fec8ef0 --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudServiceTest.java @@ -0,0 +1,130 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import java.util.Arrays; +import java.util.List; + +import org.cloudfoundry.client.v3.LastOperation; +import org.cloudfoundry.client.v3.Relationship; +import org.cloudfoundry.client.v3.ToOneRelationship; +import org.cloudfoundry.client.v3.serviceinstances.ServiceInstanceResource; +import org.cloudfoundry.client.v3.serviceinstances.ServiceInstanceType; +import org.cloudfoundry.client.v3.serviceofferings.BrokerCatalog; +import org.cloudfoundry.client.v3.serviceofferings.Features; +import org.cloudfoundry.client.v3.serviceofferings.ServiceOfferingRelationships; +import org.cloudfoundry.client.v3.serviceofferings.ServiceOfferingResource; +import org.junit.jupiter.api.Test; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation.State; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation.Type; + +class RawCloudServiceTest { + + private static final String NAME = "my-db"; + private static final String OFFERING_NAME = "postgresql"; + private static final String PLAN_NAME = "v9.4-small"; + private static final List TAGS = Arrays.asList("test-tag-1", "test-tag-2"); + private static final String LAST_OPERATION_TYPE_CREATE = "create"; + private static final String LAST_OPERATION_STATE_IN_PROGRESS = "in progress"; + private static final String LAST_OPERATION_STATE_SUCCEEDED = "succeeded"; + + @Test + void testDerive() { + RawCloudEntityTest.testDerive(buildExpectedService(), buildRawService()); + } + + @Test + void testDeriveWithUserProvidedService() { + RawCloudEntityTest.testDerive(buildExpectedUserProvidedService(), buildRawUserProvidedService()); + } + + private static CloudServiceInstance buildExpectedService() { + return ImmutableCloudServiceInstance.builder() + .metadata(RawCloudEntityTest.EXPECTED_METADATA_PARSED_FROM_V3_RESOURCE) + .name(NAME) + .plan(PLAN_NAME) + .label(OFFERING_NAME) + .type(ServiceInstanceType.MANAGED) + .tags(TAGS) + .lastOperation(new ServiceOperation(Type.CREATE, "", State.IN_PROGRESS)) + .build(); + } + + private static CloudServiceInstance buildExpectedUserProvidedService() { + return ImmutableCloudServiceInstance.builder() + .metadata(RawCloudEntityTest.EXPECTED_METADATA_PARSED_FROM_V3_RESOURCE) + .name(NAME) + .type(ServiceInstanceType.USER_PROVIDED) + .tags(TAGS) + .lastOperation(new ServiceOperation(Type.CREATE, "", State.SUCCEEDED)) + .build(); + } + + private static RawCloudServiceInstance buildRawService() { + return ImmutableRawCloudServiceInstance.builder() + .resource(buildTestResource(false, LastOperation.builder() + .type(LAST_OPERATION_TYPE_CREATE) + .state(LAST_OPERATION_STATE_IN_PROGRESS) + .build())) + .servicePlan(RawCloudServicePlanTest.buildTestServicePlan(PLAN_NAME)) + .serviceOffering(buildTestServiceOffering()) + .build(); + } + + private static RawCloudServiceInstance buildRawUserProvidedService() { + return ImmutableRawCloudServiceInstance.builder() + .resource(buildTestResource(true, LastOperation.builder() + .type(LAST_OPERATION_TYPE_CREATE) + .state(LAST_OPERATION_STATE_SUCCEEDED) + .build())) + .build(); + } + + private static ServiceInstanceResource buildTestResource(boolean isUserProvided, LastOperation lastOperation) { + ServiceInstanceResource.Builder serviceInstanceResourceBuilder = ServiceInstanceResource.builder() + .id(RawCloudEntityTest.GUID_STRING) + .createdAt(RawCloudEntityTest.CREATED_AT_STRING) + .updatedAt(RawCloudEntityTest.UPDATED_AT_STRING) + .name(NAME) + .type(ServiceInstanceType.MANAGED) + .addAllTags(TAGS) + .lastOperation(lastOperation); + if (isUserProvided) { + serviceInstanceResourceBuilder.type(ServiceInstanceType.USER_PROVIDED); + } + return serviceInstanceResourceBuilder.build(); + } + + private static ServiceOfferingResource buildTestServiceOffering() { + return ServiceOfferingResource.builder() + .id(RawCloudEntityTest.GUID_STRING) + .createdAt(RawCloudEntityTest.CREATED_AT_STRING) + .updatedAt(RawCloudEntityTest.UPDATED_AT_STRING) + .available(RawCloudServiceOfferingTest.AVAILABLE) + .name(OFFERING_NAME) + .brokerCatalog(BrokerCatalog.builder() + .brokerCatalogId(RawCloudServiceOfferingTest.UNIQUE_ID) + .features(Features.builder() + .bindable(RawCloudServiceOfferingTest.BINDABLE) + .allowContextUpdates(RawCloudServiceOfferingTest.ALLOW_CONTEXT_UPDATES) + .bindingsRetrievable(RawCloudServiceOfferingTest.BINDINGS_RETRIEVABLE) + .instancesRetrievable(RawCloudServiceOfferingTest.INSTANCES_RETRIEVABLE) + .planUpdateable(RawCloudServiceOfferingTest.PLAN_UPDATEABLE) + .build()) + .build()) + .relationships(ServiceOfferingRelationships.builder() + .serviceBroker(ToOneRelationship.builder() + .data(Relationship.builder() + .id(RawCloudServiceOfferingTest.SERVICE_BROKER_GUID) + .build()) + .build()) + .build()) + .shareable(RawCloudServiceOfferingTest.SHAREABLE) + .description(RawCloudServiceOfferingTest.DESCRIPTION) + .documentationUrl(RawCloudServiceOfferingTest.DOCUMENTATION_URL) + .build(); + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudStackTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudStackTest.java new file mode 100644 index 0000000000..ac4da5f8b2 --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudStackTest.java @@ -0,0 +1,40 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import org.cloudfoundry.client.v3.stacks.Stack; +import org.cloudfoundry.client.v3.stacks.StackResource; +import org.junit.jupiter.api.Test; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudStack; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudStack; + +class RawCloudStackTest { + + private static final String NAME = "cflinuxfs3"; + + @Test + void testDerive() { + RawCloudEntityTest.testDerive(buildExpectedStack(), buildRawStack()); + } + + private static CloudStack buildExpectedStack() { + return ImmutableCloudStack.builder() + .metadata(RawCloudEntityTest.EXPECTED_METADATA_V3) + .name(NAME) + .build(); + } + + private static RawCloudStack buildRawStack() { + return ImmutableRawCloudStack.of(buildTestResource()); + } + + private static Stack buildTestResource() { + return StackResource.builder() + .id(RawCloudEntityTest.GUID_STRING) + .createdAt(RawCloudEntityTest.CREATED_AT_STRING) + .updatedAt(RawCloudEntityTest.UPDATED_AT_STRING) + .metadata(RawCloudEntityTest.V3_METADATA) + .name(NAME) + .build(); + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudTaskTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudTaskTest.java new file mode 100644 index 0000000000..9d69a9da4c --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudTaskTest.java @@ -0,0 +1,72 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import org.cloudfoundry.client.v3.tasks.Result; +import org.cloudfoundry.client.v3.tasks.Task; +import org.cloudfoundry.client.v3.tasks.TaskResource; +import org.cloudfoundry.client.v3.tasks.TaskState; +import org.junit.jupiter.api.Test; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudTask; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudTask; + +class RawCloudTaskTest { + + private static final String NAME = "echo"; + private static final String COMMAND = "echo \"Hello!\""; + private static final int DISK_IN_MB = 128; + private static final int MEMORY_IN_MB = 256; + private static final String FAILURE_REASON = "blabla"; + private static final String DROPLET_ID = "8ff24465-823b-4a55-85ee-a680f2c743cd"; + private static final int SEQUENCE_ID = 3; + private static final TaskState STATE = TaskState.FAILED; + + private static final CloudTask.State EXPECTED_STATE = CloudTask.State.FAILED; + + @Test + void testDerive() { + RawCloudEntityTest.testDerive(buildExpectedTask(), buildRawTask()); + } + + private static CloudTask buildExpectedTask() { + return ImmutableCloudTask.builder() + .metadata(RawCloudEntityTest.EXPECTED_METADATA_PARSED_FROM_V3_RESOURCE) + .name(NAME) + .command(COMMAND) + .limits(ImmutableCloudTask.ImmutableLimits.builder() + .disk(DISK_IN_MB) + .memory(MEMORY_IN_MB) + .build()) + .result(ImmutableCloudTask.ImmutableResult.builder() + .failureReason(FAILURE_REASON) + .build()) + .state(EXPECTED_STATE) + .build(); + } + + private static RawCloudTask buildRawTask() { + return ImmutableRawCloudTask.of(buildTestResource()); + } + + private static Task buildTestResource() { + return TaskResource.builder() + .id(RawCloudEntityTest.GUID_STRING) + .createdAt(RawCloudEntityTest.CREATED_AT_STRING) + .updatedAt(RawCloudEntityTest.UPDATED_AT_STRING) + .name(NAME) + .command(COMMAND) + .diskInMb(DISK_IN_MB) + .memoryInMb(MEMORY_IN_MB) + .state(STATE) + .result(buildTestResult()) + .dropletId(DROPLET_ID) + .sequenceId(SEQUENCE_ID) + .build(); + } + + private static Result buildTestResult() { + return Result.builder() + .failureReason(FAILURE_REASON) + .build(); + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawInstancesInfoTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawInstancesInfoTest.java new file mode 100644 index 0000000000..6e7c0c4670 --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawInstancesInfoTest.java @@ -0,0 +1,51 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import org.cloudfoundry.client.v3.applications.GetApplicationProcessStatisticsResponse; +import org.cloudfoundry.client.v3.processes.ProcessState; +import org.cloudfoundry.client.v3.processes.ProcessStatisticsResource; +import org.junit.jupiter.api.Test; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableInstanceInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableInstancesInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstanceState; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstancesInfo; + +class RawInstancesInfoTest { + + @Test + void testDerive() { + RawCloudEntityTest.testDerive(buildExpectedInstancesInfo(), buildActualInstancesInfo()); + } + + private InstancesInfo buildExpectedInstancesInfo() { + return ImmutableInstancesInfo.builder() + .addInstance(ImmutableInstanceInfo.builder() + .index(0) + .state(InstanceState.RUNNING) + .build()) + .build(); + } + + private RawInstancesInfo buildActualInstancesInfo() { + return ImmutableRawInstancesInfo.builder() + .processStatisticsResponse(getApplicationProcessStatisticsResponse()) + .build(); + } + + private GetApplicationProcessStatisticsResponse getApplicationProcessStatisticsResponse() { + return GetApplicationProcessStatisticsResponse.builder() + .resource(ProcessStatisticsResource.builder() + .index(0) + .details("Instance is in running state") + .diskQuota(1024L) + .state(ProcessState.RUNNING) + .memoryQuota(1024L) + .type("web") + .uptime(9042L) + .fileDescriptorQuota(1024L) + .host("10.244.16.10") + .build()) + .build(); + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawUserRoleTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawUserRoleTest.java new file mode 100644 index 0000000000..bc650d4603 --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawUserRoleTest.java @@ -0,0 +1,49 @@ +package org.cloudfoundry.multiapps.controller.client.facade.adapters; + +import org.cloudfoundry.client.v3.Relationship; +import org.cloudfoundry.client.v3.ToOneRelationship; +import org.cloudfoundry.client.v3.roles.RoleRelationships; +import org.cloudfoundry.client.v3.roles.RoleResource; +import org.cloudfoundry.client.v3.roles.RoleType; +import org.junit.jupiter.api.Test; + +import org.cloudfoundry.multiapps.controller.client.facade.domain.UserRole; + +class RawUserRoleTest { + + private static final String USER_ROLE_GUID = "c94b4588-3431-11ed-a261-0242ac120002"; + private static final String USER_GUID = "328eaf4e-3432-11ed-a261-0242ac120002"; + private static final String DATE = "2022-01-01T13:35:11Z"; + private static final RoleType USER_ROLE_TYPE = RoleType.SPACE_DEVELOPER; + + @Test + void testDerive() { + RawCloudEntityTest.testDerive(buildExpectedUserRole(), buildActualUserRole()); + } + + private UserRole buildExpectedUserRole() { + return UserRole.SPACE_DEVELOPER; + } + + private RawUserRole buildActualUserRole() { + return ImmutableRawUserRole.builder() + .roleResource(buildRoleResource()) + .build(); + } + + private RoleResource buildRoleResource() { + return RoleResource.builder() + .createdAt(DATE) + .id(USER_ROLE_GUID) + .type(USER_ROLE_TYPE) + .relationships(RoleRelationships.builder() + .user(ToOneRelationship.builder() + .data(Relationship.builder() + .id(USER_GUID) + .build()) + .build()) + .build()) + .build(); + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/broker/FailConfiguration.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/broker/FailConfiguration.java new file mode 100644 index 0000000000..fd7e2cdf75 --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/broker/FailConfiguration.java @@ -0,0 +1,31 @@ +package org.cloudfoundry.multiapps.controller.client.facade.broker; + +import java.util.List; +import java.util.UUID; + +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +@Value.Immutable +@JsonSerialize(as = ImmutableFailConfiguration.class) +@JsonDeserialize(as = ImmutableFailConfiguration.class) +public interface FailConfiguration { + + Integer getStatus(); + + String getOperationType(); + + List getInstanceIds(); + + enum OperationType { + CREATE, UPDATE, DELETE, BIND, UNBIND, CREATE_SERVICE_KEY, DELETE_SERVICE_KEY; + + @Override + public String toString() { + return name().toLowerCase(); + } + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/broker/ServiceBrokerConfiguration.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/broker/ServiceBrokerConfiguration.java new file mode 100644 index 0000000000..0b7877eeef --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/broker/ServiceBrokerConfiguration.java @@ -0,0 +1,35 @@ +package org.cloudfoundry.multiapps.controller.client.facade.broker; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonProperty; +import org.immutables.value.Value; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; + +@Value.Immutable +@JsonSerialize(as = ImmutableServiceBrokerConfiguration.class) +@JsonDeserialize(as = ImmutableServiceBrokerConfiguration.class) +public interface ServiceBrokerConfiguration { + + @Nullable + @JsonProperty("asyncDuration") + Integer getAsyncDurationInMillis(); + + @Nullable + @JsonProperty("syncDuration") + Integer getSyncDurationInMillis(); + + @Nullable + @JsonProperty("asyncDurationForServiceCredentialBindings") + Integer getAsyncDurationForServiceCredentialBindingsInMillis(); + + @Nullable + @JsonProperty("syncDurationForServiceCredentialBindings") + Integer getSyncDurationForServiceCredentialBindingsInMillis(); + + List getFailConfigurations(); + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/oauth2/TokenFactoryTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/oauth2/TokenFactoryTest.java new file mode 100644 index 0000000000..66ef26a0be --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/oauth2/TokenFactoryTest.java @@ -0,0 +1,86 @@ +package org.cloudfoundry.multiapps.controller.client.facade.oauth2; + +import static org.cloudfoundry.multiapps.controller.client.facade.oauth2.TokenFactory.CLIENT_ID; +import static org.cloudfoundry.multiapps.controller.client.facade.oauth2.TokenFactory.USER_ID; +import static org.cloudfoundry.multiapps.controller.client.facade.oauth2.TokenFactory.USER_NAME; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Stream; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class TokenFactoryTest { + + private final TokenFactory tokenFactory = new TokenFactory(); + + public static Stream testCreateToken() { + return Stream.of( +// @formatter:off + // (0) Valid token: + Arguments.of("eyJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI2MTkyM2FkYi1iYjViLTQ4NTktODIzNy0yM2YxNzg5ZTJmOTAiLCJzdWIiOiIxNTUxODQiLCJzY29wZSI6WyJjbG91ZF9jb250cm9sbGVyLnJlYWQiLCJjbG91ZF9jb250cm9sbGVyLndyaXRlIiwiY2xvdWRfY29udHJvbGxlci5hZG1pbiIsInVhYS51c2VyIl0sImNsaWVudF9pZCI6ImNmIiwiY2lkIjoiY2YiLCJhenAiOiJjZiIsImdyYW50X3R5cGUiOiJwYXNzd29yZCIsInVzZXJfaWQiOiIxNTUxODQiLCJ1c2VyX25hbWUiOiJYU01BU1RFUiIsImVtYWlsIjoiWFNNQVNURVJAdW5rbm93biIsImZhbWlseV9uYW1lIjoiWFNNQVNURVIiLCJpYXQiOjE0NDc3NDUzMjgsImV4cCI6MTQ0Nzc4ODUyOCwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3VhYS9vYXV0aC90b2tlbiIsInppZCI6InVhYSIsImF1ZCI6WyJjbG91ZF9jb250cm9sbGVyIiwiY2YiLCJ1YWEiXX0.P9XJTA4AV5aHS_ozw5WZXgIPc3M9Q_-1oKc1tLDEC5lkx1vNZjd5ozGaZs8UvgECJ_sTY_ZL2izDAKc3ew8hv9y6i6O3V-BxAs9pxkAIo2GPVmHzZQg8t6iG6c-iz1JnMan9nnbjFmMve5qjl9dgoCat-VaWfIW7TRagQ05dNO8DXJkQiiRioQ5kzoxQV4jUgxk5tczix-s8VQfqobW472A4t087DnaCYOOdz9MF8WLoffWRX8BkYJnBgVJ0kcWPZwMuB9BBPC4Les2NiZaKpLDahPrmp340izGg9pUhUsjPbllAph5odhMDb1Lc8_Q-yKiEt-DwZ72-VkCZE-MPjQ", + Map.of(CLIENT_ID, "cf", USER_ID, "155184", USER_NAME, "XSMASTER")), + // (1) Valid token, the body of which cannot be parsed with the standard base 64 decoder (a base 64 URL decoder must be used for this one): + Arguments.of("eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIzZmEyMGRjMzAwY2Y0ZDg2ODU4NWVjYzFhZGQyOWJlNyIsImV4dF9hdHRyIjp7ImVuaGFuY2VyIjoiWFNVQUEifSwic3ViIjoiMTQxMzIxMzI3Iiwic2NvcGUiOlsiY2xvdWRfY29udHJvbGxlci5yZWFkIiwiY2xvdWRfY29udHJvbGxlci53cml0ZSIsIm9wZW5pZCIsInhzX3VzZXIucmVhZCIsImNsb3VkX2NvbnRyb2xsZXIuYWRtaW4iLCJ1YWEudXNlciJdLCJjbGllbnRfaWQiOiJjZiIsImNpZCI6ImNmIiwiYXpwIjoiY2YiLCJyZXZvY2FibGUiOnRydWUsImdyYW50X3R5cGUiOiJwYXNzd29yZCIsInVzZXJfaWQiOiIxNDEzMjEzMjciLCJvcmlnaW4iOiJ1YWEiLCJ1c2VyX25hbWUiOiJYU0FfQURNSU4iLCJlbWFpbCI6IlhTQV9BRE1JTkB1bmtub3duIiwicmV2X3NpZyI6ImU2MDQyZGFhIiwiaWF0IjoxNTIxMzgwNjI1LCJleHAiOjE1MjE0MjM4MjUsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC91YWEvb2F1dGgvdG9rZW4iLCJ6aWQiOiJ1YWEiLCJoZGIubmFtZWR1c2VyLnNhbWwiOiI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz48c2FtbDI6QXNzZXJ0aW9uIHhtbG5zOnNhbWwyPVwidXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvblwiIElEPVwiX2Q5YjgxNWQ1LTNlMTYtNDU1Mi1iMjQwLTAyNmE2OGUwZTMzMlwiIElzc3VlSW5zdGFudD1cIjIwMTgtMDMtMTVUMTY6MTE6MjkuNzQxWlwiIFZlcnNpb249XCIyLjBcIj48c2FtbDI6SXNzdWVyPkNBRC1zYW1sPC9zYW1sMjpJc3N1ZXI-PGRzOlNpZ25hdHVyZSB4bWxuczpkcz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNcIj48ZHM6U2lnbmVkSW5mbz48ZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biNcIi8-PGRzOlNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjcnNhLXNoYTFcIi8-PGRzOlJlZmVyZW5jZSBVUkk9XCIjX2Q5YjgxNWQ1LTNlMTYtNDU1Mi1iMjQwLTAyNmE2OGUwZTMzMlwiPjxkczpUcmFuc2Zvcm1zPjxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmVcIi8-PGRzOlRyYW5zZm9ybSBBbGdvcml0aG09XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biNcIi8-PC9kczpUcmFuc2Zvcm1zPjxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTFcIi8-PGRzOkRpZ2VzdFZhbHVlPlFKVG1obnJXMDY3Z3VDbWJmMTdXc1lYaCtKUT08L2RzOkRpZ2VzdFZhbHVlPjwvZHM6UmVmZXJlbmNlPjwvZHM6U2lnbmVkSW5mbz48ZHM6U2lnbmF0dXJlVmFsdWU-TzhxaDZZaWluUkhldUZkZk1qVkg0VVBlTzc5MWs2bmRrSU9wN2JQRkhnQVB0MWVpeGFGN2dTYnFMV2FmV2d5OHIrSUhlZTZmZXZjQkdMSzRMUGxPSjRmcTR3NFNsWVlzVDZBWGRKMyswZUxEQnR2QjRYN3B0MDRYMVR2UThUelVWSlovQmdLQ2huSEl4RlRocGJ6VXRINmpzQ2d1anoyaW1yenB0S083Z0JnRWplNUF6Lzg4OUJCZ29mZTRiTytJRk9hU3h2VnlKZWZJTDZSS1AzNVd6MFpOdzBqdEVNemtScEh3eFpKcVJtRjJ3Ym11YUk2ZDBNMXVVR09MVjhzUVkvdjZLbUw4U0JjZmZNZ2hDaUNFZDd6VHZqa2ZnVzBDU2xZVzFSV0ZvOURLaUFqeEt6NUtnMDliaCtZOENOaGViNFp4d09hNCtjd2d0eWVQUy9aWUZBPT08L2RzOlNpZ25hdHVyZVZhbHVlPjwvZHM6U2lnbmF0dXJlPjxzYW1sMjpTdWJqZWN0PjxzYW1sMjpOYW1lSUQgRm9ybWF0PVwidXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6MS4xOm5hbWVpZC1mb3JtYXQ6dW5zcGVjaWZpZWRcIj5YU0FfQURNSU48L3NhbWwyOk5hbWVJRD48c2FtbDI6U3ViamVjdENvbmZpcm1hdGlvbiBNZXRob2Q9XCJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6Y206YmVhcmVyXCI-PHNhbWwyOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj1cIjIwMTgtMDMtMTVUMjA6MTY6MjkuNzQxWlwiLz48L3NhbWwyOlN1YmplY3RDb25maXJtYXRpb24-PC9zYW1sMjpTdWJqZWN0PjxzYW1sMjpDb25kaXRpb25zIE5vdEJlZm9yZT1cIjIwMTgtMDMtMTVUMTY6MTE6MjkuNzQxWlwiIE5vdE9uT3JBZnRlcj1cIjIwMTgtMDMtMTVUMjA6MTY6MjkuNzQxWlwiLz48c2FtbDI6QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PVwiMjAxOC0wMy0xNVQxNjoxNjoyOS43NDFaXCIgU2Vzc2lvbk5vdE9uT3JBZnRlcj1cIjIwMTgtMDMtMTVUMTY6MjE6MjkuNzQxWlwiPjxzYW1sMjpBdXRobkNvbnRleHQ-PHNhbWwyOkF1dGhuQ29udGV4dENsYXNzUmVmPnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2VzOlBhc3N3b3JkPC9zYW1sMjpBdXRobkNvbnRleHRDbGFzc1JlZj48L3NhbWwyOkF1dGhuQ29udGV4dD48L3NhbWwyOkF1dGhuU3RhdGVtZW50Pjwvc2FtbDI6QXNzZXJ0aW9uPiIsImF1ZCI6WyJjbG91ZF9jb250cm9sbGVyIiwiY2YiLCJ1YWEiLCJ4c191c2VyIiwib3BlbmlkIl19.oCKdh2rOQ0CjlBV7D-aSsB2JQ20JMRyT4zmHc2iJDwAviCHvFx1_zdWHtH-XO67D78ElLriks3fKBnbcsLU_OlesF_1HbdE8IcQp0Wsmtc-ZvYQaGaEDkCC8iMx0ibGGEdWa264eejo2xbsNh0enDtL9SQZAfZkfDnhywpsrtJEQTgziQKFxR-AAzRQAX9H5esxI4KqWIMTveTp9rne-XH3bA70CCRH_3xiOvVaQ06tGjap6zkZTHrqFUXZvnTqK1fiJOzjeYLcyBYvd4C6gyiRyYOjyaMZlbj8SK3wZItQpCwPO40Yn7E5aOZdZpapEZ6qZ4rlptnT1WSx5-ZekYA", + Map.of(CLIENT_ID, "cf", USER_ID, "141321327", USER_NAME, "XSA_ADMIN")), + // (2) Token that contains only the user's name: + Arguments.of("eyJhbGciOiJSUzI1NiJ9.eyJ1c2VyX25hbWUiOiJ0ZXN0LXVzZXIifQ==.P9XJTA4AV5aHS_ozw5WZXgIPc3M9Q_-1oKc1tLDEC5lkx1vNZjd5ozGaZs8UvgECJ_sTY_ZL2izDAKc3ew8hv9y6i6O3V-BxAs9pxkAIo2GPVmHzZQg8t6iG6c-iz1JnMan9nnbjFmMve5qjl9dgoCat-VaWfIW7TRagQ05dNO8DXJkQiiRioQ5kzoxQV4jUgxk5tczix-s8VQfqobW472A4t087DnaCYOOdz9MF8WLoffWRX8BkYJnBgVJ0kcWPZwMuB9BBPC4Les2NiZaKpLDahPrmp340izGg9pUhUsjPbllAph5odhMDb1Lc8_Q-yKiEt-DwZ72-VkCZE-MPjQ", + Collections.emptyMap()), + // (3) Token without a signature: + Arguments.of("eyJhbGciOiJSUzI1NiJ9.eyJ1c2VyX25hbWUiOiJ0ZXN0LXVzZXIifQ==", + Collections.emptyMap()) +// @formatter:on + ); + } + + @ParameterizedTest + @MethodSource + void testCreateToken(String tokenString, Map expectedTokenProperties) { + if (expectedTokenProperties.isEmpty()) { + Exception exception = assertThrows(IllegalStateException.class, () -> tokenFactory.createToken(tokenString)); + assertEquals("One or more of the following elements are missing from the token: \"[scope, exp, iat]\"", exception.getMessage()); + return; + } + OAuth2AccessTokenWithAdditionalInfo token = tokenFactory.createToken(tokenString); + validateToken(token, expectedTokenProperties); + } + + public static Stream testAdditionalInfoToken() { + return Stream.of( +// @formatter:off + // (0) Include exchangeToken: + Arguments.of("aRh98oYD80teGrkjDFzg3ln55EV3O96y", + Map.of("exchangedToken", "a25723f22ac754f792c50f07623dzd75", "scope", List.of("controller.read"), "exp", 999, "iat", 100)), + // (1) Missing exchangedToken: + Arguments.of("aRh98oYD80teGrkjDFzg3ln55EV3O96y", + Map.of("scope", List.of("controller.read"), "exp", 999, "iat", 100)) +// @formatter:on + ); + } + + @ParameterizedTest + @MethodSource + void testAdditionalInfoToken(String tokenString, Map tokenInfo) { + OAuth2AccessTokenWithAdditionalInfo token = tokenFactory.createToken(tokenString, tokenInfo); + validateTokenAdditionalInfo(token, tokenInfo); + } + + private static void validateToken(OAuth2AccessTokenWithAdditionalInfo token, Map expectedAdditionalInfo) { + Map additionalInfo = token.getAdditionalInfo(); + Assertions.assertEquals(additionalInfo.get(CLIENT_ID), expectedAdditionalInfo.get(CLIENT_ID)); + Assertions.assertEquals(additionalInfo.get(USER_NAME), expectedAdditionalInfo.get(USER_NAME)); + Assertions.assertEquals(additionalInfo.get(USER_ID), expectedAdditionalInfo.get(USER_ID)); + } + + private static void validateTokenAdditionalInfo(OAuth2AccessTokenWithAdditionalInfo token, Map tokenInfo) { + Map tokenAdditionalInformation = token.getAdditionalInfo(); + assertEquals(tokenInfo, tokenAdditionalInformation); + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerResponseErrorHandlerTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerResponseErrorHandlerTest.java new file mode 100644 index 0000000000..0fb08bc9cd --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerResponseErrorHandlerTest.java @@ -0,0 +1,128 @@ +package org.cloudfoundry.multiapps.controller.client.facade.rest; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; + +import org.junit.jupiter.api.Test; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.web.client.RestClientException; + +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; + +class CloudControllerResponseErrorHandlerTest { + + private final CloudControllerResponseErrorHandler handler = new CloudControllerResponseErrorHandler(); + + @Test + void testWithV2Error() throws IOException { + HttpStatus statusCode = HttpStatus.UNPROCESSABLE_ENTITY; + ClientHttpResponseMock response = new ClientHttpResponseMock(statusCode, getClass().getResourceAsStream("v2-error.json")); + CloudOperationException expectedException = new CloudOperationException(statusCode, + statusCode.getReasonPhrase(), + "Request invalid due to parse error: Field: name, Error: Missing field name, Field: space_guid, Error: Missing field space_guid, Field: service_plan_guid, Error: Missing field service_plan_guid"); + testWithError(response, expectedException); + } + + @Test + void testWithV3Error() throws IOException { + HttpStatus statusCode = HttpStatus.BAD_REQUEST; + ClientHttpResponseMock response = new ClientHttpResponseMock(statusCode, getClass().getResourceAsStream("v3-error.json")); + CloudOperationException expectedException = new CloudOperationException(statusCode, + statusCode.getReasonPhrase(), + "memory_in_mb exceeds organization memory quota\ndisk_in_mb exceeds organization disk quota"); + testWithError(response, expectedException); + } + + @Test + void testWithInvalidError() throws IOException { + HttpStatus statusCode = HttpStatus.BAD_REQUEST; + ClientHttpResponseMock response = new ClientHttpResponseMock(statusCode, toInputStream("blabla")); + CloudOperationException expectedException = new CloudOperationException(statusCode, statusCode.getReasonPhrase()); + testWithError(response, expectedException); + } + + @Test + void testWithEmptyResponse() throws IOException { + HttpStatus statusCode = HttpStatus.BAD_REQUEST; + ClientHttpResponseMock response = new ClientHttpResponseMock(statusCode, toInputStream("{ }")); + CloudOperationException expectedException = new CloudOperationException(statusCode, statusCode.getReasonPhrase()); + testWithError(response, expectedException); + } + + private void testWithError(ClientHttpResponseMock response, CloudOperationException expectedException) throws IOException { + try { + handler.handleError(response); + fail("Expected an exception"); + } catch (CloudOperationException exception) { + assertEquals(expectedException.getStatusCode(), exception.getStatusCode()); + assertEquals(expectedException.getStatusText(), exception.getStatusText()); + assertEquals(expectedException.getDescription(), exception.getDescription()); + } + } + + @Test + void testWithNonClientOrServerError() throws IOException { + HttpStatus statusCode = HttpStatus.PERMANENT_REDIRECT; + ClientHttpResponseMock response = new ClientHttpResponseMock(HttpStatus.PERMANENT_REDIRECT, null); + try { + handler.handleError(response); + fail("Expected an exception"); + } catch (RestClientException exception) { + assertEquals("Unknown status code [" + statusCode + "]", exception.getMessage()); + } + } + + private InputStream toInputStream(String string) { + return new ByteArrayInputStream(string.getBytes(StandardCharsets.UTF_8)); + } + + private static class ClientHttpResponseMock implements ClientHttpResponse { + + private final HttpStatus statusCode; + private final InputStream body; + + public ClientHttpResponseMock(HttpStatus statusCode, InputStream body) { + this.statusCode = statusCode; + this.body = body; + } + + @Override + public InputStream getBody() { + return body; + } + + @Override + public HttpHeaders getHeaders() { + throw new UnsupportedOperationException(); + } + + @Override + public HttpStatus getStatusCode() { + return statusCode; + } + + @Override + public int getRawStatusCode() { + return statusCode.value(); + } + + @Override + public String getStatusText() { + return statusCode.getReasonPhrase(); + } + + @Override + public void close() { + + } + + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerRestClientImplTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerRestClientImplTest.java new file mode 100644 index 0000000000..0519cbecce --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerRestClientImplTest.java @@ -0,0 +1,309 @@ +package org.cloudfoundry.multiapps.controller.client.facade.rest; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.util.Collections; +import java.util.List; +import java.util.UUID; +import java.util.stream.Stream; + +import org.cloudfoundry.client.CloudFoundryClient; +import org.cloudfoundry.client.v3.BuildpackData; +import org.cloudfoundry.client.v3.ClientV3Exception; +import org.cloudfoundry.client.v3.Lifecycle; +import org.cloudfoundry.client.v3.LifecycleType; +import org.cloudfoundry.client.v3.Pagination; +import org.cloudfoundry.client.v3.applications.ApplicationResource; +import org.cloudfoundry.client.v3.applications.ApplicationState; +import org.cloudfoundry.client.v3.applications.ApplicationsV3; +import org.cloudfoundry.client.v3.applications.GetApplicationRequest; +import org.cloudfoundry.client.v3.applications.GetApplicationResponse; +import org.cloudfoundry.client.v3.applications.ListApplicationsRequest; +import org.cloudfoundry.client.v3.applications.ListApplicationsResponse; +import org.cloudfoundry.client.v3.applications.UpdateApplicationRequest; +import org.cloudfoundry.client.v3.applications.UpdateApplicationResponse; +import org.cloudfoundry.client.v3.serviceofferings.GetServiceOfferingRequest; +import org.cloudfoundry.client.v3.serviceofferings.GetServiceOfferingResponse; +import org.cloudfoundry.client.v3.serviceofferings.ServiceOffering; +import org.cloudfoundry.client.v3.serviceofferings.ServiceOfferingsV3; +import org.cloudfoundry.client.v3.serviceplans.GetServicePlanRequest; +import org.cloudfoundry.client.v3.serviceplans.GetServicePlanResponse; +import org.cloudfoundry.client.v3.serviceplans.ServicePlan; +import org.cloudfoundry.client.v3.serviceplans.ServicePlansV3; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.springframework.http.HttpStatus; + +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.RawCloudServiceOfferingTest; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.RawCloudServicePlanTest; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudSpace; + +import reactor.core.publisher.Mono; + +class CloudControllerRestClientImplTest { + + private static final String SERVICE_PLAN_GUID = "1803e5a7-40c7-438e-b2be-e2045c9b7cda"; + private static final String SERVICE_INSTANCE_GUID = "26949ebb-a624-35c0-000-1110a01f1880"; + private static final String SERVICE_OFFERING_GUID = "1803e5a7-40c7-438e-b2be-e2045c9b7cda"; + private static final String PLAN_NAME = "test-plan"; + private static final String OLD_APPLICATION_NAME = "old-app-name"; + private static final String NEW_APPLICATION_NAME = "new-app-name"; + private static final String APPLICATION_CREATED_AT = "2024-01-26T10:00:00"; + private static final UUID APPLICATION_GUID = UUID.randomUUID(); + private static final UUID SPACE_GUID = UUID.randomUUID(); + + @Mock + private CloudFoundryClient delegate; + private CloudControllerRestClientImpl controllerClient; + + @BeforeEach + public void setUp() throws Exception { + MockitoAnnotations.openMocks(this) + .close(); + controllerClient = new CloudControllerRestClientImpl(delegate); + } + + @Test + void testGetServiceOffering() { + GetServiceOfferingRequest request = GetServiceOfferingRequest.builder() + .serviceOfferingId(SERVICE_PLAN_GUID) + .build(); + GetServiceOfferingResponse response = GetServiceOfferingResponse.builder() + .from(RawCloudServiceOfferingTest.buildTestServiceOffering()) + .build(); + + ServiceOfferingsV3 serviceOfferingsV3 = Mockito.mock(ServiceOfferingsV3.class); + Mockito.when(delegate.serviceOfferingsV3()) + .thenReturn(serviceOfferingsV3); + Mockito.when(serviceOfferingsV3.get(request)) + .thenReturn(Mono.just(response)); + + ServiceOffering serviceOffering = controllerClient.getServiceOffering(SERVICE_PLAN_GUID) + .block(); + + assertEquals(response, serviceOffering); + } + + public static Stream testGetServiceOfferingWithError() { + return Stream.of( +// @formatter:off + Arguments.of(HttpStatus.FORBIDDEN.value(), + "403 Forbidden: Service offering with guid \"1803e5a7-40c7-438e-b2be-e2045c9b7cda\" is not available."), + Arguments.of(HttpStatus.NOT_FOUND.value(), + "404 Not Found: Service offering with guid \"1803e5a7-40c7-438e-b2be-e2045c9b7cda\" not found.") +// @formatter:on + ); + } + + @ParameterizedTest + @MethodSource + void testGetServiceOfferingWithError(int errorCode, String expectedErrorMessage) { + GetServiceOfferingRequest request = GetServiceOfferingRequest.builder() + .serviceOfferingId(SERVICE_OFFERING_GUID) + .build(); + ServiceOfferingsV3 serviceOfferingsV3 = Mockito.mock(ServiceOfferingsV3.class); + Mockito.when(delegate.serviceOfferingsV3()) + .thenReturn(serviceOfferingsV3); + Mockito.when(serviceOfferingsV3.get(request)) + .thenReturn(Mono.error(clientV3Exception(errorCode))); + Exception cloudControllerException = assertThrows(CloudOperationException.class, + () -> controllerClient.getServiceOffering(SERVICE_OFFERING_GUID) + .block()); + assertEquals(expectedErrorMessage, cloudControllerException.getMessage()); + } + + public static Stream testGetServicePlanWithError() { + return Stream.of( +// @formatter:off + Arguments.of(HttpStatus.FORBIDDEN.value(), + "403 Forbidden: Service plan with guid \"1803e5a7-40c7-438e-b2be-e2045c9b7cda\" is not available for service instance \"26949ebb-a624-35c0-000-1110a01f1880\"."), + Arguments.of(HttpStatus.NOT_FOUND.value(), + "404 Not Found: Service plan with guid \"1803e5a7-40c7-438e-b2be-e2045c9b7cda\" for service instance with name \"26949ebb-a624-35c0-000-1110a01f1880\" was not found.") +// @formatter:on + ); + } + + @ParameterizedTest + @MethodSource + void testGetServicePlanWithError(int errorCode, String expectedErrorMessage) { + GetServicePlanRequest request = GetServicePlanRequest.builder() + .servicePlanId(SERVICE_PLAN_GUID) + .build(); + + ServicePlansV3 servicePlans = Mockito.mock(ServicePlansV3.class); + Mockito.when(delegate.servicePlansV3()) + .thenReturn(servicePlans); + Mockito.when(servicePlans.get(request)) + .thenReturn(Mono.error(clientV3Exception(errorCode))); + + Exception cloudControllerException = assertThrows(CloudOperationException.class, + () -> controllerClient.getServicePlanResource(SERVICE_PLAN_GUID, + SERVICE_INSTANCE_GUID) + .block()); + assertEquals(expectedErrorMessage, cloudControllerException.getMessage()); + } + + @Test + void testGetServicePlanResource() { + GetServicePlanRequest request = GetServicePlanRequest.builder() + .servicePlanId(SERVICE_PLAN_GUID) + .build(); + GetServicePlanResponse response = GetServicePlanResponse.builder() + .from(RawCloudServicePlanTest.buildTestServicePlan(PLAN_NAME)) + .build(); + + ServicePlansV3 servicePlans = Mockito.mock(ServicePlansV3.class); + Mockito.when(delegate.servicePlansV3()) + .thenReturn(servicePlans); + Mockito.when(servicePlans.get(request)) + .thenReturn(Mono.just(response)); + + ServicePlan servicePlanResource = controllerClient.getServicePlanResource(SERVICE_PLAN_GUID, SERVICE_INSTANCE_GUID) + .block(); + + assertEquals(response, servicePlanResource); + } + + private static Stream testRenameApplication() { + return Stream.of( + // (1) Successful application rename + Arguments.of(Mono.just(UpdateApplicationResponse.builder() + .name(NEW_APPLICATION_NAME) + .id(APPLICATION_GUID.toString()) + .createdAt(APPLICATION_CREATED_AT) + .state(ApplicationState.STARTED) + .lifecycle(getApplicationLifecycle()) + .build()), + null, false), + // (2) Controller's API returns 503 and rename was actually done + Arguments.of(Mono.error(new ClientV3Exception(503, + List.of(org.cloudfoundry.client.v3.Error.builder() + .code(170015) + .title("CF-RunnerUnavailable") + .detail("Runner is unavailable") + .build()))), + Mono.just(GetApplicationResponse.builder() + .name(NEW_APPLICATION_NAME) + .id(APPLICATION_GUID.toString()) + .createdAt(APPLICATION_CREATED_AT) + .state(ApplicationState.STARTED) + .lifecycle(getApplicationLifecycle()) + .build()), + false), + // (3) Controller's API fails with 500 and application wasn't renamed + Arguments.of(Mono.error(new ClientV3Exception(500, Collections.emptyList())), null, true), + // (4) Controller's API returns 503 and while make request to get current application name the request fails + Arguments.of(Mono.error(new ClientV3Exception(503, + List.of(org.cloudfoundry.client.v3.Error.builder() + .code(170015) + .title("CF-RunnerUnavailable") + .detail("Runner is unavailable") + .build()))), + Mono.error(new ClientV3Exception(500, Collections.emptyList())), true), + // (5) Controller's API returns 503 and application wasn't renamed + Arguments.of(Mono.error(new ClientV3Exception(503, + List.of(org.cloudfoundry.client.v3.Error.builder() + .code(170015) + .title("CF-RunnerUnavailable") + .detail("Runner is unavailable") + .build()))), + Mono.just(GetApplicationResponse.builder() + .name(OLD_APPLICATION_NAME) + .id(APPLICATION_GUID.toString()) + .createdAt(APPLICATION_CREATED_AT) + .state(ApplicationState.STARTED) + .lifecycle(getApplicationLifecycle()) + .build()), + true)); + } + + private static Lifecycle getApplicationLifecycle() { + return Lifecycle.builder() + .type(LifecycleType.BUILDPACK) + .data(BuildpackData.builder() + .build()) + .build(); + } + + @ParameterizedTest + @MethodSource + void testRenameApplication(Mono updateApplicationResponse, + Mono getApplicationResponse, boolean expectedFailure) { + ApplicationsV3 applicationsV3 = Mockito.mock(ApplicationsV3.class); + var updateAppRequest = UpdateApplicationRequest.builder() + .applicationId(APPLICATION_GUID.toString()) + .name(NEW_APPLICATION_NAME) + .build(); + prepareClientDelegate(applicationsV3, updateAppRequest, updateApplicationResponse, getApplicationResponse); + + if (expectedFailure) { + assertThrows(ClientV3Exception.class, () -> controllerClient.rename(OLD_APPLICATION_NAME, NEW_APPLICATION_NAME)); + return; + } + controllerClient.rename(OLD_APPLICATION_NAME, NEW_APPLICATION_NAME); + + Mockito.verify(applicationsV3, Mockito.atMostOnce()) + .update(updateAppRequest); + } + + private void prepareClientDelegate(ApplicationsV3 applicationsV3, UpdateApplicationRequest updateAppRequest, + Mono updateApplicationResponse, + Mono getApplicationResponse) { + initControllerClientWithTargetSpace(SPACE_GUID); + + Mockito.when(delegate.applicationsV3()) + .thenReturn(applicationsV3); + var listAppsRequest = ListApplicationsRequest.builder() + .spaceId(SPACE_GUID.toString()) + .name(OLD_APPLICATION_NAME) + .page(1) + .build(); + + var listAppsResponse = ListApplicationsResponse.builder() + .resource(ApplicationResource.builder() + .name(OLD_APPLICATION_NAME) + .id(APPLICATION_GUID.toString()) + .createdAt(APPLICATION_CREATED_AT) + .state(ApplicationState.STARTED) + .lifecycle(getApplicationLifecycle()) + .build()) + .pagination(Pagination.builder() + .totalResults(1) + .totalPages(1) + .build()) + .build(); + Mockito.when(applicationsV3.list(listAppsRequest)) + .thenReturn(Mono.just(listAppsResponse)); + Mockito.when(applicationsV3.update(updateAppRequest)) + .thenReturn(updateApplicationResponse); + var getAppRequest = GetApplicationRequest.builder() + .applicationId(APPLICATION_GUID.toString()) + .build(); + + Mockito.when(applicationsV3.get(getAppRequest)) + .thenReturn(getApplicationResponse); + } + + private void initControllerClientWithTargetSpace(UUID spaceGuid) { + CloudSpace target = ImmutableCloudSpace.builder() + .metadata(ImmutableCloudMetadata.builder() + .guid(spaceGuid) + .build()) + .build(); + this.controllerClient = new CloudControllerRestClientImpl(delegate, target); + } + + private ClientV3Exception clientV3Exception(int statusCode) { + return new ClientV3Exception(statusCode, Collections.emptyList()); + } +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/util/JsonUtilTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/util/JsonUtilTest.java new file mode 100644 index 0000000000..21ebaa33ce --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/util/JsonUtilTest.java @@ -0,0 +1,107 @@ +package org.cloudfoundry.multiapps.controller.client.facade.util; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import org.junit.jupiter.api.Test; + +class JsonUtilTest { + + @Test + void testUsingPrettyPrint() { + testWithCustomPrinting(); + } + + @Test + void testWithNoPrettyPrint() { + testWithCustomPrinting(); + } + + private void testWithCustomPrinting() { + Map fooMap = createTestProperties(); + + String json = JsonUtil.convertToJson(fooMap, true); + validateJsonMap(json); + } + + @Test + void testUsingTheMethodWithNoPrettyPrint() { + Map fooMap = createTestProperties(); + + String json = JsonUtil.convertToJson(fooMap); + + validateJsonMap(json); + } + + private void validateJsonMap(String json) { + System.out.println(json); + + Map resultFoo = JsonUtil.convertJsonToMap(json); + + assertTestProperties(resultFoo); + } + + @Test + void testConvertListToJsonAndBack() { + List testingList = Arrays.asList("foo", "bar", "baz"); + String jsonList = JsonUtil.convertToJson(testingList); + + System.out.println(jsonList); + + List toList = JsonUtil.convertJsonToList(jsonList); + + assertEquals(3, toList.size()); + assertEquals(Arrays.asList("foo", "bar", "baz"), toList); + } + + @Test + void testWithNullMap() { + + Map foo = Collections.emptyMap(); + String fooJson = JsonUtil.convertToJson(foo); + String barJson = "null"; + + Map fooMap = JsonUtil.convertJsonToMap(fooJson); + Map barMap = JsonUtil.convertJsonToMap(barJson); + + assertTrue(fooMap.isEmpty()); + assertNull(barMap); + } + + private Map createTestProperties() { + Map testProperties1 = new TreeMap<>(); + testProperties1.put("host", "localhost"); + testProperties1.put("port", 30030); + testProperties1.put("long-value", (long) Integer.MAX_VALUE * 10); + testProperties1.put("double-value", 1.5); + Map testProperties2 = new TreeMap<>(); + testProperties2.put("port", 50000); + testProperties2.put("long-value", (long) Integer.MAX_VALUE * 10); + testProperties2.put("double-value", 1.5); + testProperties1.put("test", testProperties2); + testProperties1.put("list", Arrays.asList("foo", "bar", "baz")); + return testProperties1; + } + + @SuppressWarnings("unchecked") + private void assertTestProperties(Map actualProperties) { + assertTrue(actualProperties.get("host") instanceof String); + assertTrue(actualProperties.get("port") instanceof Integer); + assertTrue(actualProperties.get("long-value") instanceof Long); + assertTrue(actualProperties.get("double-value") instanceof Double); + assertTrue(((Map) actualProperties.get("test")).get("port") instanceof Integer); + assertTrue(((Map) actualProperties.get("test")).get("long-value") instanceof Long); + assertTrue(((Map) actualProperties.get("test")).get("double-value") instanceof Double); + List listFromMap = (List) actualProperties.get("list"); + assertEquals(3, listFromMap.size()); + assertEquals(Arrays.asList("foo", "bar", "baz"), listFromMap); + } + +} diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/util/UriUtilTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/util/UriUtilTest.java new file mode 100644 index 0000000000..e24b13b111 --- /dev/null +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/util/UriUtilTest.java @@ -0,0 +1,22 @@ +package org.cloudfoundry.multiapps.controller.client.facade.util; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.List; + +import org.junit.jupiter.api.Test; + +class UriUtilTest { + + @Test + void testEncodeCharsWithOneChar() { + String encodedString = UriUtil.encodeChars("space,name", List.of(",")); + assertEquals("space%2Cname", encodedString); + } + + @Test + void testEncodeCharsWithMultipleChars() { + String encodedString = UriUtil.encodeChars("org space,name", List.of(",", " ")); + assertEquals("org%20space%2Cname", encodedString); + } +} diff --git a/multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/rest/v2-error.json b/multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/rest/v2-error.json new file mode 100644 index 0000000000..c7727a2fcf --- /dev/null +++ b/multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/rest/v2-error.json @@ -0,0 +1,5 @@ +{ + "description": "Request invalid due to parse error: Field: name, Error: Missing field name, Field: space_guid, Error: Missing field space_guid, Field: service_plan_guid, Error: Missing field service_plan_guid", + "error_code": "CF-MessageParseError", + "code": 1001 +} \ No newline at end of file diff --git a/multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/rest/v3-error.json b/multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/rest/v3-error.json new file mode 100644 index 0000000000..8195bd727e --- /dev/null +++ b/multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/rest/v3-error.json @@ -0,0 +1,14 @@ +{ + "errors": [ + { + "detail": "memory_in_mb exceeds organization memory quota", + "title": "CF-UnprocessableEntity", + "code": 10008 + }, + { + "detail": "disk_in_mb exceeds organization disk quota", + "title": "CF-UnprocessableEntity", + "code": 10008 + } + ] +} \ No newline at end of file diff --git a/multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/service-broker-env.json b/multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/service-broker-env.json new file mode 100644 index 0000000000..7e97595e31 --- /dev/null +++ b/multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/service-broker-env.json @@ -0,0 +1,27 @@ +{ + "TARGET_RUNTIME": "tomcat", + "CATALOG": { + "services": [ + { + "name": "finch", + "description": "finch is a small bird", + "bindable": true, + "plan_updateable": true, + "instances_retrievable": true, + "bindings_retrievable": true, + "plans": [ + { + "name": "white", + "description": "white finch", + "free": true + }, + { + "name": "grey", + "description": "grey finch", + "free": true + } + ] + } + ] + } +} \ No newline at end of file diff --git a/multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/util/application.json b/multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/util/application.json new file mode 100644 index 0000000000..b5ed92428e --- /dev/null +++ b/multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/util/application.json @@ -0,0 +1,46 @@ +{ + "metadata": { + "guid": "83d048bc-a301-4b48-94a8-848e477fac4d", + "url": "/v2/apps/83d048bc-a301-4b48-94a8-848e477fac4d", + "created_at": "2019-07-18T17:19:27Z", + "updated_at": "2019-07-18T19:55:52Z" + }, + "entity": { + "name": "test-flask-5", + "production": false, + "space_guid": "bbbeed31-f908-477a-aab9-8cdcd19e1348", + "stack_guid": "bbbeed31-f908-477a-aab9-8cdcd19e1348", + "buildpack": null, + "detected_buildpack": "python", + "detected_buildpack_guid": "5eb740a2-f70b-4e38-957c-e1c513142c4c", + "environment_json": null, + "memory": 1024, + "instances": 1, + "disk_quota": 1024, + "state": "STOPPED", + "version": "bbbeed31-f908-477a-aab9-8cdcd19e1348", + "command": null, + "console": false, + "debug": null, + "staging_task_id": "a50db5f9-713b-4e46-9560-21bd4992df1c", + "package_state": "STAGED", + "health_check_type": "port", + "health_check_timeout": null, + "health_check_http_endpoint": null, + "staging_failed_reason": null, + "staging_failed_description": null, + "diego": true, + "docker_image": null, + "docker_credentials": { + "username": null, + "password": null + }, + "package_updated_at": "2019-07-18T17:20:54Z", + "detected_start_command": "python app.py", + "enable_ssh": true, + "ports": [ + 8080 + ], + "space_url": "/v2/spaces/e1210c89-158b-4298-a417-96f80d5b9e52" + } +} \ No newline at end of file diff --git a/multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/util/build.json b/multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/util/build.json new file mode 100644 index 0000000000..b59538fd32 --- /dev/null +++ b/multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/util/build.json @@ -0,0 +1,31 @@ +{ + "guid": "585bc3c1-3743-497d-88b0-403ad6b56d16", + "created_at": "2016-03-28T23:39:34Z", + "updated_at": "2016-06-08T19:41:26Z", + "created_by": { + "guid": "3cb4e243-bed4-49d5-8739-f8b45abdec1c", + "name": "bill", + "email": "bill@example.com" + }, + "state": "STAGING", + "error": null, + "lifecycle": { + "type": "buildpack", + "data": { + "buildpacks": [ "ruby_buildpack" ], + "stack": "cflinuxfs2" + } + }, + "package": { + "guid": "8e4da443-f255-499c-8b47-b3729b5b7432" + }, + "droplet": null, + "links": { + "self": { + "href": "https://api.example.org/v3/builds/585bc3c1-3743-497d-88b0-403ad6b56d16" + }, + "app": { + "href": "https://api.example.org/v3/apps/7b34f1cf-7e73-428a-bb5a-8a17a8058396" + } + } +} \ No newline at end of file diff --git a/multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/util/package.json b/multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/util/package.json new file mode 100644 index 0000000000..0738bf5223 --- /dev/null +++ b/multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/util/package.json @@ -0,0 +1,30 @@ +{ + "guid": "44f7c078-0934-470f-9883-4fcddc5b8f13", + "type": "bits", + "data": { + "checksum": { + "type": "sha256", + "value": null + }, + "error": null + }, + "state": "PROCESSING_UPLOAD", + "created_at": "2015-11-13T19:02:56Z", + "updated_at": "2016-06-08T19:41:26Z", + "links": { + "self": { + "href": "https://api.example.org/v3/packages/44f7c078-0934-470f-9883-4fcddc5b8f13" + }, + "upload": { + "href": "https://api.example.org/v3/packages/44f7c078-0934-470f-9883-4fcddc5b8f13/upload", + "method": "POST" + }, + "download": { + "href": "https://api.example.org/v3/packages/44f7c078-0934-470f-9883-4fcddc5b8f13/download", + "method": "GET" + }, + "app": { + "href": "https://api.example.org/v3/apps/1d3bf0ec-5806-43c4-b64e-8364dba1086a" + } + } +} \ No newline at end of file diff --git a/multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/util/service-instance.json b/multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/util/service-instance.json new file mode 100644 index 0000000000..0ff171cc9a --- /dev/null +++ b/multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/util/service-instance.json @@ -0,0 +1,37 @@ +{ + "metadata": { + "guid": "cc3b67fa-cda6-4df7-ba47-eb5f2a123992", + "url": "/v2/service_instances/cc3b67fa-cda6-4df7-ba47-eb5f2a123992", + "created_at": "2016-06-08T16:41:29Z", + "updated_at": "2016-06-08T16:41:26Z" + }, + "entity": { + "name": "my-service-instance", + "credentials": { + + }, + "service_plan_guid": "fe173a83-df28-4891-8d91-46334e04600d", + "space_guid": "bbbeed31-f908-477a-aab9-8cdcd19e1348", + "gateway_data": null, + "dashboard_url": null, + "type": "managed_service_instance", + "last_operation": { + "type": "create", + "state": "in progress", + "description": "", + "updated_at": "2016-06-08T16:41:26Z", + "created_at": "2016-06-08T16:41:29Z" + }, + "tags": [ + "accounting", + "mongodb" + ], + "space_url": "/v2/spaces/bbbeed31-f908-477a-aab9-8cdcd19e1348", + "service_plan_url": "/v2/service_plans/fe173a83-df28-4891-8d91-46334e04600d", + "service_bindings_url": "/v2/service_instances/cc3b67fa-cda6-4df7-ba47-eb5f2a123992/service_bindings", + "service_keys_url": "/v2/service_instances/cc3b67fa-cda6-4df7-ba47-eb5f2a123992/service_keys", + "routes_url": "/v2/service_instances/cc3b67fa-cda6-4df7-ba47-eb5f2a123992/routes", + "shared_from_url": "/v2/service_instances/0d632575-bb06-4ea5-bb19-a451a9644d92/shared_from", + "shared_to_url": "/v2/service_instances/0d632575-bb06-4ea5-bb19-a451a9644d92/shared_to" + } +} \ No newline at end of file diff --git a/multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/util/task.json b/multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/util/task.json new file mode 100644 index 0000000000..c4709dfa77 --- /dev/null +++ b/multiapps-controller-client/src/test/resources/org/cloudfoundry/multiapps/controller/client/facade/util/task.json @@ -0,0 +1,30 @@ +{ + "guid": "d5cc22ec-99a3-4e6a-af91-a44b4ab7b6fa", + "sequence_id": 1, + "name": "migrate", + "command": "rake db:migrate", + "state": "RUNNING", + "memory_in_mb": 512, + "disk_in_mb": 1024, + "result": { + "failure_reason": null + }, + "droplet_guid": "740ebd2b-162b-469a-bd72-3edb96fabd9a", + "created_at": "2016-05-04T17:00:41Z", + "updated_at": "2016-05-04T17:00:42Z", + "links": { + "self": { + "href": "https://api.example.org/v3/tasks/d5cc22ec-99a3-4e6a-af91-a44b4ab7b6fa" + }, + "app": { + "href": "https://api.example.org/v3/apps/ccc25a0f-c8f4-4b39-9f1b-de9f328d0ee5" + }, + "cancel": { + "href": "https://api.example.org/v3/tasks/d5cc22ec-99a3-4e6a-af91-a44b4ab7b6fa/actions/cancel", + "method": "POST" + }, + "droplet": { + "href": "https://api.example.org/v3/droplets/740ebd2b-162b-469a-bd72-3edb96fabd9a" + } + } +} \ No newline at end of file diff --git a/multiapps-controller-core/src/main/java/module-info.java b/multiapps-controller-core/src/main/java/module-info.java index 325b230667..6edd794970 100644 --- a/multiapps-controller-core/src/main/java/module-info.java +++ b/multiapps-controller-core/src/main/java/module-info.java @@ -39,7 +39,6 @@ exports org.cloudfoundry.multiapps.controller.core.validators.parameters.v2; exports org.cloudfoundry.multiapps.controller.core.validators.parameters.v3; - requires transitive com.sap.cloudfoundry.client.facade; requires transitive jakarta.persistence; requires transitive org.cloudfoundry.multiapps.controller.client; requires transitive org.cloudfoundry.multiapps.controller.persistence; diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/application/health/model/ApplicationHealthResult.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/application/health/model/ApplicationHealthResult.java index 4829225417..ac9c12e7a6 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/application/health/model/ApplicationHealthResult.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/application/health/model/ApplicationHealthResult.java @@ -1,10 +1,9 @@ package org.cloudfoundry.multiapps.controller.core.application.health.model; -import org.immutables.value.Value; - import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.sap.cloudfoundry.client.facade.Nullable; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; +import org.immutables.value.Value; @Value.Immutable @JsonSerialize(as = ImmutableApplicationHealthResult.class) diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/CloudControllerClientFactory.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/CloudControllerClientFactory.java index 1c15b206a9..91fd2fe929 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/CloudControllerClientFactory.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/CloudControllerClientFactory.java @@ -6,22 +6,20 @@ import jakarta.inject.Inject; import jakarta.inject.Named; - import org.apache.commons.lang3.StringUtils; import org.cloudfoundry.multiapps.controller.client.ResilientCloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudCredentials; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.LogCacheClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuthClient; +import org.cloudfoundry.multiapps.controller.client.facade.rest.CloudControllerRestClient; +import org.cloudfoundry.multiapps.controller.client.facade.rest.CloudControllerRestClientFactory; +import org.cloudfoundry.multiapps.controller.client.facade.rest.CloudSpaceClient; +import org.cloudfoundry.multiapps.controller.client.facade.rest.ImmutableCloudControllerRestClientFactory; import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudCredentials; -import com.sap.cloudfoundry.client.facade.adapters.LogCacheClient; -import com.sap.cloudfoundry.client.facade.domain.CloudSpace; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; -import com.sap.cloudfoundry.client.facade.oauth2.OAuthClient; -import com.sap.cloudfoundry.client.facade.rest.CloudControllerRestClient; -import com.sap.cloudfoundry.client.facade.rest.CloudControllerRestClientFactory; -import com.sap.cloudfoundry.client.facade.rest.CloudSpaceClient; -import com.sap.cloudfoundry.client.facade.rest.ImmutableCloudControllerRestClientFactory; - @Named public class CloudControllerClientFactory { diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/CloudControllerClientProvider.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/CloudControllerClientProvider.java index add0e4b52c..82c3611c65 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/CloudControllerClientProvider.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/CloudControllerClientProvider.java @@ -2,11 +2,11 @@ import java.time.Duration; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; import jakarta.inject.Inject; import jakarta.inject.Named; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; import org.cloudfoundry.multiapps.controller.core.Messages; import org.cloudfoundry.multiapps.controller.core.model.CachedMap; import org.cloudfoundry.multiapps.controller.core.security.token.TokenService; diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/CloudHandlerFactory.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/CloudHandlerFactory.java index 12dbd7ba63..ea8ef10e8b 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/CloudHandlerFactory.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/CloudHandlerFactory.java @@ -1,11 +1,10 @@ package org.cloudfoundry.multiapps.controller.core.cf; -import static java.text.MessageFormat.format; - import java.util.List; import java.util.Map; import java.util.Set; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; import org.cloudfoundry.multiapps.controller.core.cf.detect.AppSuffixDeterminer; import org.cloudfoundry.multiapps.controller.core.cf.v2.ApplicationCloudModelBuilder; import org.cloudfoundry.multiapps.controller.core.cf.v2.CloudHandlerFactoryV2; @@ -32,7 +31,7 @@ import org.cloudfoundry.multiapps.mta.model.Platform; import org.cloudfoundry.multiapps.mta.resolvers.LiveRoutesProvidedParametersResolver; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; +import static java.text.MessageFormat.format; public interface CloudHandlerFactory extends HandlerFactory { diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/OAuthClientExtended.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/OAuthClientExtended.java index 3a48eecb9d..34f3828d8a 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/OAuthClientExtended.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/OAuthClientExtended.java @@ -5,8 +5,8 @@ import java.time.Instant; import java.time.temporal.ChronoUnit; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; -import com.sap.cloudfoundry.client.facade.oauth2.OAuthClient; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuthClient; import org.cloudfoundry.multiapps.controller.client.util.TokenProperties; import org.cloudfoundry.multiapps.controller.core.Messages; import org.cloudfoundry.multiapps.controller.core.security.token.TokenService; diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/OAuthClientFactory.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/OAuthClientFactory.java index 012c812a52..49549bf6ba 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/OAuthClientFactory.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/OAuthClientFactory.java @@ -2,13 +2,11 @@ import jakarta.inject.Inject; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuthClient; +import org.cloudfoundry.multiapps.controller.client.facade.util.RestUtil; import org.cloudfoundry.multiapps.controller.client.uaa.UAAClient; import org.cloudfoundry.multiapps.controller.core.security.token.TokenService; -import com.sap.cloudfoundry.client.facade.oauth2.OAuthClient; -import com.sap.cloudfoundry.client.facade.util.RestUtil; - @Named public class OAuthClientFactory { diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/apps/ApplicationStartupStateCalculator.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/apps/ApplicationStartupStateCalculator.java index c6e723efdc..a7cf2c55ce 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/apps/ApplicationStartupStateCalculator.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/apps/ApplicationStartupStateCalculator.java @@ -1,17 +1,15 @@ package org.cloudfoundry.multiapps.controller.core.cf.apps; -import jakarta.inject.Named; +import java.util.Map; +import jakarta.inject.Named; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstanceInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstanceState; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstancesInfo; import org.cloudfoundry.multiapps.controller.core.helpers.ApplicationAttributes; import org.cloudfoundry.multiapps.controller.core.model.SupportedParameters; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.InstanceInfo; -import com.sap.cloudfoundry.client.facade.domain.InstanceState; -import com.sap.cloudfoundry.client.facade.domain.InstancesInfo; - -import java.util.Map; - @Named public class ApplicationStartupStateCalculator { diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/AppBoundServiceInstanceNamesGetter.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/AppBoundServiceInstanceNamesGetter.java index a622fb994e..84f4d9fa05 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/AppBoundServiceInstanceNamesGetter.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/AppBoundServiceInstanceNamesGetter.java @@ -6,10 +6,9 @@ import java.util.UUID; import java.util.stream.Collectors; +import org.cloudfoundry.multiapps.controller.client.facade.CloudCredentials; import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration; -import com.sap.cloudfoundry.client.facade.CloudCredentials; - public class AppBoundServiceInstanceNamesGetter extends CustomControllerClient { public AppBoundServiceInstanceNamesGetter(ApplicationConfiguration configuration, WebClientFactory webClientFactory, diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CFOptimizedEventGetter.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CFOptimizedEventGetter.java index f22d1f5969..86eac70c17 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CFOptimizedEventGetter.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CFOptimizedEventGetter.java @@ -5,10 +5,9 @@ import java.util.Objects; import java.util.stream.Collectors; +import org.cloudfoundry.multiapps.controller.client.facade.CloudCredentials; import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration; -import com.sap.cloudfoundry.client.facade.CloudCredentials; - public class CFOptimizedEventGetter extends CustomControllerClient { private static final String FIND_EVENT_BY_TYPE_AND_TIMESTAMP_ENDPOINT = "/v3/audit_events?types=%s&per_page=100&created_ats[gt]=%s"; diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CfRolesGetter.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CfRolesGetter.java index 58b2958ad9..4f6dfbb3c5 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CfRolesGetter.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CfRolesGetter.java @@ -8,11 +8,10 @@ import java.util.UUID; import java.util.stream.Collectors; +import org.cloudfoundry.multiapps.controller.client.facade.CloudCredentials; +import org.cloudfoundry.multiapps.controller.client.facade.domain.UserRole; import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration; -import com.sap.cloudfoundry.client.facade.CloudCredentials; -import com.sap.cloudfoundry.client.facade.domain.UserRole; - public class CfRolesGetter extends CustomControllerClient { private static final String ROLES_FILTER = Arrays.stream(UserRole.values()) diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CloudEntityResourceMapper.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CloudEntityResourceMapper.java index 64d6780de0..8d01fe7eca 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CloudEntityResourceMapper.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CloudEntityResourceMapper.java @@ -13,21 +13,20 @@ import org.cloudfoundry.client.v3.Metadata; import org.cloudfoundry.client.v3.serviceinstances.ServiceInstanceType; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceInstance; import org.cloudfoundry.multiapps.controller.core.model.DeployedMtaService; import org.cloudfoundry.multiapps.controller.core.model.DeployedMtaServiceKey; import org.cloudfoundry.multiapps.controller.core.model.ImmutableDeployedMtaServiceKey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.sap.cloudfoundry.client.facade.domain.CloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceInstance; - public class CloudEntityResourceMapper { private static final Logger LOGGER = LoggerFactory.getLogger(CloudEntityResourceMapper.class); - + @SuppressWarnings("unchecked") public String getRelatedObjectGuid(Map resource, String relationshipName) { var relationships = (Map) resource.get("relationships"); diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CustomControllerClient.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CustomControllerClient.java index adb1602558..8edf474e8b 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CustomControllerClient.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CustomControllerClient.java @@ -8,14 +8,13 @@ import org.apache.commons.collections4.ListUtils; import org.apache.commons.lang3.StringUtils; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudCredentials; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerHeaderConfiguration; import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.reactive.function.client.WebClient; -import com.sap.cloudfoundry.client.facade.CloudCredentials; - public abstract class CustomControllerClient { private final WebClient webClient; diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CustomControllerClientErrorHandler.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CustomControllerClientErrorHandler.java index e9adda4147..0f3b0dce4e 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CustomControllerClientErrorHandler.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CustomControllerClientErrorHandler.java @@ -1,18 +1,18 @@ package org.cloudfoundry.multiapps.controller.core.cf.clients; -import com.sap.cloudfoundry.client.facade.CloudOperationException; +import java.text.MessageFormat; +import java.util.Map; +import java.util.function.Supplier; + import org.cloudfoundry.multiapps.common.ParsingException; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; import org.cloudfoundry.multiapps.controller.client.util.ResilientCloudOperationExecutor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.web.client.HttpStatusCodeException; -import java.text.MessageFormat; -import java.util.Map; -import java.util.function.Supplier; - public class CustomControllerClientErrorHandler { private static final Logger LOGGER = LoggerFactory.getLogger(CustomControllerClientErrorHandler.class); diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CustomServiceKeysClient.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CustomServiceKeysClient.java index 9288715142..733843fd25 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CustomServiceKeysClient.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CustomServiceKeysClient.java @@ -7,6 +7,8 @@ import java.util.stream.Collectors; import org.cloudfoundry.client.v3.serviceinstances.ServiceInstanceType; +import org.cloudfoundry.multiapps.controller.client.facade.CloudCredentials; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadataLabels; import org.cloudfoundry.multiapps.controller.core.cf.metadata.criteria.MtaMetadataCriteriaBuilder; import org.cloudfoundry.multiapps.controller.core.cf.metadata.util.MtaMetadataUtil; @@ -14,9 +16,6 @@ import org.cloudfoundry.multiapps.controller.core.model.DeployedMtaServiceKey; import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration; -import com.sap.cloudfoundry.client.facade.CloudCredentials; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; - public class CustomServiceKeysClient extends CustomControllerClient { private static final String SERVICE_KEYS_RESOURCE_BASE_URI = "/v3/service_credential_bindings"; @@ -44,8 +43,8 @@ public List getServiceKeysByMetadataAndGuids(String space .build() .get(); - return new CustomControllerClientErrorHandler().handleErrorsOrReturnResult(() -> getServiceKeysByMetadataInternal(labelSelector, - services)); + return new CustomControllerClientErrorHandler().handleErrorsOrReturnResult( + () -> getServiceKeysByMetadataInternal(labelSelector, services)); } private List getServiceKeysByMetadataInternal(String labelSelector, List services) { @@ -73,8 +72,7 @@ private List getManagedServices(List ser private boolean serviceIsNotUserProvided(DeployedMtaService service) { return service.getMetadata() != null && service.getMetadata() - .getGuid() != null - && service.getType() == ServiceInstanceType.MANAGED; + .getGuid() != null && service.getType() == ServiceInstanceType.MANAGED; } protected class ServiceKeysResponseMapper extends ResourcesResponseMapper { @@ -91,8 +89,7 @@ public List getMappedResources() { if (mtaServices != null) { serviceMapping = mtaServices.stream() .collect(Collectors.toMap(service -> service.getGuid() - .toString(), - Function.identity())); + .toString(), Function.identity())); } else { serviceMapping = getIncludedServiceInstancesMapping(); } diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/ServiceInstanceRoutesGetter.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/ServiceInstanceRoutesGetter.java index 30dfb80b14..280c5e0786 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/ServiceInstanceRoutesGetter.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/ServiceInstanceRoutesGetter.java @@ -6,12 +6,11 @@ import java.util.Map; import java.util.stream.Collectors; +import org.cloudfoundry.multiapps.controller.client.facade.CloudCredentials; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableServiceRouteBinding; import org.cloudfoundry.multiapps.controller.client.lib.domain.ServiceRouteBinding; import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration; -import com.sap.cloudfoundry.client.facade.CloudCredentials; - public class ServiceInstanceRoutesGetter extends CustomControllerClient { private static final int MAX_CHAR_LENGTH_FOR_PARAMS_IN_REQUEST = 4000; diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/WebClientFactory.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/WebClientFactory.java index 3c7ef8b18b..8102c00151 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/WebClientFactory.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/clients/WebClientFactory.java @@ -2,14 +2,12 @@ import jakarta.inject.Inject; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudCredentials; +import org.cloudfoundry.multiapps.controller.client.facade.util.RestUtil; import org.cloudfoundry.multiapps.controller.core.cf.OAuthClientFactory; import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration; import org.springframework.web.reactive.function.client.WebClient; -import com.sap.cloudfoundry.client.facade.CloudCredentials; -import com.sap.cloudfoundry.client.facade.util.RestUtil; - @Named public class WebClientFactory { diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/detect/DeployedMtaDetector.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/detect/DeployedMtaDetector.java index c03d80a456..d7352ccb8b 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/detect/DeployedMtaDetector.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/detect/DeployedMtaDetector.java @@ -6,7 +6,8 @@ import jakarta.inject.Inject; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudEntity; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadataLabels; import org.cloudfoundry.multiapps.controller.core.cf.metadata.criteria.MtaMetadataCriteria; import org.cloudfoundry.multiapps.controller.core.cf.metadata.criteria.MtaMetadataCriteriaBuilder; @@ -15,9 +16,6 @@ import org.cloudfoundry.multiapps.controller.core.cf.metadata.util.MtaMetadataUtil; import org.cloudfoundry.multiapps.controller.core.model.DeployedMta; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudEntity; - @Named public class DeployedMtaDetector { @@ -68,7 +66,8 @@ public List detectDeployedMtasByNamespace(String mtaNamespace, Clou .exists() .and() .label(MtaMetadataLabels.MTA_NAMESPACE) - .hasValueOrIsntPresent(MtaMetadataUtil.getHashedLabel(mtaNamespace)) + .hasValueOrIsntPresent( + MtaMetadataUtil.getHashedLabel(mtaNamespace)) .build(); return getDeployedMtasByMetadataSelectionCriteria(selectionCriteria, client); @@ -80,7 +79,8 @@ public Optional detectDeployedMtaByNameAndNamespace(String mtaName, .hasValue(MtaMetadataUtil.getHashedLabel(mtaName)) .and() .label(MtaMetadataLabels.MTA_NAMESPACE) - .hasValueOrIsntPresent(MtaMetadataUtil.getHashedLabel(mtaNamespace)) + .hasValueOrIsntPresent( + MtaMetadataUtil.getHashedLabel(mtaNamespace)) .build(); return getDeployedMtasByMetadataSelectionCriteria(selectionCriteria, client).stream() diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/detect/DeployedMtaRequiredDataOnlyDetector.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/detect/DeployedMtaRequiredDataOnlyDetector.java index 91f3acb2cb..df8c5db4bc 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/detect/DeployedMtaRequiredDataOnlyDetector.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/detect/DeployedMtaRequiredDataOnlyDetector.java @@ -4,14 +4,12 @@ import jakarta.inject.Inject; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudEntity; import org.cloudfoundry.multiapps.controller.core.cf.metadata.criteria.MtaMetadataCriteria; import org.cloudfoundry.multiapps.controller.core.cf.metadata.entity.processor.MtaMetadataEntityAggregator; import org.cloudfoundry.multiapps.controller.core.cf.metadata.entity.processor.MtaMetadataEntityCollector; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudEntity; - @Named("deployedMtaRequiredDataOnlyDetector") public class DeployedMtaRequiredDataOnlyDetector extends DeployedMtaDetector { diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/entity/processor/MtaMetadataApplicationCollector.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/entity/processor/MtaMetadataApplicationCollector.java index aa949b310e..1b82b5dff3 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/entity/processor/MtaMetadataApplicationCollector.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/entity/processor/MtaMetadataApplicationCollector.java @@ -3,12 +3,10 @@ import java.util.List; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.core.cf.metadata.criteria.MtaMetadataCriteria; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; - @Named public class MtaMetadataApplicationCollector implements MtaMetadataEntityCollector { diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/entity/processor/MtaMetadataEntityAggregator.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/entity/processor/MtaMetadataEntityAggregator.java index 5490a99dd1..6706ee2321 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/entity/processor/MtaMetadataEntityAggregator.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/entity/processor/MtaMetadataEntityAggregator.java @@ -7,8 +7,10 @@ import jakarta.inject.Inject; import jakarta.inject.Named; - import org.apache.commons.collections4.ListUtils; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudEntity; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; import org.cloudfoundry.multiapps.controller.core.cf.metadata.ImmutableMtaMetadata; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadata; import org.cloudfoundry.multiapps.controller.core.cf.metadata.processor.MtaMetadataParser; @@ -19,10 +21,6 @@ import org.cloudfoundry.multiapps.controller.core.model.ImmutableDeployedMtaService; import org.cloudfoundry.multiapps.mta.model.Version; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudEntity; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; - @Named public class MtaMetadataEntityAggregator { diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/entity/processor/MtaMetadataEntityCollector.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/entity/processor/MtaMetadataEntityCollector.java index 50a1df4392..2198713b8c 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/entity/processor/MtaMetadataEntityCollector.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/entity/processor/MtaMetadataEntityCollector.java @@ -2,15 +2,14 @@ import java.util.List; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudEntity; import org.cloudfoundry.multiapps.controller.core.cf.metadata.criteria.MtaMetadataCriteria; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudEntity; - public interface MtaMetadataEntityCollector { List collect(CloudControllerClient client, MtaMetadataCriteria criteria); - + List collectRequiredDataOnly(CloudControllerClient client, MtaMetadataCriteria criteria); } diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/entity/processor/MtaMetadataServiceCollector.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/entity/processor/MtaMetadataServiceCollector.java index 02daac91e1..84dd7e2d87 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/entity/processor/MtaMetadataServiceCollector.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/entity/processor/MtaMetadataServiceCollector.java @@ -3,12 +3,10 @@ import java.util.List; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; import org.cloudfoundry.multiapps.controller.core.cf.metadata.criteria.MtaMetadataCriteria; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; - @Named public class MtaMetadataServiceCollector implements MtaMetadataEntityCollector { @@ -16,7 +14,7 @@ public class MtaMetadataServiceCollector implements MtaMetadataEntityCollector collect(CloudControllerClient client, MtaMetadataCriteria criteria) { return client.getServiceInstancesByMetadataLabelSelector(criteria.get()); } - + @Override public List collectRequiredDataOnly(CloudControllerClient client, MtaMetadataCriteria criteria) { return client.getServiceInstancesWithoutAuxiliaryContentByMetadataLabelSelector(criteria.get()); diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/processor/MtaMetadataParser.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/processor/MtaMetadataParser.java index 1a8a5a1ae1..f9503d54ee 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/processor/MtaMetadataParser.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/processor/MtaMetadataParser.java @@ -6,9 +6,11 @@ import jakarta.inject.Inject; import jakarta.inject.Named; - import org.apache.commons.lang3.StringUtils; import org.cloudfoundry.client.v3.Metadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudEntity; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; import org.cloudfoundry.multiapps.controller.core.Constants; import org.cloudfoundry.multiapps.controller.core.Messages; import org.cloudfoundry.multiapps.controller.core.cf.metadata.ImmutableMtaMetadata; @@ -19,10 +21,6 @@ import org.cloudfoundry.multiapps.controller.core.model.ImmutableDeployedMtaApplication; import org.cloudfoundry.multiapps.controller.core.model.ImmutableDeployedMtaService; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudEntity; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; - @Named public class MtaMetadataParser extends BaseMtaMetadataParser { @@ -84,8 +82,7 @@ public DeployedMtaApplication parseDeployedMtaApplication(CloudApplication appli public DeployedMtaService parseDeployedMtaService(CloudServiceInstance serviceInstance) { mtaMetadataValidator.validate(serviceInstance); String resourceName = parseNameAttribute(serviceInstance.getV3Metadata() - .getAnnotations(), - MtaMetadataAnnotations.MTA_RESOURCE); + .getAnnotations(), MtaMetadataAnnotations.MTA_RESOURCE); return ImmutableDeployedMtaService.builder() .from(serviceInstance) diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/processor/MtaMetadataValidator.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/processor/MtaMetadataValidator.java index a9521406d7..69e26dce88 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/processor/MtaMetadataValidator.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/processor/MtaMetadataValidator.java @@ -5,18 +5,16 @@ import java.util.Map; import jakarta.inject.Named; - import org.cloudfoundry.multiapps.common.ContentException; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudEntity; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; import org.cloudfoundry.multiapps.controller.core.Constants; import org.cloudfoundry.multiapps.controller.core.Messages; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadataAnnotations; import org.cloudfoundry.multiapps.controller.core.cf.metadata.util.MtaMetadataUtil; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudEntity; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; - @Named public class MtaMetadataValidator { @@ -61,8 +59,8 @@ private void validateAttributeContainsName(CloudEntity entity, String attributeK .get(attributeKey); Map mtaModuleMap = JsonUtil.convertJsonToMap(mtaModule); if (!mtaModuleMap.containsKey(Constants.ATTR_NAME)) { - throw new ContentException(MessageFormat.format(Messages.METADATA_OF_0_CONTAINS_INVALID_VALUE_FOR_1, entity.getName(), - Constants.ATTR_NAME)); + throw new ContentException( + MessageFormat.format(Messages.METADATA_OF_0_CONTAINS_INVALID_VALUE_FOR_1, entity.getName(), Constants.ATTR_NAME)); } } diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/util/MtaMetadataUtil.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/util/MtaMetadataUtil.java index 4d498ca9f5..59b674ab9e 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/util/MtaMetadataUtil.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/util/MtaMetadataUtil.java @@ -5,12 +5,11 @@ import org.apache.commons.lang3.StringUtils; import org.cloudfoundry.client.v3.Metadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudEntity; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadataAnnotations; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadataLabels; import org.springframework.util.DigestUtils; -import com.sap.cloudfoundry.client.facade.domain.CloudEntity; - public class MtaMetadataUtil { public static final List MTA_METADATA_MANDATORY_LABELS = List.of(MtaMetadataLabels.MTA_ID); @@ -30,8 +29,8 @@ public static boolean hasMtaMetadata(CloudEntity entity) { .keySet(); Set metadataAnnotations = metadata.getAnnotations() .keySet(); - return metadataLabels.containsAll(MTA_METADATA_MANDATORY_LABELS) - && metadataAnnotations.containsAll(MTA_METADATA_MANDATORY_ANNOTATIONS); + return metadataLabels.containsAll(MTA_METADATA_MANDATORY_LABELS) && metadataAnnotations.containsAll( + MTA_METADATA_MANDATORY_ANNOTATIONS); } public static String getHashedLabel(String mtaLabel) { diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/util/DeployedAfterModulesContentValidator.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/util/DeployedAfterModulesContentValidator.java index 782a6463b5..6ff614c8fb 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/util/DeployedAfterModulesContentValidator.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/util/DeployedAfterModulesContentValidator.java @@ -8,14 +8,13 @@ import java.util.stream.Collectors; import org.cloudfoundry.multiapps.common.ContentException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; import org.cloudfoundry.multiapps.controller.core.Messages; import org.cloudfoundry.multiapps.controller.core.helpers.ModuleToDeployHelper; import org.cloudfoundry.multiapps.controller.core.util.UserMessageLogger; import org.cloudfoundry.multiapps.mta.model.Module; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; - public class DeployedAfterModulesContentValidator implements ModulesContentValidator { private static final String DEFAULT_MESSAGE_DELIMITER = ", "; @@ -57,17 +56,20 @@ private boolean areModuleDependenciesResolvable(Module module, Set modul return true; } return moduleDependencies.stream() - .allMatch(dependency -> isModuleDependencyResolvable(moduleNamesForDeployment, module.getName(), dependency)); + .allMatch( + dependency -> isModuleDependencyResolvable(moduleNamesForDeployment, module.getName(), dependency)); } - private boolean isModuleDependencyResolvable(Set moduleNamesForDeployment, String moduleWithDependency, String dependencyModule) { + private boolean isModuleDependencyResolvable(Set moduleNamesForDeployment, String moduleWithDependency, + String dependencyModule) { if (moduleNamesForDeployment.contains(dependencyModule)) { return true; } Module dependencyNotForDeployment = allModulesInArchive.get(dependencyModule); if (dependencyNotForDeployment != null && !moduleToDeployHelper.isApplication(dependencyNotForDeployment)) { - userMessageLogger.warn(MessageFormat.format(Messages.MODULE_0_DEPENDS_ON_MODULE_1_WHICH_CANNOT_BE_RESOLVED, - moduleWithDependency, dependencyModule)); + userMessageLogger.warn( + MessageFormat.format(Messages.MODULE_0_DEPENDS_ON_MODULE_1_WHICH_CANNOT_BE_RESOLVED, moduleWithDependency, + dependencyModule)); return true; } return doesAppExist(dependencyModule); diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ApplicationCloudModelBuilder.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ApplicationCloudModelBuilder.java index 66fa25677f..2910e5e4e7 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ApplicationCloudModelBuilder.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ApplicationCloudModelBuilder.java @@ -13,6 +13,9 @@ import org.apache.commons.collections4.CollectionUtils; import org.cloudfoundry.multiapps.common.ContentException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudTask; import org.cloudfoundry.multiapps.controller.client.lib.domain.BindingDetails; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended.AttributeUpdateStrategy; @@ -46,10 +49,6 @@ import org.cloudfoundry.multiapps.mta.model.Resource; import org.cloudfoundry.multiapps.mta.util.PropertiesUtil; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; -import com.sap.cloudfoundry.client.facade.domain.CloudTask; - public class ApplicationCloudModelBuilder { private static final int MTA_MAJOR_VERSION = 2; @@ -73,10 +72,8 @@ protected ApplicationCloudModelBuilder(AbstractBuilder builder) { this.deploymentDescriptor = builder.deploymentDescriptor; this.namespace = builder.namespace; this.prettyPrinting = builder.prettyPrinting; - this.applicationEnvCloudModelBuilder = new ApplicationEnvironmentCloudModelBuilder(deploymentDescriptor, - builder.deployId, - namespace, - prettyPrinting); + this.applicationEnvCloudModelBuilder = new ApplicationEnvironmentCloudModelBuilder(deploymentDescriptor, builder.deployId, + namespace, prettyPrinting); this.deployedMta = builder.deployedMta; this.parametersChainBuilder = new ParametersChainBuilder(deploymentDescriptor); this.stepLogger = builder.userMessageLogger; @@ -293,8 +290,8 @@ protected ServiceKeyToInject buildServiceKeyToInject(RequiredDependency dependen } public List getApplicationDomains(List> parametersList, Module module) { - return getApplicationRoutesCloudModelBuilder(parametersList).getApplicationDomains(module, - parametersChainBuilder.buildModuleChain(module.getName())); + return getApplicationRoutesCloudModelBuilder(parametersList).getApplicationDomains(module, parametersChainBuilder.buildModuleChain( + module.getName())); } protected Resource getResource(String dependencyName) { diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ApplicationRoutesCloudModelBuilder.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ApplicationRoutesCloudModelBuilder.java index 13805151c0..40ebdedbb6 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ApplicationRoutesCloudModelBuilder.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ApplicationRoutesCloudModelBuilder.java @@ -6,6 +6,8 @@ import java.util.Map; import java.util.Set; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.model.DeployedMtaApplication; import org.cloudfoundry.multiapps.controller.core.model.SupportedParameters; @@ -16,9 +18,6 @@ import org.cloudfoundry.multiapps.mta.model.Module; import org.cloudfoundry.multiapps.mta.util.PropertiesUtil; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; - public class ApplicationRoutesCloudModelBuilder { private final DeploymentDescriptor descriptor; diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v2/CloudHandlerFactoryV2.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v2/CloudHandlerFactoryV2.java index c6638ca64b..83faaf7131 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v2/CloudHandlerFactoryV2.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v2/CloudHandlerFactoryV2.java @@ -5,6 +5,7 @@ import java.util.Set; import org.cloudfoundry.multiapps.common.util.MiscUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; import org.cloudfoundry.multiapps.controller.core.cf.CloudHandlerFactory; import org.cloudfoundry.multiapps.controller.core.cf.detect.AppSuffixDeterminer; import org.cloudfoundry.multiapps.controller.core.helpers.v2.ConfigurationFilterParser; @@ -27,8 +28,6 @@ import org.cloudfoundry.multiapps.mta.model.Platform; import org.cloudfoundry.multiapps.mta.resolvers.LiveRoutesProvidedParametersResolver; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; - public class CloudHandlerFactoryV2 extends HandlerFactoryV2 implements CloudHandlerFactory { @Override @@ -55,16 +54,16 @@ public ConfigurationReferencesResolver getConfigurationReferencesResolver(Deploy CloudTarget cloudTarget, ApplicationConfiguration configuration, String namespace) { ParametersChainBuilder chainBuilder = new ParametersChainBuilder(deploymentDescriptor, null); - org.cloudfoundry.multiapps.controller.core.helpers.v2.ConfigurationFilterParser filterParser = new org.cloudfoundry.multiapps.controller.core.helpers.v2.ConfigurationFilterParser(cloudTarget, - chainBuilder, - namespace); + org.cloudfoundry.multiapps.controller.core.helpers.v2.ConfigurationFilterParser filterParser = new org.cloudfoundry.multiapps.controller.core.helpers.v2.ConfigurationFilterParser( + cloudTarget, chainBuilder, namespace); return new ConfigurationReferencesResolver(configurationEntryService, filterParser, cloudTarget, configuration); } @Override - public ConfigurationReferencesResolver - getConfigurationReferencesResolver(ConfigurationEntryService configurationEntryService, ConfigurationFilterParser filterParser, - CloudTarget cloudTarget, ApplicationConfiguration configuration) { + public ConfigurationReferencesResolver getConfigurationReferencesResolver(ConfigurationEntryService configurationEntryService, + ConfigurationFilterParser filterParser, + CloudTarget cloudTarget, + ApplicationConfiguration configuration) { return new ConfigurationReferencesResolver(configurationEntryService, MiscUtil.cast(filterParser), cloudTarget, configuration); } @@ -99,10 +98,9 @@ public PlatformMerger getPlatformMerger(Platform platform) { } @Override - public ConfigurationSubscriptionFactory - getConfigurationSubscriptionFactory(DeploymentDescriptor descriptor, - Map resolvedReferences, - Set dynamicResolvableParameters) { + public ConfigurationSubscriptionFactory getConfigurationSubscriptionFactory(DeploymentDescriptor descriptor, + Map resolvedReferences, + Set dynamicResolvableParameters) { return new ConfigurationSubscriptionFactory(descriptor, resolvedReferences, dynamicResolvableParameters); } diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ServiceKeysCloudModelBuilder.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ServiceKeysCloudModelBuilder.java index 51a2155244..ef5cb4a984 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ServiceKeysCloudModelBuilder.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ServiceKeysCloudModelBuilder.java @@ -8,6 +8,8 @@ import org.cloudfoundry.client.v3.Metadata; import org.cloudfoundry.multiapps.common.ContentException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceKey; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.model.SupportedParameters; import org.cloudfoundry.multiapps.controller.core.util.CloudModelBuilderUtil; @@ -15,9 +17,6 @@ import org.cloudfoundry.multiapps.mta.model.DeploymentDescriptor; import org.cloudfoundry.multiapps.mta.model.Resource; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceKey; - public class ServiceKeysCloudModelBuilder { protected final DeploymentDescriptor descriptor; @@ -32,9 +31,9 @@ public ServiceKeysCloudModelBuilder(DeploymentDescriptor deploymentDescriptor, S public Map> build() { return descriptor.getResources() - .stream() - .filter(CloudModelBuilderUtil::isService) - .collect(Collectors.toMap(Resource::getName, this::getServiceKeysForService)); + .stream() + .filter(CloudModelBuilderUtil::isService) + .collect(Collectors.toMap(Resource::getName, this::getServiceKeysForService)); } protected List getServiceKeysForService(Resource resource) { @@ -79,8 +78,9 @@ protected List> getServiceKeysMaps(Resource resource) { protected String getInvalidServiceKeysErrorMessage(String serviceName, Object serviceConfig) { return MessageFormat.format(org.cloudfoundry.multiapps.mta.Messages.INVALID_TYPE_FOR_KEY, - org.cloudfoundry.multiapps.mta.util.NameUtil.getPrefixedName(serviceName, SupportedParameters.SERVICE_KEYS), Map.class.getSimpleName(), - serviceConfig.getClass() - .getSimpleName()); + org.cloudfoundry.multiapps.mta.util.NameUtil.getPrefixedName(serviceName, + SupportedParameters.SERVICE_KEYS), + Map.class.getSimpleName(), serviceConfig.getClass() + .getSimpleName()); } } diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v3/CloudHandlerFactoryV3.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v3/CloudHandlerFactoryV3.java index 132ab2f04f..4a535123df 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v3/CloudHandlerFactoryV3.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v3/CloudHandlerFactoryV3.java @@ -4,6 +4,7 @@ import java.util.Map; import java.util.Set; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; import org.cloudfoundry.multiapps.controller.core.cf.CloudHandlerFactory; import org.cloudfoundry.multiapps.controller.core.cf.detect.AppSuffixDeterminer; import org.cloudfoundry.multiapps.controller.core.helpers.v2.ConfigurationFilterParser; @@ -26,8 +27,6 @@ import org.cloudfoundry.multiapps.mta.model.Platform; import org.cloudfoundry.multiapps.mta.resolvers.LiveRoutesProvidedParametersResolver; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; - public class CloudHandlerFactoryV3 extends HandlerFactoryV3 implements CloudHandlerFactory { @Override @@ -59,9 +58,10 @@ public ConfigurationReferencesResolver getConfigurationReferencesResolver(Deploy } @Override - public ConfigurationReferencesResolver - getConfigurationReferencesResolver(ConfigurationEntryService configurationEntryService, ConfigurationFilterParser filterParser, - CloudTarget cloudTarget, ApplicationConfiguration configuration) { + public ConfigurationReferencesResolver getConfigurationReferencesResolver(ConfigurationEntryService configurationEntryService, + ConfigurationFilterParser filterParser, + CloudTarget cloudTarget, + ApplicationConfiguration configuration) { return new ConfigurationReferencesResolver(configurationEntryService, filterParser, cloudTarget, configuration); } @@ -96,10 +96,9 @@ public PlatformMerger getPlatformMerger(Platform platform) { } @Override - public ConfigurationSubscriptionFactory - getConfigurationSubscriptionFactory(DeploymentDescriptor descriptor, - Map resolvedReferences, - Set dynamicResolvableParameters) { + public ConfigurationSubscriptionFactory getConfigurationSubscriptionFactory(DeploymentDescriptor descriptor, + Map resolvedReferences, + Set dynamicResolvableParameters) { return new ConfigurationSubscriptionFactory(descriptor, resolvedReferences, dynamicResolvableParameters); } diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v3/ServiceKeysCloudModelBuilder.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v3/ServiceKeysCloudModelBuilder.java index 3615c0a716..542144984f 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v3/ServiceKeysCloudModelBuilder.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v3/ServiceKeysCloudModelBuilder.java @@ -4,12 +4,11 @@ import java.util.Map; import java.util.stream.Collectors; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; import org.cloudfoundry.multiapps.controller.core.util.CloudModelBuilderUtil; import org.cloudfoundry.multiapps.mta.model.DeploymentDescriptor; import org.cloudfoundry.multiapps.mta.model.Resource; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; - public class ServiceKeysCloudModelBuilder extends org.cloudfoundry.multiapps.controller.core.cf.v2.ServiceKeysCloudModelBuilder { public ServiceKeysCloudModelBuilder(DeploymentDescriptor deploymentDescriptor, String namespace, String spaceGuid) { @@ -19,10 +18,10 @@ public ServiceKeysCloudModelBuilder(DeploymentDescriptor deploymentDescriptor, S @Override public Map> build() { return descriptor.getResources() - .stream() - .filter(CloudModelBuilderUtil::isService) - .filter(Resource::isActive) - .collect(Collectors.toMap(Resource::getName, this::getServiceKeysForService)); + .stream() + .filter(CloudModelBuilderUtil::isService) + .filter(Resource::isActive) + .collect(Collectors.toMap(Resource::getName, this::getServiceKeysForService)); } } diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/helpers/ApplicationAttributes.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/helpers/ApplicationAttributes.java index aa0a25064c..f103b456ac 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/helpers/ApplicationAttributes.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/helpers/ApplicationAttributes.java @@ -5,11 +5,10 @@ import org.cloudfoundry.multiapps.common.ParsingException; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.core.Constants; import org.cloudfoundry.multiapps.controller.core.Messages; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; - public class ApplicationAttributes { private final String appName; @@ -29,11 +28,8 @@ public T get(String attributeName, Class attributeClass, T defaultValue) Object attribute = attributes.getOrDefault(attributeName, defaultValue); if (!hasCorrectType(attribute, attributeClass)) { Class actualAttributeClass = attribute.getClass(); - throw new ParsingException(Messages.ATTRIBUTE_0_OF_APP_1_IS_OF_TYPE_2_INSTEAD_OF_3, - attributeName, - appName, - actualAttributeClass.getSimpleName(), - attributeClass.getSimpleName()); + throw new ParsingException(Messages.ATTRIBUTE_0_OF_APP_1_IS_OF_TYPE_2_INSTEAD_OF_3, attributeName, appName, + actualAttributeClass.getSimpleName(), attributeClass.getSimpleName()); } return (T) attribute; } diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/helpers/ApplicationEnvironmentUpdater.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/helpers/ApplicationEnvironmentUpdater.java index cd77232af1..ea84301d48 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/helpers/ApplicationEnvironmentUpdater.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/helpers/ApplicationEnvironmentUpdater.java @@ -6,9 +6,8 @@ import org.cloudfoundry.multiapps.common.SLException; import org.cloudfoundry.multiapps.common.util.JsonUtil; import org.cloudfoundry.multiapps.common.util.MapUtil; - -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; public class ApplicationEnvironmentUpdater { diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/helpers/ClientHelper.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/helpers/ClientHelper.java index 8419844c1c..bee4aa6fc4 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/helpers/ClientHelper.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/helpers/ClientHelper.java @@ -3,14 +3,13 @@ import java.text.MessageFormat; import java.util.UUID; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.rest.CloudSpaceClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.rest.CloudSpaceClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudSpace; - public class ClientHelper { private static final Logger LOGGER = LoggerFactory.getLogger(ClientHelper.class); diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/helpers/MtaConfigurationPurger.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/helpers/MtaConfigurationPurger.java index 6621cd3e8c..060abf9fd4 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/helpers/MtaConfigurationPurger.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/helpers/MtaConfigurationPurger.java @@ -1,7 +1,5 @@ package org.cloudfoundry.multiapps.controller.core.helpers; -import static org.cloudfoundry.multiapps.controller.core.cf.metadata.util.MtaMetadataUtil.hasMtaMetadata; - import java.text.MessageFormat; import java.util.List; import java.util.Set; @@ -9,6 +7,10 @@ import java.util.stream.Stream; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.rest.CloudSpaceClient; import org.cloudfoundry.multiapps.controller.core.Messages; import org.cloudfoundry.multiapps.controller.core.auditlogging.MtaConfigurationPurgerAuditLog; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadata; @@ -23,10 +25,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.rest.CloudSpaceClient; +import static org.cloudfoundry.multiapps.controller.core.cf.metadata.util.MtaMetadataUtil.hasMtaMetadata; public class MtaConfigurationPurger { @@ -104,9 +103,8 @@ private boolean isStillRelevant(List stillRelevantEntries, C private boolean haveSameProviderIdAndVersion(ConfigurationEntry entry1, ConfigurationEntry entry2) { return entry1.getProviderId() - .equals(entry2.getProviderId()) - && entry1.getProviderVersion() - .equals(entry2.getProviderVersion()); + .equals(entry2.getProviderId()) && entry1.getProviderVersion() + .equals(entry2.getProviderVersion()); } private List getStillRelevantConfigurationEntries(List apps) { diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/model/DeployedMtaApplication.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/model/DeployedMtaApplication.java index deb4d8b91f..786aafff15 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/model/DeployedMtaApplication.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/model/DeployedMtaApplication.java @@ -2,11 +2,10 @@ import java.util.List; -import org.immutables.value.Value; - import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.immutables.value.Value; @Value.Immutable @JsonSerialize(as = ImmutableDeployedMtaApplication.class) diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/model/DeployedMtaService.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/model/DeployedMtaService.java index 199f044091..94817644fd 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/model/DeployedMtaService.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/model/DeployedMtaService.java @@ -1,11 +1,10 @@ package org.cloudfoundry.multiapps.controller.core.model; -import org.cloudfoundry.multiapps.common.Nullable; -import org.immutables.value.Value; - import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.common.Nullable; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.immutables.value.Value; @Value.Immutable @JsonSerialize(as = ImmutableDeployedMtaService.class) diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/model/DeployedMtaServiceKey.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/model/DeployedMtaServiceKey.java index 881082982e..1cfc63078c 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/model/DeployedMtaServiceKey.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/model/DeployedMtaServiceKey.java @@ -1,11 +1,10 @@ package org.cloudfoundry.multiapps.controller.core.model; -import org.cloudfoundry.multiapps.common.Nullable; -import org.immutables.value.Value; - import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.common.Nullable; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.immutables.value.Value; @Value.Immutable @JsonSerialize(as = ImmutableDeployedMtaServiceKey.class) diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/model/IncrementalAppInstanceUpdateConfiguration.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/model/IncrementalAppInstanceUpdateConfiguration.java index 12afb00686..c1d078497a 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/model/IncrementalAppInstanceUpdateConfiguration.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/model/IncrementalAppInstanceUpdateConfiguration.java @@ -1,11 +1,10 @@ package org.cloudfoundry.multiapps.controller.core.model; -import org.immutables.value.Value; - import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.sap.cloudfoundry.client.facade.Nullable; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.Nullable; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.immutables.value.Value; @Value.Immutable @JsonSerialize(as = ImmutableIncrementalAppInstanceUpdateConfiguration.class) diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/model/TypedServiceOperationState.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/model/TypedServiceOperationState.java index b4ee4f389a..d4161d2c21 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/model/TypedServiceOperationState.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/model/TypedServiceOperationState.java @@ -2,10 +2,9 @@ import java.text.MessageFormat; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.core.Messages; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; - public enum TypedServiceOperationState { DONE, FAILED, CREATING, UPDATING, DELETING; @@ -20,8 +19,8 @@ public static TypedServiceOperationState fromServiceOperation(ServiceOperation s case IN_PROGRESS: return fromOngoingServiceOperation(serviceOperation); default: - throw new IllegalStateException(MessageFormat.format(Messages.ILLEGAL_SERVICE_OPERATION_STATE, - serviceOperation.getState())); + throw new IllegalStateException( + MessageFormat.format(Messages.ILLEGAL_SERVICE_OPERATION_STATE, serviceOperation.getState())); } } diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/ApplicationAttributeUpdateStrategyParser.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/ApplicationAttributeUpdateStrategyParser.java index 6329f63548..427e338c44 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/ApplicationAttributeUpdateStrategyParser.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/ApplicationAttributeUpdateStrategyParser.java @@ -14,7 +14,7 @@ public class ApplicationAttributeUpdateStrategyParser implements ParametersParse @Override public CloudApplicationExtended.AttributeUpdateStrategy parse(List> parametersList) { Map attributesUpdateStrategy = getAttributesUpdateStrategyParameter(parametersList); - ImmutableCloudApplicationExtended.AttributeUpdateStrategy.Builder builder = ImmutableCloudApplicationExtended.AttributeUpdateStrategy.builder(); + ImmutableCloudApplicationExtended.ImmutableAttributeUpdateStrategy.Builder builder = ImmutableCloudApplicationExtended.ImmutableAttributeUpdateStrategy.builder(); Boolean shouldKeepExistingEnv = shouldKeepExistingEnv(attributesUpdateStrategy); Boolean shouldKeepExistingRoutes = shouldKeepExistingRoutes(attributesUpdateStrategy); Boolean shouldKeepExistingServiceBindings = shouldKeepExistingServiceBindings(attributesUpdateStrategy); @@ -46,7 +46,8 @@ private Boolean shouldKeepExistingRoutes(Map attributesUpdateSt } private Boolean shouldKeepExistingServiceBindings(Map attributesUpdateStrategy) { - return attributesUpdateStrategy.get(SupportedParameters.ApplicationUpdateStrategy.SERVICE_BINDINGS_APPLICATION_ATTRIBUTES_UPDATE_STRATEGY); + return attributesUpdateStrategy.get( + SupportedParameters.ApplicationUpdateStrategy.SERVICE_BINDINGS_APPLICATION_ATTRIBUTES_UPDATE_STRATEGY); } } diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/DockerInfoParser.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/DockerInfoParser.java index aaf799b8c7..5c2337ec51 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/DockerInfoParser.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/DockerInfoParser.java @@ -4,13 +4,12 @@ import java.util.List; import java.util.Map; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DockerCredentials; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DockerInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableDockerCredentials; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableDockerInfo; import org.cloudfoundry.multiapps.mta.util.PropertiesUtil; -import com.sap.cloudfoundry.client.facade.domain.DockerCredentials; -import com.sap.cloudfoundry.client.facade.domain.DockerInfo; -import com.sap.cloudfoundry.client.facade.domain.ImmutableDockerCredentials; -import com.sap.cloudfoundry.client.facade.domain.ImmutableDockerInfo; - public class DockerInfoParser implements ParametersParser { private static final String DOCKER = "docker"; diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/IdleRouteParametersParser.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/IdleRouteParametersParser.java index 7bcdacbd8d..925a9186a2 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/IdleRouteParametersParser.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/IdleRouteParametersParser.java @@ -8,15 +8,14 @@ import java.util.stream.Collectors; import org.cloudfoundry.multiapps.common.util.MapUtil; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudDomain; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudRoute; import org.cloudfoundry.multiapps.controller.core.model.SupportedParameters; import org.cloudfoundry.multiapps.controller.core.util.ApplicationURI; import org.cloudfoundry.multiapps.controller.core.validators.parameters.RoutesValidator; import org.cloudfoundry.multiapps.mta.util.PropertiesUtil; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudDomain; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudRoute; - public class IdleRouteParametersParser extends RouteParametersParser { public IdleRouteParametersParser(String defaultHost, String defaultDomain, String routePath) { @@ -43,9 +42,8 @@ public Set getApplicationRoutes(List> parameters } private Set getIdleRoutes(List> parametersList) { - List> idleRoutesMaps = RoutesValidator.applyRoutesType(PropertiesUtil.getPropertyValue(parametersList, - SupportedParameters.IDLE_ROUTES, - null)); + List> idleRoutesMaps = RoutesValidator.applyRoutesType( + PropertiesUtil.getPropertyValue(parametersList, SupportedParameters.IDLE_ROUTES, null)); return idleRoutesMaps.stream() .map(this::parseIdleRouteMap) .filter(Objects::nonNull) @@ -87,9 +85,7 @@ private CloudRoute modifyRoute(CloudRoute inputRoute) { var appUri = new ApplicationURI(defaultHost == null ? inputRoute.getHost() : defaultHost, defaultDomain == null ? inputRoute.getDomain() - .getName() - : defaultDomain, - inputRoute.getPath()); + .getName() : defaultDomain, inputRoute.getPath()); return modifiedRouteBuilder.url(appUri.toCloudRoute() .getUrl()) .build(); diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/RouteParametersParser.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/RouteParametersParser.java index 02078d2f67..1e8c57d824 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/RouteParametersParser.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/RouteParametersParser.java @@ -9,13 +9,12 @@ import java.util.stream.Collectors; import org.cloudfoundry.multiapps.common.util.MapUtil; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; import org.cloudfoundry.multiapps.controller.core.model.SupportedParameters; import org.cloudfoundry.multiapps.controller.core.util.ApplicationURI; import org.cloudfoundry.multiapps.controller.core.validators.parameters.RoutesValidator; import org.cloudfoundry.multiapps.mta.util.PropertiesUtil; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; - public class RouteParametersParser implements ParametersParser> { private final String defaultHost; @@ -97,7 +96,7 @@ protected List getDomainValues(List> parametersList) /** * This method is doing a DesCartesian multiplication for given hosts and domains and returns constructed routes - * + * * @param hosts * @param domains * @return set of all routes created @@ -122,9 +121,8 @@ private void addHostBasedRoutes(Set routes, String domain, List getApplicationRoutes(List> parametersList) { - List> routesMaps = RoutesValidator.applyRoutesType(PropertiesUtil.getPropertyValue(parametersList, - SupportedParameters.ROUTES, - null)); + List> routesMaps = RoutesValidator.applyRoutesType( + PropertiesUtil.getPropertyValue(parametersList, SupportedParameters.ROUTES, null)); return routesMaps.stream() .map(this::parseRouteMap) diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/StagingParametersParser.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/StagingParametersParser.java index b882a48fce..43f2b334ea 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/StagingParametersParser.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/StagingParametersParser.java @@ -4,11 +4,11 @@ import java.util.List; import java.util.Map; -import com.sap.cloudfoundry.client.facade.domain.DockerInfo; -import com.sap.cloudfoundry.client.facade.domain.ImmutableStaging; -import com.sap.cloudfoundry.client.facade.domain.LifecycleType; -import com.sap.cloudfoundry.client.facade.domain.Staging; import org.cloudfoundry.multiapps.common.ContentException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DockerInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableStaging; +import org.cloudfoundry.multiapps.controller.client.facade.domain.LifecycleType; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Staging; import org.cloudfoundry.multiapps.controller.core.model.SupportedParameters; import org.cloudfoundry.multiapps.mta.util.PropertiesUtil; import org.springframework.util.CollectionUtils; diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/TaskParametersParser.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/TaskParametersParser.java index 1ccd80e6c2..6a34a9fd12 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/TaskParametersParser.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/TaskParametersParser.java @@ -5,13 +5,11 @@ import java.util.Map; import java.util.stream.Collectors; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudTask; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudTask; import org.cloudfoundry.multiapps.controller.core.validators.parameters.TasksValidator; import org.cloudfoundry.multiapps.mta.util.PropertiesUtil; -import com.sap.cloudfoundry.client.facade.domain.CloudTask; -import com.sap.cloudfoundry.client.facade.domain.CloudTask.Limits; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudTask; - public class TaskParametersParser implements ParametersParser> { private final String parameterName; @@ -23,9 +21,8 @@ public TaskParametersParser(String parameterName) { @Override public List parse(List> parametersList) { - @SuppressWarnings("unchecked") - List> tasks = (List>) PropertiesUtil.getPropertyValue(parametersList, parameterName, - Collections.emptyList()); + @SuppressWarnings("unchecked") List> tasks = (List>) PropertiesUtil.getPropertyValue( + parametersList, parameterName, Collections.emptyList()); return tasks.stream() .map(cloudTaskMapper::toCloudTask) @@ -42,7 +39,7 @@ public CloudTask toCloudTask(Map rawTask) { .build(); } - private Limits parseLimits(Map rawTask) { + private CloudTask.Limits parseLimits(Map rawTask) { return ImmutableCloudTask.ImmutableLimits.builder() .memory(parseMemory(rawTask)) .disk(parseDiskQuota(rawTask)) diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/security/data/termination/DataTerminationService.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/security/data/termination/DataTerminationService.java index 56d61a5668..ffda6a00e0 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/security/data/termination/DataTerminationService.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/security/data/termination/DataTerminationService.java @@ -1,15 +1,16 @@ package org.cloudfoundry.multiapps.controller.core.security.data.termination; -import static java.text.MessageFormat.format; - import java.text.MessageFormat; import java.time.Duration; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.List; +import jakarta.inject.Inject; +import jakarta.inject.Named; import org.cloudfoundry.multiapps.common.SLException; import org.cloudfoundry.multiapps.controller.api.model.Operation; +import org.cloudfoundry.multiapps.controller.client.facade.CloudCredentials; import org.cloudfoundry.multiapps.controller.core.Messages; import org.cloudfoundry.multiapps.controller.core.auditlogging.MtaConfigurationPurgerAuditLog; import org.cloudfoundry.multiapps.controller.core.cf.clients.CFOptimizedEventGetter; @@ -29,10 +30,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.sap.cloudfoundry.client.facade.CloudCredentials; - -import jakarta.inject.Inject; -import jakarta.inject.Named; +import static java.text.MessageFormat.format; @Named public class DataTerminationService { @@ -96,10 +94,8 @@ private List getSpaceDeleteEvents() { protected CFOptimizedEventGetter getCfOptimizedEventGetter() { CloudCredentials cloudCredentials = new CloudCredentials(configuration.getGlobalAuditorUser(), - configuration.getGlobalAuditorPassword(), - SecurityUtil.CLIENT_ID, - SecurityUtil.CLIENT_SECRET, - configuration.getGlobalAuditorOrigin()); + configuration.getGlobalAuditorPassword(), SecurityUtil.CLIENT_ID, + SecurityUtil.CLIENT_SECRET, configuration.getGlobalAuditorOrigin()); return new CFOptimizedEventGetter(configuration, webClientFactory, cloudCredentials); } @@ -118,8 +114,8 @@ private void deleteConfigurationSubscriptionOrphanData(String spaceId) { if (configurationSubscriptions.isEmpty()) { return; } - configurationSubscriptions.forEach(configurationSubscription -> mtaConfigurationPurgerAuditLog.logDeleteSubscription(spaceId, - configurationSubscription)); + configurationSubscriptions.forEach( + configurationSubscription -> mtaConfigurationPurgerAuditLog.logDeleteSubscription(spaceId, configurationSubscription)); configurationSubscriptionService.createQuery() .deleteAll(spaceId); } diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/security/token/TokenService.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/security/token/TokenService.java index 1e2ad82b96..a29ec50657 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/security/token/TokenService.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/security/token/TokenService.java @@ -12,9 +12,9 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; import jakarta.inject.Inject; import jakarta.inject.Named; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; import org.cloudfoundry.multiapps.controller.client.util.TokenProperties; import org.cloudfoundry.multiapps.controller.core.Constants; import org.cloudfoundry.multiapps.controller.core.Messages; diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/security/token/parsers/JwtTokenParser.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/security/token/parsers/JwtTokenParser.java index 8cca4bad9a..a8e5441bc5 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/security/token/parsers/JwtTokenParser.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/security/token/parsers/JwtTokenParser.java @@ -5,7 +5,8 @@ import jakarta.inject.Inject; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.TokenFactory; import org.cloudfoundry.multiapps.controller.client.uaa.UAAClient; import org.cloudfoundry.multiapps.controller.core.Messages; import org.cloudfoundry.multiapps.controller.core.security.token.parsing.TokenValidationStrategyFactory; @@ -15,9 +16,6 @@ import org.springframework.core.annotation.Order; import org.springframework.security.authentication.InternalAuthenticationServiceException; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; -import com.sap.cloudfoundry.client.facade.oauth2.TokenFactory; - @Named @Order(0) public class JwtTokenParser implements TokenParser { diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/security/token/parsers/TokenParser.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/security/token/parsers/TokenParser.java index 22afbc4bda..ea3617dd2a 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/security/token/parsers/TokenParser.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/security/token/parsers/TokenParser.java @@ -1,9 +1,9 @@ package org.cloudfoundry.multiapps.controller.core.security.token.parsers; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; - import java.util.Optional; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; + public interface TokenParser { Optional parse(String tokenString); diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/security/token/parsers/TokenParserChain.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/security/token/parsers/TokenParserChain.java index 6938a76f04..53a6bd81dd 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/security/token/parsers/TokenParserChain.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/security/token/parsers/TokenParserChain.java @@ -6,15 +6,13 @@ import jakarta.inject.Inject; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; import org.cloudfoundry.multiapps.controller.core.Messages; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.authentication.InternalAuthenticationServiceException; import org.springframework.security.oauth2.core.OAuth2AccessToken; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; - @Named public class TokenParserChain { @@ -40,7 +38,8 @@ private OAuth2AccessTokenWithAdditionalInfo parseTokenString(String tokenString) .filter(Optional::isPresent) .map(Optional::get) .findFirst() - .orElseThrow(() -> new InternalAuthenticationServiceException(Messages.NO_TOKEN_PARSER_FOUND_FOR_THE_CURRENT_TOKEN)); + .orElseThrow( + () -> new InternalAuthenticationServiceException(Messages.NO_TOKEN_PARSER_FOUND_FOR_THE_CURRENT_TOKEN)); } private void logTokenInfo(OAuth2AccessToken accessToken) { diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/util/ApplicationURI.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/util/ApplicationURI.java index 98718d525f..ddacd3f717 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/util/ApplicationURI.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/util/ApplicationURI.java @@ -6,12 +6,11 @@ import java.util.Objects; import org.apache.commons.lang3.StringUtils; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudDomain; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudRoute; import org.cloudfoundry.multiapps.controller.core.model.SupportedParameters; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudDomain; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudRoute; - public class ApplicationURI { private String uri = ""; @@ -49,8 +48,7 @@ public ApplicationURI(CloudRoute route) { return; } setParts(route.getHost(), route.getDomain() - .getName(), - route.getPath()); + .getName(), route.getPath()); } public ApplicationURI(String host, String domain, String path) { diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/util/SecurityUtil.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/util/SecurityUtil.java index 8e3cce6b0e..4570a373d5 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/util/SecurityUtil.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/util/SecurityUtil.java @@ -5,14 +5,13 @@ import java.util.Set; import java.util.stream.Collectors; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; import org.cloudfoundry.multiapps.controller.client.util.TokenProperties; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; import org.springframework.security.oauth2.core.user.DefaultOAuth2User; import org.springframework.security.oauth2.core.user.OAuth2User; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; - public class SecurityUtil { public static final String CLIENT_ID = "cf"; diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/util/UriUtil.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/util/UriUtil.java index 518145a898..dbd671d167 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/util/UriUtil.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/util/UriUtil.java @@ -7,10 +7,9 @@ import java.util.Collection; import java.util.stream.Collectors; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; import org.cloudfoundry.multiapps.controller.core.Messages; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; - public class UriUtil { public static final String DEFAULT_SCHEME_SEPARATOR = "://"; diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/util/UserInfo.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/util/UserInfo.java index 398f318cef..286f893680 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/util/UserInfo.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/util/UserInfo.java @@ -3,7 +3,7 @@ import java.io.Serializable; import java.security.Principal; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; public class UserInfo implements Principal, Serializable { diff --git a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/apps/ApplicationStartupStateCalculatorTest.java b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/apps/ApplicationStartupStateCalculatorTest.java index cda3f7bf15..c47f715990 100644 --- a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/apps/ApplicationStartupStateCalculatorTest.java +++ b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/apps/ApplicationStartupStateCalculatorTest.java @@ -1,7 +1,5 @@ package org.cloudfoundry.multiapps.controller.core.cf.apps; -import static org.junit.jupiter.api.Assertions.assertEquals; - import java.util.Map; import java.util.UUID; import java.util.stream.Collectors; @@ -10,23 +8,24 @@ import org.cloudfoundry.multiapps.common.test.TestUtil; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableInstanceInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableInstancesInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstanceState; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstancesInfo; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.InstancesInfo; -import com.sap.cloudfoundry.client.facade.domain.InstanceState; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudApplication; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableInstancesInfo; -import com.sap.cloudfoundry.client.facade.domain.ImmutableInstanceInfo; +import static org.junit.jupiter.api.Assertions.assertEquals; class ApplicationStartupStateCalculatorTest { public static Stream testComputeCurrentState() { return Stream.of( - // @formatter:off + // @formatter:off // (0) Arguments.of("started-app.json", ApplicationStartupState.STARTED), // (1) @@ -53,7 +52,7 @@ void testComputeCurrentState(String pathToFileContainingAppJson, ApplicationStar public static Stream testComputeDesiredState() { return Stream.of( - // @formatter:off + // @formatter:off // (0) Arguments.of("app-with-no-start-attribute-true.json", true, ApplicationStartupState.STOPPED), // (1) diff --git a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CustomControllerClientErrorHandlerTest.java b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CustomControllerClientErrorHandlerTest.java index 9efc0a0f4f..a8674bbc12 100644 --- a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CustomControllerClientErrorHandlerTest.java +++ b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/clients/CustomControllerClientErrorHandlerTest.java @@ -1,11 +1,9 @@ package org.cloudfoundry.multiapps.controller.core.cf.clients; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; - import java.util.stream.Stream; import org.cloudfoundry.multiapps.common.test.TestUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; import org.cloudfoundry.multiapps.controller.client.util.ResilientCloudOperationExecutor; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -16,16 +14,18 @@ import org.springframework.http.HttpStatus; import org.springframework.web.client.HttpStatusCodeException; -import com.sap.cloudfoundry.client.facade.CloudOperationException; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; class CustomControllerClientErrorHandlerTest { private static final ResilientCloudOperationExecutor NULL_RETRIER = new ResilientCloudOperationExecutor().withRetryCount(0) - .withWaitTimeBetweenRetriesInMillis(0); + .withWaitTimeBetweenRetriesInMillis( + 0); public static Stream testHandleErrorsWithRightExceptionType() { return Stream.of( -// @formatter:off + // @formatter:off // (0) The response body contains a description in the supported format: Arguments.of(prepareHttpStatusCodeException(HttpStatus.BAD_GATEWAY, "Service broker error", "cf-error-response-body-0.json"), new CloudOperationException(HttpStatus.BAD_GATEWAY, "Service broker error", "Application currency-services-core-uaa-dev1!i211 does not exist")), @@ -75,8 +75,10 @@ private static HttpStatusCodeException prepareHttpStatusCodeException(HttpStatus @Test void testHandleErrorsWithWrongExceptionType() { - ResilientCloudOperationExecutor resilientCloudOperationExecutor = new ResilientCloudOperationExecutor().withWaitTimeBetweenRetriesInMillis(0); - CustomControllerClientErrorHandler customControllerClientErrorHandler = new CustomControllerClientErrorHandler().withExecutorFactory(() -> resilientCloudOperationExecutor); + ResilientCloudOperationExecutor resilientCloudOperationExecutor = new ResilientCloudOperationExecutor().withWaitTimeBetweenRetriesInMillis( + 0); + CustomControllerClientErrorHandler customControllerClientErrorHandler = new CustomControllerClientErrorHandler().withExecutorFactory( + () -> resilientCloudOperationExecutor); Assertions.assertThrows(IllegalArgumentException.class, () -> customControllerClientErrorHandler.handleErrors(() -> { throw new IllegalArgumentException("Should not be handled by the error handler"); })); diff --git a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/detect/DeployedMtaDetectorTest.java b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/detect/DeployedMtaDetectorTest.java index c0f909ea8f..e61ff34873 100644 --- a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/detect/DeployedMtaDetectorTest.java +++ b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/detect/DeployedMtaDetectorTest.java @@ -8,11 +8,18 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import com.fasterxml.jackson.core.type.TypeReference; import org.cloudfoundry.client.v3.Metadata; import org.cloudfoundry.multiapps.common.test.TestUtil; import org.cloudfoundry.multiapps.common.test.Tester; import org.cloudfoundry.multiapps.common.test.Tester.Expectation; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceInstance; import org.cloudfoundry.multiapps.controller.core.cf.metadata.entity.processor.MtaMetadataApplicationCollector; import org.cloudfoundry.multiapps.controller.core.cf.metadata.entity.processor.MtaMetadataEntityAggregator; import org.cloudfoundry.multiapps.controller.core.cf.metadata.entity.processor.MtaMetadataEntityCollector; @@ -30,14 +37,6 @@ import org.mockito.Mockito; import org.mockito.MockitoAnnotations; -import com.fasterxml.jackson.core.type.TypeReference; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudApplication; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceInstance; - class DeployedMtaDetectorTest { private final Tester tester = Tester.forClass(getClass()); @@ -71,38 +70,30 @@ void setUp() throws Exception { static Stream testGetAllDeployedMtas() { return Stream.of( - // (1) No MTA applications: - Arguments.of("metadata/apps-01.json", null, - new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-01.json")), - // (2) Applications without module in metadata: - Arguments.of("metadata/apps-02.json", null, - new Expectation(Expectation.Type.EXCEPTION, - "MTA metadata for entity \"mta-application-1\" is incomplete. This indicates that MTA reserved variables in the entity's metadata were modified manually. Either revert the changes or delete the entity.")), - // (3) Services without resource in metadata: - Arguments.of("metadata/apps-03.json", "metadata/services-03.json", - new Expectation(Expectation.Type.EXCEPTION, - "MTA metadata for entity \"mta-service-1\" is incomplete. This indicates that MTA reserved variables in the entity's metadata were modified manually. Either revert the changes or delete the entity.")), - // (4) Two MTA applications: - Arguments.of("metadata/apps-04.json", null, - new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-04.json")), - // (5) Applications from different versions of the same MTA: - Arguments.of("metadata/apps-05.json", null, - new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-05.json")), - // (6) Applications from different versions of the same MTA (same modules): - Arguments.of("metadata/apps-06.json", null, - new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-06.json")), - // (7) Two services with no applications - Arguments.of(null, "metadata/services-07.json", - new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-07.json")), - // (8) Two services with same mta id and different version - Arguments.of(null, "metadata/services-08.json", - new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-08.json")), - // (9) Two apps with one service each - Arguments.of("metadata/apps-09.json", "metadata/services-09.json", - new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-09.json")), - // (10) Two apps with one service and one user provided service each - Arguments.of("metadata/apps-10.json", "metadata/services-10.json", - new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-10.json"))); + // (1) No MTA applications: + Arguments.of("metadata/apps-01.json", null, new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-01.json")), + // (2) Applications without module in metadata: + Arguments.of("metadata/apps-02.json", null, new Expectation(Expectation.Type.EXCEPTION, + "MTA metadata for entity \"mta-application-1\" is incomplete. This indicates that MTA reserved variables in the entity's metadata were modified manually. Either revert the changes or delete the entity.")), + // (3) Services without resource in metadata: + Arguments.of("metadata/apps-03.json", "metadata/services-03.json", new Expectation(Expectation.Type.EXCEPTION, + "MTA metadata for entity \"mta-service-1\" is incomplete. This indicates that MTA reserved variables in the entity's metadata were modified manually. Either revert the changes or delete the entity.")), + // (4) Two MTA applications: + Arguments.of("metadata/apps-04.json", null, new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-04.json")), + // (5) Applications from different versions of the same MTA: + Arguments.of("metadata/apps-05.json", null, new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-05.json")), + // (6) Applications from different versions of the same MTA (same modules): + Arguments.of("metadata/apps-06.json", null, new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-06.json")), + // (7) Two services with no applications + Arguments.of(null, "metadata/services-07.json", new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-07.json")), + // (8) Two services with same mta id and different version + Arguments.of(null, "metadata/services-08.json", new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-08.json")), + // (9) Two apps with one service each + Arguments.of("metadata/apps-09.json", "metadata/services-09.json", + new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-09.json")), + // (10) Two apps with one service and one user provided service each + Arguments.of("metadata/apps-10.json", "metadata/services-10.json", + new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-10.json"))); } static Stream testGetAllDeployedMtasWithoutNamespace() { @@ -111,29 +102,29 @@ static Stream testGetAllDeployedMtasWithoutNamespace() { static Stream testGetAllDeployedMtasByNamespace() { return Stream.of( - // (1) 3 applications, 2 in one mta and 1 in the other: - Arguments.of("namespace", "metadata/apps-11.json", "metadata/services-11.json", - new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-11.json")), - // (2) Two apps with one service each, seraching by default namespace - Arguments.of(null, "metadata/apps-09.json", "metadata/services-09.json", - new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-09.json"))); + // (1) 3 applications, 2 in one mta and 1 in the other: + Arguments.of("namespace", "metadata/apps-11.json", "metadata/services-11.json", + new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-11.json")), + // (2) Two apps with one service each, seraching by default namespace + Arguments.of(null, "metadata/apps-09.json", "metadata/services-09.json", + new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-09.json"))); } static Stream testGetAllDeployedMtasByName() { return Stream.of( - // (1) 3 applications, 2 in one mta and 1 in the other: - Arguments.of("quux", "metadata/apps-11.json", "metadata/services-11.json", - new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-11.json"))); + // (1) 3 applications, 2 in one mta and 1 in the other: + Arguments.of("quux", "metadata/apps-11.json", "metadata/services-11.json", + new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-11.json"))); } static Stream testGetAllDeployedMtaByNameAndNamespace() { return Stream.of( - // (1) 3 applications, 2 in one mta and 1 in the other: - Arguments.of("quux", "namespace", "metadata/apps-13.json", "metadata/services-13.json", - new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-13.json")), - // (2) Two apps with one service each, seraching by default namespace - Arguments.of("quux", null, "metadata/apps-09.json", "metadata/services-09.json", - new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-12.json"))); + // (1) 3 applications, 2 in one mta and 1 in the other: + Arguments.of("quux", "namespace", "metadata/apps-13.json", "metadata/services-13.json", + new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-13.json")), + // (2) Two apps with one service each, seraching by default namespace + Arguments.of("quux", null, "metadata/apps-09.json", "metadata/services-09.json", + new Expectation(Expectation.Type.JSON, "metadata/deployed-mtas-12.json"))); } @ParameterizedTest @@ -157,8 +148,7 @@ void testGetAllDeployedMtasWithoutNamespace(String appsResourceLocation, String @ParameterizedTest @MethodSource void testGetAllDeployedMtasByNamespace(String namespace, String appsResourceLocation, String servicesResourceLocation, - Expectation expectation) - throws IOException { + Expectation expectation) throws IOException { prepareMocks(appsResourceLocation, servicesResourceLocation); tester.test(() -> deployedMtaDetector.detectDeployedMtasByNamespace(namespace, client), expectation); @@ -178,13 +168,11 @@ void testGetAllDeployedMtasByName(String name, String appsResourceLocation, Stri @ParameterizedTest @MethodSource void testGetAllDeployedMtaByNameAndNamespace(String name, String namespace, String appsResourceLocation, - String servicesResourceLocation, Expectation expectation) - throws IOException { + String servicesResourceLocation, Expectation expectation) throws IOException { prepareMocks(appsResourceLocation, servicesResourceLocation); tester.test(() -> deployedMtaDetector.detectDeployedMtaByNameAndNamespace(name, namespace, client) - .get(), - expectation); + .get(), expectation); verifyNameWasChecked(name); verifyNamespaceWasChecked(namespace); } @@ -194,8 +182,8 @@ private void verifyNamespaceWasChecked(String namespace) { Mockito.verify(client) .getApplicationsByMetadataLabelSelector(Mockito.contains("mta_namespace=" + MtaMetadataUtil.getHashedLabel(namespace))); Mockito.verify(client) - .getServiceInstancesByMetadataLabelSelector(Mockito.contains("mta_namespace=" - + MtaMetadataUtil.getHashedLabel(namespace))); + .getServiceInstancesByMetadataLabelSelector( + Mockito.contains("mta_namespace=" + MtaMetadataUtil.getHashedLabel(namespace))); } else { Mockito.verify(client) diff --git a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/entity/processor/MtaMetadataEntityAggregatorTest.java b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/entity/processor/MtaMetadataEntityAggregatorTest.java index 5e271933c0..9ee7e714b9 100644 --- a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/entity/processor/MtaMetadataEntityAggregatorTest.java +++ b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/metadata/entity/processor/MtaMetadataEntityAggregatorTest.java @@ -4,10 +4,14 @@ import java.util.List; 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; import org.cloudfoundry.multiapps.common.test.Tester.Expectation; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudEntity; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; import org.cloudfoundry.multiapps.controller.core.cf.metadata.processor.MtaMetadataParser; import org.cloudfoundry.multiapps.controller.core.cf.metadata.processor.MtaMetadataValidator; import org.junit.jupiter.params.ParameterizedTest; @@ -16,11 +20,6 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import com.fasterxml.jackson.core.type.TypeReference; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudEntity; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; - class MtaMetadataEntityAggregatorTest { private final Tester tester = Tester.forClass(getClass()); private List inputEntities; @@ -33,7 +32,7 @@ class MtaMetadataEntityAggregatorTest { static Stream testAggregate() { return Stream.of( - // @formatter:off + // @formatter:off // (1) 2 mtas in CloudEntities - first has 2 apps and 2 services (with older versions), second had only 1 app Arguments.of("input-apps-01.json", "input-services-01.json", new Expectation(Expectation.Type.JSON, "aggregated-deployed-mtas-01.json")), // (2) 3 versions of the same mta (2 apps and 1 service) - two with namespaces, the last one without diff --git a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ApplicationRoutesCloudModelBuilderTest.java b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ApplicationRoutesCloudModelBuilderTest.java index 747fed6649..7c1d5c4508 100644 --- a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ApplicationRoutesCloudModelBuilderTest.java +++ b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ApplicationRoutesCloudModelBuilderTest.java @@ -1,16 +1,15 @@ package org.cloudfoundry.multiapps.controller.core.cf.v2; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; - import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudDomain; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudRoute; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.model.DeployedMtaApplication; import org.cloudfoundry.multiapps.controller.core.model.SupportedParameters; @@ -22,10 +21,10 @@ import org.mockito.Mockito; import org.mockito.MockitoAnnotations; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudDomain; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudRoute; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; class ApplicationRoutesCloudModelBuilderTest { @@ -41,8 +40,7 @@ class ApplicationRoutesCloudModelBuilderTest { void setUp() throws Exception { MockitoAnnotations.openMocks(this) .close(); - applicationRoutesCloudModelBuilder = new ApplicationRoutesCloudModelBuilder(deploymentDescriptor, - client, + applicationRoutesCloudModelBuilder = new ApplicationRoutesCloudModelBuilder(deploymentDescriptor, client, applicationAttributeUpdateStrategy); } @@ -53,9 +51,8 @@ void testGetApplicationRoutes() { List> moduleParameters = List.of(Map.of(SupportedParameters.ROUTES, List.of(route))); Module module = Mockito.mock(Module.class); DeployedMtaApplication deployedMtaApplication = Mockito.mock(DeployedMtaApplication.class); - List applicationRoutes = new ArrayList<>(applicationRoutesCloudModelBuilder.getApplicationRoutes(module, - moduleParameters, - deployedMtaApplication)); + List applicationRoutes = new ArrayList<>( + applicationRoutesCloudModelBuilder.getApplicationRoutes(module, moduleParameters, deployedMtaApplication)); assertEquals(1, applicationRoutes.size()); assertEquals("abc.cfapps.sap.hana.ondemand.com", applicationRoutes.get(0) .getUrl()); @@ -109,9 +106,8 @@ private CloudRoute buildCloudRoute(String host, String domain, String protocol) private void assertRouteExists(Set routes, String url, String protocol) { boolean routeExists = routes.stream() .anyMatch(route -> route.getUrl() - .equals(url) - && route.getRequestedProtocol() - .equals(protocol)); + .equals(url) && route.getRequestedProtocol() + .equals(protocol)); if (!routeExists) { fail(MessageFormat.format("Route with URL: {0} and protocol {1} does not exists", url, protocol)); } diff --git a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/v2/CloudModelBuilderTest.java b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/v2/CloudModelBuilderTest.java index 0205650217..028496b488 100644 --- a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/v2/CloudModelBuilderTest.java +++ b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/v2/CloudModelBuilderTest.java @@ -10,13 +10,13 @@ import java.util.TreeMap; import java.util.stream.Stream; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; import org.apache.commons.io.IOUtils; import org.cloudfoundry.multiapps.common.test.Tester; import org.cloudfoundry.multiapps.common.test.Tester.Expectation; import org.cloudfoundry.multiapps.common.util.JsonUtil; import org.cloudfoundry.multiapps.common.util.MapUtil; import org.cloudfoundry.multiapps.common.util.YamlParser; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.CloudHandlerFactory; import org.cloudfoundry.multiapps.controller.core.cf.detect.AppSuffixDeterminer; diff --git a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/v3/CloudModelBuilderTest.java b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/v3/CloudModelBuilderTest.java index 205c14c490..f16f712284 100644 --- a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/v3/CloudModelBuilderTest.java +++ b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/v3/CloudModelBuilderTest.java @@ -4,6 +4,7 @@ import java.util.stream.Stream; import org.cloudfoundry.multiapps.common.test.Tester.Expectation; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; import org.cloudfoundry.multiapps.controller.core.cf.CloudHandlerFactory; import org.cloudfoundry.multiapps.controller.core.cf.detect.AppSuffixDeterminer; import org.cloudfoundry.multiapps.controller.core.cf.v2.ApplicationCloudModelBuilder; @@ -20,8 +21,6 @@ import org.mockito.Mockito; import org.mockito.MockitoAnnotations; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; - class CloudModelBuilderTest extends org.cloudfoundry.multiapps.controller.core.cf.v2.CloudModelBuilderTest { @Mock @@ -29,7 +28,7 @@ class CloudModelBuilderTest extends org.cloudfoundry.multiapps.controller.core.c public static Stream getParameters() { return Stream.of( -// @formatter:off + // @formatter:off // (00) Test missing resource type definition: Arguments.of("mtad-missing-resource-type-definition.yaml", "config-01.mtaext", "/mta/cf-platform.json", null, null, false, @@ -60,25 +59,28 @@ protected ServicesCloudModelBuilder getServicesCloudModelBuilder(DeploymentDescr } @Override - protected ApplicationCloudModelBuilder - getApplicationCloudModelBuilder(DeploymentDescriptor deploymentDescriptor, boolean prettyPrinting, DeployedMta deployedMta, - AppSuffixDeterminer appSuffixDeterminer, boolean incrementalBlueGreen) { - deploymentDescriptor = new DescriptorReferenceResolver(deploymentDescriptor, - new ResolverBuilder(), - new ResolverBuilder(), + protected ApplicationCloudModelBuilder getApplicationCloudModelBuilder(DeploymentDescriptor deploymentDescriptor, + boolean prettyPrinting, DeployedMta deployedMta, + AppSuffixDeterminer appSuffixDeterminer, + boolean incrementalBlueGreen) { + deploymentDescriptor = new DescriptorReferenceResolver(deploymentDescriptor, new ResolverBuilder(), new ResolverBuilder(), Collections.emptySet()).resolve(); var client = Mockito.mock(CloudControllerClient.class); Mockito.when(client.getApplicationRoutes(Mockito.any())) .thenReturn(Collections.emptyList()); - return new org.cloudfoundry.multiapps.controller.core.cf.v2.ApplicationCloudModelBuilder.Builder().deploymentDescriptor(deploymentDescriptor) + return new org.cloudfoundry.multiapps.controller.core.cf.v2.ApplicationCloudModelBuilder.Builder().deploymentDescriptor( + deploymentDescriptor) .prettyPrinting(prettyPrinting) .deployedMta(deployedMta) .deployId(DEPLOY_ID) .namespace(namespace) - .userMessageLogger(Mockito.mock(UserMessageLogger.class)) - .appSuffixDeterminer(appSuffixDeterminer) + .userMessageLogger(Mockito.mock( + UserMessageLogger.class)) + .appSuffixDeterminer( + appSuffixDeterminer) .client(client) - .incrementalInstancesUpdate(incrementalBlueGreen) + .incrementalInstancesUpdate( + incrementalBlueGreen) .build(); } @@ -92,8 +94,7 @@ protected UserMessageLogger getUserMessageLogger() { void testWarnMessage(String deploymentDescriptorLocation, String extensionDescriptorLocation, String platformsLocation, String deployedMtaLocation, String namespace, boolean applyNamespace, String[] mtaArchiveModules, String[] mtaModules, String[] deployedApps, Expectation expectedServices, Expectation expectedApps, - AppSuffixDeterminer appSuffixDeterminer) - throws Exception { + AppSuffixDeterminer appSuffixDeterminer) throws Exception { initializeParameters(deploymentDescriptorLocation, extensionDescriptorLocation, platformsLocation, deployedMtaLocation, namespace, applyNamespace, mtaArchiveModules, mtaModules, deployedApps, appSuffixDeterminer, false); resourcesCalculator.calculateContentForBuilding(deploymentDescriptor.getResources()); diff --git a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/helpers/ApplicationAttributesTest.java b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/helpers/ApplicationAttributesTest.java index aa047e80e5..435a66704d 100644 --- a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/helpers/ApplicationAttributesTest.java +++ b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/helpers/ApplicationAttributesTest.java @@ -1,23 +1,22 @@ package org.cloudfoundry.multiapps.controller.core.helpers; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; - import java.text.MessageFormat; import java.util.Map; import org.cloudfoundry.multiapps.common.ParsingException; import org.cloudfoundry.multiapps.common.test.TestUtil; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableLifecycle; +import org.cloudfoundry.multiapps.controller.client.facade.domain.LifecycleType; import org.cloudfoundry.multiapps.controller.core.Messages; import org.junit.jupiter.api.Test; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.LifecycleType; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudApplication; -import com.sap.cloudfoundry.client.facade.domain.ImmutableLifecycle; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; class ApplicationAttributesTest { diff --git a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/helpers/ApplicationEnvironmentUpdaterTest.java b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/helpers/ApplicationEnvironmentUpdaterTest.java index 4b6d1dfcf0..0a26695f5b 100644 --- a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/helpers/ApplicationEnvironmentUpdaterTest.java +++ b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/helpers/ApplicationEnvironmentUpdaterTest.java @@ -7,19 +7,18 @@ import org.cloudfoundry.multiapps.common.test.Tester; import org.cloudfoundry.multiapps.common.test.Tester.Expectation; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableLifecycle; +import org.cloudfoundry.multiapps.controller.client.facade.domain.LifecycleType; 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.Mockito; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.LifecycleType; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudApplication; -import com.sap.cloudfoundry.client.facade.domain.ImmutableLifecycle; - class ApplicationEnvironmentUpdaterTest { private final Tester tester = Tester.forClass(getClass()); @@ -28,7 +27,7 @@ class ApplicationEnvironmentUpdaterTest { public static Stream testUpdateEnv() { return Stream.of( -// @formatter:off + // @formatter:off Arguments.of("application-env-updater-input-00.json", new Expectation(Expectation.Type.JSON, "application-env-updater-result-00.json")), Arguments.of("application-env-updater-input-01.json", new Expectation(Expectation.Type.JSON, "application-env-updater-result-01.json")) // @formatter:on @@ -48,7 +47,8 @@ void testUpdateEnv(String filename, Expectation expectation) { .type(LifecycleType.DOCKER) .build()) .build(); - ApplicationEnvironmentUpdater applicationEnvironmentUpdater = new ApplicationEnvironmentUpdater(app, ENV_CONVERTER.asEnv(input.app.env), + ApplicationEnvironmentUpdater applicationEnvironmentUpdater = new ApplicationEnvironmentUpdater(app, + ENV_CONVERTER.asEnv(input.app.env), client).withPrettyPrinting(false); applicationEnvironmentUpdater.updateApplicationEnvironment(input.envPropertyKey, input.newKey, input.newValue); ArgumentCaptor captor = ArgumentCaptor.forClass(Map.class); diff --git a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/helpers/ClientHelperTest.java b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/helpers/ClientHelperTest.java index 133d12c403..610e8d4a80 100644 --- a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/helpers/ClientHelperTest.java +++ b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/helpers/ClientHelperTest.java @@ -2,6 +2,14 @@ import java.util.UUID; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudOrganization; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudOrganization; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.rest.CloudSpaceClient; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -11,15 +19,6 @@ import org.mockito.MockitoAnnotations; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.rest.CloudSpaceClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.CloudOrganization; -import com.sap.cloudfoundry.client.facade.domain.CloudSpace; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudOrganization; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudSpace; - class ClientHelperTest { private static final String ORG_NAME = "some-organization"; diff --git a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/helpers/MtaConfigurationPurgerTest.java b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/helpers/MtaConfigurationPurgerTest.java index e1580b3f25..bbbedb936c 100644 --- a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/helpers/MtaConfigurationPurgerTest.java +++ b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/helpers/MtaConfigurationPurgerTest.java @@ -1,11 +1,15 @@ package org.cloudfoundry.multiapps.controller.core.helpers; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.when; - import java.util.ArrayList; import java.util.List; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableLifecycle; +import org.cloudfoundry.multiapps.controller.client.facade.domain.LifecycleType; +import org.cloudfoundry.multiapps.controller.client.facade.rest.CloudSpaceClient; import org.cloudfoundry.multiapps.controller.core.auditlogging.MtaConfigurationPurgerAuditLog; import org.cloudfoundry.multiapps.controller.core.cf.metadata.processor.MtaMetadataParser; import org.cloudfoundry.multiapps.controller.core.cf.metadata.processor.MtaMetadataValidator; @@ -26,13 +30,8 @@ import org.mockito.Mockito; import org.mockito.MockitoAnnotations; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudApplication; -import com.sap.cloudfoundry.client.facade.domain.ImmutableLifecycle; -import com.sap.cloudfoundry.client.facade.domain.LifecycleType; -import com.sap.cloudfoundry.client.facade.rest.CloudSpaceClient; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.when; class MtaConfigurationPurgerTest { @@ -76,9 +75,7 @@ void setUp() throws Exception { @Test void testPurge() { - MtaConfigurationPurger purger = new MtaConfigurationPurger(client, - spaceClient, - configurationEntryService, + MtaConfigurationPurger purger = new MtaConfigurationPurger(client, spaceClient, configurationEntryService, configurationSubscriptionService, new MtaMetadataParser(new MtaMetadataValidator()), mtaConfigurationPurgerAuditLog); @@ -146,16 +143,8 @@ private ConfigurationSubscription createSubscription(int id, String applicationN } private ConfigurationEntry createEntry(int id, String providerId) { - return new ConfigurationEntry(id, - ConfigurationEntriesUtil.PROVIDER_NID, - providerId, - Version.parseVersion("1.0.0"), - null, - new CloudTarget(TARGET_ORG, TARGET_SPACE), - null, - null, - null, - null); + return new ConfigurationEntry(id, ConfigurationEntriesUtil.PROVIDER_NID, providerId, Version.parseVersion("1.0.0"), null, + new CloudTarget(TARGET_ORG, TARGET_SPACE), null, null, null, null); } } diff --git a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/parser/DockerInfoParserTest.java b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/parser/DockerInfoParserTest.java index 8251d6b605..c92622a922 100644 --- a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/parser/DockerInfoParserTest.java +++ b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/parser/DockerInfoParserTest.java @@ -1,19 +1,18 @@ package org.cloudfoundry.multiapps.controller.core.parser; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; - import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DockerInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableDockerCredentials; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableDockerInfo; import org.junit.jupiter.api.Test; -import com.sap.cloudfoundry.client.facade.domain.DockerInfo; -import com.sap.cloudfoundry.client.facade.domain.ImmutableDockerCredentials; -import com.sap.cloudfoundry.client.facade.domain.ImmutableDockerInfo; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; class DockerInfoParserTest { diff --git a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/parser/StagingParametersParserTest.java b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/parser/StagingParametersParserTest.java index aef7f3495e..98677fc307 100644 --- a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/parser/StagingParametersParserTest.java +++ b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/parser/StagingParametersParserTest.java @@ -6,9 +6,9 @@ import java.util.List; import java.util.Map; -import com.sap.cloudfoundry.client.facade.domain.LifecycleType; -import com.sap.cloudfoundry.client.facade.domain.Staging; import org.cloudfoundry.multiapps.common.ContentException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.LifecycleType; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Staging; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.util.CollectionUtils; diff --git a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/security/token/TokenServiceTest.java b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/security/token/TokenServiceTest.java index 9823f71758..47ec937361 100644 --- a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/security/token/TokenServiceTest.java +++ b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/security/token/TokenServiceTest.java @@ -8,7 +8,7 @@ import java.util.List; import java.util.Map; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; import org.cloudfoundry.multiapps.controller.client.util.TokenProperties; import org.cloudfoundry.multiapps.controller.core.security.token.parsers.TokenParserChain; import org.cloudfoundry.multiapps.controller.persistence.OrderDirection; diff --git a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/security/token/parsers/JwtTokenParserTest.java b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/security/token/parsers/JwtTokenParserTest.java index 3337af4c60..a4f8087d63 100644 --- a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/security/token/parsers/JwtTokenParserTest.java +++ b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/security/token/parsers/JwtTokenParserTest.java @@ -1,15 +1,9 @@ package org.cloudfoundry.multiapps.controller.core.security.token.parsers; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.anyString; - import java.util.Map; import java.util.Optional; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; import org.cloudfoundry.multiapps.controller.client.uaa.UAAClient; import org.cloudfoundry.multiapps.controller.core.security.token.parsing.TokenValidationStrategyFactory; import org.cloudfoundry.multiapps.controller.core.security.token.parsing.ValidationStrategy; @@ -17,7 +11,12 @@ import org.mockito.Mockito; import org.springframework.security.authentication.InternalAuthenticationServiceException; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.anyString; class JwtTokenParserTest { @@ -60,8 +59,7 @@ void testWhenValidationStrategyThrowsException() { TokenValidationStrategyFactory tokenValidationStrategyFactory = mockTokenValidationStrategyFactory(); Mockito.when(tokenValidationStrategyFactory.createStrategy(anyString())) .thenReturn(validationStrategy); - JwtTokenParser parser = new JwtTokenParserMock(mockUaaClient(false, "RS256", "not-at-all-matters"), - true, + JwtTokenParser parser = new JwtTokenParserMock(mockUaaClient(false, "RS256", "not-at-all-matters"), true, tokenValidationStrategyFactory); assertTrue(parser.parse("token-value") .isEmpty()); @@ -75,8 +73,7 @@ void testWhenValidationStrategyReturnsFalse() { TokenValidationStrategyFactory tokenValidationStrategyFactory = mockTokenValidationStrategyFactory(); Mockito.when(tokenValidationStrategyFactory.createStrategy(anyString())) .thenReturn(validationStrategy); - JwtTokenParser parser = new JwtTokenParserMock(mockUaaClient(false, "RS256", "not-at-all-matters"), - true, + JwtTokenParser parser = new JwtTokenParserMock(mockUaaClient(false, "RS256", "not-at-all-matters"), true, tokenValidationStrategyFactory); assertTrue(parser.parse("token-value") .isEmpty()); @@ -90,8 +87,7 @@ void testWhenValidationStrategyReturnsTrue() { TokenValidationStrategyFactory tokenValidationStrategyFactory = Mockito.mock(TokenValidationStrategyFactory.class); Mockito.when(tokenValidationStrategyFactory.createStrategy(anyString())) .thenReturn(validationStrategy); - JwtTokenParser parser = new JwtTokenParserMock(mockUaaClient(false, "RS256", "not-at-all-matters"), - true, + JwtTokenParser parser = new JwtTokenParserMock(mockUaaClient(false, "RS256", "not-at-all-matters"), true, tokenValidationStrategyFactory); assertDoesNotThrow(() -> parser.parse("token-value")); } diff --git a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/util/ApplicationURITest.java b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/util/ApplicationURITest.java index 80a41afd5f..edf8d475e6 100644 --- a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/util/ApplicationURITest.java +++ b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/util/ApplicationURITest.java @@ -1,10 +1,9 @@ package org.cloudfoundry.multiapps.controller.core.util; -import static org.cloudfoundry.multiapps.controller.core.util.TestData.route; - import java.util.Map; import java.util.stream.Stream; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; import org.cloudfoundry.multiapps.controller.core.model.SupportedParameters; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -12,7 +11,7 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; +import static org.cloudfoundry.multiapps.controller.core.util.TestData.route; class ApplicationURITest { @@ -43,7 +42,7 @@ void testGetHostDomainPath(String uri, boolean noHostname, String expectedHost, @SuppressWarnings("serial") static Stream testGetURIParts() { return Stream.of( -//@formatter:off + //@formatter:off Arguments.of("host", "domain.com", "/path", Map.of(SupportedParameters.HOST, "host", SupportedParameters.DOMAIN, "domain.com", diff --git a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/util/SecurityUtilTest.java b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/util/SecurityUtilTest.java index ac9606e4e9..a24cc8d568 100644 --- a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/util/SecurityUtilTest.java +++ b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/util/SecurityUtilTest.java @@ -1,18 +1,11 @@ package org.cloudfoundry.multiapps.controller.core.util; -import static com.sap.cloudfoundry.client.facade.oauth2.TokenFactory.SCOPE_CC_ADMIN; -import static org.cloudfoundry.multiapps.controller.client.util.TokenProperties.CLIENT_ID_KEY; -import static org.cloudfoundry.multiapps.controller.client.util.TokenProperties.USER_ID_KEY; -import static org.cloudfoundry.multiapps.controller.client.util.TokenProperties.USER_NAME_KEY; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - import java.util.Collections; import java.util.Map; import java.util.Objects; import java.util.Set; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.security.core.GrantedAuthority; @@ -20,7 +13,13 @@ import org.springframework.security.oauth2.core.OAuth2AccessToken; import org.springframework.security.oauth2.core.user.OAuth2User; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; +import static org.cloudfoundry.multiapps.controller.client.facade.oauth2.TokenFactory.SCOPE_CC_ADMIN; +import static org.cloudfoundry.multiapps.controller.client.util.TokenProperties.CLIENT_ID_KEY; +import static org.cloudfoundry.multiapps.controller.client.util.TokenProperties.USER_ID_KEY; +import static org.cloudfoundry.multiapps.controller.client.util.TokenProperties.USER_NAME_KEY; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; class SecurityUtilTest { diff --git a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/util/TestData.java b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/util/TestData.java index ddac3a28ad..592d9e8201 100644 --- a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/util/TestData.java +++ b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/util/TestData.java @@ -6,10 +6,9 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; import org.cloudfoundry.multiapps.controller.core.model.SupportedParameters; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; - public class TestData { public static Map routeParameterWithAdditionalValues(String route, boolean noHostname, diff --git a/multiapps-controller-process/src/main/java/module-info.java b/multiapps-controller-process/src/main/java/module-info.java index cea4682659..231bedb9e5 100644 --- a/multiapps-controller-process/src/main/java/module-info.java +++ b/multiapps-controller-process/src/main/java/module-info.java @@ -15,7 +15,6 @@ exports org.cloudfoundry.multiapps.controller.process.variables; exports org.cloudfoundry.multiapps.controller.process.stream; - requires transitive com.sap.cloudfoundry.client.facade; requires transitive flowable.engine; requires transitive org.cloudfoundry.multiapps.controller.api; requires transitive org.cloudfoundry.multiapps.controller.core; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/client/LoggingCloudControllerClient.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/client/LoggingCloudControllerClient.java index e1bbaff721..461f261c74 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/client/LoggingCloudControllerClient.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/client/LoggingCloudControllerClient.java @@ -9,40 +9,39 @@ import java.util.UUID; import org.cloudfoundry.client.v3.Metadata; +import org.cloudfoundry.multiapps.controller.client.facade.ApplicationServicesUpdateCallback; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.ServiceBindingOperationCallback; +import org.cloudfoundry.multiapps.controller.client.facade.UploadStatusCallback; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudAsyncJob; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudBuild; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudDomain; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudEvent; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudProcess; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBroker; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceOffering; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudStack; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudTask; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DockerInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DropletInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstancesInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServicePlanVisibility; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Staging; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Upload; +import org.cloudfoundry.multiapps.controller.client.facade.domain.UserRole; +import org.cloudfoundry.multiapps.controller.client.facade.dto.ApplicationToCreateDto; import org.cloudfoundry.multiapps.controller.core.security.serialization.SecureSerialization; import org.cloudfoundry.multiapps.controller.core.util.UriUtil; import org.cloudfoundry.multiapps.controller.core.util.UserMessageLogger; import org.cloudfoundry.multiapps.controller.process.Messages; -import com.sap.cloudfoundry.client.facade.ApplicationServicesUpdateCallback; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.ServiceBindingOperationCallback; -import com.sap.cloudfoundry.client.facade.UploadStatusCallback; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudAsyncJob; -import com.sap.cloudfoundry.client.facade.domain.CloudBuild; -import com.sap.cloudfoundry.client.facade.domain.CloudDomain; -import com.sap.cloudfoundry.client.facade.domain.CloudEvent; -import com.sap.cloudfoundry.client.facade.domain.CloudPackage; -import com.sap.cloudfoundry.client.facade.domain.CloudProcess; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBroker; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceOffering; -import com.sap.cloudfoundry.client.facade.domain.CloudSpace; -import com.sap.cloudfoundry.client.facade.domain.CloudStack; -import com.sap.cloudfoundry.client.facade.domain.CloudTask; -import com.sap.cloudfoundry.client.facade.domain.DockerInfo; -import com.sap.cloudfoundry.client.facade.domain.DropletInfo; -import com.sap.cloudfoundry.client.facade.domain.InstancesInfo; -import com.sap.cloudfoundry.client.facade.domain.ServicePlanVisibility; -import com.sap.cloudfoundry.client.facade.domain.Staging; -import com.sap.cloudfoundry.client.facade.domain.Upload; -import com.sap.cloudfoundry.client.facade.domain.UserRole; -import com.sap.cloudfoundry.client.facade.dto.ApplicationToCreateDto; - public class LoggingCloudControllerClient implements CloudControllerClient { private final CloudControllerClient delegate; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/jobs/OrphanedDataCleaner.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/jobs/OrphanedDataCleaner.java index 911961df43..ef348f7181 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/jobs/OrphanedDataCleaner.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/jobs/OrphanedDataCleaner.java @@ -6,6 +6,10 @@ import java.util.List; import java.util.UUID; +import org.cloudfoundry.multiapps.controller.client.facade.CloudCredentials; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.ImmutableCloudFoundryClientFactory; +import org.cloudfoundry.multiapps.controller.client.facade.rest.CloudSpaceClient; import org.cloudfoundry.multiapps.controller.core.auditlogging.MtaConfigurationPurgerAuditLog; import org.cloudfoundry.multiapps.controller.core.cf.OAuthClientFactory; import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration; @@ -15,11 +19,6 @@ import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudCredentials; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.adapters.ImmutableCloudFoundryClientFactory; -import com.sap.cloudfoundry.client.facade.rest.CloudSpaceClient; - public abstract class OrphanedDataCleaner implements Cleaner { private static final Logger LOGGER = LoggerFactory.getLogger(OrphanedDataCleaner.class); @@ -96,10 +95,8 @@ protected MtaConfigurationPurgerAuditLog getMtaConfigurationPurgerAuditLog() { protected void initSpaceClient() { CloudCredentials cloudCredentials = new CloudCredentials(configuration.getGlobalAuditorUser(), - configuration.getGlobalAuditorPassword(), - SecurityUtil.CLIENT_ID, - SecurityUtil.CLIENT_SECRET, - configuration.getGlobalAuditorOrigin()); + configuration.getGlobalAuditorPassword(), SecurityUtil.CLIENT_ID, + SecurityUtil.CLIENT_SECRET, configuration.getGlobalAuditorOrigin()); var clientFactory = ImmutableCloudFoundryClientFactory.builder() .connectTimeout(Duration.ofMinutes(5)) .responseTimeout(Duration.ofMinutes(5)) diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/listeners/DeployAppSubProcessEndListener.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/listeners/DeployAppSubProcessEndListener.java index a5d5cca737..a5d2259a1f 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/listeners/DeployAppSubProcessEndListener.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/listeners/DeployAppSubProcessEndListener.java @@ -2,8 +2,8 @@ import jakarta.inject.Inject; import jakarta.inject.Named; - import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBroker; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration; import org.cloudfoundry.multiapps.controller.persistence.services.HistoricOperationEventService; @@ -18,8 +18,6 @@ import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.flowable.engine.delegate.DelegateExecution; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBroker; - @Named("deployAppSubProcessEndListener") public class DeployAppSubProcessEndListener extends AbstractProcessExecutionListener { @@ -30,13 +28,8 @@ protected DeployAppSubProcessEndListener(ProgressMessageService progressMessageS ProcessLoggerProvider processLoggerProvider, ProcessLoggerPersister processLoggerPersister, HistoricOperationEventService historicOperationEventService, FlowableFacade flowableFacade, ApplicationConfiguration configuration) { - super(progressMessageService, - stepLoggerFactory, - processLoggerProvider, - processLoggerPersister, - historicOperationEventService, - flowableFacade, - configuration); + super(progressMessageService, stepLoggerFactory, processLoggerProvider, processLoggerPersister, historicOperationEventService, + flowableFacade, configuration); } @Override diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/AddDomainsStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/AddDomainsStep.java index 4e2648d378..31a4001bcd 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/AddDomainsStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/AddDomainsStep.java @@ -4,15 +4,13 @@ import java.util.stream.Collectors; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudDomain; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudDomain; - @Named("addDomainsStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class AddDomainsStep extends SyncFlowableStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/BindServiceToApplicationStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/BindServiceToApplicationStep.java index 99ff7f4995..fc797e85d8 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/BindServiceToApplicationStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/BindServiceToApplicationStep.java @@ -6,7 +6,9 @@ import java.util.Optional; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.ApplicationServicesUpdateCallback; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.util.DefaultApplicationServicesUpdateCallback; @@ -15,10 +17,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.ApplicationServicesUpdateCallback; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; - @Named("bindServiceToApplicationStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class BindServiceToApplicationStep extends AsyncFlowableStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/BuildApplicationDeployModelStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/BuildApplicationDeployModelStep.java index e71a733e96..3cf7e74442 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/BuildApplicationDeployModelStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/BuildApplicationDeployModelStep.java @@ -5,8 +5,13 @@ import java.util.Map; import java.util.Set; +import jakarta.inject.Inject; +import jakarta.inject.Named; import org.apache.commons.lang3.StringUtils; import org.cloudfoundry.client.v3.processes.HealthCheckType; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableStaging; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Staging; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.v2.ConfigurationEntriesCloudModelBuilder; @@ -25,13 +30,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; -import com.sap.cloudfoundry.client.facade.domain.ImmutableStaging; -import com.sap.cloudfoundry.client.facade.domain.Staging; - -import jakarta.inject.Inject; -import jakarta.inject.Named; - @Named("buildApplicationDeployModelStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class BuildApplicationDeployModelStep extends SyncFlowableStep { 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 8eef8b6ac0..8057ba4423 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 @@ -8,12 +8,12 @@ import java.util.TreeSet; import java.util.stream.Collectors; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; import jakarta.inject.Inject; import jakarta.inject.Named; import org.cloudfoundry.multiapps.common.SLException; import org.cloudfoundry.multiapps.controller.api.model.ProcessType; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.cf.CloudHandlerFactory; import org.cloudfoundry.multiapps.controller.core.cf.util.CloudModelBuilderContentCalculator; @@ -184,7 +184,7 @@ private List getAppNames(List modulesCalculatedForDeployment) { .map(NameUtil::getApplicationName) .collect(toList()); } - + private List buildServicesForBindings(ServicesCloudModelBuilder servicesCloudModelBuilder, DeploymentDescriptor deploymentDescriptor, List modulesCalculatedForDeployment) { @@ -197,9 +197,7 @@ private List buildFilteredServices(DeploymentDescr List filteredResourceNames, ServicesCloudModelBuilder servicesCloudModelBuilder) { CloudModelBuilderContentCalculator resourcesCloudModelBuilderContentCalculator = new ResourcesCloudModelBuilderContentCalculator( - filteredResourceNames, - getStepLogger(), - false); + filteredResourceNames, getStepLogger(), false); // this always filters the 'isActive', 'isResourceSpecifiedForDeployment' and 'isService' resources List calculatedFilteredResources = resourcesCloudModelBuilderContentCalculator.calculateContentForBuilding( deploymentDescriptor.getResources()); @@ -236,44 +234,39 @@ private List calculateModulesForDeployment(ProcessContext context, Deplo mtaManifestModuleNames, deployedModuleNames, mtaModuleNamesForDeployment); - return modulesCloudModelBuilderContentCalculator.calculateContentForBuilding(getModulesForDeployment(context.getExecution(), - deploymentDescriptor)); + return modulesCloudModelBuilderContentCalculator.calculateContentForBuilding( + getModulesForDeployment(context.getExecution(), deploymentDescriptor)); } private List calculateResourcesForDeployment(ProcessContext context, DeploymentDescriptor deploymentDescriptor) { List resourcesSpecifiedForDeployment = context.getVariable(Variables.RESOURCES_FOR_DEPLOYMENT); CloudModelBuilderContentCalculator resourcesCloudModelBuilderContentCalculator = new ResourcesCloudModelBuilderContentCalculator( - resourcesSpecifiedForDeployment, - getStepLogger(), - shouldProcessOnlyUserProvidedServices(context)); + resourcesSpecifiedForDeployment, getStepLogger(), shouldProcessOnlyUserProvidedServices(context)); return resourcesCloudModelBuilderContentCalculator.calculateContentForBuilding(deploymentDescriptor.getResources()); } private boolean shouldProcessOnlyUserProvidedServices(ProcessContext context) { - return processTypeParser.getProcessType(context.getExecution()) == ProcessType.ROLLBACK_MTA - && context.getVariable(Variables.PROCESS_USER_PROVIDED_SERVICES); + return processTypeParser.getProcessType(context.getExecution()) == ProcessType.ROLLBACK_MTA && context.getVariable( + Variables.PROCESS_USER_PROVIDED_SERVICES); } - protected ModulesCloudModelBuilderContentCalculator - getModulesContentCalculator(ProcessContext context, List mtaDescriptorModules, Set mtaManifestModuleNames, - Set deployedModuleNames, Set mtaModuleNamesForDeployment) { + protected ModulesCloudModelBuilderContentCalculator getModulesContentCalculator(ProcessContext context, + List mtaDescriptorModules, + Set mtaManifestModuleNames, + Set deployedModuleNames, + Set mtaModuleNamesForDeployment) { List modulesValidators = getModuleContentValidators(context.getControllerClient(), mtaDescriptorModules, mtaModuleNamesForDeployment, deployedModuleNames); - return new ModulesCloudModelBuilderContentCalculator(mtaManifestModuleNames, - deployedModuleNames, - context.getVariable(Variables.MODULES_FOR_DEPLOYMENT), - getStepLogger(), - moduleToDeployHelper, - modulesValidators); + return new ModulesCloudModelBuilderContentCalculator(mtaManifestModuleNames, deployedModuleNames, + context.getVariable(Variables.MODULES_FOR_DEPLOYMENT), getStepLogger(), + moduleToDeployHelper, modulesValidators); } private List getModuleContentValidators(CloudControllerClient cloudControllerClient, List mtaDescriptorModules, Set mtaModulesForDeployment, Set deployedModuleNames) { return List.of(new UnresolvedModulesContentValidator(mtaModulesForDeployment, deployedModuleNames), - new DeployedAfterModulesContentValidator(cloudControllerClient, - getStepLogger(), - moduleToDeployHelper, + new DeployedAfterModulesContentValidator(cloudControllerClient, getStepLogger(), moduleToDeployHelper, mtaDescriptorModules)); } diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/BuildCloudUndeployModelStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/BuildCloudUndeployModelStep.java index 85f4c31efe..75c29b4619 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/BuildCloudUndeployModelStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/BuildCloudUndeployModelStep.java @@ -11,14 +11,14 @@ import java.util.Set; import java.util.stream.Collectors; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; import jakarta.inject.Inject; import jakarta.inject.Named; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.ListUtils; import org.cloudfoundry.multiapps.controller.api.model.ProcessType; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.cf.v2.ApplicationCloudModelBuilder; import org.cloudfoundry.multiapps.controller.core.helpers.ModuleToDeployHelper; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CalculateServiceKeyForWaitingStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CalculateServiceKeyForWaitingStep.java index d34504e637..9ddfa0d4d9 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CalculateServiceKeyForWaitingStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CalculateServiceKeyForWaitingStep.java @@ -5,7 +5,9 @@ import java.util.stream.Collectors; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.security.serialization.SecureSerialization; import org.cloudfoundry.multiapps.controller.process.Messages; @@ -14,10 +16,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; - @Named("calculateServiceKeyForWaitingStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class CalculateServiceKeyForWaitingStep extends SyncFlowableStep { @@ -39,9 +37,9 @@ private List getServiceKeysInProgress(List exi } return existingServiceKeys.stream() .filter(key -> key.getServiceKeyOperation() - .getState() == ServiceCredentialBindingOperation.State.IN_PROGRESS - || key.getServiceKeyOperation() - .getState() == ServiceCredentialBindingOperation.State.INITIAL) + .getState() == ServiceCredentialBindingOperation.State.IN_PROGRESS || + key.getServiceKeyOperation() + .getState() == ServiceCredentialBindingOperation.State.INITIAL) .collect(Collectors.toList()); } diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServiceBindingOperationStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServiceBindingOperationStep.java index 53db542b43..cbbb9999a8 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServiceBindingOperationStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServiceBindingOperationStep.java @@ -5,7 +5,10 @@ import java.util.UUID; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.Messages; @@ -13,11 +16,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; - @Named("checkServiceBindingOperationStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class CheckServiceBindingOperationStep extends AsyncFlowableStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServiceKeyOperationStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServiceKeyOperationStep.java index 40410c5e96..de465222b5 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServiceKeyOperationStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServiceKeyOperationStep.java @@ -4,16 +4,14 @@ import java.util.List; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; - @Named("checkServiceKeyOperationStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class CheckServiceKeyOperationStep extends AsyncFlowableStep { @@ -23,8 +21,7 @@ protected StepPhase executeAsyncStep(ProcessContext context) throws Exception { CloudControllerClient controllerClient = context.getControllerClient(); CloudServiceKey serviceKeyToProcess = context.getVariable(Variables.SERVICE_KEY_TO_PROCESS); CloudServiceKey serviceKey = controllerClient.getServiceKey(serviceKeyToProcess.getServiceInstance() - .getName(), - serviceKeyToProcess.getName()); + .getName(), serviceKeyToProcess.getName()); if (serviceKey == null) { getStepLogger().debug(Messages.SERVICE_KEY_DOES_NOT_EXIST_0, serviceKeyToProcess.getName()); context.setVariable(Variables.SERVICE_KEY_DOES_NOT_EXIST, true); diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServiceOperationStateStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServiceOperationStateStep.java index 69ff576cb7..0433ff90bf 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServiceOperationStateStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServiceOperationStateStep.java @@ -5,7 +5,7 @@ import jakarta.inject.Inject; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.util.ServiceOperationGetter; import org.cloudfoundry.multiapps.controller.process.util.ServiceProgressReporter; @@ -13,8 +13,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; - @Named("checkServiceOperationStateStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class CheckServiceOperationStateStep extends CollectServicesInProgressStateStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServicesToDeleteStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServicesToDeleteStep.java index 52631f2d2d..fab45d049f 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServicesToDeleteStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServicesToDeleteStep.java @@ -8,9 +8,7 @@ import jakarta.inject.Inject; import jakarta.inject.Named; - -import com.sap.cloudfoundry.client.facade.CloudControllerClient; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration; @@ -28,8 +26,7 @@ public class CheckServicesToDeleteStep extends CollectServicesInProgressStateSte private ApplicationConfiguration applicationConfiguration; @Inject - CheckServicesToDeleteStep(ServiceOperationGetter serviceOperationGetter, - ServiceProgressReporter serviceProgressReporter, + CheckServicesToDeleteStep(ServiceOperationGetter serviceOperationGetter, ServiceProgressReporter serviceProgressReporter, ApplicationConfiguration applicationConfiguration) { super(serviceOperationGetter, serviceProgressReporter); this.applicationConfiguration = applicationConfiguration; @@ -43,10 +40,11 @@ protected List getExistingServicesInProgress(Proce } CloudControllerClient client = context.getControllerClient(); int maxParallelThreads = getMaxParallelThreads(servicesToDelete); - return ForkJoinPoolUtil.execute(maxParallelThreads, () -> doGetExistingServicesInProgress(client, servicesToDelete)); + return ForkJoinPoolUtil.execute(maxParallelThreads, () -> doGetExistingServicesInProgress(client, servicesToDelete)); } - private List doGetExistingServicesInProgress(CloudControllerClient client, List servicesToDelete) { + private List doGetExistingServicesInProgress(CloudControllerClient client, + List servicesToDelete) { return servicesToDelete.parallelStream() .map(service -> getExistingService(client, buildCloudServiceExtended(service))) .filter(Objects::nonNull) diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ClearMtaMetadataBaseStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ClearMtaMetadataBaseStep.java index 26768b890a..11a92109fd 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ClearMtaMetadataBaseStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ClearMtaMetadataBaseStep.java @@ -5,14 +5,13 @@ import org.apache.commons.collections4.MapUtils; import org.cloudfoundry.client.v3.Metadata; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; import org.cloudfoundry.multiapps.controller.core.cf.metadata.util.MtaMetadataUtil; import org.cloudfoundry.multiapps.controller.process.Messages; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; - public abstract class ClearMtaMetadataBaseStep extends SyncFlowableStep { protected void deleteMtaMetadataFromService(CloudControllerClient client, CloudServiceInstance serviceToDetachFromMta) { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CollectServicesInProgressStateStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CollectServicesInProgressStateStep.java index 300c3cf1d5..6522d1ef63 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CollectServicesInProgressStateStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CollectServicesInProgressStateStep.java @@ -1,10 +1,16 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudEntity; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; +import java.time.Duration; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudEntity; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.Messages; @@ -12,12 +18,6 @@ import org.cloudfoundry.multiapps.controller.process.util.ServiceProgressReporter; import org.cloudfoundry.multiapps.controller.process.variables.Variables; -import java.time.Duration; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - public abstract class CollectServicesInProgressStateStep extends TimeoutAsyncFlowableStep { protected ServiceOperationGetter serviceOperationGetter; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CollectSystemParametersStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CollectSystemParametersStep.java index 407ecbd606..220eff5dc0 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CollectSystemParametersStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CollectSystemParametersStep.java @@ -4,13 +4,13 @@ import java.text.MessageFormat; import java.util.function.Supplier; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudCredentials; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.util.AuthorizationEndpointGetter; import jakarta.inject.Inject; import jakarta.inject.Named; import org.cloudfoundry.multiapps.common.ContentException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudCredentials; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.util.AuthorizationEndpointGetter; import org.cloudfoundry.multiapps.controller.core.cf.clients.WebClientFactory; import org.cloudfoundry.multiapps.controller.core.helpers.CredentialsGenerator; import org.cloudfoundry.multiapps.controller.core.helpers.SystemParameters; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateAppStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateAppStep.java index 6aef1f6756..7dbb9ec2e8 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateAppStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateAppStep.java @@ -12,14 +12,14 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudCredentials; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.dto.ApplicationToCreateDto; -import com.sap.cloudfoundry.client.facade.dto.ImmutableApplicationToCreateDto; import jakarta.inject.Inject; import jakarta.inject.Named; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudCredentials; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.dto.ApplicationToCreateDto; +import org.cloudfoundry.multiapps.controller.client.facade.dto.ImmutableApplicationToCreateDto; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ServiceKeyToInject; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateServiceBrokerStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateServiceBrokerStep.java index 96edd526ae..0c5a4e5082 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateServiceBrokerStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateServiceBrokerStep.java @@ -7,9 +7,14 @@ import java.util.stream.Collectors; import jakarta.inject.Named; - import org.cloudfoundry.multiapps.common.ContentException; import org.cloudfoundry.multiapps.common.NotFoundException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudServiceBrokerException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBroker; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceBroker; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.helpers.ApplicationAttributes; import org.cloudfoundry.multiapps.controller.core.model.SupportedParameters; @@ -21,13 +26,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.CloudServiceBrokerException; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBroker; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceBroker; - @Named("createOrUpdateServiceBrokerStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class CreateOrUpdateServiceBrokerStep extends TimeoutAsyncFlowableStep { @@ -145,8 +143,8 @@ private CloudServiceBroker findServiceBroker(List serviceBro .filter(broker -> broker.getName() .equals(name)) .findFirst() - .orElseThrow(() -> new NotFoundException(MessageFormat.format(Messages.SERVICE_BROKER_0_DOES_NOT_EXIST, - name))); + .orElseThrow( + () -> new NotFoundException(MessageFormat.format(Messages.SERVICE_BROKER_0_DOES_NOT_EXIST, name))); } private CloudServiceBroker mergeServiceBrokerMetadata(CloudServiceBroker serviceBroker, CloudServiceBroker existingBroker) { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CreateServiceKeyStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CreateServiceKeyStep.java index daa939b57a..69d45976e7 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CreateServiceKeyStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CreateServiceKeyStep.java @@ -5,8 +5,11 @@ import java.util.Optional; import jakarta.inject.Named; - import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.util.ServiceKeyPollingFactory; @@ -15,11 +18,6 @@ import org.springframework.context.annotation.Scope; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; - @Named("createServiceKeyStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class CreateServiceKeyStep extends AsyncFlowableStep { @@ -51,8 +49,7 @@ private Optional createServiceKey(CloudServiceKey serviceKeyToCreate, Cl } catch (CloudOperationException e) { if (e.getStatusCode() == HttpStatus.UNPROCESSABLE_ENTITY) { CloudServiceKey serviceKey = controllerClient.getServiceKey(serviceKeyToCreate.getServiceInstance() - .getName(), - serviceKeyToCreate.getName()); + .getName(), serviceKeyToCreate.getName()); if (serviceKey != null) { context.setVariable(Variables.USE_LAST_OPERATION_FOR_SERVICE_KEY_CREATION, true); return Optional.empty(); diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CreateServiceStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CreateServiceStep.java index b5f7008ed0..86606d1120 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CreateServiceStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CreateServiceStep.java @@ -5,7 +5,10 @@ import java.util.Optional; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.util.OperationExecutionState; import org.cloudfoundry.multiapps.controller.process.Messages; @@ -18,11 +21,6 @@ import org.springframework.http.HttpStatus; import org.springframework.util.Assert; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; - @Named("createServiceStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class CreateServiceStep extends ServiceStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteApplicationRoutesStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteApplicationRoutesStep.java index 3a9910c232..3b53ee4d9d 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteApplicationRoutesStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteApplicationRoutesStep.java @@ -7,13 +7,13 @@ import java.util.UUID; import java.util.stream.Collectors; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudCredentials; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; import jakarta.inject.Inject; import jakarta.inject.Named; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudCredentials; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudRouteExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudRouteExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ServiceRouteBinding; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteApplicationStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteApplicationStep.java index 884428b5d7..34b37377a2 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteApplicationStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteApplicationStep.java @@ -4,18 +4,16 @@ import java.util.List; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudTask; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudTask; - @Named("deleteApplicationStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class DeleteApplicationStep extends UndeployAppStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteIdleRoutesStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteIdleRoutesStep.java index 2ca757ff4c..dd51027416 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteIdleRoutesStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteIdleRoutesStep.java @@ -4,8 +4,11 @@ import java.util.Set; import jakarta.inject.Named; - import org.apache.commons.collections4.SetUtils; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.variables.Variables; @@ -13,11 +16,6 @@ import org.springframework.context.annotation.Scope; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; - @Named("deleteIdleRoutesStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class DeleteIdleRoutesStep extends SyncFlowableStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceBrokersStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceBrokersStep.java index 8030ca726c..9168129c0e 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceBrokersStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceBrokersStep.java @@ -9,7 +9,11 @@ import java.util.Optional; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudServiceBrokerException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBroker; import org.cloudfoundry.multiapps.controller.core.helpers.ApplicationAttributes; import org.cloudfoundry.multiapps.controller.core.model.SupportedParameters; import org.cloudfoundry.multiapps.controller.process.Messages; @@ -19,12 +23,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.CloudServiceBrokerException; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBroker; - @Named("deleteServiceBrokersStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class DeleteServiceBrokersStep extends TimeoutAsyncFlowableStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceKeyStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceKeyStep.java index fc886b210e..9740690372 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceKeyStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceKeyStep.java @@ -5,8 +5,11 @@ import java.util.Optional; import jakarta.inject.Named; - import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.util.ServiceKeyPollingFactory; @@ -15,11 +18,6 @@ import org.springframework.context.annotation.Scope; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; - @Named("deleteServiceKeyStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class DeleteServiceKeyStep extends AsyncFlowableStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceMtaMetadataStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceMtaMetadataStep.java index 2585ac4492..193bfbe400 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceMtaMetadataStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceMtaMetadataStep.java @@ -3,15 +3,13 @@ import java.text.MessageFormat; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; - @Named("deleteServiceMtaMetadataStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class DeleteServiceMtaMetadataStep extends ClearMtaMetadataBaseStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceStep.java index 17e9bbe2d6..1664ad7128 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceStep.java @@ -6,7 +6,9 @@ import jakarta.inject.Inject; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.Messages; @@ -19,10 +21,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; - @Named("deleteServiceStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class DeleteServiceStep extends AsyncFlowableStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetachServiceKeysFromMtaStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetachServiceKeysFromMtaStep.java index a5353dc212..cdad02e8a9 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetachServiceKeysFromMtaStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetachServiceKeysFromMtaStep.java @@ -3,15 +3,13 @@ import java.util.List; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; import org.cloudfoundry.multiapps.controller.core.model.DeployedMtaServiceKey; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; - @Named("detachServiceKeysFromMtaStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class DetachServiceKeysFromMtaStep extends ClearMtaMetadataBaseStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetachServicesFromMtaStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetachServicesFromMtaStep.java index 31210d063c..596b457cd9 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetachServicesFromMtaStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetachServicesFromMtaStep.java @@ -3,15 +3,13 @@ import java.util.List; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; - @Named("detachServicesFromMtaStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class DetachServicesFromMtaStep extends ClearMtaMetadataBaseStep { @@ -21,7 +19,8 @@ protected StepPhase executeStep(ProcessContext context) { getStepLogger().debug(Messages.DETACHING_SERVICES_FROM_MTA); List serviceNamesToDetachFromMta = context.getVariable(Variables.SERVICES_TO_DELETE); CloudControllerClient client = context.getControllerClient(); - List servicesToDetachFromMta = client.getServiceInstancesWithoutAuxiliaryContentByNames(serviceNamesToDetachFromMta); + List servicesToDetachFromMta = client.getServiceInstancesWithoutAuxiliaryContentByNames( + serviceNamesToDetachFromMta); servicesToDetachFromMta.forEach(serviceToDetach -> deleteMtaMetadataFromService(client, serviceToDetach)); getStepLogger().debug(Messages.SERVICES_DETACHED_FROM_MTA); return StepPhase.DONE; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetectApplicationsToRenameStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetectApplicationsToRenameStep.java index e85db7fa74..4b1ba0b2a3 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetectApplicationsToRenameStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetectApplicationsToRenameStep.java @@ -6,7 +6,10 @@ import java.util.Set; import java.util.stream.Collectors; +import jakarta.inject.Named; import org.apache.commons.collections4.CollectionUtils; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.core.model.BlueGreenApplicationNameSuffix; import org.cloudfoundry.multiapps.controller.core.model.DeployedMta; import org.cloudfoundry.multiapps.controller.core.model.DeployedMtaApplication; @@ -18,11 +21,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; - -import jakarta.inject.Named; - @Named("detectApplicationsToRenameStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class DetectApplicationsToRenameStep extends SyncFlowableStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetectDeployedMtaStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetectDeployedMtaStep.java index 3291e69571..09711ac4c2 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetectDeployedMtaStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetectDeployedMtaStep.java @@ -4,11 +4,11 @@ import java.util.List; import java.util.Optional; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudCredentials; import jakarta.inject.Inject; import jakarta.inject.Named; import org.apache.commons.lang3.StringUtils; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudCredentials; import org.cloudfoundry.multiapps.controller.core.cf.clients.CustomServiceKeysClient; import org.cloudfoundry.multiapps.controller.core.cf.clients.WebClientFactory; import org.cloudfoundry.multiapps.controller.core.cf.detect.DeployedMtaDetector; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineApplicationServiceBindingActionsStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineApplicationServiceBindingActionsStep.java index beedfbd4b5..33ac5a1a20 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineApplicationServiceBindingActionsStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineApplicationServiceBindingActionsStep.java @@ -6,12 +6,12 @@ import java.util.Objects; import java.util.UUID; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudCredentials; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; import jakarta.inject.Inject; import jakarta.inject.Named; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudCredentials; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended.AttributeUpdateStrategy; import org.cloudfoundry.multiapps.controller.core.cf.clients.AppBoundServiceInstanceNamesGetter; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineDesiredStateAchievingActionsStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineDesiredStateAchievingActionsStep.java index f8a99a3341..490af1aa54 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineDesiredStateAchievingActionsStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineDesiredStateAchievingActionsStep.java @@ -7,7 +7,9 @@ import jakarta.inject.Inject; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.RestartParameters; import org.cloudfoundry.multiapps.controller.core.cf.apps.ActionCalculator; @@ -22,10 +24,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudPackage; - @Named("determineDesiredStateAchievingActionsStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class DetermineDesiredStateAchievingActionsStep extends SyncFlowableStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceBindingsToDeleteStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceBindingsToDeleteStep.java index 6d01595fff..8928a096cc 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceBindingsToDeleteStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceBindingsToDeleteStep.java @@ -4,7 +4,8 @@ import java.util.UUID; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.security.serialization.SecureSerialization; import org.cloudfoundry.multiapps.controller.process.Messages; @@ -12,9 +13,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; - @Named("determineServiceBindingsToDeleteStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class DetermineServiceBindingsToDeleteStep extends SyncFlowableStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceCreateUpdateServiceActionsStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceCreateUpdateServiceActionsStep.java index 472739a2c6..4d0d1275b9 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceCreateUpdateServiceActionsStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceCreateUpdateServiceActionsStep.java @@ -11,12 +11,19 @@ import java.util.Map; import java.util.Objects; +import jakarta.inject.Inject; +import jakarta.inject.Named; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.ObjectUtils; import org.cloudfoundry.client.v3.Metadata; import org.cloudfoundry.multiapps.common.SLException; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.cf.v2.ResourceType; @@ -35,15 +42,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; - -import jakarta.inject.Inject; -import jakarta.inject.Named; - @Named("determineServiceCreateUpdateActionsStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class DetermineServiceCreateUpdateServiceActionsStep extends SyncFlowableStep { @@ -230,12 +228,15 @@ private CloudServiceInstanceExtended setServiceParameters(ProcessContext context String appArchiveId = context.getRequiredVariable(Variables.APP_ARCHIVE_ID); String spaceGuid = context.getVariable(Variables.SPACE_GUID); ArchiveEntryWithStreamPositions serviceBindingParametersEntry = ArchiveEntryExtractorUtil.findEntry(fileName, - context.getVariable(Variables.ARCHIVE_ENTRIES_POSITIONS)); + context.getVariable( + Variables.ARCHIVE_ENTRIES_POSITIONS)); byte[] serviceBindingsParametersContent = archiveEntryExtractor.extractEntryBytes(ImmutableFileEntryProperties.builder() .guid(appArchiveId) - .name(serviceBindingParametersEntry.getName()) + .name( + serviceBindingParametersEntry.getName()) .spaceGuid(spaceGuid) - .maxFileSizeInBytes(configuration.getMaxManifestSize()) + .maxFileSizeInBytes( + configuration.getMaxManifestSize()) .build(), serviceBindingParametersEntry); try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(serviceBindingsParametersContent)) { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceDeleteActionsToExecuteStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceDeleteActionsToExecuteStep.java index 3328028415..65a55e5b83 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceDeleteActionsToExecuteStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceDeleteActionsToExecuteStep.java @@ -6,8 +6,11 @@ import jakarta.inject.Inject; import jakarta.inject.Named; - import org.cloudfoundry.multiapps.controller.api.model.ProcessType; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; import org.cloudfoundry.multiapps.controller.core.security.serialization.SecureSerialization; import org.cloudfoundry.multiapps.controller.core.util.CloudModelBuilderUtil; import org.cloudfoundry.multiapps.controller.process.Messages; @@ -18,11 +21,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; - @Named("determineServiceDeleteActionsToExecuteStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class DetermineServiceDeleteActionsToExecuteStep extends SyncFlowableStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceKeysToRecreateStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceKeysToRecreateStep.java index ac9bd55cfc..4a0dfe41ad 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceKeysToRecreateStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceKeysToRecreateStep.java @@ -7,10 +7,13 @@ import java.util.Objects; import jakarta.inject.Named; - import org.apache.commons.collections4.ListUtils; import org.cloudfoundry.client.v3.Metadata; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.util.ServiceUtil; @@ -18,11 +21,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; - @Named("determineServiceKeysToRecreateStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class DetermineServiceKeysToRecreateStep extends SyncFlowableStep { @@ -104,8 +102,8 @@ public static boolean isMetadataEqual(Metadata metadataA, Metadata metadataB) { return metadataA == null && metadataB == null; } - return Objects.equals(metadataA.getAnnotations(), metadataB.getAnnotations()) - && Objects.equals(metadataA.getLabels(), metadataB.getLabels()); + return Objects.equals(metadataA.getAnnotations(), metadataB.getAnnotations()) && Objects.equals(metadataA.getLabels(), + metadataB.getLabels()); } private CloudServiceKey getWithName(List serviceKeys, String name) { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineTasksFromHookStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineTasksFromHookStep.java index d3394c40c4..b27a6978a4 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineTasksFromHookStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineTasksFromHookStep.java @@ -4,7 +4,7 @@ import java.util.List; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudTask; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.util.TaskHookParser; import org.cloudfoundry.multiapps.controller.process.variables.Variables; @@ -12,8 +12,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.domain.CloudTask; - @Named("determineTasksFromHookStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class DetermineTasksFromHookStep extends SyncFlowableStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ExecuteTaskStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ExecuteTaskStep.java index edff1eb5ea..57f2e88526 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ExecuteTaskStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ExecuteTaskStep.java @@ -7,7 +7,8 @@ import jakarta.inject.Inject; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudTask; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientFactory; import org.cloudfoundry.multiapps.controller.core.security.token.TokenService; @@ -17,9 +18,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudTask; - @Named("executeTaskStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class ExecuteTaskStep extends TimeoutAsyncFlowableStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ExtractBatchedServicesWithResolvedDynamicParametersStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ExtractBatchedServicesWithResolvedDynamicParametersStep.java index 4644496c23..482097efd5 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ExtractBatchedServicesWithResolvedDynamicParametersStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ExtractBatchedServicesWithResolvedDynamicParametersStep.java @@ -8,10 +8,11 @@ import java.util.Set; import java.util.stream.Collectors; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudEntity; + import jakarta.inject.Named; import org.cloudfoundry.multiapps.common.util.MiscUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudEntity; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.helpers.DynamicResolvableParametersHelper; @@ -25,6 +26,7 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; + @Named("extractBatchedServicesWithResolvedDynamicParametersStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class ExtractBatchedServicesWithResolvedDynamicParametersStep extends SyncFlowableStep { @@ -82,8 +84,8 @@ private Map getExistingServiceGuidsIfNeeded(CloudControllerClien List servicesCalculatedForDeployment) { Map existingServiceGuids = new HashMap<>(); for (var serviceCalculatedForDeployment : servicesCalculatedForDeployment) { - if (!serviceCalculatedForDeployment.isManaged() - && isServiceInstanceGuidRequired(dynamicResolvableParameters, serviceCalculatedForDeployment)) { + if (!serviceCalculatedForDeployment.isManaged() && isServiceInstanceGuidRequired(dynamicResolvableParameters, + serviceCalculatedForDeployment)) { existingServiceGuids.put(serviceCalculatedForDeployment.getResourceName(), client.getRequiredServiceInstanceGuid(serviceCalculatedForDeployment.getName()) .toString()); diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/IncrementalAppInstancesUpdateStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/IncrementalAppInstancesUpdateStep.java index 194ace9711..7f46f4e753 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/IncrementalAppInstancesUpdateStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/IncrementalAppInstancesUpdateStep.java @@ -1,14 +1,17 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.cloudfoundry.multiapps.controller.process.steps.StepsUtil.disableAutoscaling; -import static org.cloudfoundry.multiapps.controller.process.steps.StepsUtil.enableAutoscaling; - import java.text.MessageFormat; import java.time.Duration; import java.util.List; import java.util.UUID; import java.util.concurrent.TimeUnit; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstanceInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstanceState; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientFactory; import org.cloudfoundry.multiapps.controller.core.model.DeployedMta; @@ -23,13 +26,8 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.InstanceInfo; -import com.sap.cloudfoundry.client.facade.domain.InstanceState; - -import jakarta.inject.Inject; -import jakarta.inject.Named; +import static org.cloudfoundry.multiapps.controller.process.steps.StepsUtil.disableAutoscaling; +import static org.cloudfoundry.multiapps.controller.process.steps.StepsUtil.enableAutoscaling; @Named("incrementalAppInstancesUpdateStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) @@ -66,8 +64,10 @@ protected StepPhase executeAsyncStep(ProcessContext context) throws Exception { List idleApplicationInstances = client.getApplicationInstances(applicationId) .getInstances(); var incrementalAppInstanceUpdateConfigurationBuilder = ImmutableIncrementalAppInstanceUpdateConfiguration.builder() - .newApplication(application) - .newApplicationInstanceCount(idleApplicationInstances.size()); + .newApplication( + application) + .newApplicationInstanceCount( + idleApplicationInstances.size()); int oldApplicationInstanceCount = client.getApplicationInstances(oldApplication) .getInstances() @@ -95,7 +95,8 @@ private StepPhase scaleUpNewAppToTheRequiredInstances(ProcessContext context, Cl client.updateApplicationInstances(application.getName(), application.getInstances()); incrementalAppInstanceUpdateConfigurationBuilder = ImmutableIncrementalAppInstanceUpdateConfiguration.builder() .newApplication(application) - .newApplicationInstanceCount(application.getInstances()); + .newApplicationInstanceCount( + application.getInstances()); context.setVariable(Variables.INCREMENTAL_APP_INSTANCE_UPDATE_CONFIGURATION, incrementalAppInstanceUpdateConfigurationBuilder.build()); setExecutionIndexForPollingNewAppInstances(context); @@ -115,7 +116,8 @@ private DeployedMtaApplication getOldApplication(ProcessContext context, CloudAp DeployedMtaApplication deployedMtaApplication = deployedMta.getApplications() .stream() .filter(deployedApplication -> deployedApplication.getModuleName() - .equals(currentApplication.getModuleName())) + .equals( + currentApplication.getModuleName())) .findFirst() .orElse(null); if (deployedMtaApplication == null) { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteAppStatusExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteAppStatusExecution.java index f207aa8048..42cef59ed4 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteAppStatusExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteAppStatusExecution.java @@ -8,10 +8,9 @@ import java.util.Objects; import java.util.UUID; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.ApplicationLog; -import com.sap.cloudfoundry.client.facade.domain.ApplicationLog.MessageType; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ApplicationLog; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientFactory; import org.cloudfoundry.multiapps.controller.core.cf.apps.ApplicationStateAction; @@ -25,6 +24,7 @@ import org.slf4j.LoggerFactory; import static java.text.MessageFormat.format; +import static org.cloudfoundry.multiapps.controller.client.facade.domain.ApplicationLog.MessageType; public class PollExecuteAppStatusExecution implements AsyncExecution { @@ -153,8 +153,8 @@ private AppExecutionDetailedStatus getAppExecutionStatus(ApplicationLog log, Mar return null; } - private AsyncExecutionState checkAppExecutionStatus(ProcessContext context, CloudApplication app, - ApplicationAttributes appAttributes, AppExecutionDetailedStatus status) { + private AsyncExecutionState checkAppExecutionStatus(ProcessContext context, CloudApplication app, ApplicationAttributes appAttributes, + AppExecutionDetailedStatus status) { var execStatus = status.getStatus(); boolean stopApp = appAttributes.get(SupportedParameters.STOP_APP, Boolean.class, Boolean.FALSE); diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteTaskStatusExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteTaskStatusExecution.java index 25011bb464..cc65b0624f 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteTaskStatusExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteTaskStatusExecution.java @@ -3,8 +3,8 @@ import java.text.MessageFormat; import java.util.UUID; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudTask; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudTask; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientFactory; import org.cloudfoundry.multiapps.controller.core.security.token.TokenService; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollIncrementalAppInstanceUpdateExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollIncrementalAppInstanceUpdateExecution.java index 981de97cd0..254997958b 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollIncrementalAppInstanceUpdateExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollIncrementalAppInstanceUpdateExecution.java @@ -1,17 +1,16 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.cloudfoundry.multiapps.controller.process.steps.StepsUtil.enableAutoscaling; - import java.text.MessageFormat; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.model.ImmutableIncrementalAppInstanceUpdateConfiguration; import org.cloudfoundry.multiapps.controller.core.model.IncrementalAppInstanceUpdateConfiguration; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.variables.Variables; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; +import static org.cloudfoundry.multiapps.controller.process.steps.StepsUtil.enableAutoscaling; public class PollIncrementalAppInstanceUpdateExecution implements AsyncExecution { @@ -19,7 +18,8 @@ public class PollIncrementalAppInstanceUpdateExecution implements AsyncExecution public AsyncExecutionState execute(ProcessContext context) { CloudApplicationExtended appToProcess = context.getVariable(Variables.APP_TO_PROCESS); CloudControllerClient client = context.getControllerClient(); - IncrementalAppInstanceUpdateConfiguration incrementalAppInstanceUpdateConfiguration = context.getVariable(Variables.INCREMENTAL_APP_INSTANCE_UPDATE_CONFIGURATION); + IncrementalAppInstanceUpdateConfiguration incrementalAppInstanceUpdateConfiguration = context.getVariable( + Variables.INCREMENTAL_APP_INSTANCE_UPDATE_CONFIGURATION); context.getStepLogger() .debug(Messages.DESIRED_APPLICATION_0_INSTANCES_1_AND_NOW_SCALED_TO_2, appToProcess.getName(), appToProcess.getInstances(), incrementalAppInstanceUpdateConfiguration.getNewApplicationInstanceCount()); @@ -67,11 +67,12 @@ private void setExecutionIndexForPollingNewAppInstances(ProcessContext context) } private IncrementalAppInstanceUpdateConfiguration - downscaleOldApplication(ProcessContext context, - IncrementalAppInstanceUpdateConfiguration incrementalAppInstanceUpdateConfiguration, - CloudControllerClient client) { + downscaleOldApplication(ProcessContext context, + IncrementalAppInstanceUpdateConfiguration incrementalAppInstanceUpdateConfiguration, + CloudControllerClient client) { var incrementalAppInstanceUpdateConfigurationBuilder = ImmutableIncrementalAppInstanceUpdateConfiguration.builder() - .from(incrementalAppInstanceUpdateConfiguration); + .from( + incrementalAppInstanceUpdateConfiguration); CloudApplication oldApplication = incrementalAppInstanceUpdateConfiguration.getOldApplication(); if (oldApplication != null && incrementalAppInstanceUpdateConfiguration.getOldApplicationInstanceCount() > 1) { int oldApplicationInstancesCount = incrementalAppInstanceUpdateConfiguration.getOldApplicationInstanceCount() - 1; @@ -84,11 +85,12 @@ private void setExecutionIndexForPollingNewAppInstances(ProcessContext context) } private IncrementalAppInstanceUpdateConfiguration - scaleUpNewApplication(ProcessContext context, - IncrementalAppInstanceUpdateConfiguration incrementalAppInstanceUpdateConfiguration, - CloudControllerClient client) { + scaleUpNewApplication(ProcessContext context, + IncrementalAppInstanceUpdateConfiguration incrementalAppInstanceUpdateConfiguration, + CloudControllerClient client) { var incrementalAppInstanceUpdateConfigurationBuilder = ImmutableIncrementalAppInstanceUpdateConfiguration.builder() - .from(incrementalAppInstanceUpdateConfiguration); + .from( + incrementalAppInstanceUpdateConfiguration); CloudApplication newApplication = context.getVariable(Variables.APP_TO_PROCESS); int newApplicationInstancesCount = incrementalAppInstanceUpdateConfiguration.getNewApplicationInstanceCount() + 1; context.getStepLogger() diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollOperationBaseExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollOperationBaseExecution.java index 7053ade223..4cc0dd734e 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollOperationBaseExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollOperationBaseExecution.java @@ -2,12 +2,11 @@ import java.util.function.Consumer; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudAsyncJob; import org.cloudfoundry.multiapps.controller.process.util.AsyncJobToAsyncExecutionStateAdapter; import org.cloudfoundry.multiapps.controller.process.util.ImmutableAsyncJobToAsyncExecutionStateAdapter; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudAsyncJob; - public abstract class PollOperationBaseExecution implements AsyncExecution { @Override @@ -24,7 +23,8 @@ private AsyncJobToAsyncExecutionStateAdapter buildAsyncJobToAsyncExecutionAdapte .inProgressHandler(getInProgressHandler(context)) .onCompleteHandler(getOnCompleteHandler(context)) .onErrorHandler(getOnErrorHandler(context)) - .onErrorHandlerForOptionalResource(getOnErrorHandlerForOptionalResource(context)) + .onErrorHandlerForOptionalResource( + getOnErrorHandlerForOptionalResource(context)) .isOptionalResource(isOptional(context)) .build(); } diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingLastOperationExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingLastOperationExecution.java index 5bfb2eabe0..1e5cfc7eb6 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingLastOperationExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingLastOperationExecution.java @@ -4,16 +4,15 @@ import java.util.List; import java.util.UUID; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.util.StepLogger; import org.cloudfoundry.multiapps.controller.process.variables.Variables; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; - public class PollServiceBindingLastOperationExecution implements AsyncExecution { @Override diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingLastOperationFailSafeExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingLastOperationFailSafeExecution.java index 1b78932508..efec0706ff 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingLastOperationFailSafeExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingLastOperationFailSafeExecution.java @@ -2,11 +2,10 @@ import java.text.MessageFormat; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.variables.Variables; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; - public class PollServiceBindingLastOperationFailSafeExecution extends PollServiceBindingLastOperationExecution { @Override diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingOrKeyOperationExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingOrKeyOperationExecution.java index 6c2147fd94..5fc367cc66 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingOrKeyOperationExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingOrKeyOperationExecution.java @@ -2,15 +2,14 @@ import java.util.List; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.variables.Variables; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; - public class PollServiceBindingOrKeyOperationExecution implements AsyncExecution { @Override diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingUnbindingOperationBaseExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingUnbindingOperationBaseExecution.java index da6921ba6b..1fd21af746 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingUnbindingOperationBaseExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingUnbindingOperationBaseExecution.java @@ -3,13 +3,12 @@ import java.util.List; import java.util.function.Consumer; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudAsyncJob; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.variables.Variables; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudAsyncJob; - public abstract class PollServiceBindingUnbindingOperationBaseExecution extends PollOperationBaseExecution { @Override @@ -46,8 +45,9 @@ protected Consumer getOnErrorHandlerForOptionalResource(ProcessCo CloudApplication app = context.getVariable(Variables.APP_TO_PROCESS); String serviceInstanceName = context.getVariable(Variables.SERVICE_TO_UNBIND_BIND); return serviceBindingJob -> context.getStepLogger() - .warnWithoutProgressMessage(Messages.ASYNC_OPERATION_FOR_SERVICE_BINDING_FOR_OPTIONAL_SERVICE_FAILED_WITH, - app.getName(), serviceInstanceName, serviceBindingJob.getErrors()); + .warnWithoutProgressMessage( + Messages.ASYNC_OPERATION_FOR_SERVICE_BINDING_FOR_OPTIONAL_SERVICE_FAILED_WITH, app.getName(), + serviceInstanceName, serviceBindingJob.getErrors()); } @Override diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBrokerOperationsExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBrokerOperationsExecution.java index 74a037dc66..7e163666da 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBrokerOperationsExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBrokerOperationsExecution.java @@ -3,12 +3,11 @@ import java.text.MessageFormat; import java.util.function.Consumer; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudAsyncJob; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBroker; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.variables.Variables; -import com.sap.cloudfoundry.client.facade.domain.CloudAsyncJob; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBroker; - public class PollServiceBrokerOperationsExecution extends PollOperationBaseExecution { @Override diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBrokersOperationsExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBrokersOperationsExecution.java index 5dbaacb95c..cfb7cfea91 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBrokersOperationsExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBrokersOperationsExecution.java @@ -4,14 +4,13 @@ import java.util.Map; import java.util.function.Consumer; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudAsyncJob; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.util.AsyncJobToAsyncExecutionStateAdapter; import org.cloudfoundry.multiapps.controller.process.util.ImmutableAsyncJobToAsyncExecutionStateAdapter; import org.cloudfoundry.multiapps.controller.process.variables.Variables; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudAsyncJob; - public class PollServiceBrokersOperationsExecution implements AsyncExecution { @Override @@ -23,8 +22,8 @@ public AsyncExecutionState execute(ProcessContext context) { String serviceBrokerName = brokerNameWithJobId.getKey(); String jobId = brokerNameWithJobId.getValue(); CloudControllerClient controllerClient = context.getControllerClient(); - AsyncExecutionState asyncJobStatus = createAsyncJobAdapter(context, - serviceBrokerName).evaluateState(controllerClient.getAsyncJob(jobId)); + AsyncExecutionState asyncJobStatus = createAsyncJobAdapter(context, serviceBrokerName).evaluateState( + controllerClient.getAsyncJob(jobId)); if (asyncJobStatus == AsyncExecutionState.ERROR) { return AsyncExecutionState.ERROR; } @@ -46,8 +45,8 @@ private AsyncJobToAsyncExecutionStateAdapter createAsyncJobAdapter(ProcessContex .inProgressHandler(getInProgressHandler(context, serviceBrokerName)) .onCompleteHandler(getOnCompleteHandler(context, serviceBrokerName)) .onErrorHandler(getOnErrorHandler(context, serviceBrokerName)) - .onErrorHandlerForOptionalResource(getOnErrorHandlerForOptionalResource(context, - serviceBrokerName)) + .onErrorHandlerForOptionalResource( + getOnErrorHandlerForOptionalResource(context, serviceBrokerName)) .build(); } diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceCreateOrUpdateOperationsExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceCreateOrUpdateOperationsExecution.java index 4a7b653900..9f044d347e 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceCreateOrUpdateOperationsExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceCreateOrUpdateOperationsExecution.java @@ -3,8 +3,9 @@ import java.text.MessageFormat; import java.util.List; import java.util.function.Supplier; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; + import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.util.ServiceOperationGetter; @@ -43,8 +44,7 @@ protected ServiceOperation mapOperationState(StepLogger stepLogger, ServiceOpera lastServiceOperation = super.mapOperationState(stepLogger, lastServiceOperation, service); if (shouldIgnoreLastOperationFailure(lastServiceOperation)) { stepLogger.warn(Messages.FAILED_SERVICE_UPDATE, service.getName(), lastServiceOperation.getDescription()); - return new ServiceOperation(lastServiceOperation.getType(), - lastServiceOperation.getDescription(), + return new ServiceOperation(lastServiceOperation.getType(), lastServiceOperation.getDescription(), ServiceOperation.State.SUCCEEDED); } return lastServiceOperation; @@ -52,8 +52,7 @@ protected ServiceOperation mapOperationState(StepLogger stepLogger, ServiceOpera private boolean shouldIgnoreLastOperationFailure(ServiceOperation lastServiceOperation) { return lastServiceOperation.getType() == ServiceOperation.Type.UPDATE - && lastServiceOperation.getState() == ServiceOperation.State.FAILED - && !shouldFailOnUpdateSupplier.get(); + && lastServiceOperation.getState() == ServiceOperation.State.FAILED && !shouldFailOnUpdateSupplier.get(); } @Override @@ -88,8 +87,7 @@ private String getSuccessMessage(CloudServiceInstanceExtended service, ServiceOp return MessageFormat.format(Messages.SERVICE_UPDATED, service.getName()); default: throw new IllegalStateException( - MessageFormat.format(org.cloudfoundry.multiapps.controller.core.Messages.ILLEGAL_SERVICE_OPERATION_TYPE, - type)); + MessageFormat.format(org.cloudfoundry.multiapps.controller.core.Messages.ILLEGAL_SERVICE_OPERATION_TYPE, type)); } } diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceDeleteOperationsExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceDeleteOperationsExecution.java index 983b104e27..122a730a51 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceDeleteOperationsExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceDeleteOperationsExecution.java @@ -4,6 +4,7 @@ import java.util.List; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.util.ServiceOperationGetter; @@ -11,8 +12,6 @@ import org.cloudfoundry.multiapps.controller.process.util.StepLogger; import org.cloudfoundry.multiapps.controller.process.variables.Variables; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; - public class PollServiceDeleteOperationsExecution extends PollServiceOperationsExecution { public PollServiceDeleteOperationsExecution(ServiceOperationGetter serviceOperationGetter, diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceInProgressOperationsExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceInProgressOperationsExecution.java index eae8830c88..3141891ebd 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceInProgressOperationsExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceInProgressOperationsExecution.java @@ -4,6 +4,7 @@ import java.util.List; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.util.ServiceOperationGetter; @@ -11,8 +12,6 @@ import org.cloudfoundry.multiapps.controller.process.util.StepLogger; import org.cloudfoundry.multiapps.controller.process.variables.Variables; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; - public class PollServiceInProgressOperationsExecution extends PollServiceOperationsExecution { public PollServiceInProgressOperationsExecution(ServiceOperationGetter serviceOperationGetter, @@ -51,8 +50,9 @@ private String getSuccessMessage(CloudServiceInstanceExtended service, ServiceOp case DELETE: return MessageFormat.format(Messages.SERVICE_DELETED, service.getName()); default: - throw new IllegalStateException(MessageFormat.format(org.cloudfoundry.multiapps.controller.core.Messages.ILLEGAL_SERVICE_OPERATION_TYPE, - type)); + throw new IllegalStateException( + MessageFormat.format(org.cloudfoundry.multiapps.controller.core.Messages.ILLEGAL_SERVICE_OPERATION_TYPE, + type)); } } @@ -68,8 +68,9 @@ private String getFailureMessage(CloudServiceInstanceExtended service, ServiceOp return MessageFormat.format(Messages.ERROR_DELETING_SERVICE, service.getName(), service.getLabel(), service.getPlan(), lastServiceOperation.getDescription()); default: - throw new IllegalStateException(MessageFormat.format(org.cloudfoundry.multiapps.controller.core.Messages.ILLEGAL_SERVICE_OPERATION_TYPE, - lastServiceOperation.getType())); + throw new IllegalStateException( + MessageFormat.format(org.cloudfoundry.multiapps.controller.core.Messages.ILLEGAL_SERVICE_OPERATION_TYPE, + lastServiceOperation.getType())); } } diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyCreationOperationExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyCreationOperationExecution.java index 082d5d7d1f..d86a801fcb 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyCreationOperationExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyCreationOperationExecution.java @@ -2,12 +2,11 @@ import java.util.function.Consumer; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudAsyncJob; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.variables.Variables; -import com.sap.cloudfoundry.client.facade.domain.CloudAsyncJob; - public class PollServiceKeyCreationOperationExecution extends PollServiceKeyOperationExecution { @Override @@ -15,7 +14,7 @@ protected Consumer getOnErrorHandlerForOptionalResource(ProcessCo CloudServiceInstanceExtended serviceInstanceToProcess = context.getVariable(Variables.SERVICE_TO_PROCESS); return serviceKeyJob -> context.getStepLogger() .warn(Messages.ASYNC_OPERATION_FOR_OPTIONAL_SERVICE_KEY_FAILED_WITH, - serviceInstanceToProcess.getName(), serviceKeyJob.getErrors()); + serviceInstanceToProcess.getName(), serviceKeyJob.getErrors()); } @Override diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyDeletionLastOperationExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyDeletionLastOperationExecution.java index 622a3aba22..f3f22a5fcc 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyDeletionLastOperationExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyDeletionLastOperationExecution.java @@ -1,6 +1,6 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; public class PollServiceKeyDeletionLastOperationExecution extends PollServiceKeyLastOperationExecution { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyDeletionOperationExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyDeletionOperationExecution.java index af3d9daa80..63aa9bac43 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyDeletionOperationExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyDeletionOperationExecution.java @@ -2,11 +2,10 @@ import java.util.function.Consumer; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudAsyncJob; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.variables.Variables; -import com.sap.cloudfoundry.client.facade.domain.CloudAsyncJob; - public class PollServiceKeyDeletionOperationExecution extends PollServiceKeyOperationExecution { @Override diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyLastOperationExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyLastOperationExecution.java index 9c91c92d21..37e1a62aa6 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyLastOperationExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyLastOperationExecution.java @@ -2,14 +2,13 @@ import java.text.MessageFormat; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.variables.Variables; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; - public class PollServiceKeyLastOperationExecution implements AsyncExecution { @Override @@ -17,8 +16,7 @@ public AsyncExecutionState execute(ProcessContext context) { CloudControllerClient controllerClient = context.getControllerClient(); CloudServiceKey serviceKeyToProcess = context.getVariable(Variables.SERVICE_KEY_TO_PROCESS); CloudServiceKey serviceKey = controllerClient.getServiceKey(serviceKeyToProcess.getServiceInstance() - .getName(), - serviceKeyToProcess.getName()); + .getName(), serviceKeyToProcess.getName()); return checkServiceKeyLastOperation(serviceKey, context); } diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyLastOperationFailSafeExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyLastOperationFailSafeExecution.java index 8c41214fb1..09d1895270 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyLastOperationFailSafeExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyLastOperationFailSafeExecution.java @@ -1,9 +1,8 @@ package org.cloudfoundry.multiapps.controller.process.steps; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; import org.cloudfoundry.multiapps.controller.process.Messages; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; - public class PollServiceKeyLastOperationFailSafeExecution extends PollServiceKeyLastOperationExecution { @Override diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyOperationExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyOperationExecution.java index 69f772652f..bcf3eebeab 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyOperationExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyOperationExecution.java @@ -2,12 +2,11 @@ import java.util.function.Consumer; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudAsyncJob; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.variables.Variables; -import com.sap.cloudfoundry.client.facade.domain.CloudAsyncJob; - public abstract class PollServiceKeyOperationExecution extends PollOperationBaseExecution { @Override diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceOperationsExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceOperationsExecution.java index 840d257bb4..c01b3c9cc8 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceOperationsExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceOperationsExecution.java @@ -1,7 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static java.text.MessageFormat.format; - import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -11,6 +9,9 @@ import org.apache.commons.collections4.CollectionUtils; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.security.serialization.SecureSerialization; import org.cloudfoundry.multiapps.controller.process.Messages; @@ -19,9 +20,7 @@ import org.cloudfoundry.multiapps.controller.process.util.StepLogger; import org.cloudfoundry.multiapps.controller.process.variables.Variables; -import com.sap.cloudfoundry.client.facade.CloudControllerException; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; +import static java.text.MessageFormat.format; public abstract class PollServiceOperationsExecution implements AsyncExecution { @@ -76,9 +75,8 @@ protected List getServiceOperationsToPoll(ProcessC return servicesToPoll; } - protected List - getServicesWithTriggeredOperations(Collection services, - Map triggeredServiceOperations) { + protected List getServicesWithTriggeredOperations(Collection services, + Map triggeredServiceOperations) { return services.stream() .filter(cloudService -> triggeredServiceOperations.containsKey(cloudService.getName())) .collect(Collectors.toList()); @@ -111,8 +109,7 @@ private ServiceOperation getLastServiceOperation(ProcessContext context, CloudSe protected ServiceOperation mapOperationState(StepLogger stepLogger, ServiceOperation lastServiceOperation, CloudServiceInstanceExtended service) { if (lastServiceOperation.getDescription() == null && lastServiceOperation.getState() == ServiceOperation.State.FAILED) { - return new ServiceOperation(lastServiceOperation.getType(), - Messages.DEFAULT_FAILED_OPERATION_DESCRIPTION, + return new ServiceOperation(lastServiceOperation.getType(), Messages.DEFAULT_FAILED_OPERATION_DESCRIPTION, lastServiceOperation.getState()); } return lastServiceOperation; @@ -130,8 +127,8 @@ private void reportOverallProgress(ProcessContext context, Collection - getRemainingServicesToPoll(Map servicesWithLastOperation) { + protected List getRemainingServicesToPoll( + Map servicesWithLastOperation) { return servicesWithLastOperation.entrySet() .stream() .filter(this::isOperationInProgress) diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceUnbindingLastOperationExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceUnbindingLastOperationExecution.java index 4423154278..bbc7debd4c 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceUnbindingLastOperationExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceUnbindingLastOperationExecution.java @@ -1,6 +1,6 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; public class PollServiceUnbindingLastOperationExecution extends PollServiceBindingLastOperationExecution { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStageAppStatusExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStageAppStatusExecution.java index e41ccf522c..87aebb5b0a 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStageAppStatusExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStageAppStatusExecution.java @@ -3,9 +3,9 @@ import java.text.MessageFormat; import java.util.UUID; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.PackageState; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.PackageState; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientFactory; import org.cloudfoundry.multiapps.controller.core.security.token.TokenService; import org.cloudfoundry.multiapps.controller.persistence.services.ProcessLoggerProvider; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartAppExecutionWithRollbackExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartAppExecutionWithRollbackExecution.java index 6dc6879582..a1fbc35243 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartAppExecutionWithRollbackExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartAppExecutionWithRollbackExecution.java @@ -1,5 +1,7 @@ package org.cloudfoundry.multiapps.controller.process.steps; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientFactory; import org.cloudfoundry.multiapps.controller.core.model.IncrementalAppInstanceUpdateConfiguration; @@ -7,9 +9,6 @@ import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.variables.Variables; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; - import static org.cloudfoundry.multiapps.controller.process.steps.StepsUtil.enableAutoscaling; public class PollStartAppExecutionWithRollbackExecution extends PollStartAppStatusExecution { @@ -28,15 +27,15 @@ public AsyncExecutionState execute(ProcessContext context) { } private void rollbackOldAppInstances(ProcessContext context) { - IncrementalAppInstanceUpdateConfiguration incrementalAppInstanceUpdateConfiguration = context.getVariable(Variables.INCREMENTAL_APP_INSTANCE_UPDATE_CONFIGURATION); + IncrementalAppInstanceUpdateConfiguration incrementalAppInstanceUpdateConfiguration = context.getVariable( + Variables.INCREMENTAL_APP_INSTANCE_UPDATE_CONFIGURATION); CloudApplication oldApplication = incrementalAppInstanceUpdateConfiguration.getOldApplication(); CloudControllerClient client = context.getControllerClient(); context.getStepLogger() .warn(Messages.SCALING_DOWN_NEW_APPLICATION_TO_ONE_INSTANCE, incrementalAppInstanceUpdateConfiguration.getNewApplication() .getName()); client.updateApplicationInstances(incrementalAppInstanceUpdateConfiguration.getNewApplication() - .getName(), - 1); + .getName(), 1); if (oldApplication == null) { return; } @@ -50,7 +49,8 @@ private void rollbackOldAppInstances(ProcessContext context) { @Override protected void onSuccess(ProcessContext context, String message, Object... arguments) { - IncrementalAppInstanceUpdateConfiguration incrementalAppInstanceUpdateConfiguration = context.getVariable(Variables.INCREMENTAL_APP_INSTANCE_UPDATE_CONFIGURATION); + IncrementalAppInstanceUpdateConfiguration incrementalAppInstanceUpdateConfiguration = context.getVariable( + Variables.INCREMENTAL_APP_INSTANCE_UPDATE_CONFIGURATION); CloudApplicationExtended appToProcess = context.getVariable(Variables.APP_TO_PROCESS); if (incrementalAppInstanceUpdateConfiguration.getNewApplicationInstanceCount() == appToProcess.getInstances()) { super.onSuccess(context, message, arguments); diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartAppStatusExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartAppStatusExecution.java index 893f0cdcf6..6e94188a71 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartAppStatusExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartAppStatusExecution.java @@ -4,11 +4,11 @@ import java.util.Map; import java.util.stream.Collectors; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; -import com.sap.cloudfoundry.client.facade.domain.InstanceInfo; -import com.sap.cloudfoundry.client.facade.domain.InstanceState; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstanceInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstanceState; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientFactory; import org.cloudfoundry.multiapps.controller.core.security.token.TokenService; import org.cloudfoundry.multiapps.controller.core.util.UriUtil; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartLiveAppExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartLiveAppExecution.java index 03497d8cbe..169ee05bc8 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartLiveAppExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartLiveAppExecution.java @@ -1,6 +1,8 @@ package org.cloudfoundry.multiapps.controller.process.steps; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientFactory; import org.cloudfoundry.multiapps.controller.core.model.DeployedMtaApplication; @@ -8,9 +10,6 @@ import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.variables.Variables; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; - public class PollStartLiveAppExecution extends PollStartAppStatusExecution { public PollStartLiveAppExecution(CloudControllerClientFactory clientFactory, TokenService tokenService) { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartServiceBrokerSubscriberStatusExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartServiceBrokerSubscriberStatusExecution.java index 0d67c0e7cc..4840c8b664 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartServiceBrokerSubscriberStatusExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartServiceBrokerSubscriberStatusExecution.java @@ -1,14 +1,12 @@ package org.cloudfoundry.multiapps.controller.process.steps; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientFactory; import org.cloudfoundry.multiapps.controller.core.security.token.TokenService; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; - public class PollStartServiceBrokerSubscriberStatusExecution extends PollStartAppStatusExecution { - public PollStartServiceBrokerSubscriberStatusExecution(CloudControllerClientFactory clientFactory, - TokenService tokenService) { + public PollStartServiceBrokerSubscriberStatusExecution(CloudControllerClientFactory clientFactory, TokenService tokenService) { super(clientFactory, tokenService); } diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollUploadAppStatusExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollUploadAppStatusExecution.java index ce04e30c85..d7f95bd2f6 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollUploadAppStatusExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollUploadAppStatusExecution.java @@ -1,21 +1,20 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static java.text.MessageFormat.format; - import java.util.UUID; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ErrorDetails; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Upload; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudPackage; -import com.sap.cloudfoundry.client.facade.domain.ErrorDetails; -import com.sap.cloudfoundry.client.facade.domain.Upload; +import static java.text.MessageFormat.format; public class PollUploadAppStatusExecution implements AsyncExecution { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PrepareApplicationForBackupStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PrepareApplicationForBackupStep.java index 04e315e1a7..ec99aa294e 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PrepareApplicationForBackupStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PrepareApplicationForBackupStep.java @@ -2,7 +2,10 @@ import java.text.MessageFormat; +import jakarta.inject.Named; import org.cloudfoundry.client.v3.Metadata; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadataAnnotations; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadataLabels; import org.cloudfoundry.multiapps.controller.core.cf.metadata.util.MtaMetadataUtil; @@ -14,11 +17,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; - -import jakarta.inject.Named; - @Named("prepareApplicationForBackupStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class PrepareApplicationForBackupStep extends SyncFlowableStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PrepareBackupMtaForDeploymentStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PrepareBackupMtaForDeploymentStep.java index 6225e06431..154b62be26 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PrepareBackupMtaForDeploymentStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PrepareBackupMtaForDeploymentStep.java @@ -4,7 +4,11 @@ import java.util.function.Function; import java.util.stream.Collectors; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.persistence.NoResultException; import org.cloudfoundry.multiapps.common.ContentException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; import org.cloudfoundry.multiapps.controller.core.cf.detect.DeployedMtaDetector; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadataAnnotations; import org.cloudfoundry.multiapps.controller.core.model.DeployedMta; @@ -20,12 +24,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; - -import jakarta.inject.Inject; -import jakarta.inject.Named; -import jakarta.persistence.NoResultException; - @Named("prepareBackupMtaForDeploymentStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class PrepareBackupMtaForDeploymentStep extends SyncFlowableStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PrepareToExecuteTasksStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PrepareToExecuteTasksStep.java index d9a4b50c7c..64073d204f 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PrepareToExecuteTasksStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PrepareToExecuteTasksStep.java @@ -4,14 +4,12 @@ import java.util.List; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudTask; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.domain.CloudTask; - @Named("prepareToExecuteTasksStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class PrepareToExecuteTasksStep extends SyncFlowableStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PrepareToRestartServiceBrokerSubscribersStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PrepareToRestartServiceBrokerSubscribersStep.java index 7fe03c0523..8a4fc37853 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PrepareToRestartServiceBrokerSubscribersStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PrepareToRestartServiceBrokerSubscribersStep.java @@ -3,14 +3,12 @@ import java.util.List; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; - @Named("prepareToRestartServiceBrokerSubscribersStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class PrepareToRestartServiceBrokerSubscribersStep extends SyncFlowableStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ProcessContext.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ProcessContext.java index fe34c50b03..616b58e551 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ProcessContext.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ProcessContext.java @@ -1,7 +1,7 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientProvider; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.client.LoggingCloudControllerClient; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RemoveMtaBackupMetadataStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RemoveMtaBackupMetadataStep.java index 42eccbf6b9..78bff75200 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RemoveMtaBackupMetadataStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RemoveMtaBackupMetadataStep.java @@ -1,6 +1,8 @@ package org.cloudfoundry.multiapps.controller.process.steps; +import jakarta.inject.Named; import org.cloudfoundry.client.v3.Metadata; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadataAnnotations; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadataLabels; import org.cloudfoundry.multiapps.controller.core.cf.metadata.util.MtaMetadataUtil; @@ -11,10 +13,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; - -import jakarta.inject.Named; - @Named("removeMtaBackupMetadataStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class RemoveMtaBackupMetadataStep extends SyncFlowableStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RemoveNewApplicationsSuffixStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RemoveNewApplicationsSuffixStep.java index d6e7315087..aee843d5d3 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RemoveNewApplicationsSuffixStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RemoveNewApplicationsSuffixStep.java @@ -4,7 +4,7 @@ import jakarta.inject.Inject; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; import org.cloudfoundry.multiapps.controller.core.model.BlueGreenApplicationNameSuffix; import org.cloudfoundry.multiapps.controller.persistence.model.ConfigurationSubscription; import org.cloudfoundry.multiapps.controller.persistence.services.ConfigurationSubscriptionService; @@ -13,8 +13,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; - @Named("removeNewApplicationsSuffixStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class RemoveNewApplicationsSuffixStep extends SyncFlowableStep { @@ -64,15 +62,9 @@ private void updateConfigurationSubscription(ConfigurationSubscription subscript } private ConfigurationSubscription createNewSubscription(ConfigurationSubscription subscription, String newAppName) { - return new ConfigurationSubscription(subscription.getId(), - subscription.getMtaId(), - subscription.getSpaceId(), - newAppName, - subscription.getFilter(), - subscription.getModuleDto(), - subscription.getResourceDto(), - subscription.getModuleId(), - subscription.getResourceId()); + return new ConfigurationSubscription(subscription.getId(), subscription.getMtaId(), subscription.getSpaceId(), newAppName, + subscription.getFilter(), subscription.getModuleDto(), subscription.getResourceDto(), + subscription.getModuleId(), subscription.getResourceId()); } @Override diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RenameApplicationsStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RenameApplicationsStep.java index 8e9915062c..35401b900b 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RenameApplicationsStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RenameApplicationsStep.java @@ -3,8 +3,11 @@ import java.util.ArrayList; import java.util.List; +import jakarta.inject.Inject; +import jakarta.inject.Named; import org.cloudfoundry.multiapps.common.ConflictException; import org.cloudfoundry.multiapps.controller.api.model.ProcessType; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; import org.cloudfoundry.multiapps.controller.core.helpers.ApplicationNameSuffixAppender; import org.cloudfoundry.multiapps.controller.core.model.ApplicationColor; import org.cloudfoundry.multiapps.controller.core.model.BlueGreenApplicationNameSuffix; @@ -25,11 +28,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; - -import jakarta.inject.Inject; -import jakarta.inject.Named; - @Named("renameApplicationsStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class RenameApplicationsStep extends SyncFlowableStep { @@ -133,8 +131,8 @@ private ApplicationColor computeLiveMtaColor(ProcessContext context, DeployedMta return liveMtaColor; } catch (ConflictException e) { getStepLogger().warn(e.getMessage()); - ApplicationColor liveMtaColor = applicationColorDetector.detectLiveApplicationColor(deployedMta, - context.getVariable(Variables.CORRELATION_ID)); + ApplicationColor liveMtaColor = applicationColorDetector.detectLiveApplicationColor(deployedMta, context.getVariable( + Variables.CORRELATION_ID)); ApplicationColor idleMtaColor = liveMtaColor.getAlternativeColor(); getStepLogger().info(Messages.ASSUMED_LIVE_AND_IDLE_COLORS, liveMtaColor, idleMtaColor); return liveMtaColor; @@ -180,8 +178,9 @@ public void execute(ProcessContext context) { List backupMtaApplications = new ArrayList<>(); for (DeployedMtaApplication backupMtaApplication : backupMta.getApplications()) { String backupApplicationName = backupMtaApplication.getName(); - String applicationNameWithoutMtaBackupNamespace = backupApplicationName.substring(NameUtil.getNamespacePrefix(Constants.MTA_BACKUP_NAMESPACE) - .length()); + String applicationNameWithoutMtaBackupNamespace = backupApplicationName.substring( + NameUtil.getNamespacePrefix(Constants.MTA_BACKUP_NAMESPACE) + .length()); getStepLogger().info(Messages.RENAME_BACKUP_APPLICATION_0_TO_1, backupApplicationName, applicationNameWithoutMtaBackupNamespace); client.rename(backupApplicationName, applicationNameWithoutMtaBackupNamespace); diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RestartAppStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RestartAppStep.java index 30ed0eba7f..9016e5933f 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RestartAppStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RestartAppStep.java @@ -4,6 +4,11 @@ import java.time.Duration; import java.util.List; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientFactory; import org.cloudfoundry.multiapps.controller.core.model.HookPhase; import org.cloudfoundry.multiapps.controller.core.security.token.TokenService; @@ -14,14 +19,6 @@ import org.springframework.context.annotation.Scope; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication.State; - -import jakarta.inject.Inject; -import jakarta.inject.Named; - @Named("restartAppStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class RestartAppStep extends TimeoutAsyncFlowableStepWithHooks implements BeforeStepHookPhaseProvider { @@ -62,7 +59,7 @@ private boolean isStarted(CloudControllerClient client, String appName) { try { CloudApplication app = client.getApplication(appName); return app.getState() - .equals(State.STARTED); + .equals(CloudApplication.State.STARTED); } catch (CloudOperationException e) { if (e.getStatusCode() .equals(HttpStatus.INTERNAL_SERVER_ERROR)) { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RestartServiceBrokerSubscriberStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RestartServiceBrokerSubscriberStep.java index d4b76dc88c..aaaa25f930 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RestartServiceBrokerSubscriberStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RestartServiceBrokerSubscriberStep.java @@ -4,13 +4,11 @@ import java.util.List; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.process.Messages; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; - @Named("restartServiceBrokerSubscriberStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class RestartServiceBrokerSubscriberStep extends RestartAppStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RestartSubscribersStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RestartSubscribersStep.java index 7850fbe394..4e1a64975c 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RestartSubscribersStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RestartSubscribersStep.java @@ -3,17 +3,15 @@ import java.util.List; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudSpace; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudSpace; - @Named("restartSubscribersStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class RestartSubscribersStep extends SyncFlowableStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ScaleAppStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ScaleAppStep.java index 0b08a27084..a8604e5fb0 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ScaleAppStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ScaleAppStep.java @@ -2,17 +2,15 @@ import java.text.MessageFormat; +import jakarta.inject.Named; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; - -import jakarta.inject.Named; - @Named("scaleAppStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class ScaleAppStep extends SyncFlowableStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ServiceStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ServiceStep.java index 1555c1818f..cfb562278e 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ServiceStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ServiceStep.java @@ -5,8 +5,12 @@ import java.util.Map; import jakarta.inject.Inject; - import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudServiceBrokerException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.util.OperationExecutionState; import org.cloudfoundry.multiapps.controller.process.Messages; @@ -15,12 +19,6 @@ import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudControllerException; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.CloudServiceBrokerException; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; - public abstract class ServiceStep extends AsyncFlowableStep { @Inject diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/StageAppStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/StageAppStep.java index e162e7a251..8e11f5cafa 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/StageAppStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/StageAppStep.java @@ -6,7 +6,7 @@ import jakarta.inject.Inject; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientFactory; import org.cloudfoundry.multiapps.controller.core.security.token.TokenService; import org.cloudfoundry.multiapps.controller.process.Messages; @@ -16,8 +16,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; - @Named("stageAppStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class StageAppStep extends TimeoutAsyncFlowableStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/StepsUtil.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/StepsUtil.java index 3a41037365..7228b15780 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/StepsUtil.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/StepsUtil.java @@ -13,16 +13,16 @@ import java.util.stream.Collectors; import com.fasterxml.jackson.core.type.TypeReference; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.adapters.LogCacheClient; -import com.sap.cloudfoundry.client.facade.domain.ApplicationLog; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBroker; -import com.sap.cloudfoundry.client.facade.domain.CloudTask; import org.apache.commons.lang3.StringUtils; import org.cloudfoundry.client.v3.Metadata; import org.cloudfoundry.multiapps.common.SLException; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.LogCacheClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ApplicationLog; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBroker; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudTask; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.cf.CloudHandlerFactory; import org.cloudfoundry.multiapps.controller.core.cf.detect.AppSuffixDeterminer; @@ -127,8 +127,8 @@ static List getDeletedEntriesFromProcess(FlowableFacade flow static List getDeletedEntriesFromAllProcesses(ProcessContext context, FlowableFacade flowableFacade) { String correlationId = context.getVariable(Variables.CORRELATION_ID); - List configurationEntries = new ArrayList<>(StepsUtil.getDeletedEntriesFromProcess(flowableFacade, - correlationId)); + List configurationEntries = new ArrayList<>( + StepsUtil.getDeletedEntriesFromProcess(flowableFacade, correlationId)); List subProcessIds = flowableFacade.getHistoricSubProcessIds(correlationId); for (String subProcessId : subProcessIds) { configurationEntries.addAll(getDeletedEntriesFromProcess(flowableFacade, subProcessId)); diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/StopAppStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/StopAppStep.java index 80e197afca..8b652fe803 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/StopAppStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/StopAppStep.java @@ -3,6 +3,10 @@ import java.text.MessageFormat; import java.util.List; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.model.HookPhase; import org.cloudfoundry.multiapps.controller.process.Messages; @@ -12,13 +16,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication.State; - -import jakarta.inject.Inject; -import jakarta.inject.Named; - @Named("stopAppStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class StopAppStep extends SyncFlowableStepWithHooks implements BeforeStepHookPhaseProvider, AfterStepHookPhaseProvider { @@ -34,7 +31,7 @@ public StepPhase executeStepInternal(ProcessContext context) { CloudApplication existingApp = context.getVariable(Variables.EXISTING_APP); if (existingApp != null && !existingApp.getState() - .equals(State.STOPPED)) { + .equals(CloudApplication.State.STOPPED)) { getStepLogger().info(Messages.STOPPING_APP, app.getName()); CloudControllerClient client = context.getControllerClient(); diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/StopApplicationUndeploymentStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/StopApplicationUndeploymentStep.java index 66aa450764..744fc45894 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/StopApplicationUndeploymentStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/StopApplicationUndeploymentStep.java @@ -3,6 +3,10 @@ import java.text.MessageFormat; import java.util.List; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.core.model.HookPhase; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.util.ApplicationWaitAfterStopHandler; @@ -10,12 +14,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; - -import jakarta.inject.Inject; -import jakarta.inject.Named; - @Named("stopApplicationUndeploymentStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class StopApplicationUndeploymentStep extends UndeployAppStep implements BeforeStepHookPhaseProvider, AfterStepHookPhaseProvider { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/SyncFlowableStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/SyncFlowableStep.java index 784959dcda..ce4e3d43de 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/SyncFlowableStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/SyncFlowableStep.java @@ -2,12 +2,15 @@ import java.util.function.BiFunction; +import io.netty.handler.timeout.TimeoutException; import jakarta.inject.Inject; import jakarta.inject.Named; - import org.apache.commons.lang3.StringUtils; import org.cloudfoundry.multiapps.common.ContentException; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudServiceBrokerException; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientProvider; import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration; import org.cloudfoundry.multiapps.controller.core.util.LoggingUtil; @@ -28,12 +31,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.sap.cloudfoundry.client.facade.CloudControllerException; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.CloudServiceBrokerException; - -import io.netty.handler.timeout.TimeoutException; - public abstract class SyncFlowableStep implements JavaDelegate { protected final Logger logger = LoggerFactory.getLogger(getClass()); @@ -120,7 +117,7 @@ private void handleException(ProcessContext context, Exception e) { * * @param context flowable context of the step * @param e thrown exception from {@link #executeStep(ProcessContext) executeStep} and pre-processed by - * {@link #handleException(ProcessContext, Exception) handleException} + * {@link #handleException(ProcessContext, Exception) handleException} * @throws Exception in case derivative methods throw exception */ protected void onStepError(ProcessContext context, Exception e) throws Exception { @@ -137,8 +134,7 @@ private Exception handleControllerException(Exception e) { return new CloudControllerException((CloudOperationException) e); } if (e instanceof TimeoutException) { - return new SLException(e, - Messages.TIMEOUT_0_EXCEEDED_WHILE_WAITING_CLOUD_CONTROLLER, + return new SLException(e, Messages.TIMEOUT_0_EXCEEDED_WHILE_WAITING_CLOUD_CONTROLLER, configuration.getControllerClientResponseTimeout() .toSeconds()); } diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UnbindServiceFromApplicationStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UnbindServiceFromApplicationStep.java index bd232b5708..4d51c2ab64 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UnbindServiceFromApplicationStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UnbindServiceFromApplicationStep.java @@ -6,7 +6,11 @@ import java.util.function.Supplier; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.ApplicationServicesUpdateCallback; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.ServiceBindingOperationCallback; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.util.DeletingServiceBindingOperationCallback; @@ -16,12 +20,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.ApplicationServicesUpdateCallback; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.ServiceBindingOperationCallback; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; - @Named("unbindServiceFromApplicationStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class UnbindServiceFromApplicationStep extends AsyncFlowableStep { @@ -31,20 +29,18 @@ protected StepPhase executeAsyncStep(ProcessContext context) throws Exception { CloudServiceBinding serviceBindingToDelete = context.getVariable(Variables.SERVICE_BINDING_TO_DELETE); CloudControllerClient controllerClient = context.getControllerClient(); if (serviceBindingToDelete != null) { - return deleteServiceBinding(context, - () -> controllerClient.deleteServiceBinding(serviceBindingToDelete.getGuid(), - getServiceBindingOperationCallback(context, - controllerClient)), + return deleteServiceBinding(context, () -> controllerClient.deleteServiceBinding(serviceBindingToDelete.getGuid(), + getServiceBindingOperationCallback(context, + controllerClient)), () -> MessageFormat.format(Messages.DELETION_OF_SERVICE_BINDING_0_FINISHED, serviceBindingToDelete.getGuid())); } CloudApplicationExtended app = context.getVariable(Variables.APP_TO_PROCESS); String serviceInstanceName = context.getVariable(Variables.SERVICE_TO_UNBIND_BIND); getStepLogger().info(Messages.UNBINDING_SERVICE_INSTANCE_FROM_APP, serviceInstanceName, app.getName()); - return deleteServiceBinding(context, - () -> controllerClient.unbindServiceInstance(app.getName(), serviceInstanceName, - getApplicationServicesUpdateCallback(context, - controllerClient)), + return deleteServiceBinding(context, () -> controllerClient.unbindServiceInstance(app.getName(), serviceInstanceName, + getApplicationServicesUpdateCallback(context, + controllerClient)), () -> MessageFormat.format(Messages.UNBINDING_SERVICE_INSTANCE_FROM_APP_FINISHED, serviceInstanceName, app.getName())); } diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UndeployAppStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UndeployAppStep.java index 4ead9515fa..126fd67bb0 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UndeployAppStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UndeployAppStep.java @@ -1,10 +1,9 @@ package org.cloudfoundry.multiapps.controller.process.steps; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.process.variables.Variables; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; - public abstract class UndeployAppStep extends SyncFlowableStepWithHooks { @Override diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceBrokerSubscriberStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceBrokerSubscriberStep.java index 518e580962..f8076a09fb 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceBrokerSubscriberStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceBrokerSubscriberStep.java @@ -3,7 +3,12 @@ import java.text.MessageFormat; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBroker; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceBroker; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.util.ExceptionMessageTailMapper; import org.cloudfoundry.multiapps.controller.process.util.ExceptionMessageTailMapper.CloudComponents; @@ -11,13 +16,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudControllerException; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBroker; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceBroker; - @Named("updateServiceBrokerSubscriberStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class UpdateServiceBrokerSubscriberStep extends CreateOrUpdateServiceBrokerStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceKeysMetadataStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceKeysMetadataStep.java index 1c8dd0b228..e4581ceefd 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceKeysMetadataStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceKeysMetadataStep.java @@ -5,16 +5,14 @@ import java.util.stream.Collectors; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; - @Named("updateServiceKeysMetadataStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class UpdateServiceKeysMetadataStep extends SyncFlowableStep { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceMetadataStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceMetadataStep.java index 59bde959a5..d12af6525f 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceMetadataStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceMetadataStep.java @@ -6,17 +6,15 @@ import java.util.UUID; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.util.OperationExecutionState; import org.cloudfoundry.multiapps.controller.process.Messages; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; - @Named("updateServiceMetadataStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class UpdateServiceMetadataStep extends ServiceStep { @@ -33,8 +31,7 @@ protected OperationExecutionState executeOperation(ProcessContext context, Cloud } catch (CloudOperationException e) { String exceptionDescription = MessageFormat.format(Messages.COULD_NOT_UPDATE_METADATA_OF_SERVICE, service.getName(), e.getDescription()); - CloudOperationException cloudOperationException = new CloudOperationException(e.getStatusCode(), - e.getStatusText(), + CloudOperationException cloudOperationException = new CloudOperationException(e.getStatusCode(), e.getStatusText(), exceptionDescription); processServiceActionFailure(context, service, cloudOperationException); @@ -46,8 +43,8 @@ protected OperationExecutionState executeOperation(ProcessContext context, Cloud @Override protected List getAsyncStepExecutions(ProcessContext context) { - return Collections.singletonList(new PollServiceCreateOrUpdateOperationsExecution(getServiceOperationGetter(), - getServiceProgressReporter())); + return Collections.singletonList( + new PollServiceCreateOrUpdateOperationsExecution(getServiceOperationGetter(), getServiceProgressReporter())); } @Override diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceParametersStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceParametersStep.java index cfa4865030..e92a59236d 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceParametersStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceParametersStep.java @@ -3,10 +3,11 @@ import java.text.MessageFormat; import java.util.List; import java.util.function.Supplier; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; + import jakarta.inject.Named; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.util.OperationExecutionState; import org.cloudfoundry.multiapps.controller.process.Messages; @@ -34,8 +35,9 @@ protected OperationExecutionState executeOperation(ProcessContext context, Cloud if (service.shouldFailOnParametersUpdateFailure() != null && !service.shouldFailOnParametersUpdateFailure()) { getStepLogger().warn( MessageFormat.format(Messages.SERVICE_INSTANCE_0_PARAMETERS_UPDATE_FAILED_IGNORING_FAILURE, service.getName())); - LOGGER.error(MessageFormat.format(Messages.SERVICE_INSTANCE_0_PARAMETERS_UPDATE_FAILED_ERROR_1, service.getName(), - e.getMessage()), e); + LOGGER.error( + MessageFormat.format(Messages.SERVICE_INSTANCE_0_PARAMETERS_UPDATE_FAILED_ERROR_1, service.getName(), e.getMessage()), + e); return OperationExecutionState.FINISHED; } String exceptionDescription = MessageFormat.format(Messages.COULD_NOT_UPDATE_PARAMETERS_SERVICE, service.getName(), @@ -52,9 +54,8 @@ protected OperationExecutionState executeOperation(ProcessContext context, Cloud @Override protected List getAsyncStepExecutions(ProcessContext context) { CloudServiceInstanceExtended serviceToProcess = context.getVariable(Variables.SERVICE_TO_PROCESS); - return List.of( - new PollServiceCreateOrUpdateOperationsExecution(getServiceOperationGetter(), getServiceProgressReporter(), - shouldFailOnParametersUpdateFailure(serviceToProcess))); + return List.of(new PollServiceCreateOrUpdateOperationsExecution(getServiceOperationGetter(), getServiceProgressReporter(), + shouldFailOnParametersUpdateFailure(serviceToProcess))); } private Supplier shouldFailOnParametersUpdateFailure(CloudServiceInstanceExtended serviceToProcess) { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServicePlanStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServicePlanStep.java index de9b771e47..458042ea72 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServicePlanStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServicePlanStep.java @@ -3,10 +3,11 @@ import java.text.MessageFormat; import java.util.List; import java.util.function.Supplier; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; + import jakarta.inject.Named; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.util.OperationExecutionState; import org.cloudfoundry.multiapps.controller.process.Messages; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceSyslogDrainUrlStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceSyslogDrainUrlStep.java index 037bd77249..ba1e4cc26f 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceSyslogDrainUrlStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceSyslogDrainUrlStep.java @@ -5,18 +5,15 @@ import java.util.List; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.util.OperationExecutionState; import org.cloudfoundry.multiapps.controller.process.Messages; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation.Type; - @Named("updateServiceSyslogUrlStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class UpdateServiceSyslogDrainUrlStep extends ServiceStep { @@ -36,8 +33,7 @@ protected OperationExecutionState executeOperation(ProcessContext context, Cloud } catch (CloudOperationException e) { String exceptionDescription = MessageFormat.format(Messages.COULD_NOT_UPDATE_SYSLOG_DRAIN_URL_SERVICE, service.getName(), e.getDescription()); - CloudOperationException cloudOperationException = new CloudOperationException(e.getStatusCode(), - e.getStatusText(), + CloudOperationException cloudOperationException = new CloudOperationException(e.getStatusCode(), e.getStatusText(), exceptionDescription); processServiceActionFailure(context, service, cloudOperationException); @@ -49,12 +45,12 @@ protected OperationExecutionState executeOperation(ProcessContext context, Cloud @Override protected List getAsyncStepExecutions(ProcessContext context) { - return Collections.singletonList(new PollServiceCreateOrUpdateOperationsExecution(getServiceOperationGetter(), - getServiceProgressReporter())); + return Collections.singletonList( + new PollServiceCreateOrUpdateOperationsExecution(getServiceOperationGetter(), getServiceProgressReporter())); } @Override - protected Type getOperationType() { + protected ServiceOperation.Type getOperationType() { return ServiceOperation.Type.UPDATE; } } diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceTagsStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceTagsStep.java index 47243b220e..0dd5bfbe0e 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceTagsStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceTagsStep.java @@ -3,10 +3,11 @@ import java.text.MessageFormat; import java.util.List; import java.util.function.Supplier; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; + import jakarta.inject.Named; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.util.OperationExecutionState; import org.cloudfoundry.multiapps.controller.process.Messages; @@ -56,9 +57,8 @@ protected OperationExecutionState executeOperation(ProcessContext context, Cloud @Override protected List getAsyncStepExecutions(ProcessContext context) { CloudServiceInstanceExtended serviceToProcess = context.getVariable(Variables.SERVICE_TO_PROCESS); - return List.of( - new PollServiceCreateOrUpdateOperationsExecution(getServiceOperationGetter(), getServiceProgressReporter(), - shouldFailOnTagsUpdateFailure(serviceToProcess))); + return List.of(new PollServiceCreateOrUpdateOperationsExecution(getServiceOperationGetter(), getServiceProgressReporter(), + shouldFailOnTagsUpdateFailure(serviceToProcess))); } private Supplier shouldFailOnTagsUpdateFailure(CloudServiceInstanceExtended serviceToProcess) { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateSubscribersStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateSubscribersStep.java index 40f5af7a29..d0f007db15 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateSubscribersStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateSubscribersStep.java @@ -11,16 +11,16 @@ import java.util.function.BiFunction; import java.util.stream.Collectors; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudSpace; -import com.sap.cloudfoundry.client.facade.rest.CloudSpaceClient; import jakarta.inject.Inject; import jakarta.inject.Named; import org.apache.commons.collections4.ListUtils; import org.cloudfoundry.multiapps.common.SLException; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.rest.CloudSpaceClient; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientFactory; import org.cloudfoundry.multiapps.controller.core.cf.CloudHandlerFactory; @@ -204,8 +204,8 @@ private CloudApplication attemptToUpdateSubscriber(ProcessContext context, Cloud Variables.MTA_NAMESPACE), getStepLogger(), StepsUtil.getAppSuffixDeterminer( - context), - client, false); + context), client, + false); Module module = dummyDescriptor.getModules() .get(0); diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UploadAppAsyncExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UploadAppAsyncExecution.java index 5bfca316cc..f68e1bd55f 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UploadAppAsyncExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UploadAppAsyncExecution.java @@ -1,7 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static java.text.MessageFormat.format; - import java.nio.file.Path; import java.text.MessageFormat; import java.time.Duration; @@ -14,6 +12,10 @@ import java.util.concurrent.RejectedExecutionException; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Status; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.UploadStatusCallbackExtended; import org.cloudfoundry.multiapps.controller.core.Constants; @@ -32,10 +34,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudPackage; -import com.sap.cloudfoundry.client.facade.domain.Status; +import static java.text.MessageFormat.format; public class UploadAppAsyncExecution implements AsyncExecution { @@ -96,7 +95,8 @@ private ApplicationToUploadContext buildApplicationToUploadContext(ProcessContex MtaArchiveElements mtaArchiveElements = context.getVariable(Variables.MTA_ARCHIVE_ELEMENTS); return ImmutableApplicationToUploadContext.builder() .application(applicationToProcess) - .moduleFileName(mtaArchiveElements.getModuleFileName(applicationToProcess.getModuleName())) + .moduleFileName( + mtaArchiveElements.getModuleFileName(applicationToProcess.getModuleName())) .spaceGuid(context.getVariable(Variables.SPACE_GUID)) .correlationId(context.getVariable(Variables.CORRELATION_ID)) .taskId(context.getVariable(Variables.TASK_ID)) @@ -142,8 +142,8 @@ private CloudPackage asyncUploadFiles(CloudControllerClient client, ApplicationT private Path extractApplicationFromArchive(ApplicationToUploadContext applicationToUploadContext) { LocalDateTime startTime = LocalDateTime.now(); - Path extractedAppPath = extractFromMtar(createApplicationArchiveContext(applicationToUploadContext, - applicationConfiguration.getMaxResourceFileSize())); + Path extractedAppPath = extractFromMtar( + createApplicationArchiveContext(applicationToUploadContext, applicationConfiguration.getMaxResourceFileSize())); long timeElapsedForUpload = Duration.between(startTime, LocalDateTime.now()) .toMillis(); applicationToUploadContext.getStepLogger() @@ -154,10 +154,8 @@ private Path extractApplicationFromArchive(ApplicationToUploadContext applicatio protected ApplicationArchiveContext createApplicationArchiveContext(ApplicationToUploadContext applicationToUploadContext, long maxSize) { - return new ApplicationArchiveContext(applicationToUploadContext.getModuleFileName(), - maxSize, - applicationToUploadContext.getArchiveEntries(), - applicationToUploadContext.getSpaceGuid(), + return new ApplicationArchiveContext(applicationToUploadContext.getModuleFileName(), maxSize, + applicationToUploadContext.getArchiveEntries(), applicationToUploadContext.getSpaceGuid(), applicationToUploadContext.getAppArchiveId()); } @@ -169,18 +167,15 @@ private CloudPackage upload(CloudControllerClient client, ApplicationToUploadCon Path extractedModulePath) { try { return client.asyncUploadApplicationWithExponentialBackoff(applicationToUploadContext.getApplication() - .getName(), - extractedModulePath, - getMonitorUploadStatusCallback(applicationToUploadContext.getApplication(), - extractedModulePath, - applicationToUploadContext.getStepLogger(), - applicationToUploadContext.getCorrelationId(), - applicationToUploadContext.getTaskId()), - null); + .getName(), extractedModulePath, + getMonitorUploadStatusCallback( + applicationToUploadContext.getApplication(), extractedModulePath, + applicationToUploadContext.getStepLogger(), + applicationToUploadContext.getCorrelationId(), + applicationToUploadContext.getTaskId()), null); } catch (Exception e) { FileUtils.cleanUp(extractedModulePath, LOGGER); - throw new SLException(e, - Messages.ERROR_WHILE_STARTING_ASYNC_UPLOAD_OF_APP_WITH_NAME_0, + throw new SLException(e, Messages.ERROR_WHILE_STARTING_ASYNC_UPLOAD_OF_APP_WITH_NAME_0, applicationToUploadContext.getApplication() .getName()); } diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UploadAppStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UploadAppStep.java index 0e1a963fe9..3feebe0f46 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UploadAppStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UploadAppStep.java @@ -1,7 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static java.text.MessageFormat.format; - import java.time.Duration; import java.util.List; import java.util.Map; @@ -10,7 +8,14 @@ import java.util.UUID; import java.util.concurrent.ExecutorService; +import com.fasterxml.jackson.core.type.TypeReference; +import jakarta.inject.Inject; +import jakarta.inject.Named; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Status; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.Constants; import org.cloudfoundry.multiapps.controller.core.helpers.ApplicationFileDigestDetector; @@ -31,14 +36,7 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.fasterxml.jackson.core.type.TypeReference; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudPackage; -import com.sap.cloudfoundry.client.facade.domain.Status; - -import jakarta.inject.Inject; -import jakarta.inject.Named; +import static java.text.MessageFormat.format; @Named("uploadAppStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) @@ -105,8 +103,8 @@ public StepPhase executeAsyncStep(ProcessContext context) throws FileStorageExce return StepPhase.POLL; } - if (isPackageInValidState(latestPackage) - && (context.getVariable(Variables.APP_NEEDS_RESTAGE) || !packagesMatch(currentPackage.get(), latestPackage))) { + if (isPackageInValidState(latestPackage) && (context.getVariable(Variables.APP_NEEDS_RESTAGE) || !packagesMatch( + currentPackage.get(), latestPackage))) { context.setVariable(Variables.SHOULD_SKIP_APPLICATION_UPLOAD, true); return useLatestPackage(context, latestPackage); } @@ -133,9 +131,7 @@ private String getNewApplicationDigest(ProcessContext context, String fileName) protected ApplicationArchiveContext createApplicationArchiveContext(ProcessContext context, String fileName) { long maxSize = configuration.getMaxResourceFileSize(); List archiveEntryWithStreamPositions = context.getVariable(Variables.ARCHIVE_ENTRIES_POSITIONS); - return new ApplicationArchiveContext(fileName, - maxSize, - archiveEntryWithStreamPositions, + return new ApplicationArchiveContext(fileName, maxSize, archiveEntryWithStreamPositions, context.getRequiredVariable(Variables.SPACE_GUID), context.getRequiredVariable(Variables.APP_ARCHIVE_ID)); } diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationAttributeUpdater.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationAttributeUpdater.java index b695bf325c..b7c612b26f 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationAttributeUpdater.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationAttributeUpdater.java @@ -1,10 +1,9 @@ package org.cloudfoundry.multiapps.controller.process.util; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.process.util.ElementUpdater.UpdateStrategy; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; - public abstract class ApplicationAttributeUpdater extends ControllerClientFacade { public enum UpdateState { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationEnvironmentCalculator.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationEnvironmentCalculator.java index 1b54244ab4..03b10139db 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationEnvironmentCalculator.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationEnvironmentCalculator.java @@ -8,9 +8,9 @@ import jakarta.inject.Inject; import jakarta.inject.Named; - import org.cloudfoundry.multiapps.common.util.MapUtil; import org.cloudfoundry.multiapps.controller.api.model.ProcessType; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.model.DeployedMtaApplication; import org.cloudfoundry.multiapps.controller.process.Messages; @@ -21,8 +21,6 @@ import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudOperationException; - @Named public class ApplicationEnvironmentCalculator { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationStager.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationStager.java index 5d5cd40938..435fde7306 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationStager.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationStager.java @@ -1,13 +1,18 @@ package org.cloudfoundry.multiapps.controller.process.util; -import static java.text.MessageFormat.format; - import java.util.Comparator; import java.util.List; import java.util.Optional; import java.util.UUID; import java.util.function.Supplier; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudBuild; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DropletInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.PackageState; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.security.serialization.SecureSerialization; import org.cloudfoundry.multiapps.controller.process.Messages; @@ -16,13 +21,7 @@ import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudBuild; -import com.sap.cloudfoundry.client.facade.domain.CloudPackage; -import com.sap.cloudfoundry.client.facade.domain.DropletInfo; -import com.sap.cloudfoundry.client.facade.domain.PackageState; +import static java.text.MessageFormat.format; public class ApplicationStager { @@ -126,8 +125,7 @@ public void bindDropletToApplication(UUID appGuid) { UUID buildGuid = context.getVariable(Variables.BUILD_GUID); client.bindDropletToApp(client.getBuild(buildGuid) .getDropletInfo() - .getGuid(), - appGuid); + .getGuid(), appGuid); } public StepPhase stageApp(CloudApplication app) { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationWaitAfterStopVariableGetter.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationWaitAfterStopVariableGetter.java index 8e32106860..f1d07fa0cf 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationWaitAfterStopVariableGetter.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationWaitAfterStopVariableGetter.java @@ -4,7 +4,7 @@ import java.util.Optional; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration; import org.cloudfoundry.multiapps.controller.process.Constants; @@ -12,8 +12,6 @@ import org.cloudfoundry.multiapps.controller.process.steps.ProcessContext; import org.cloudfoundry.multiapps.controller.process.variables.Variables; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; - @Named public class ApplicationWaitAfterStopVariableGetter { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/AsyncJobToAsyncExecutionStateAdapter.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/AsyncJobToAsyncExecutionStateAdapter.java index b1a7112a92..bad6812d53 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/AsyncJobToAsyncExecutionStateAdapter.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/AsyncJobToAsyncExecutionStateAdapter.java @@ -4,12 +4,11 @@ import java.util.function.Consumer; import org.cloudfoundry.client.v3.jobs.JobState; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudAsyncJob; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.steps.AsyncExecutionState; import org.immutables.value.Value; -import com.sap.cloudfoundry.client.facade.domain.CloudAsyncJob; - @Value.Immutable public interface AsyncJobToAsyncExecutionStateAdapter { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/CloudPackagesGetter.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/CloudPackagesGetter.java index 54516405b5..8224a94a31 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/CloudPackagesGetter.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/CloudPackagesGetter.java @@ -8,25 +8,24 @@ import java.util.function.Supplier; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DropletInfo; import org.cloudfoundry.multiapps.controller.core.security.serialization.SecureSerialization; import org.cloudfoundry.multiapps.controller.process.Messages; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudPackage; -import com.sap.cloudfoundry.client.facade.domain.DropletInfo; - @Named public class CloudPackagesGetter { private static final Logger LOGGER = LoggerFactory.getLogger(CloudPackagesGetter.class); public Optional getAppPackage(CloudControllerClient client, UUID applicationGuid) { - Optional currentDropletForApplication = findOrReturnEmpty(() -> client.getCurrentDropletForApplication(applicationGuid)); + Optional currentDropletForApplication = findOrReturnEmpty( + () -> client.getCurrentDropletForApplication(applicationGuid)); if (currentDropletForApplication.isEmpty()) { return getMostRecentAppPackage(client, applicationGuid); } @@ -53,8 +52,8 @@ private Optional findOrReturnEmpty(Supplier supplier) { public Optional getMostRecentAppPackage(CloudControllerClient client, UUID applicationGuid) { List cloudPackages = client.getPackagesForApplication(applicationGuid); - LOGGER.info(MessageFormat.format(Messages.PACKAGES_FOR_APPLICATION_0_ARE_1, applicationGuid, - SecureSerialization.toJson(cloudPackages))); + LOGGER.info( + MessageFormat.format(Messages.PACKAGES_FOR_APPLICATION_0_ARE_1, applicationGuid, SecureSerialization.toJson(cloudPackages))); return cloudPackages.stream() .max(Comparator.comparing(cloudPackage -> cloudPackage.getMetadata() .getCreatedAt())); diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ControllerClientFacade.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ControllerClientFacade.java index 0c6e896e3a..8fba2565d5 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ControllerClientFacade.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ControllerClientFacade.java @@ -1,6 +1,6 @@ package org.cloudfoundry.multiapps.controller.process.util; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; import org.cloudfoundry.multiapps.controller.process.steps.ProcessContext; public abstract class ControllerClientFacade { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/DefaultApplicationServicesUpdateCallback.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/DefaultApplicationServicesUpdateCallback.java index 272c46d6b7..a6bbd2fd5d 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/DefaultApplicationServicesUpdateCallback.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/DefaultApplicationServicesUpdateCallback.java @@ -4,6 +4,10 @@ import java.util.UUID; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.ApplicationServicesUpdateCallback; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.steps.ProcessContext; @@ -11,11 +15,6 @@ import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.ApplicationServicesUpdateCallback; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; - public class DefaultApplicationServicesUpdateCallback implements ApplicationServicesUpdateCallback { private final ProcessContext context; private final CloudControllerClient controllerClient; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/DeletingServiceBindingOperationCallback.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/DeletingServiceBindingOperationCallback.java index e0f132ab0c..051dac1cdf 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/DeletingServiceBindingOperationCallback.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/DeletingServiceBindingOperationCallback.java @@ -3,16 +3,15 @@ import java.util.UUID; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.ServiceBindingOperationCallback; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.steps.ProcessContext; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.ServiceBindingOperationCallback; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; - public class DeletingServiceBindingOperationCallback implements ServiceBindingOperationCallback { private final ProcessContext context; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/DiskQuotaApplicationAttributeUpdater.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/DiskQuotaApplicationAttributeUpdater.java index ade18b93ba..75b4a1a8d0 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/DiskQuotaApplicationAttributeUpdater.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/DiskQuotaApplicationAttributeUpdater.java @@ -1,11 +1,10 @@ package org.cloudfoundry.multiapps.controller.process.util; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudProcess; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.process.util.ElementUpdater.UpdateStrategy; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudProcess; - public class DiskQuotaApplicationAttributeUpdater extends ApplicationAttributeUpdater { private final CloudProcess existingProcess; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/DynamicResolvableParametersContextUpdater.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/DynamicResolvableParametersContextUpdater.java index 10e4a42457..b4b428a997 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/DynamicResolvableParametersContextUpdater.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/DynamicResolvableParametersContextUpdater.java @@ -2,6 +2,7 @@ import java.util.Set; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.helpers.DynamicResolvableParametersHelper; import org.cloudfoundry.multiapps.controller.core.model.DynamicResolvableParameter; @@ -10,8 +11,6 @@ import org.cloudfoundry.multiapps.controller.process.steps.ProcessContext; import org.cloudfoundry.multiapps.controller.process.variables.Variables; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; - public class DynamicResolvableParametersContextUpdater { private final ProcessContext context; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/EnvironmentApplicationAttributeUpdater.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/EnvironmentApplicationAttributeUpdater.java index 72cbe5cdb5..20397b8cb6 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/EnvironmentApplicationAttributeUpdater.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/EnvironmentApplicationAttributeUpdater.java @@ -2,12 +2,11 @@ import java.util.Map; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.util.ElementUpdater.UpdateStrategy; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; - public class EnvironmentApplicationAttributeUpdater extends ApplicationAttributeUpdater { private final Map existingAppEnv; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ExistingAppsToBackupCalculator.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ExistingAppsToBackupCalculator.java index 4e2d565515..be0666ae46 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ExistingAppsToBackupCalculator.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ExistingAppsToBackupCalculator.java @@ -8,6 +8,7 @@ import java.util.Optional; import java.util.stream.Collectors; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadataAnnotations; import org.cloudfoundry.multiapps.controller.core.model.DeployedMta; import org.cloudfoundry.multiapps.controller.core.model.DeployedMtaApplication; @@ -22,8 +23,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; - public class ExistingAppsToBackupCalculator { private static final Logger LOGGER = LoggerFactory.getLogger(ExistingAppsToBackupCalculator.class); @@ -58,8 +57,9 @@ public List calculateExistingAppsToBackup(ProcessContext conte private boolean doesDeployedMtaVersionMatchToCurrentDeployment(DeployedMta detectedMta, String mtaVersionOfCurrentDescriptor) { return detectedMta != null && detectedMta.getApplications() .stream() - .allMatch(deployedApplication -> doesMtaVersionMatchToCurrentDeployment(deployedApplication, - mtaVersionOfCurrentDescriptor)); + .allMatch( + deployedApplication -> doesMtaVersionMatchToCurrentDeployment(deployedApplication, + mtaVersionOfCurrentDescriptor)); } private boolean doesMtaVersionMatchToCurrentDeployment(DeployedMtaApplication deployedApplication, @@ -185,7 +185,8 @@ public List calculateAppsToUndeploy(ProcessContext context, Li List deployedAppsToUndeploy = backupMta.getApplications() .stream() - .filter(application -> !appsToBackupNames.contains(application.getName())) + .filter(application -> !appsToBackupNames.contains( + application.getName())) .collect(Collectors.toList()); appsToUndeploy.addAll(deployedAppsToUndeploy); return appsToUndeploy; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/MemoryApplicationAttributeUpdater.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/MemoryApplicationAttributeUpdater.java index 1e88a015bf..7cffc6cfc9 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/MemoryApplicationAttributeUpdater.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/MemoryApplicationAttributeUpdater.java @@ -1,11 +1,10 @@ package org.cloudfoundry.multiapps.controller.process.util; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudProcess; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.process.util.ElementUpdater.UpdateStrategy; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudProcess; - public class MemoryApplicationAttributeUpdater extends ApplicationAttributeUpdater { private final CloudProcess existingProcess; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ModuleDependencyChecker.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ModuleDependencyChecker.java index dc9d092c9d..57bb811154 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ModuleDependencyChecker.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ModuleDependencyChecker.java @@ -8,14 +8,13 @@ import java.util.function.Predicate; import java.util.stream.Collectors; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; import org.cloudfoundry.multiapps.controller.core.Messages; import org.cloudfoundry.multiapps.controller.core.helpers.ModuleToDeployHelper; import org.cloudfoundry.multiapps.controller.core.util.UserMessageLogger; import org.cloudfoundry.multiapps.mta.model.Module; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; - public class ModuleDependencyChecker { private final Map allModulesInDescriptorWithNames; @@ -59,18 +58,18 @@ public boolean areAllDependenciesSatisfied(Module module) { return true; } return module.getDeployedAfter() - .isEmpty() - || areDependenciesProcessed(module) || areAllDependenciesAlreadyPresent(module); + .isEmpty() || areDependenciesProcessed(module) || areAllDependenciesAlreadyPresent(module); } private boolean areAllDependenciesAlreadyPresent(Module module) { boolean allModulesFoundInSpace = module.getDeployedAfter() .stream() .allMatch(dependency -> isDependencyPresent(module.getName(), dependency)); - List modulesNotYetDeployed = module.getDeployedAfter().stream() - .filter(modulesForDeployment::contains) - .filter(dependency -> !modulesAlreadyDeployed.contains(dependency)) - .collect(Collectors.toList()); + List modulesNotYetDeployed = module.getDeployedAfter() + .stream() + .filter(modulesForDeployment::contains) + .filter(dependency -> !modulesAlreadyDeployed.contains(dependency)) + .collect(Collectors.toList()); return allModulesFoundInSpace && modulesNotYetDeployed.isEmpty(); } @@ -103,8 +102,8 @@ private boolean isDependencyPresent(String moduleName, String dependencyName) { } Module dependency = allModulesInDescriptorWithNames.get(dependencyName); if (!moduleToDeployHelper.isApplication(dependency)) { - userMessageLogger.warn(MessageFormat.format(Messages.MODULE_0_DEPENDS_ON_MODULE_1_WHICH_CANNOT_BE_RESOLVED, - moduleName, dependencyName)); + userMessageLogger.warn( + MessageFormat.format(Messages.MODULE_0_DEPENDS_ON_MODULE_1_WHICH_CANNOT_BE_RESOLVED, moduleName, dependencyName)); return true; } return appExists(dependencyName); diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ModuleDeterminer.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ModuleDeterminer.java index f416c0d2da..248b898f51 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ModuleDeterminer.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ModuleDeterminer.java @@ -1,5 +1,6 @@ package org.cloudfoundry.multiapps.controller.process.util; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.metadata.processor.MtaMetadataParser; import org.cloudfoundry.multiapps.controller.core.model.DeployedMtaApplication; @@ -11,8 +12,6 @@ import org.cloudfoundry.multiapps.mta.model.Module; import org.immutables.value.Value; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; - @Value.Immutable public abstract class ModuleDeterminer { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/OperationInFinalStateHandler.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/OperationInFinalStateHandler.java index 9e2c52f303..b9edeac622 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/OperationInFinalStateHandler.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/OperationInFinalStateHandler.java @@ -7,7 +7,6 @@ import java.util.Map; import java.util.Optional; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; import jakarta.inject.Inject; import jakarta.inject.Named; import org.cloudfoundry.client.v3.Metadata; @@ -15,6 +14,7 @@ import org.cloudfoundry.multiapps.controller.api.model.Operation; import org.cloudfoundry.multiapps.controller.api.model.Operation.State; import org.cloudfoundry.multiapps.controller.api.model.ProcessType; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientProvider; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadataAnnotations; import org.cloudfoundry.multiapps.controller.core.model.DeployedMta; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceBindingParametersGetter.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceBindingParametersGetter.java index c3998b6f61..028b25fa1b 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceBindingParametersGetter.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceBindingParametersGetter.java @@ -10,6 +10,10 @@ import org.cloudfoundry.multiapps.common.SLException; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; import org.cloudfoundry.multiapps.controller.client.lib.domain.BindingDetails; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; @@ -23,11 +27,6 @@ import org.cloudfoundry.multiapps.mta.util.PropertiesUtil; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; - public class ServiceBindingParametersGetter { private final ProcessContext context; @@ -82,13 +81,17 @@ private Map getFileProvidedBindingParameters(String requiredDepe return Collections.emptyMap(); } String appArchiveId = context.getRequiredVariable(Variables.APP_ARCHIVE_ID); - ArchiveEntryWithStreamPositions archiveEntryWithStreamPositions = ArchiveEntryExtractorUtil.findEntry(fileName, - context.getVariable(Variables.ARCHIVE_ENTRIES_POSITIONS)); + ArchiveEntryWithStreamPositions archiveEntryWithStreamPositions = ArchiveEntryExtractorUtil.findEntry(fileName, context.getVariable( + Variables.ARCHIVE_ENTRIES_POSITIONS)); byte[] serviceBindingParametersFileContent = archiveEntryExtractor.extractEntryBytes(ImmutableFileEntryProperties.builder() .guid(appArchiveId) - .name(archiveEntryWithStreamPositions.getName()) - .spaceGuid(context.getRequiredVariable(Variables.SPACE_GUID)) - .maxFileSizeInBytes(maxManifestSize) + .name( + archiveEntryWithStreamPositions.getName()) + .spaceGuid( + context.getRequiredVariable( + Variables.SPACE_GUID)) + .maxFileSizeInBytes( + maxManifestSize) .build(), archiveEntryWithStreamPositions); try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(serviceBindingParametersFileContent)) { @@ -136,14 +139,16 @@ public Map getServiceBindingParametersFromExistingInstance(Cloud if (HttpStatus.NOT_IMPLEMENTED == e.getStatusCode() || HttpStatus.BAD_REQUEST == e.getStatusCode()) { // ignore 501 and 400 error codes from service brokers context.getStepLogger() - .warnWithoutProgressMessage(Messages.CANNOT_RETRIEVE_PARAMETERS_OF_BINDING_BETWEEN_APPLICATION_0_AND_SERVICE_INSTANCE_1, - application.getName(), serviceName); + .warnWithoutProgressMessage( + Messages.CANNOT_RETRIEVE_PARAMETERS_OF_BINDING_BETWEEN_APPLICATION_0_AND_SERVICE_INSTANCE_1, + application.getName(), serviceName); return null; } else if (HttpStatus.BAD_GATEWAY == e.getStatusCode()) { // TODO: this is a temporary fix for external error code mapping leading to incorrect 502 errors context.getStepLogger() - .warnWithoutProgressMessage(Messages.CANNOT_RETRIEVE_PARAMETERS_OF_BINDING_BETWEEN_APPLICATION_0_AND_SERVICE_INSTANCE_1_FIX, - application.getName(), serviceName); + .warnWithoutProgressMessage( + Messages.CANNOT_RETRIEVE_PARAMETERS_OF_BINDING_BETWEEN_APPLICATION_0_AND_SERVICE_INSTANCE_1_FIX, + application.getName(), serviceName); return null; } throw e; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceBindingPollingFactory.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceBindingPollingFactory.java index 555604c225..155ba5f159 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceBindingPollingFactory.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceBindingPollingFactory.java @@ -1,5 +1,6 @@ package org.cloudfoundry.multiapps.controller.process.util; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.process.steps.AsyncExecution; import org.cloudfoundry.multiapps.controller.process.steps.PollServiceBindingLastOperationExecution; import org.cloudfoundry.multiapps.controller.process.steps.PollServiceBindingOperationExecution; @@ -8,8 +9,6 @@ import org.cloudfoundry.multiapps.controller.process.steps.ProcessContext; import org.cloudfoundry.multiapps.controller.process.variables.Variables; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; - public class ServiceBindingPollingFactory { private final ProcessContext context; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceKeyPollingFactory.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceKeyPollingFactory.java index 99b4b76393..24af46d1b6 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceKeyPollingFactory.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceKeyPollingFactory.java @@ -1,5 +1,6 @@ package org.cloudfoundry.multiapps.controller.process.util; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.process.steps.AsyncExecution; import org.cloudfoundry.multiapps.controller.process.steps.PollServiceKeyCreationOperationExecution; import org.cloudfoundry.multiapps.controller.process.steps.PollServiceKeyDeletionLastOperationExecution; @@ -8,8 +9,6 @@ import org.cloudfoundry.multiapps.controller.process.steps.ProcessContext; import org.cloudfoundry.multiapps.controller.process.variables.Variables; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; - public class ServiceKeyPollingFactory extends ServiceBindingPollingFactory { public ServiceKeyPollingFactory(ProcessContext context, ServiceCredentialBindingOperation.Type serviceBindingOperationType) { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceOperationGetter.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceOperationGetter.java index c8424a18a3..5359b41a8c 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceOperationGetter.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceOperationGetter.java @@ -4,14 +4,12 @@ import java.util.UUID; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudEvent; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudEvent; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; - @Named public class ServiceOperationGetter { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceProgressReporter.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceProgressReporter.java index 1f1bd69aac..c84c8007b0 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceProgressReporter.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceProgressReporter.java @@ -1,7 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.util; -import static java.text.MessageFormat.format; - import java.util.Collection; import java.util.List; import java.util.Map; @@ -10,11 +8,11 @@ import java.util.stream.Collectors; import jakarta.inject.Named; - +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.core.model.TypedServiceOperationState; import org.cloudfoundry.multiapps.controller.process.steps.ProcessContext; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; +import static java.text.MessageFormat.format; @Named public class ServiceProgressReporter { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceRemover.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceRemover.java index d26f4758c8..f63eddc82e 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceRemover.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceRemover.java @@ -4,8 +4,13 @@ import jakarta.inject.Inject; import jakarta.inject.Named; - import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudServiceBrokerException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.steps.ProcessContext; @@ -13,13 +18,6 @@ import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudControllerException; -import com.sap.cloudfoundry.client.facade.CloudException; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.CloudServiceBrokerException; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; - @Named public class ServiceRemover { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceUtil.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceUtil.java index cf370736a8..4caff14531 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceUtil.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/ServiceUtil.java @@ -2,16 +2,15 @@ import java.util.List; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudServiceBrokerException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.Messages; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudControllerException; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.CloudServiceBrokerException; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; - public final class ServiceUtil { private ServiceUtil() { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/StagingApplicationAttributeUpdater.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/StagingApplicationAttributeUpdater.java index 79d091633f..53ce7fb9c6 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/StagingApplicationAttributeUpdater.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/StagingApplicationAttributeUpdater.java @@ -3,16 +3,15 @@ import java.util.Objects; import org.apache.commons.lang3.StringUtils; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudProcess; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Staging; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.DropletInfoFactory; import org.cloudfoundry.multiapps.controller.client.lib.domain.HealthCheckInfo; -import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.cloudfoundry.multiapps.controller.process.steps.ProcessContext; import org.cloudfoundry.multiapps.controller.process.util.ElementUpdater.UpdateStrategy; - -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudProcess; -import com.sap.cloudfoundry.client.facade.domain.Staging; +import org.cloudfoundry.multiapps.controller.process.variables.Variables; public class StagingApplicationAttributeUpdater extends ApplicationAttributeUpdater { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/StagingState.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/StagingState.java index bd4011265d..180138ea20 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/StagingState.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/StagingState.java @@ -1,10 +1,9 @@ package org.cloudfoundry.multiapps.controller.process.util; import org.cloudfoundry.multiapps.common.Nullable; +import org.cloudfoundry.multiapps.controller.client.facade.domain.PackageState; import org.immutables.value.Value; -import com.sap.cloudfoundry.client.facade.domain.PackageState; - @Value.Immutable public interface StagingState { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/TaskHookParser.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/TaskHookParser.java index 039ca73f29..48e8363e4c 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/TaskHookParser.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/TaskHookParser.java @@ -3,13 +3,12 @@ import java.util.Map; import org.cloudfoundry.multiapps.common.ContentException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudTask; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudTask; import org.cloudfoundry.multiapps.controller.core.parser.TaskParametersParser; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.mta.model.Hook; -import com.sap.cloudfoundry.client.facade.domain.CloudTask; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudTask; - public class TaskHookParser { public static final String HOOK_TYPE_TASK = "task"; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/UnbindServiceFromApplicationCallback.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/UnbindServiceFromApplicationCallback.java index 11d518746b..1a3ac535ac 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/UnbindServiceFromApplicationCallback.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/UnbindServiceFromApplicationCallback.java @@ -4,6 +4,10 @@ import java.util.UUID; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.ApplicationServicesUpdateCallback; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.steps.ProcessContext; @@ -11,11 +15,6 @@ import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.ApplicationServicesUpdateCallback; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; - public class UnbindServiceFromApplicationCallback implements ApplicationServicesUpdateCallback { private final ProcessContext context; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/UrisApplicationAttributeUpdater.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/UrisApplicationAttributeUpdater.java index eca38ba969..984b16aebe 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/UrisApplicationAttributeUpdater.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/util/UrisApplicationAttributeUpdater.java @@ -8,14 +8,13 @@ import java.util.UUID; import org.apache.commons.collections4.SetUtils; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.util.UriUtil; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.util.ElementUpdater.UpdateStrategy; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; - public class UrisApplicationAttributeUpdater extends ApplicationAttributeUpdater { private final List existingRoutes; @@ -44,8 +43,8 @@ private boolean doesProtocolOfTheExistingRouteDiffer(CloudRoute updatedRoute, UU return existingRoute.get() .getDestinations() .stream() - .noneMatch(destination -> Objects.equals(destination.getApplicationGuid(), applicationGuid) - && Objects.equals(destination.getProtocol(), updatedRoute.getRequestedProtocol())); + .noneMatch(destination -> Objects.equals(destination.getApplicationGuid(), applicationGuid) && Objects.equals( + destination.getProtocol(), updatedRoute.getRequestedProtocol())); } private Optional findCloudRoute(String url, List cloudRoutes) { diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/variables/Variables.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/variables/Variables.java index dfa65dd558..5f8e987e7c 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/variables/Variables.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/variables/Variables.java @@ -11,14 +11,14 @@ import java.util.UUID; import com.fasterxml.jackson.core.type.TypeReference; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudPackage; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBroker; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.CloudTask; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBroker; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudTask; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.cf.DeploymentMode; diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/jobs/ConfigurationEntriesCleanerTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/jobs/ConfigurationEntriesCleanerTest.java index 94717e988d..67fe7131e9 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/jobs/ConfigurationEntriesCleanerTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/jobs/ConfigurationEntriesCleanerTest.java @@ -1,15 +1,12 @@ package org.cloudfoundry.multiapps.controller.process.jobs; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.UUID; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.rest.CloudSpaceClient; import org.cloudfoundry.multiapps.controller.core.auditlogging.MtaConfigurationPurgerAuditLog; import org.cloudfoundry.multiapps.controller.core.cf.OAuthClientFactory; import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration; @@ -22,8 +19,10 @@ import org.mockito.MockitoAnnotations; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.rest.CloudSpaceClient; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; class ConfigurationEntriesCleanerTest { private static final UUID EXISTING_SPACE_1 = UUID.randomUUID(); diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/jobs/ConfigurationSubscriptionCleanerTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/jobs/ConfigurationSubscriptionCleanerTest.java index cab059aebf..5ebca5efe1 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/jobs/ConfigurationSubscriptionCleanerTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/jobs/ConfigurationSubscriptionCleanerTest.java @@ -1,15 +1,12 @@ package org.cloudfoundry.multiapps.controller.process.jobs; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.UUID; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.rest.CloudSpaceClient; import org.cloudfoundry.multiapps.controller.core.auditlogging.MtaConfigurationPurgerAuditLog; import org.cloudfoundry.multiapps.controller.core.cf.OAuthClientFactory; import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration; @@ -22,8 +19,10 @@ import org.mockito.MockitoAnnotations; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.rest.CloudSpaceClient; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; class ConfigurationSubscriptionCleanerTest { @@ -50,9 +49,7 @@ class ConfigurationSubscriptionCleanerTest { void setUp() throws Exception { MockitoAnnotations.openMocks(this) .close(); - cleaner = new ConfigurationSubscriptionCleaner(configuration, - configurationSubscriptionService, - oAuthClientFactory, + cleaner = new ConfigurationSubscriptionCleaner(configuration, configurationSubscriptionService, oAuthClientFactory, mtaConfigurationPurgerAuditLog) { @Override protected void initSpaceClient() { @@ -85,37 +82,16 @@ void testSingleExecution() { private List generateConfigurationSubscriptions() { List configurationSubscriptions = new ArrayList<>(); for (int i = 0; i < 5; i++) { - configurationSubscriptions.add(new ConfigurationSubscription(i, - "mtaId" + i, - NON_EXISTING_SPACE.toString(), - "app" + i, - null, - null, - null, - null, - null)); + configurationSubscriptions.add( + new ConfigurationSubscription(i, "mtaId" + i, NON_EXISTING_SPACE.toString(), "app" + i, null, null, null, null, null)); } for (int i = 10; i < 15; i++) { - configurationSubscriptions.add(new ConfigurationSubscription(i, - "mtaId" + i, - EXISTING_SPACE_1.toString(), - "app" + i, - null, - null, - null, - null, - null)); + configurationSubscriptions.add( + new ConfigurationSubscription(i, "mtaId" + i, EXISTING_SPACE_1.toString(), "app" + i, null, null, null, null, null)); } for (int i = 15; i < 20; i++) { - configurationSubscriptions.add(new ConfigurationSubscription(i, - "mtaId" + i, - EXISTING_SPACE_2.toString(), - "app" + i, - null, - null, - null, - null, - null)); + configurationSubscriptions.add( + new ConfigurationSubscription(i, "mtaId" + i, EXISTING_SPACE_2.toString(), "app" + i, null, null, null, null, null)); } return configurationSubscriptions; } diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/listeners/ManageAppServiceBindingEndListenerTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/listeners/ManageAppServiceBindingEndListenerTest.java index 3c426714da..285f3c6ee6 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/listeners/ManageAppServiceBindingEndListenerTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/listeners/ManageAppServiceBindingEndListenerTest.java @@ -1,15 +1,11 @@ package org.cloudfoundry.multiapps.controller.process.listeners; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - import java.util.stream.Stream; import org.cloudfoundry.multiapps.common.util.JsonUtil; import org.cloudfoundry.multiapps.controller.api.model.ProcessType; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudApplication; import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration; import org.cloudfoundry.multiapps.controller.persistence.services.HistoricOperationEventService; import org.cloudfoundry.multiapps.controller.persistence.services.ProcessLoggerPersister; @@ -28,8 +24,11 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudApplication; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; class ManageAppServiceBindingEndListenerTest { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/AddDomainsStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/AddDomainsStepTest.java index 524a3a74ef..eb5514b0a3 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/AddDomainsStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/AddDomainsStepTest.java @@ -5,20 +5,19 @@ import java.util.stream.Stream; import org.apache.commons.collections4.ListUtils; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudDomain; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudDomain; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Mockito; -import com.sap.cloudfoundry.client.facade.domain.CloudDomain; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudDomain; - class AddDomainsStepTest extends SyncFlowableStepTest { public static Stream testExecute() { return Stream.of( -// @formatter:off + // @formatter:off // (0) Attempt to add non-existing custom domains: Arguments.of(List.of("foo", "bar"), List.of("baz", "qux")), // (1) Attempt to add existing custom domains: diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/BindServiceToApplicationStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/BindServiceToApplicationStepTest.java index 7e423c9a0c..c777fa0089 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/BindServiceToApplicationStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/BindServiceToApplicationStepTest.java @@ -1,14 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - import java.time.LocalDateTime; import java.util.List; import java.util.Map; @@ -16,6 +7,13 @@ import java.util.UUID; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.ApplicationServicesUpdateCallback; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableServiceCredentialBindingOperation; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; @@ -24,13 +22,14 @@ import org.junit.jupiter.api.Test; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.ApplicationServicesUpdateCallback; -import com.sap.cloudfoundry.client.facade.CloudControllerException; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceBinding; -import com.sap.cloudfoundry.client.facade.domain.ImmutableServiceCredentialBindingOperation; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; class BindServiceToApplicationStepTest extends SyncFlowableStepTest { @@ -68,9 +67,9 @@ void testAsyncServiceBindingWithPollingByLastOperation() { prepareContext(); when(client.bindServiceInstance(eq(BINDING_NAME), eq(APPLICATION_NAME), eq(SERVICE_NAME), eq(BINDING_PARAMETERS), any(ApplicationServicesUpdateCallback.class))).then(answer -> { - context.setVariable(Variables.USE_LAST_OPERATION_FOR_SERVICE_BINDING_CREATION, true); - return Optional.empty(); - }); + context.setVariable(Variables.USE_LAST_OPERATION_FOR_SERVICE_BINDING_CREATION, true); + return Optional.empty(); + }); step.execute(execution); assertEquals(StepPhase.POLL.toString(), getExecutionStatus()); assertTrue(context.getVariable(Variables.USE_LAST_OPERATION_FOR_SERVICE_BINDING_CREATION)); @@ -117,9 +116,8 @@ void testThrowExceptionOnNotOptionalService() { } private void handleErrorInCallback(ProcessContext customProcessContext) { - new DefaultApplicationServicesUpdateCallback(customProcessContext, - client).onError(new CloudOperationException(HttpStatus.BAD_GATEWAY), APPLICATION_NAME, - SERVICE_NAME); + new DefaultApplicationServicesUpdateCallback(customProcessContext, client).onError( + new CloudOperationException(HttpStatus.BAD_GATEWAY), APPLICATION_NAME, SERVICE_NAME); } private void handleServiceAlreadyBoundErrorInCallback(ProcessContext customProcessContext) { 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 41fb4bc9d4..ddf288592c 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 @@ -7,10 +7,10 @@ import java.util.stream.Stream; import com.fasterxml.jackson.core.type.TypeReference; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; import org.cloudfoundry.multiapps.common.test.TestUtil; import org.cloudfoundry.multiapps.common.test.Tester.Expectation; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; import org.cloudfoundry.multiapps.controller.core.cf.util.ModulesCloudModelBuilderContentCalculator; import org.cloudfoundry.multiapps.controller.core.cf.v2.ApplicationCloudModelBuilder; import org.cloudfoundry.multiapps.controller.core.cf.v2.ServiceKeysCloudModelBuilder; @@ -143,9 +143,11 @@ protected ApplicationCloudModelBuilder getApplicationCloudModelBuilder(ProcessCo } @Override - protected ModulesCloudModelBuilderContentCalculator - getModulesContentCalculator(ProcessContext context, List mtaDescriptorModules, Set mtaManifestModuleNames, - Set deployedModuleNames, Set allMtaModuleNames) { + protected ModulesCloudModelBuilderContentCalculator getModulesContentCalculator(ProcessContext context, + List mtaDescriptorModules, + Set mtaManifestModuleNames, + Set deployedModuleNames, + Set allMtaModuleNames) { return modulesCloudModelBuilderContentCalculator; } diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/BuildCloudUndeployModelStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/BuildCloudUndeployModelStepTest.java index 6cf273c190..40a131a453 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/BuildCloudUndeployModelStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/BuildCloudUndeployModelStepTest.java @@ -7,14 +7,14 @@ import java.util.stream.Stream; import com.fasterxml.jackson.core.type.TypeReference; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudEntity; import org.cloudfoundry.multiapps.common.test.TestUtil; import org.cloudfoundry.multiapps.common.test.Tester; import org.cloudfoundry.multiapps.common.test.Tester.Expectation; import org.cloudfoundry.multiapps.common.util.JsonUtil; import org.cloudfoundry.multiapps.controller.api.model.ProcessType; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudEntity; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.v2.ApplicationCloudModelBuilder; diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CalculateServiceKeyForWaitingStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CalculateServiceKeyForWaitingStepTest.java index 3a88fdf77a..20afe4b197 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CalculateServiceKeyForWaitingStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CalculateServiceKeyForWaitingStepTest.java @@ -1,19 +1,18 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.when; - import java.util.List; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableServiceCredentialBindingOperation; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.junit.jupiter.api.Test; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ImmutableServiceCredentialBindingOperation; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; class CalculateServiceKeyForWaitingStepTest extends SyncFlowableStepTest { @@ -25,8 +24,8 @@ void testExecuteStep() { CloudServiceKey serviceKeyInProgress = buildCloudServiceKey("key-in-progress", ServiceCredentialBindingOperation.State.IN_PROGRESS); CloudServiceKey serviceKeyInSucceededState = buildCloudServiceKey("key-succeeded", ServiceCredentialBindingOperation.State.SUCCEEDED); - when(client.getServiceKeysWithCredentials(SERVICE_INSTANCE_NAME)).thenReturn(List.of(serviceKeyInProgress, - serviceKeyInSucceededState)); + when(client.getServiceKeysWithCredentials(SERVICE_INSTANCE_NAME)).thenReturn( + List.of(serviceKeyInProgress, serviceKeyInSucceededState)); step.execute(execution); assertStepFinishedSuccessfully(); assertEquals(List.of(serviceKeyInProgress), context.getVariable(Variables.CLOUD_SERVICE_KEYS_FOR_WAITING)); @@ -43,7 +42,8 @@ private CloudServiceKey buildCloudServiceKey(String name, ServiceCredentialBindi .name(name) .serviceKeyOperation(ImmutableServiceCredentialBindingOperation.builder() .state(state) - .type(ServiceCredentialBindingOperation.Type.CREATE) + .type( + ServiceCredentialBindingOperation.Type.CREATE) .build()) .build(); } diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServiceBindingOperationStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServiceBindingOperationStepTest.java index 9c13188d6c..b2f6558882 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServiceBindingOperationStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServiceBindingOperationStepTest.java @@ -1,15 +1,17 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.when; - import java.text.MessageFormat; import java.util.List; import java.util.UUID; import java.util.stream.Stream; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableServiceCredentialBindingOperation; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; @@ -23,12 +25,9 @@ import org.junit.jupiter.params.provider.MethodSource; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceBinding; -import com.sap.cloudfoundry.client.facade.domain.ImmutableServiceCredentialBindingOperation; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.when; class CheckServiceBindingOperationStepTest extends SyncFlowableStepTest { @@ -79,13 +78,15 @@ void testCheckServiceBindingWhichIsInDifferentStates(ServiceCredentialBindingOpe @Test void testThrowExceptionWhenFetchingServiceBinding() { when(client.getServiceBindingForApplication(APP_GUID, - SERVICE_INSTANCE_GUID)).thenThrow(new CloudOperationException(HttpStatus.SERVICE_UNAVAILABLE)); + SERVICE_INSTANCE_GUID)).thenThrow( + new CloudOperationException(HttpStatus.SERVICE_UNAVAILABLE)); when(client.getApplicationGuid(APP_NAME)).thenReturn(APP_GUID); when(client.getRequiredServiceInstanceGuid(SERVICE_INSTANCE_NAME)).thenReturn(SERVICE_INSTANCE_GUID); Exception exception = assertThrows(SLException.class, () -> step.execute(execution)); - assertEquals("Error while checking service binding operations between app: \"test-app\" and service instance \"test-service-instance\": Controller operation failed: 503 Service Unavailable", - exception.getMessage() - .trim()); + assertEquals( + "Error while checking service binding operations between app: \"test-app\" and service instance \"test-service-instance\": Controller operation failed: 503 Service Unavailable", + exception.getMessage() + .trim()); } @Test @@ -137,7 +138,8 @@ private CloudServiceBinding buildCloudServiceBinding(ServiceCredentialBindingOpe .serviceInstanceGuid(SERVICE_INSTANCE_GUID) .applicationGuid(APP_GUID) .serviceBindingOperation(ImmutableServiceCredentialBindingOperation.builder() - .type(ServiceCredentialBindingOperation.Type.DELETE) + .type( + ServiceCredentialBindingOperation.Type.DELETE) .state(bindingState) .build()) .build(); diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServiceKeyOperationStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServiceKeyOperationStepTest.java index d6a279369f..834e1b150e 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServiceKeyOperationStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServiceKeyOperationStepTest.java @@ -1,10 +1,11 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.when; - import java.util.stream.Stream; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableServiceCredentialBindingOperation; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.variables.Variables; @@ -13,10 +14,8 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ImmutableServiceCredentialBindingOperation; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; class CheckServiceKeyOperationStepTest extends SyncFlowableStepTest { @@ -62,7 +61,8 @@ private CloudServiceKey buildCloudServiceKey(ServiceCredentialBindingOperation.S .serviceInstance(buildCloudServiceInstanceExtended()) .serviceKeyOperation(ImmutableServiceCredentialBindingOperation.builder() .state(serviceKeyState) - .type(ServiceCredentialBindingOperation.Type.CREATE) + .type( + ServiceCredentialBindingOperation.Type.CREATE) .build()) .build(); } diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServiceOperationStateStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServiceOperationStateStepTest.java index df52ea6546..2463ea0142 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServiceOperationStateStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServiceOperationStateStepTest.java @@ -1,15 +1,12 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.when; - import java.util.Map; import java.util.UUID; import java.util.stream.Stream; import org.apache.commons.collections4.MapUtils; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.variables.Variables; @@ -17,8 +14,8 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; class CheckServiceOperationStateStepTest extends SyncFlowableStepTest { @@ -26,20 +23,18 @@ class CheckServiceOperationStateStepTest extends SyncFlowableStepTest testExecute() { return Stream.of( - // (1) Service exist and it is in progress state - Arguments.of("service-1", true, - new ServiceOperation(ServiceOperation.Type.CREATE, "", ServiceOperation.State.IN_PROGRESS), - ServiceOperation.Type.CREATE, "POLL"), - // (2) Service does not exist - Arguments.of("service-1", false, null, null, "DONE"), - // (3) Service exist but it is not in progress state - Arguments.of("service-1", true, - new ServiceOperation(ServiceOperation.Type.CREATE, "", ServiceOperation.State.SUCCEEDED), null, - "DONE"), - // (4) Missing service operation for existing service - Arguments.of("service-1", true, null, null, "DONE"), - // (5) Missing type and state for last operation - Arguments.of("service-1", true, new ServiceOperation(null, null, null), null, "DONE")); + // (1) Service exist and it is in progress state + Arguments.of("service-1", true, new ServiceOperation(ServiceOperation.Type.CREATE, "", ServiceOperation.State.IN_PROGRESS), + ServiceOperation.Type.CREATE, "POLL"), + // (2) Service does not exist + Arguments.of("service-1", false, null, null, "DONE"), + // (3) Service exist but it is not in progress state + Arguments.of("service-1", true, new ServiceOperation(ServiceOperation.Type.CREATE, "", ServiceOperation.State.SUCCEEDED), null, + "DONE"), + // (4) Missing service operation for existing service + Arguments.of("service-1", true, null, null, "DONE"), + // (5) Missing type and state for last operation + Arguments.of("service-1", true, new ServiceOperation(null, null, null), null, "DONE")); } @ParameterizedTest diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServicesToDeleteStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServicesToDeleteStepTest.java index 3ce9fa3dc2..8bfe1e9f3b 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServicesToDeleteStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CheckServicesToDeleteStepTest.java @@ -1,9 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.mockito.Mockito.when; - import java.util.Collections; import java.util.List; import java.util.Map; @@ -13,6 +9,10 @@ import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.tuple.Pair; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration; @@ -22,10 +22,9 @@ import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Mock; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceInstance; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Mockito.when; class CheckServicesToDeleteStepTest extends SyncFlowableStepTest { @@ -36,26 +35,26 @@ class CheckServicesToDeleteStepTest extends SyncFlowableStepTest testExecute() { return Stream.of( - // (1) Multiple services in progress - Arguments.of(List.of("service-1", "service-2", "service-3"), List.of("service-1", "service-2", "service-3"), - Map.ofEntries(Map.entry("service-1", ServiceOperation.State.IN_PROGRESS), - Map.entry("service-2", ServiceOperation.State.IN_PROGRESS), - Map.entry("service-3", ServiceOperation.State.IN_PROGRESS)), - List.of("service-1", "service-2", "service-3"), "POLL"), - // (2) One service in progress - Arguments.of(List.of("service-1", "service-2", "service-3"), List.of("service-2", "service-3"), - Map.ofEntries(Pair.of("service-2", ServiceOperation.State.SUCCEEDED), - Pair.of("service-3", ServiceOperation.State.IN_PROGRESS)), - List.of("service-3"), "POLL"), - // (3) All services are not in progress state - Arguments.of(List.of("service-1", "service-2", "service-3"), List.of("service-1", "service-2"), - Map.ofEntries(Pair.of("service-1", ServiceOperation.State.SUCCEEDED), - Pair.of("service-2", ServiceOperation.State.SUCCEEDED)), - Collections.emptyList(), "DONE"), - // (4) No services to delete - Arguments.of(Collections.emptyList(), Collections.emptyList(), - Collections.emptyMap(), - Collections.emptyList(), "DONE")); + // (1) Multiple services in progress + Arguments.of(List.of("service-1", "service-2", "service-3"), List.of("service-1", "service-2", "service-3"), + Map.ofEntries(Map.entry("service-1", ServiceOperation.State.IN_PROGRESS), + Map.entry("service-2", ServiceOperation.State.IN_PROGRESS), + Map.entry("service-3", ServiceOperation.State.IN_PROGRESS)), + List.of("service-1", "service-2", "service-3"), "POLL"), + // (2) One service in progress + Arguments.of(List.of("service-1", "service-2", "service-3"), List.of("service-2", "service-3"), + Map.ofEntries(Pair.of("service-2", ServiceOperation.State.SUCCEEDED), + Pair.of("service-3", ServiceOperation.State.IN_PROGRESS)), + List.of("service-3"), "POLL"), + // (3) All services are not in progress state + Arguments.of(List.of("service-1", "service-2", "service-3"), List.of("service-1", "service-2"), + Map.ofEntries(Pair.of("service-1", ServiceOperation.State.SUCCEEDED), + Pair.of("service-2", ServiceOperation.State.SUCCEEDED)), + Collections.emptyList(), "DONE"), + // (4) No services to delete + Arguments.of(Collections.emptyList(), Collections.emptyList(), + Collections.emptyMap(), + Collections.emptyList(), "DONE")); } @ParameterizedTest @@ -90,13 +89,14 @@ private List getServices(List existingServiceNames } private void prepareClient(List serviceNames, Map servicesOperationState) { - for (String serviceName: serviceNames) { + for (String serviceName : serviceNames) { ServiceOperation lastServiceOperation = new ServiceOperation(ServiceOperation.Type.DELETE, "", servicesOperationState.get(serviceName)); CloudServiceInstanceExtended returnedService = ImmutableCloudServiceInstanceExtended.builder() .metadata(ImmutableCloudMetadata.builder() - .guid(UUID.randomUUID()) + .guid( + UUID.randomUUID()) .build()) .name(serviceName) .lastOperation(lastServiceOperation) @@ -106,7 +106,8 @@ private void prepareClient(List serviceNames, Map expectedServicesOperations, String expectedStatus) { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CollectBlueGreenSystemParametersStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CollectBlueGreenSystemParametersStepTest.java index be6e33cbb5..bb4b63280a 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CollectBlueGreenSystemParametersStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CollectBlueGreenSystemParametersStepTest.java @@ -1,11 +1,9 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; - import java.util.List; import java.util.Map; +import org.cloudfoundry.multiapps.controller.client.facade.util.AuthorizationEndpointGetter; import org.cloudfoundry.multiapps.controller.core.helpers.SystemParameters; import org.cloudfoundry.multiapps.controller.core.model.SupportedParameters; import org.cloudfoundry.multiapps.controller.process.variables.Variables; @@ -14,8 +12,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.util.AuthorizationEndpointGetter; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; class CollectBlueGreenSystemParametersStepTest extends CollectSystemParametersStepBaseTest { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CollectSystemParametersStepBaseTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CollectSystemParametersStepBaseTest.java index 56eda02d73..7e4742b5b8 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CollectSystemParametersStepBaseTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CollectSystemParametersStepBaseTest.java @@ -1,12 +1,12 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - import java.net.MalformedURLException; import java.net.URL; import java.util.UUID; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudDomain; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.util.AuthorizationEndpointGetter; import org.cloudfoundry.multiapps.controller.core.cf.clients.WebClientFactory; import org.cloudfoundry.multiapps.controller.core.helpers.CredentialsGenerator; import org.cloudfoundry.multiapps.controller.core.security.token.TokenService; @@ -18,9 +18,8 @@ import org.junit.jupiter.api.BeforeEach; import org.mockito.Mock; -import com.sap.cloudfoundry.client.facade.domain.CloudDomain; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.util.AuthorizationEndpointGetter; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public abstract class CollectSystemParametersStepBaseTest extends SyncFlowableStepTest { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CollectSystemParametersStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CollectSystemParametersStepTest.java index 5c197a7d7f..bc6e7b91bb 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CollectSystemParametersStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CollectSystemParametersStepTest.java @@ -1,14 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.Mockito.when; - import java.util.Collections; import java.util.List; import java.util.Map; @@ -16,6 +7,7 @@ import org.cloudfoundry.multiapps.common.ContentException; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; import org.cloudfoundry.multiapps.controller.core.cf.metadata.ImmutableMtaMetadata; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadata; import org.cloudfoundry.multiapps.controller.core.helpers.SystemParameters; @@ -37,7 +29,14 @@ import org.mockito.Mockito; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudOperationException; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.when; class CollectSystemParametersStepTest extends CollectSystemParametersStepBaseTest { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateAppStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateAppStepTest.java index 3a03b84775..35b9b6ab3d 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateAppStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateAppStepTest.java @@ -1,13 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.cloudfoundry.multiapps.controller.process.steps.StepsTestUtil.prepareDisablingAutoscaler; -import static org.cloudfoundry.multiapps.controller.process.steps.StepsTestUtil.testIfEnabledOrDisabledAutoscaler; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - import java.text.MessageFormat; import java.util.Collections; import java.util.List; @@ -18,6 +10,18 @@ import org.cloudfoundry.multiapps.common.SLException; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DockerInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableDockerCredentials; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableDockerInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableServiceCredentialBindingOperation; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableStaging; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Staging; +import org.cloudfoundry.multiapps.controller.client.facade.dto.ApplicationToCreateDto; +import org.cloudfoundry.multiapps.controller.client.facade.dto.ImmutableApplicationToCreateDto; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ServiceKeyToInject; @@ -28,18 +32,13 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.DockerInfo; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ImmutableDockerCredentials; -import com.sap.cloudfoundry.client.facade.domain.ImmutableDockerInfo; -import com.sap.cloudfoundry.client.facade.domain.ImmutableServiceCredentialBindingOperation; -import com.sap.cloudfoundry.client.facade.domain.ImmutableStaging; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; -import com.sap.cloudfoundry.client.facade.domain.Staging; -import com.sap.cloudfoundry.client.facade.dto.ApplicationToCreateDto; -import com.sap.cloudfoundry.client.facade.dto.ImmutableApplicationToCreateDto; +import static org.cloudfoundry.multiapps.controller.process.steps.StepsTestUtil.prepareDisablingAutoscaler; +import static org.cloudfoundry.multiapps.controller.process.steps.StepsTestUtil.testIfEnabledOrDisabledAutoscaler; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; class CreateOrUpdateAppStepTest extends SyncFlowableStepTest { @@ -53,7 +52,7 @@ class CreateOrUpdateAppStepTest extends SyncFlowableStepTest testHandleApplicationAttributes() { return Stream.of( -//@formatter:off + //@formatter:off // (1) Everything is specified properly and should apply incremental instances update: Arguments.of(ImmutableStaging.builder().command("command1").healthCheckType("none").addBuildpack("buildpackUrl").build(), 128, 256, TestData.routeSet("example.com", "foo-bar.xyz"), Map.of("env-key", "env-value"), true), @@ -189,8 +188,10 @@ private CloudServiceKey buildCloudServiceKey(Map serviceKeyCrede .name(SERVICE_KEY_NAME) .credentials(serviceKeyCredentials) .serviceKeyOperation(ImmutableServiceCredentialBindingOperation.builder() - .type(ServiceCredentialBindingOperation.Type.CREATE) - .state(ServiceCredentialBindingOperation.State.SUCCEEDED) + .type( + ServiceCredentialBindingOperation.Type.CREATE) + .state( + ServiceCredentialBindingOperation.State.SUCCEEDED) .build()) .build(); } diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateServiceBrokerStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateServiceBrokerStepTest.java index d7a4b91bc3..4542923d30 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateServiceBrokerStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateServiceBrokerStepTest.java @@ -1,9 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - import java.text.MessageFormat; import java.util.Collections; import java.util.List; @@ -15,6 +11,12 @@ import org.cloudfoundry.multiapps.common.ContentException; import org.cloudfoundry.multiapps.common.SLException; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudServiceBrokerException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBroker; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceBroker; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.model.SupportedParameters; @@ -27,12 +29,9 @@ import org.mockito.Mockito; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudControllerException; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.CloudServiceBrokerException; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBroker; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceBroker; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; class CreateOrUpdateServiceBrokerStepTest extends SyncFlowableStepTest { @@ -52,7 +51,7 @@ class CreateOrUpdateServiceBrokerStepTest extends SyncFlowableStepTest testExecute() { return Stream.of( -// @formatter:off + // @formatter:off // (1) A service broker should be created, all necessary parameters are present and it isn't space scoped (explicit): Arguments.of(new StepInput(new SimpleApplication(APP_NAME, Map.of(SupportedParameters.CREATE_SERVICE_BROKER, true, SupportedParameters.SERVICE_BROKER_NAME, SERVICE_BROKER_NAME, SupportedParameters.SERVICE_BROKER_USERNAME, SERVICE_BROKER_USER, diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateStepWithExistingAppTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateStepWithExistingAppTest.java index 4d3060127c..81dec8e5a0 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateStepWithExistingAppTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateStepWithExistingAppTest.java @@ -9,21 +9,21 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; -import com.sap.cloudfoundry.client.facade.domain.HealthCheckType; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudApplication; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudPackage; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudProcess; -import com.sap.cloudfoundry.client.facade.domain.ImmutableDockerData; -import com.sap.cloudfoundry.client.facade.domain.ImmutableDockerInfo; -import com.sap.cloudfoundry.client.facade.domain.ImmutableDropletInfo; -import com.sap.cloudfoundry.client.facade.domain.ImmutableLifecycle; -import com.sap.cloudfoundry.client.facade.domain.ImmutableStaging; -import com.sap.cloudfoundry.client.facade.domain.LifecycleType; -import com.sap.cloudfoundry.client.facade.domain.Staging; -import com.sap.cloudfoundry.client.facade.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.HealthCheckType; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudProcess; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableDockerData; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableDockerInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableDropletInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableLifecycle; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableStaging; +import org.cloudfoundry.multiapps.controller.client.facade.domain.LifecycleType; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Staging; +import org.cloudfoundry.multiapps.controller.client.facade.util.JsonUtil; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.Constants; @@ -177,10 +177,10 @@ private ImmutableCloudApplicationExtended.Builder getApplicationBuilder(boolean .isSshEnabled(false) .build()) .attributesUpdateStrategy( - ImmutableCloudApplicationExtended.AttributeUpdateStrategy.builder() - .shouldKeepExistingEnv( - shouldKeepExistingEnv) - .build()); + ImmutableCloudApplicationExtended.ImmutableAttributeUpdateStrategy.builder() + .shouldKeepExistingEnv( + shouldKeepExistingEnv) + .build()); } private void prepareContext(CloudApplicationExtended application, boolean shouldSkipServiceRebinding) { @@ -227,8 +227,8 @@ private void prepareClient(CloudApplication application, Set routes, when(client.getApplicationProcess(application.getGuid())).thenReturn(ImmutableCloudProcess.builder() .command(command) .diskInMb(disk == null ? 1024 : disk) - .memoryInMb(memory == null ? 1024 - : memory) + .memoryInMb( + memory == null ? 1024 : memory) .healthCheckType(hcType == null ? HealthCheckType.PORT : HealthCheckType.valueOf( diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateServiceKeyStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateServiceKeyStepTest.java index a5f37e244b..eb925ba06f 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateServiceKeyStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateServiceKeyStepTest.java @@ -1,16 +1,17 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - import java.util.Optional; import java.util.UUID; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableServiceCredentialBindingOperation; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.variables.Variables; @@ -18,14 +19,12 @@ import org.mockito.Mockito; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceInstance; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ImmutableServiceCredentialBindingOperation; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; class CreateServiceKeyStepTest extends SyncFlowableStepTest { @@ -97,8 +96,10 @@ private CloudServiceKey buildCloudServiceKey(CloudServiceInstance serviceInstanc .name(SERVICE_KEY_NAME) .metadata(ImmutableCloudMetadata.of(SERVICE_KEY_GUID)) .serviceKeyOperation(ImmutableServiceCredentialBindingOperation.builder() - .type(ServiceCredentialBindingOperation.Type.CREATE) - .state(ServiceCredentialBindingOperation.State.SUCCEEDED) + .type( + ServiceCredentialBindingOperation.Type.CREATE) + .state( + ServiceCredentialBindingOperation.State.SUCCEEDED) .build()) .build(); } diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateServiceStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateServiceStepTest.java index 7ae9582961..51fe4a72c7 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateServiceStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateServiceStepTest.java @@ -1,13 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyBoolean; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.when; - import java.util.List; import java.util.Map; import java.util.Set; @@ -17,6 +9,11 @@ import org.cloudfoundry.client.v3.serviceinstances.ServiceInstanceType; import org.cloudfoundry.multiapps.common.SLException; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.model.DynamicResolvableParameter; @@ -33,11 +30,13 @@ import org.mockito.Mockito; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceInstance; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.when; class CreateServiceStepTest extends SyncFlowableStepTest { @@ -71,32 +70,29 @@ private static Stream testCreateServiceInstanceWhenAlreadyExists() { static Stream testSetServiceGuidIfPresent() { return Stream.of(Arguments.of( - // (1) Test resolve service guid - Set.of(ImmutableDynamicResolvableParameter.builder() - .parameterName("service-guid") - .relationshipEntityName("service-1") - .build(), - ImmutableDynamicResolvableParameter.builder() - .parameterName("service-guid") - .relationshipEntityName("service-2") - .build()), - ImmutableDynamicResolvableParameter.builder() - .parameterName("service-guid") - .relationshipEntityName("service-1") - .value("beeb5e8d-4ab9-46ee-9205-455a278743f0") - .build()), + // (1) Test resolve service guid + Set.of(ImmutableDynamicResolvableParameter.builder() + .parameterName("service-guid") + .relationshipEntityName("service-1") + .build(), ImmutableDynamicResolvableParameter.builder() + .parameterName("service-guid") + .relationshipEntityName("service-2") + .build()), + ImmutableDynamicResolvableParameter.builder() + .parameterName("service-guid") + .relationshipEntityName("service-1") + .value("beeb5e8d-4ab9-46ee-9205-455a278743f0") + .build()), // (2) Test skip resolve of unrelated parameter Arguments.of(Set.of(ImmutableDynamicResolvableParameter.builder() .parameterName("service-guid") .relationshipEntityName("service-2") - .build()), - null), + .build()), null), // (3) Test skip resolve of unrelated parameter due to different parameter type Arguments.of(Set.of(ImmutableDynamicResolvableParameter.builder() .parameterName("metadata-key") .relationshipEntityName("service-1") - .build()), - null)); + .build()), null)); } private static CloudServiceInstanceExtended createCloudService(UUID serviceGuid) { @@ -140,10 +136,8 @@ void testExecute(CloudServiceInstanceExtended service, Map st private void prepareServiceOperationsGetter(CloudServiceInstanceExtended service) { context.setVariable(Variables.SERVICES_TO_CREATE, List.of(service)); - when(serviceOperationGetter.getLastServiceOperation(any(), - any())).thenReturn(new ServiceOperation(ServiceOperation.Type.CREATE, - "create done", - ServiceOperation.State.IN_PROGRESS)); + when(serviceOperationGetter.getLastServiceOperation(any(), any())).thenReturn( + new ServiceOperation(ServiceOperation.Type.CREATE, "create done", ServiceOperation.State.IN_PROGRESS)); } @Test @@ -158,8 +152,9 @@ void testExceptionIsThrownOnManagedServiceCreationUnprocessableEntity() { initializeInput(createCloudService(UUID.randomUUID()), MANAGED_SERVICE_STEPS, false); throwExceptionOnServiceCreation(HttpStatus.UNPROCESSABLE_ENTITY); Exception exception = assertThrows(SLException.class, () -> step.execute(execution)); - assertEquals("Service operation failed: Controller operation failed: 422 Error occurred: Error creating or updating service instance: Could not create service \"service-1\" : Expected Exception message ", - exception.getMessage()); + assertEquals( + "Service operation failed: Controller operation failed: 422 Error occurred: Error creating or updating service instance: Could not create service \"service-1\" : Expected Exception message ", + exception.getMessage()); } @Test @@ -173,8 +168,10 @@ void testExceptionIsThrownOnManagedServiceCreationBadGateway() { @ParameterizedTest void testCreateServiceInstanceWhenAlreadyExists(ServiceOperation.State serviceInstanceState, String executionStatus) { initializeInput(createCloudService(UUID.randomUUID()), MANAGED_SERVICE_STEPS, true); - ImmutableCloudServiceInstance existingCloudServiceInstance = ImmutableCloudServiceInstance.copyOf(createCloudService(UUID.randomUUID())) - .withLastOperation(createLastOperation(serviceInstanceState)); + ImmutableCloudServiceInstance existingCloudServiceInstance = ImmutableCloudServiceInstance.copyOf( + createCloudService(UUID.randomUUID())) + .withLastOperation(createLastOperation( + serviceInstanceState)); Mockito.when(client.getServiceInstanceWithoutAuxiliaryContent(anyString(), anyBoolean())) .thenReturn(existingCloudServiceInstance); Mockito.doThrow(new CloudOperationException(HttpStatus.UNPROCESSABLE_ENTITY)) diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteApplicationRoutesStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteApplicationRoutesStepTest.java index abe69d641d..a6746b5de2 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteApplicationRoutesStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteApplicationRoutesStepTest.java @@ -1,14 +1,11 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - import java.util.Collections; import java.util.List; import org.cloudfoundry.multiapps.controller.api.model.ProcessType; +import org.cloudfoundry.multiapps.controller.client.facade.CloudCredentials; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.core.cf.clients.ServiceInstanceRoutesGetter; import org.cloudfoundry.multiapps.controller.core.cf.metadata.processor.MtaMetadataParser; import org.cloudfoundry.multiapps.controller.core.model.HookPhase; @@ -22,8 +19,10 @@ import org.mockito.Mock; import org.mockito.Mockito; -import com.sap.cloudfoundry.client.facade.CloudCredentials; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; class DeleteApplicationRoutesStepTest extends UndeployAppStepTest { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteApplicationStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteApplicationStepTest.java index ef6ec66b5f..6f92ad8b9f 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteApplicationStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteApplicationStepTest.java @@ -1,10 +1,9 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.verify; - import org.cloudfoundry.multiapps.common.SLException; import org.cloudfoundry.multiapps.controller.api.model.ProcessType; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.metadata.processor.MtaMetadataParser; @@ -19,8 +18,8 @@ import org.mockito.Mockito; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.verify; class DeleteApplicationStepTest extends UndeployAppStepTest { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteIdleRoutesStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteIdleRoutesStepTest.java index 83c41cf0dc..7174392423 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteIdleRoutesStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteIdleRoutesStepTest.java @@ -1,19 +1,17 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - import java.util.Collections; import java.util.List; import java.util.Set; import java.util.stream.Stream; +import com.fasterxml.jackson.core.type.TypeReference; import org.apache.commons.collections4.CollectionUtils; import org.cloudfoundry.multiapps.common.SLException; import org.cloudfoundry.multiapps.common.test.TestUtil; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.variables.Variables; @@ -25,38 +23,39 @@ import org.mockito.Mockito; import org.springframework.http.HttpStatus; -import com.fasterxml.jackson.core.type.TypeReference; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; class DeleteIdleRoutesStepTest extends SyncFlowableStepTest { static Stream testExecute() { return Stream.of( - // (1) One old route is replaced with a new one in redeploy: - Arguments.of("existing-app-1.json", "app-to-deploy-1.json", - TestData.routeSet("module-1.domain.com", "module-1.domain.com/with/path"), null, StepPhase.DONE), - // (2) There are no differences between old and new route: - Arguments.of("existing-app-2.json", "app-to-deploy-2.json", Collections.emptySet(), null, StepPhase.DONE), - // (3) The new URIs are a subset of the old: - Arguments.of("existing-app-3.json", "app-to-deploy-3.json", - TestData.routeSet("test.domain.com/51052", "test.domain.com/51054"), null, StepPhase.DONE), - // (4) There is no previous version of app: - Arguments.of(null, "app-to-deploy-3.json", Collections.emptySet(), null, StepPhase.DONE), - // (5) Not Found Exception is thrown - Arguments.of("existing-app-1.json", "app-to-deploy-1.json", - TestData.routeSet("module-1.domain.com", "module-1.domain.com/with/path"), - new CloudOperationException(HttpStatus.NOT_FOUND), StepPhase.DONE), - // (6) Conflict Exception is thrown - Arguments.of("existing-app-1.json", "app-to-deploy-1.json", - TestData.routeSet("module-1.domain.com", "module-1.domain.com/with/path"), - new CloudOperationException(HttpStatus.CONFLICT), StepPhase.DONE), - // (7) No-Hostname: There are no differences between old and new routes: - Arguments.of("existing-app-4.json", "app-to-deploy-4.json", Collections.emptySet(), null, StepPhase.DONE), - // (8) No-Hostname: The new routes are a subset of the old: - Arguments.of("existing-app-5.json", "app-to-deploy-4.json", - TestData.routeSet(TestData.NOHOSTNAME_URI_FLAG + "testdomain.com", "bar.testdomain.com/another/path"), null, - StepPhase.DONE)); + // (1) One old route is replaced with a new one in redeploy: + Arguments.of("existing-app-1.json", "app-to-deploy-1.json", + TestData.routeSet("module-1.domain.com", "module-1.domain.com/with/path"), null, StepPhase.DONE), + // (2) There are no differences between old and new route: + Arguments.of("existing-app-2.json", "app-to-deploy-2.json", Collections.emptySet(), null, StepPhase.DONE), + // (3) The new URIs are a subset of the old: + Arguments.of("existing-app-3.json", "app-to-deploy-3.json", TestData.routeSet("test.domain.com/51052", "test.domain.com/51054"), + null, StepPhase.DONE), + // (4) There is no previous version of app: + Arguments.of(null, "app-to-deploy-3.json", Collections.emptySet(), null, StepPhase.DONE), + // (5) Not Found Exception is thrown + Arguments.of("existing-app-1.json", "app-to-deploy-1.json", + TestData.routeSet("module-1.domain.com", "module-1.domain.com/with/path"), + new CloudOperationException(HttpStatus.NOT_FOUND), StepPhase.DONE), + // (6) Conflict Exception is thrown + Arguments.of("existing-app-1.json", "app-to-deploy-1.json", + TestData.routeSet("module-1.domain.com", "module-1.domain.com/with/path"), + new CloudOperationException(HttpStatus.CONFLICT), StepPhase.DONE), + // (7) No-Hostname: There are no differences between old and new routes: + Arguments.of("existing-app-4.json", "app-to-deploy-4.json", Collections.emptySet(), null, StepPhase.DONE), + // (8) No-Hostname: The new routes are a subset of the old: + Arguments.of("existing-app-5.json", "app-to-deploy-4.json", + TestData.routeSet(TestData.NOHOSTNAME_URI_FLAG + "testdomain.com", "bar.testdomain.com/another/path"), null, + StepPhase.DONE)); } @ParameterizedTest diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceBrokersStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceBrokersStepTest.java index 5a48eae036..96dc1bf6fd 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceBrokersStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceBrokersStepTest.java @@ -1,9 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - import java.text.MessageFormat; import java.util.Collections; import java.util.List; @@ -14,6 +10,12 @@ import org.apache.commons.collections4.CollectionUtils; import org.cloudfoundry.multiapps.common.SLException; import org.cloudfoundry.multiapps.common.util.ListUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudServiceBrokerException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBroker; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceBroker; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.model.SupportedParameters; import org.cloudfoundry.multiapps.controller.process.steps.CreateOrUpdateServiceBrokerStepTest.SimpleApplication; @@ -26,12 +28,9 @@ import org.mockito.stubbing.Answer; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudControllerException; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.CloudServiceBrokerException; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBroker; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceBroker; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; class DeleteServiceBrokersStepTest extends SyncFlowableStepTest { @@ -52,7 +51,7 @@ protected List getCreatedOrUpdatedServiceBrokerNames(ProcessContext cont public static Stream testExecute() { return Stream.of( -// @formatter:off + // @formatter:off // (1) One service broker should be deleted: Arguments.of(new StepInput(List.of(SERVICE_BROKER_NAME), List.of(new SimpleApplication(APPLICATION_NAME, Map.of(SupportedParameters.SERVICE_BROKER_NAME, SERVICE_BROKER_NAME, diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceKeyStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceKeyStepTest.java index dc12066378..11824ddeed 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceKeyStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceKeyStepTest.java @@ -1,17 +1,16 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - import java.text.MessageFormat; import java.util.Optional; import java.util.UUID; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableServiceCredentialBindingOperation; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.Messages; @@ -19,12 +18,12 @@ import org.junit.jupiter.api.Test; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ImmutableServiceCredentialBindingOperation; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; class DeleteServiceKeyStepTest extends SyncFlowableStepTest { @@ -115,8 +114,10 @@ private CloudServiceKey buildCloudServiceKey(CloudServiceInstanceExtended servic .name(SERVICE_KEY_NAME) .metadata(ImmutableCloudMetadata.of(SERVICE_KEY_GUID)) .serviceKeyOperation(ImmutableServiceCredentialBindingOperation.builder() - .type(ServiceCredentialBindingOperation.Type.CREATE) - .state(ServiceCredentialBindingOperation.State.SUCCEEDED) + .type( + ServiceCredentialBindingOperation.Type.CREATE) + .state( + ServiceCredentialBindingOperation.State.SUCCEEDED) .build()) .build(); } diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceMtaMetadataStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceMtaMetadataStepTest.java index 499f0373ea..96a150b2fc 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceMtaMetadataStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceMtaMetadataStepTest.java @@ -1,19 +1,18 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - import java.util.UUID; import org.cloudfoundry.client.v3.Metadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.junit.jupiter.api.Test; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; class DeleteServiceMtaMetadataStepTest extends SyncFlowableStepTest { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceStepTest.java index 56e2b54ba3..1a7d869d3a 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteServiceStepTest.java @@ -1,18 +1,13 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - import java.util.ArrayList; import java.util.List; import java.util.UUID; import java.util.stream.Stream; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.util.ServiceAction; import org.cloudfoundry.multiapps.controller.process.util.ServiceOperationGetter; @@ -24,9 +19,12 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; class DeleteServiceStepTest extends SyncFlowableStepTest { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetachServiceKeysFromMtaStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetachServiceKeysFromMtaStepTest.java index 12387d432d..6dc70e3ff9 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetachServiceKeysFromMtaStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetachServiceKeysFromMtaStepTest.java @@ -1,14 +1,14 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.eq; - import java.util.Collections; import java.util.List; import java.util.UUID; import java.util.stream.Stream; import org.cloudfoundry.client.v3.Metadata; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadataAnnotations; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadataLabels; import org.cloudfoundry.multiapps.controller.core.model.DeployedMtaServiceKey; @@ -20,9 +20,8 @@ import org.mockito.Mockito; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.eq; class DetachServiceKeysFromMtaStepTest extends SyncFlowableStepTest { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetachServicesFromMtaStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetachServicesFromMtaStepTest.java index b7631166e6..40b15d83d3 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetachServicesFromMtaStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetachServicesFromMtaStepTest.java @@ -1,9 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; - import java.util.Collections; import java.util.List; import java.util.UUID; @@ -11,6 +7,10 @@ import java.util.stream.Stream; import org.cloudfoundry.client.v3.Metadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceInstance; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadataAnnotations; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadataLabels; import org.cloudfoundry.multiapps.controller.process.variables.Variables; @@ -19,10 +19,9 @@ import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Mockito; -import com.sap.cloudfoundry.client.facade.domain.CloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceInstance; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; class DetachServicesFromMtaStepTest extends SyncFlowableStepTest { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetectApplicationsToRenameStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetectApplicationsToRenameStepTest.java index a8c675ef90..9de262849e 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetectApplicationsToRenameStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetectApplicationsToRenameStepTest.java @@ -7,6 +7,11 @@ import java.util.stream.Stream; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableLifecycle; +import org.cloudfoundry.multiapps.controller.client.facade.domain.LifecycleType; import org.cloudfoundry.multiapps.controller.core.cf.metadata.ImmutableMtaMetadata; import org.cloudfoundry.multiapps.controller.core.model.BlueGreenApplicationNameSuffix; import org.cloudfoundry.multiapps.controller.core.model.DeployedMta; @@ -22,12 +27,6 @@ import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Mockito; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.LifecycleType; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudApplication; -import com.sap.cloudfoundry.client.facade.domain.ImmutableLifecycle; - class DetectApplicationsToRenameStepTest extends SyncFlowableStepTest { @BeforeEach diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetectDeployedMtaStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetectDeployedMtaStepTest.java index 1aed12df48..39faae73aa 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetectDeployedMtaStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetectDeployedMtaStepTest.java @@ -1,9 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.mockito.Mockito.when; - import java.util.Collections; import java.util.List; import java.util.Optional; @@ -12,6 +8,8 @@ import org.cloudfoundry.multiapps.common.test.TestUtil; import org.cloudfoundry.multiapps.common.test.Tester.Expectation; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudCredentials; import org.cloudfoundry.multiapps.controller.core.cf.clients.CustomServiceKeysClient; import org.cloudfoundry.multiapps.controller.core.cf.detect.DeployedMtaDetector; import org.cloudfoundry.multiapps.controller.core.cf.metadata.ImmutableMtaMetadata; @@ -31,8 +29,9 @@ import org.mockito.Mock; import org.mockito.Mockito; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudCredentials; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.mockito.Mockito.when; class DetectDeployedMtaStepTest extends SyncFlowableStepTest { @@ -65,7 +64,9 @@ void testExecuteWithDeployedMta() { when(deployedMtaDetector.detectDeployedMtas(Mockito.any(CloudControllerClient.class))).thenReturn(deployedComponents); when(deployedMtaDetector.detectDeployedMtaByNameAndNamespace(Mockito.eq(MTA_ID), Mockito.eq(null), - Mockito.any(CloudControllerClient.class))).thenReturn(Optional.of(deployedMta)); + Mockito.any( + CloudControllerClient.class))).thenReturn( + Optional.of(deployedMta)); when(customClientMock.getServiceKeysByMetadataAndGuids(Mockito.eq(SPACE_GUID), Mockito.eq(MTA_ID), Mockito.isNull(), Mockito.eq(deployedMta.getServices()))).thenReturn(deployedKeys); @@ -99,10 +100,12 @@ void testExecuteWithBackupdMta() { .moduleName("test-module") .name("test-app") .v3Metadata(Metadata.builder() - .annotation(MtaMetadataAnnotations.MTA_VERSION, - MTA_VERSION_2) + .annotation( + MtaMetadataAnnotations.MTA_VERSION, + MTA_VERSION_2) .build()) - .productizationState(ProductizationState.LIVE) + .productizationState( + ProductizationState.LIVE) .build()) .metadata(ImmutableMtaMetadata.builder() .id(MTA_ID) @@ -114,10 +117,12 @@ void testExecuteWithBackupdMta() { .moduleName("test-module") .name("mta-backup-test-app") .v3Metadata(Metadata.builder() - .annotation(MtaMetadataAnnotations.MTA_VERSION, - MTA_VERSION_1) + .annotation( + MtaMetadataAnnotations.MTA_VERSION, + MTA_VERSION_1) .build()) - .productizationState(ProductizationState.LIVE) + .productizationState( + ProductizationState.LIVE) .build()) .metadata(ImmutableMtaMetadata.builder() .id(MTA_ID) @@ -128,8 +133,9 @@ void testExecuteWithBackupdMta() { when(deployedMtaDetector.detectDeployedMtaByNameAndNamespace(Mockito.eq(MTA_ID), Mockito.eq(null), Mockito.any())).thenReturn(Optional.of(deployedMta)); when(deployedMtaDetector.detectDeployedMtaByNameAndNamespace(Mockito.eq(MTA_ID), - Mockito.eq(NameUtil.computeUserNamespaceWithSystemNamespace(Constants.MTA_BACKUP_NAMESPACE, - null)), + Mockito.eq(NameUtil.computeUserNamespaceWithSystemNamespace( + Constants.MTA_BACKUP_NAMESPACE, + null)), Mockito.any())).thenReturn(Optional.of(backupMta)); step.execute(execution); diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineApplicationServiceBindingActionsStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineApplicationServiceBindingActionsStepTest.java index 562938ed7d..908a33858f 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineApplicationServiceBindingActionsStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineApplicationServiceBindingActionsStepTest.java @@ -1,11 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; - import java.text.MessageFormat; import java.util.Collections; import java.util.List; @@ -13,6 +7,10 @@ import java.util.UUID; import java.util.stream.Stream; +import org.cloudfoundry.multiapps.controller.client.facade.CloudCredentials; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceBinding; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.clients.AppBoundServiceInstanceNamesGetter; @@ -27,10 +25,11 @@ import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Mock; -import com.sap.cloudfoundry.client.facade.CloudCredentials; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceBinding; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; class DetermineApplicationServiceBindingActionsStepTest extends SyncFlowableStepTest { @@ -46,25 +45,24 @@ class DetermineApplicationServiceBindingActionsStepTest extends SyncFlowableStep static Stream testDetermineServiceBindUnbind() { return Stream.of( - // (1) Service binding exist but service is no more part of the MTA - Arguments.of(false, false, true, true, false), - // (2) Service binding exist, service is no more part of the MTA and keepExistingBindings strategy is set to true - Arguments.of(false, true, true, false, false), - // (3) Service is part from MTA and binding doesn't exist - Arguments.of(true, false, false, false, true), - // (4) Service is part from MTA, it is already bound and existing parameters match to MTA parameters - Arguments.of(true, false, true, false, false), - // (5) Service is part of MTA and keepExistingBindings strategy is set to true - Arguments.of(true, true, true, false, false), - // (6) Service is not part of MTA and keepExistingBindings strategy is set to true - Arguments.of(false, true, true, false, false)); + // (1) Service binding exist but service is no more part of the MTA + Arguments.of(false, false, true, true, false), + // (2) Service binding exist, service is no more part of the MTA and keepExistingBindings strategy is set to true + Arguments.of(false, true, true, false, false), + // (3) Service is part from MTA and binding doesn't exist + Arguments.of(true, false, false, false, true), + // (4) Service is part from MTA, it is already bound and existing parameters match to MTA parameters + Arguments.of(true, false, true, false, false), + // (5) Service is part of MTA and keepExistingBindings strategy is set to true + Arguments.of(true, true, true, false, false), + // (6) Service is not part of MTA and keepExistingBindings strategy is set to true + Arguments.of(false, true, true, false, false)); } @ParameterizedTest @MethodSource void testDetermineServiceBindUnbind(boolean servicePartFromMta, boolean keepExistingBinding, boolean serviceBindingExist, - boolean expectedUnbindValue, boolean expectedBindValue) - throws FileStorageException { + boolean expectedUnbindValue, boolean expectedBindValue) throws FileStorageException { CloudApplicationExtended application = buildCloudApplicationExtended(servicePartFromMta, keepExistingBinding); prepareContext(application); prepareClient(application, serviceBindingExist); @@ -119,9 +117,10 @@ void testBindingToDeleteAndAppToProcessAreSet() { void testGetStepErrorMessageDuringServiceBindingDeletion() { CloudServiceBinding serviceBindingToDelete = buildServiceBinding(); context.setVariable(Variables.SERVICE_BINDING_TO_DELETE, serviceBindingToDelete); - assertEquals(MessageFormat.format(Messages.ERROR_WHILE_DETERMINING_BIND_UNBIND_OPERATIONS_OF_APPLICATION_GUID_TO_SERVICE_INSTANCE_GUID, - serviceBindingToDelete.getApplicationGuid(), serviceBindingToDelete.getServiceInstanceGuid()), - step.getStepErrorMessage(context)); + assertEquals( + MessageFormat.format(Messages.ERROR_WHILE_DETERMINING_BIND_UNBIND_OPERATIONS_OF_APPLICATION_GUID_TO_SERVICE_INSTANCE_GUID, + serviceBindingToDelete.getApplicationGuid(), serviceBindingToDelete.getServiceInstanceGuid()), + step.getStepErrorMessage(context)); } @Test @@ -130,8 +129,7 @@ void testGetStepErrorMessageDuringServiceBindingCreation() { context.setVariable(Variables.APP_TO_PROCESS, app); context.setVariable(Variables.SERVICE_TO_UNBIND_BIND, SERVICE_INSTANCE_NAME); assertEquals(MessageFormat.format(Messages.ERROR_WHILE_DETERMINING_BIND_UNBIND_OPERATIONS_OF_APPLICATION_TO_SERVICE, APP_NAME, - SERVICE_INSTANCE_NAME), - step.getStepErrorMessage(context)); + SERVICE_INSTANCE_NAME), step.getStepErrorMessage(context)); } private ImmutableCloudServiceBinding buildServiceBinding() { @@ -143,16 +141,18 @@ private ImmutableCloudServiceBinding buildServiceBinding() { } private CloudApplicationExtended buildCloudApplicationExtended(boolean servicePartFromMta, boolean keepExistingBinding) { - CloudApplicationExtended.AttributeUpdateStrategy attributeUpdateStrategy = ImmutableCloudApplicationExtended.AttributeUpdateStrategy.builder() - .shouldKeepExistingServiceBindings(keepExistingBinding) - .build(); + CloudApplicationExtended.AttributeUpdateStrategy attributeUpdateStrategy = ImmutableCloudApplicationExtended.ImmutableAttributeUpdateStrategy.builder() + .shouldKeepExistingServiceBindings( + keepExistingBinding) + .build(); ImmutableCloudApplicationExtended.Builder applicationBuilder = ImmutableCloudApplicationExtended.builder() - .metadata(ImmutableCloudMetadata.of(UUID.randomUUID())) + .metadata(ImmutableCloudMetadata.of( + UUID.randomUUID())) .name(APP_NAME) - .attributesUpdateStrategy(attributeUpdateStrategy); + .attributesUpdateStrategy( + attributeUpdateStrategy); return servicePartFromMta ? applicationBuilder.addService(SERVICE_INSTANCE_NAME) - .build() - : applicationBuilder.build(); + .build() : applicationBuilder.build(); } private void prepareContext(CloudApplicationExtended application) { @@ -168,11 +168,10 @@ private void prepareClient(CloudApplicationExtended application, boolean service } private void prepareServiceBindingParametersGetter(Map mtaBindingParameters, - Map existingServiceBindingParameters) - throws FileStorageException { + Map existingServiceBindingParameters) throws FileStorageException { when(serviceBindingParametersGetter.getServiceBindingParametersFromMta(any(), any())).thenReturn(mtaBindingParameters); - when(serviceBindingParametersGetter.getServiceBindingParametersFromExistingInstance(any(), - any())).thenReturn(existingServiceBindingParameters); + when(serviceBindingParametersGetter.getServiceBindingParametersFromExistingInstance(any(), any())).thenReturn( + existingServiceBindingParameters); } @Override diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineDesiredStateAchievingActionsStepBaseTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineDesiredStateAchievingActionsStepBaseTest.java index 8ce52dc151..8c8aa5e8c9 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineDesiredStateAchievingActionsStepBaseTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineDesiredStateAchievingActionsStepBaseTest.java @@ -1,12 +1,12 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.when; - import java.util.UUID; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableDockerData; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.RestartParameters; @@ -15,11 +15,10 @@ import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.mockito.Mock; -import com.sap.cloudfoundry.client.facade.domain.CloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.CloudPackage; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudPackage; -import com.sap.cloudfoundry.client.facade.domain.ImmutableDockerData; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; public abstract class DetermineDesiredStateAchievingActionsStepBaseTest extends SyncFlowableStepTest { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceBindingsToDeleteStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceBindingsToDeleteStepTest.java index 3df9e7e744..9138447b68 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceBindingsToDeleteStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceBindingsToDeleteStepTest.java @@ -1,19 +1,18 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.when; - import java.util.List; import java.util.UUID; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceBinding; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.junit.jupiter.api.Test; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceBinding; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; class DetermineServiceBindingsToDeleteStepTest extends SyncFlowableStepTest { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceCreateUpdateServiceActionsStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceCreateUpdateServiceActionsStepTest.java index 772205069b..069619f4e8 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceCreateUpdateServiceActionsStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceCreateUpdateServiceActionsStepTest.java @@ -1,13 +1,21 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; +import java.text.MessageFormat; +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 org.cloudfoundry.client.v3.serviceinstances.ServiceInstanceType; import org.cloudfoundry.multiapps.common.test.TestUtil; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.model.DynamicResolvableParameter; @@ -24,14 +32,6 @@ import org.mockito.Mockito; import org.springframework.http.HttpStatus; -import java.text.MessageFormat; -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.assertThrows; @@ -75,20 +75,18 @@ static Stream testSetServiceGuidIfPresent() { .build(), ImmutableDynamicResolvableParameter.builder() .parameterName("service-guid") .relationshipEntityName("service-2") - .build()), ImmutableDynamicResolvableParameter.builder() - .parameterName( - "service-guid") - .relationshipEntityName( - "service-1") - .value( - "beeb5e8d-4ab9-46ee-9205-455a278743f0") - .build()), - // (2) Test skip resolve of unrelated parameter - Arguments.of("determine-actions-create-or-update-services-step-input-15-dynamic-parameter-relationship-match.json", Set.of( + .build()), ImmutableDynamicResolvableParameter.builder() .parameterName("service-guid") - .relationshipEntityName("service-2") - .build()), null), + .relationshipEntityName("service-1") + .value("beeb5e8d-4ab9-46ee-9205-455a278743f0") + .build()), + // (2) Test skip resolve of unrelated parameter + Arguments.of("determine-actions-create-or-update-services-step-input-15-dynamic-parameter-relationship-match.json", + Set.of(ImmutableDynamicResolvableParameter.builder() + .parameterName("service-guid") + .relationshipEntityName("service-2") + .build()), null), // (3) Test skip resolve of service marked for recreation Arguments.of("determine-actions-create-or-update-services-step-input-3-recreate-service.json", Set.of( ImmutableDynamicResolvableParameter.builder() @@ -96,18 +94,18 @@ static Stream testSetServiceGuidIfPresent() { .relationshipEntityName("service-1") .build()), null), // (4) Test skip resolve of unrelated parameter due to different parameter type - Arguments.of("determine-actions-create-or-update-services-step-input-15-dynamic-parameter-relationship-match.json", Set.of( - ImmutableDynamicResolvableParameter.builder() - .parameterName("metadata-key") - .relationshipEntityName("service-1") - .build()), null)); + Arguments.of("determine-actions-create-or-update-services-step-input-15-dynamic-parameter-relationship-match.json", + Set.of(ImmutableDynamicResolvableParameter.builder() + .parameterName("metadata-key") + .relationshipEntityName("service-1") + .build()), null)); } @ParameterizedTest @MethodSource void testExecute(String inputFilename, String expectedExceptionMessage) { - StepInput input = JsonUtil.fromJson(TestUtil.getResourceAsString(inputFilename, DetermineServiceCreateUpdateServiceActionsStepTest.class), - StepInput.class); + StepInput input = JsonUtil.fromJson( + TestUtil.getResourceAsString(inputFilename, DetermineServiceCreateUpdateServiceActionsStepTest.class), StepInput.class); initializeParameters(input, null); if (expectedExceptionMessage != null) { Exception exception = assertThrows(Exception.class, () -> step.execute(execution)); @@ -136,7 +134,8 @@ void testServiceParametersFetchingErrorHandling(boolean isOptionalService) { step.execute(execution); assertStepFinishedSuccessfully(); List serviceActionsToExecute = context.getVariable(Variables.SERVICE_ACTIONS_TO_EXCECUTE); - assertTrue(serviceActionsToExecute.contains(ServiceAction.UPDATE_CREDENTIALS), "Actions should contain " + ServiceAction.UPDATE_CREDENTIALS); + assertTrue(serviceActionsToExecute.contains(ServiceAction.UPDATE_CREDENTIALS), + "Actions should contain " + ServiceAction.UPDATE_CREDENTIALS); } @ParameterizedTest @@ -155,7 +154,8 @@ void testShouldSkipParametersUpdate(boolean isOptional) { assertStepFinishedSuccessfully(); List serviceActionsToExecute = context.getVariable(Variables.SERVICE_ACTIONS_TO_EXCECUTE); - assertTrue(serviceActionsToExecute.contains(ServiceAction.UPDATE_CREDENTIALS), "Actions should contain " + ServiceAction.UPDATE_CREDENTIALS); + assertTrue(serviceActionsToExecute.contains(ServiceAction.UPDATE_CREDENTIALS), + "Actions should contain " + ServiceAction.UPDATE_CREDENTIALS); assertFalse(serviceActionsToExecute.contains(ServiceAction.CREATE), "Actions should not contain " + ServiceAction.CREATE); } @@ -174,7 +174,8 @@ void testShouldSkipParametersUpdateWithoutCredentials(boolean isOptional) { step.execute(execution); assertStepFinishedSuccessfully(); List serviceActionsToExecute = context.getVariable(Variables.SERVICE_ACTIONS_TO_EXCECUTE); - assertFalse(serviceActionsToExecute.contains(ServiceAction.UPDATE_CREDENTIALS), "Actions should not contain " + ServiceAction.UPDATE_CREDENTIALS); + assertFalse(serviceActionsToExecute.contains(ServiceAction.UPDATE_CREDENTIALS), + "Actions should not contain " + ServiceAction.UPDATE_CREDENTIALS); assertFalse(serviceActionsToExecute.contains(ServiceAction.CREATE), "Actions should not contain " + ServiceAction.CREATE); } @@ -205,7 +206,8 @@ void testUpdateServiceKeysWhenDeleteServiceKeysIsSet(boolean serviceExists) { void testUpdateServiceTagsForUserProvidedService() { CloudMetadata serviceMetadata = ImmutableCloudMetadata.of(UUID.randomUUID()); var existingService = createMockUserProvidedServiceInstance(serviceMetadata, List.of("custom-tag-A", "custom-tag-B")); - var serviceWithUpdatedTags = createMockUserProvidedServiceInstance(serviceMetadata, List.of("updated-custom-tag-A", "updated-custom-tag-B")); + var serviceWithUpdatedTags = createMockUserProvidedServiceInstance(serviceMetadata, + List.of("updated-custom-tag-A", "updated-custom-tag-B")); context.setVariable(Variables.SERVICE_TO_PROCESS, serviceWithUpdatedTags); Mockito.when(client.getServiceInstance(SERVICE_NAME, false)) @@ -220,9 +222,10 @@ void testUpdateServiceTagsForUserProvidedService() { @ParameterizedTest @MethodSource - void testSetServiceGuidIfPresent(String inputFilename, Set dynamicResolvableParameters, DynamicResolvableParameter expectedResolvedParameter) { - StepInput input = JsonUtil.fromJson(TestUtil.getResourceAsString(inputFilename, DetermineServiceCreateUpdateServiceActionsStepTest.class), - StepInput.class); + void testSetServiceGuidIfPresent(String inputFilename, Set dynamicResolvableParameters, + DynamicResolvableParameter expectedResolvedParameter) { + StepInput input = JsonUtil.fromJson( + TestUtil.getResourceAsString(inputFilename, DetermineServiceCreateUpdateServiceActionsStepTest.class), StepInput.class); initializeParameters(input, dynamicResolvableParameters); step.execute(execution); @@ -279,13 +282,15 @@ private void validateActions(StepInput input) { assertTrue(serviceActionsToExecute.contains(ServiceAction.UPDATE_TAGS), "Actions should contain " + ServiceAction.UPDATE_TAGS); } if (input.shouldUpdateServiceParameters) { - assertTrue(serviceActionsToExecute.contains(ServiceAction.UPDATE_CREDENTIALS), "Actions should contain " + ServiceAction.UPDATE_CREDENTIALS); + assertTrue(serviceActionsToExecute.contains(ServiceAction.UPDATE_CREDENTIALS), + "Actions should contain " + ServiceAction.UPDATE_CREDENTIALS); } if (input.shouldUpdateServiceKeys) { assertTrue(serviceActionsToExecute.contains(ServiceAction.UPDATE_KEYS), "Actions should contain " + ServiceAction.UPDATE_KEYS); } if (input.shouldUpdateSyslogDrainUrl) { - assertTrue(serviceActionsToExecute.contains(ServiceAction.UPDATE_SYSLOG_URL), "Actions should contain " + ServiceAction.UPDATE_SYSLOG_URL); + assertTrue(serviceActionsToExecute.contains(ServiceAction.UPDATE_SYSLOG_URL), + "Actions should contain " + ServiceAction.UPDATE_SYSLOG_URL); } } diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceDeleteActionsToExecuteStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceDeleteActionsToExecuteStepTest.java index 8cfeadcea8..f04e7ca7b6 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceDeleteActionsToExecuteStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceDeleteActionsToExecuteStepTest.java @@ -1,17 +1,18 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.cloudfoundry.multiapps.controller.process.util.ServiceDeletionActions.DELETE_METADATA; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - import java.util.Collections; import java.util.List; import java.util.Map; import java.util.UUID; import org.cloudfoundry.client.v3.Metadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableServiceCredentialBindingOperation; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.cf.v2.ResourceType; @@ -23,13 +24,10 @@ import org.cloudfoundry.multiapps.mta.model.Resource; import org.junit.jupiter.api.Test; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceBinding; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ImmutableServiceCredentialBindingOperation; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class DetermineServiceDeleteActionsToExecuteStepTest extends SyncFlowableStepTest { @@ -91,8 +89,7 @@ void testDeleteServiceInstanceWithNoBindingsAndKeys() { step.execute(execution); assertStepFinishedSuccessfully(); assertEquals(List.of(ServiceDeletionActions.DELETE_SERVICE_BINDINGS, ServiceDeletionActions.DELETE_SERVICE_KEYS, - ServiceDeletionActions.DELETE_SERVICE_INSTANCE), - context.getVariable(Variables.SERVICE_DELETION_ACTIONS)); + ServiceDeletionActions.DELETE_SERVICE_INSTANCE), context.getVariable(Variables.SERVICE_DELETION_ACTIONS)); } @Test diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceKeysToRecreateStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceKeysToRecreateStepTest.java index 93f951e824..82da244ea5 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceKeysToRecreateStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineServiceKeysToRecreateStepTest.java @@ -1,9 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.when; - import java.util.Collections; import java.util.List; import java.util.Map; @@ -11,7 +7,12 @@ import org.cloudfoundry.client.v3.Metadata; import org.cloudfoundry.multiapps.common.SLException; -import org.cloudfoundry.multiapps.controller.api.model.ImmutableMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableServiceCredentialBindingOperation; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadataAnnotations; @@ -20,12 +21,9 @@ import org.junit.jupiter.api.Test; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ImmutableServiceCredentialBindingOperation; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.when; class DetermineServiceKeysToRecreateStepTest extends SyncFlowableStepTest { @@ -44,7 +42,8 @@ void testGetServiceKeysForOptionalServiceWhichDoesNotExist() { CloudServiceKey serviceKey = buildCloudServiceKey(); context.setVariable(Variables.SERVICE_TO_PROCESS, serviceInstance); context.setVariable(Variables.SERVICE_KEYS_TO_CREATE, Map.of(SERVICE_INSTANCE_NAME, List.of(serviceKey))); - when(client.getServiceKeysWithCredentials(SERVICE_INSTANCE_NAME)).thenThrow(new CloudOperationException(HttpStatus.SERVICE_UNAVAILABLE)); + when(client.getServiceKeysWithCredentials(SERVICE_INSTANCE_NAME)).thenThrow( + new CloudOperationException(HttpStatus.SERVICE_UNAVAILABLE)); step.execute(execution); assertStepFinishedSuccessfully(); assertEquals(Collections.emptyList(), context.getVariable(Variables.CLOUD_SERVICE_KEYS_TO_DELETE)); @@ -114,7 +113,8 @@ void testThrowExceptionWithNonOptionalService() { CloudServiceKey serviceKeyToCreate = buildCloudServiceKey(); context.setVariable(Variables.SERVICE_TO_PROCESS, serviceInstance); context.setVariable(Variables.SERVICE_KEYS_TO_CREATE, Map.of(SERVICE_INSTANCE_NAME, List.of(serviceKeyToCreate))); - when(client.getServiceKeysWithCredentials(SERVICE_INSTANCE_NAME)).thenThrow(new CloudOperationException(HttpStatus.SERVICE_UNAVAILABLE)); + when(client.getServiceKeysWithCredentials(SERVICE_INSTANCE_NAME)).thenThrow( + new CloudOperationException(HttpStatus.SERVICE_UNAVAILABLE)); Exception exception = assertThrows(SLException.class, () -> step.execute(execution)); assertEquals("Error while determining service keys to recreate: Controller operation failed: 503 Service Unavailable ", exception.getMessage()); @@ -129,8 +129,9 @@ void testUpdateUnchangedServiceKeyMetadata() { .label(MtaMetadataLabels.MTA_ID, "aaaaa") .annotation(MtaMetadataAnnotations.MTA_ID, "different-test-mta") - .annotation(MtaMetadataAnnotations.MTA_VERSION, - MTA_VERSION) + .annotation( + MtaMetadataAnnotations.MTA_VERSION, + MTA_VERSION) .build()); context.setVariable(Variables.SERVICE_TO_PROCESS, serviceInstance); context.setVariable(Variables.SERVICE_KEYS_TO_CREATE, Map.of(SERVICE_INSTANCE_NAME, List.of(serviceKeyToUpdate))); @@ -161,8 +162,10 @@ private CloudServiceKey buildCloudServiceKey() { .annotation(MtaMetadataAnnotations.MTA_VERSION, MTA_VERSION) .build()) .serviceKeyOperation(ImmutableServiceCredentialBindingOperation.builder() - .type(ServiceCredentialBindingOperation.Type.CREATE) - .state(ServiceCredentialBindingOperation.State.SUCCEEDED) + .type( + ServiceCredentialBindingOperation.Type.CREATE) + .state( + ServiceCredentialBindingOperation.State.SUCCEEDED) .build()) .build(); } @@ -173,8 +176,10 @@ private CloudServiceKey buildCloudServiceKeyWithCredentialsInProgress() { .metadata(ImmutableCloudMetadata.of(SERVICE_KEY_GUID)) .putCredential("test-key", "test-value") .serviceKeyOperation(ImmutableServiceCredentialBindingOperation.builder() - .type(ServiceCredentialBindingOperation.Type.CREATE) - .state(ServiceCredentialBindingOperation.State.SUCCEEDED) + .type( + ServiceCredentialBindingOperation.Type.CREATE) + .state( + ServiceCredentialBindingOperation.State.SUCCEEDED) .build()) .build(); } @@ -185,16 +190,20 @@ private CloudServiceKey buildCloudServiceKeyInProgress(CloudServiceKey original) .name(SERVICE_KEY_NAME) .metadata(ImmutableCloudMetadata.of(SERVICE_KEY_GUID)) .serviceKeyOperation(ImmutableServiceCredentialBindingOperation.builder() - .type(ServiceCredentialBindingOperation.Type.CREATE) - .state(ServiceCredentialBindingOperation.State.IN_PROGRESS) + .type( + ServiceCredentialBindingOperation.Type.CREATE) + .state( + ServiceCredentialBindingOperation.State.IN_PROGRESS) .build()) .build(); } return ImmutableCloudServiceKey.copyOf(original) .withServiceKeyOperation(ImmutableServiceCredentialBindingOperation.builder() - .type(ServiceCredentialBindingOperation.Type.CREATE) - .state(ServiceCredentialBindingOperation.State.IN_PROGRESS) + .type( + ServiceCredentialBindingOperation.Type.CREATE) + .state( + ServiceCredentialBindingOperation.State.IN_PROGRESS) .build()); } @@ -203,8 +212,10 @@ private CloudServiceKey buildExisingCloudServiceKey() { .name(EXISTING_SERVICE_KEY_NAME) .metadata(ImmutableCloudMetadata.of(EXISTING_SERVICE_KEY_GUID)) .serviceKeyOperation(ImmutableServiceCredentialBindingOperation.builder() - .type(ServiceCredentialBindingOperation.Type.CREATE) - .state(ServiceCredentialBindingOperation.State.SUCCEEDED) + .type( + ServiceCredentialBindingOperation.Type.CREATE) + .state( + ServiceCredentialBindingOperation.State.SUCCEEDED) .build()) .build(); } diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/ExecuteTaskStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/ExecuteTaskStepTest.java index 8920d143f9..f89dcaba15 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/ExecuteTaskStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/ExecuteTaskStepTest.java @@ -1,27 +1,26 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.argThat; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - import java.time.Duration; import java.util.List; import org.cloudfoundry.multiapps.common.test.GenericArgumentMatcher; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudTask; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudTask; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.model.SupportedParameters; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - -import com.sap.cloudfoundry.client.facade.domain.CloudTask; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudTask; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + class ExecuteTaskStepTest extends SyncFlowableStepTest { private static final Long DUMMY_TIME = 100L; diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/IncrementalAppInstanceUpdateStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/IncrementalAppInstanceUpdateStepTest.java index 4df0cca8c7..18e55a7f7a 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/IncrementalAppInstanceUpdateStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/IncrementalAppInstanceUpdateStepTest.java @@ -1,17 +1,16 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.cloudfoundry.multiapps.controller.process.steps.StepsTestUtil.prepareDisablingAutoscaler; -import static org.cloudfoundry.multiapps.controller.process.steps.StepsTestUtil.testIfEnabledOrDisabledAutoscaler; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - import java.text.MessageFormat; import java.time.Duration; import java.util.List; import java.util.UUID; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableInstanceInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableInstancesInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstanceInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstanceState; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstancesInfo; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientFactory; @@ -31,12 +30,12 @@ import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Mockito; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableInstanceInfo; -import com.sap.cloudfoundry.client.facade.domain.ImmutableInstancesInfo; -import com.sap.cloudfoundry.client.facade.domain.InstanceInfo; -import com.sap.cloudfoundry.client.facade.domain.InstanceState; -import com.sap.cloudfoundry.client.facade.domain.InstancesInfo; +import static org.cloudfoundry.multiapps.controller.process.steps.StepsTestUtil.prepareDisablingAutoscaler; +import static org.cloudfoundry.multiapps.controller.process.steps.StepsTestUtil.testIfEnabledOrDisabledAutoscaler; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; class IncrementalAppInstanceUpdateStepTest extends SyncFlowableStepTest { @@ -60,7 +59,8 @@ void executeStepWithMissingOldApplication() { prepareAppToProcess(5); step.execute(execution); verify(client).updateApplicationInstances(APP_TO_PROCESS_NAME, 5); - IncrementalAppInstanceUpdateConfiguration incrementalAppInstanceUpdateConfiguration = context.getVariable(Variables.INCREMENTAL_APP_INSTANCE_UPDATE_CONFIGURATION); + IncrementalAppInstanceUpdateConfiguration incrementalAppInstanceUpdateConfiguration = context.getVariable( + Variables.INCREMENTAL_APP_INSTANCE_UPDATE_CONFIGURATION); assertEquals(5, incrementalAppInstanceUpdateConfiguration.getNewApplicationInstanceCount()); assertEquals(1, context.getVariable(Variables.ASYNC_STEP_EXECUTION_INDEX)); assertExecutionStepStatus(StepPhase.POLL.toString()); @@ -91,7 +91,8 @@ void executeStepWithRunningOldApplication() { prepareRunningOldApplication(); prepareAppToProcess(5); step.execute(execution); - IncrementalAppInstanceUpdateConfiguration incrementalAppInstanceUpdateConfiguration = context.getVariable(Variables.INCREMENTAL_APP_INSTANCE_UPDATE_CONFIGURATION); + IncrementalAppInstanceUpdateConfiguration incrementalAppInstanceUpdateConfiguration = context.getVariable( + Variables.INCREMENTAL_APP_INSTANCE_UPDATE_CONFIGURATION); assertEquals(1, incrementalAppInstanceUpdateConfiguration.getNewApplicationInstanceCount()); assertEquals(2, context.getVariable(Variables.ASYNC_STEP_EXECUTION_INDEX)); assertEquals(1, incrementalAppInstanceUpdateConfiguration.getOldApplicationInstanceCount()); @@ -133,7 +134,8 @@ void executeStepWithFailingOldApplication() { prepareFailingOldApplication(); prepareAppToProcess(5); step.execute(execution); - IncrementalAppInstanceUpdateConfiguration incrementalAppInstanceUpdateConfiguration = context.getVariable(Variables.INCREMENTAL_APP_INSTANCE_UPDATE_CONFIGURATION); + IncrementalAppInstanceUpdateConfiguration incrementalAppInstanceUpdateConfiguration = context.getVariable( + Variables.INCREMENTAL_APP_INSTANCE_UPDATE_CONFIGURATION); assertEquals(1, incrementalAppInstanceUpdateConfiguration.getNewApplicationInstanceCount()); assertEquals(0, context.getVariable(Variables.ASYNC_STEP_EXECUTION_INDEX)); assertEquals(1, incrementalAppInstanceUpdateConfiguration.getOldApplicationInstanceCount()); @@ -156,7 +158,8 @@ void executeStepWithAlreadyScaledApplication() { prepareFailingOldApplication(); prepareAppToProcess(1); step.execute(execution); - IncrementalAppInstanceUpdateConfiguration incrementalAppInstanceUpdateConfiguration = context.getVariable(Variables.INCREMENTAL_APP_INSTANCE_UPDATE_CONFIGURATION); + IncrementalAppInstanceUpdateConfiguration incrementalAppInstanceUpdateConfiguration = context.getVariable( + Variables.INCREMENTAL_APP_INSTANCE_UPDATE_CONFIGURATION); assertEquals(1, incrementalAppInstanceUpdateConfiguration.getNewApplicationInstanceCount()); assertEquals(0, context.getVariable(Variables.ASYNC_STEP_EXECUTION_INDEX)); assertEquals(1, incrementalAppInstanceUpdateConfiguration.getOldApplicationInstanceCount()); @@ -171,7 +174,8 @@ void executeStepWithoutOldApplicationsDetected() { prepareDeployedMtaWithoutApplications(); prepareAppToProcess(5); step.execute(execution); - IncrementalAppInstanceUpdateConfiguration incrementalAppInstanceUpdateConfiguration = context.getVariable(Variables.INCREMENTAL_APP_INSTANCE_UPDATE_CONFIGURATION); + IncrementalAppInstanceUpdateConfiguration incrementalAppInstanceUpdateConfiguration = context.getVariable( + Variables.INCREMENTAL_APP_INSTANCE_UPDATE_CONFIGURATION); assertEquals(5, incrementalAppInstanceUpdateConfiguration.getNewApplicationInstanceCount()); assertEquals(1, context.getVariable(Variables.ASYNC_STEP_EXECUTION_INDEX)); assertExecutionStepStatus(StepPhase.POLL.toString()); @@ -200,7 +204,8 @@ void executeStepWithOtherOldApplicationsDetected() { context.setVariable(Variables.DEPLOYED_MTA, deployedMta); prepareAppToProcess(5); step.execute(execution); - IncrementalAppInstanceUpdateConfiguration incrementalAppInstanceUpdateConfiguration = context.getVariable(Variables.INCREMENTAL_APP_INSTANCE_UPDATE_CONFIGURATION); + IncrementalAppInstanceUpdateConfiguration incrementalAppInstanceUpdateConfiguration = context.getVariable( + Variables.INCREMENTAL_APP_INSTANCE_UPDATE_CONFIGURATION); assertEquals(5, incrementalAppInstanceUpdateConfiguration.getNewApplicationInstanceCount()); assertEquals(1, context.getVariable(Variables.ASYNC_STEP_EXECUTION_INDEX)); assertNull(incrementalAppInstanceUpdateConfiguration.getOldApplication()); diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteAppStatusExecutionTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteAppStatusExecutionTest.java index 3b5e27566d..008346657d 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteAppStatusExecutionTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteAppStatusExecutionTest.java @@ -14,12 +14,11 @@ import java.util.UUID; import java.util.stream.Stream; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.adapters.LogCacheClient; -import com.sap.cloudfoundry.client.facade.domain.ApplicationLog; -import com.sap.cloudfoundry.client.facade.domain.ApplicationLog.MessageType; -import com.sap.cloudfoundry.client.facade.domain.ImmutableApplicationLog; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.LogCacheClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ApplicationLog; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableApplicationLog; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.Constants; @@ -95,31 +94,32 @@ void setUp() throws Exception { static Stream testStep() { return Stream.of( // (1) Application is in running state - Arguments.of(createAppLog("testMessage", MessageType.STDOUT, APP_SOURCE), null, null, false, + Arguments.of(createAppLog("testMessage", ApplicationLog.MessageType.STDOUT, APP_SOURCE), null, null, false, AsyncExecutionState.RUNNING), // (2) Application finished execution and should be stopped - Arguments.of(createAppLog("SUCCESS", MessageType.STDOUT, APP_SOURCE), null, null, true, + Arguments.of(createAppLog("SUCCESS", ApplicationLog.MessageType.STDOUT, APP_SOURCE), null, null, true, AsyncExecutionState.FINISHED), // (3) Application finished execution and should be left to run - Arguments.of(createAppLog("SUCCESS", MessageType.STDOUT, APP_SOURCE), null, null, false, + Arguments.of(createAppLog("SUCCESS", ApplicationLog.MessageType.STDOUT, APP_SOURCE), null, null, false, AsyncExecutionState.FINISHED), // (4) Application with Custom success marker - Arguments.of(createAppLog("SUCCESS", MessageType.STDOUT, APP_SOURCE), "executed", null, false, + Arguments.of(createAppLog("SUCCESS", ApplicationLog.MessageType.STDOUT, APP_SOURCE), "executed", null, false, AsyncExecutionState.RUNNING), // (5) Application in failed state - Arguments.of(createAppLog("FAILURE", MessageType.STDERR, APP_SOURCE), null, null, false, + Arguments.of(createAppLog("FAILURE", ApplicationLog.MessageType.STDERR, APP_SOURCE), null, null, false, AsyncExecutionState.ERROR), // (6) Application in failed state and should be stopped - Arguments.of(createAppLog("FAILURE", MessageType.STDERR, APP_SOURCE), null, null, true, AsyncExecutionState.ERROR), + Arguments.of(createAppLog("FAILURE", ApplicationLog.MessageType.STDERR, APP_SOURCE), null, null, true, + AsyncExecutionState.ERROR), // (7) Application with Custom failure marker - Arguments.of(createAppLog("FAILURE", MessageType.STDERR, APP_SOURCE), null, "execution failure", false, + Arguments.of(createAppLog("FAILURE", ApplicationLog.MessageType.STDERR, APP_SOURCE), null, "execution failure", false, AsyncExecutionState.RUNNING), // (8) Log message with non APP Source - Arguments.of(createAppLog("info service", MessageType.STDOUT, "service"), null, null, false, + Arguments.of(createAppLog("info service", ApplicationLog.MessageType.STDOUT, "service"), null, null, false, AsyncExecutionState.RUNNING)); } - private static ApplicationLog createAppLog(String message, MessageType messageType, String sourceName) { + private static ApplicationLog createAppLog(String message, ApplicationLog.MessageType messageType, String sourceName) { return ImmutableApplicationLog.builder() .applicationGuid(APPLICATION_GUID) .message(message) diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteTaskStatusStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteTaskStatusStepTest.java index 2d9e1246c1..c58a09fb92 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteTaskStatusStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteTaskStatusStepTest.java @@ -1,15 +1,15 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; - import java.time.Duration; import java.util.Collections; import java.util.List; import java.util.UUID; import java.util.stream.Stream; +import org.cloudfoundry.multiapps.controller.client.facade.adapters.LogCacheClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudTask; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudTask; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientFactory; @@ -18,14 +18,13 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; - -import com.sap.cloudfoundry.client.facade.adapters.LogCacheClient; -import com.sap.cloudfoundry.client.facade.domain.CloudTask; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudTask; import org.mockito.Mock; import org.mockito.Mockito; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + class PollExecuteTaskStatusStepTest extends AsyncStepOperationTest { private static final Duration START_TIMEOUT = Duration.ofSeconds(900); @@ -53,7 +52,7 @@ class PollExecuteTaskStatusStepTest extends AsyncStepOperationTest testPollStateExecution() { return Stream.of( -// @formatter:off + // @formatter:off // (0) Arguments.of(CloudTask.State.SUCCEEDED, 100L, AsyncExecutionState.FINISHED), // (1) diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollIncrementalAppInstanceUpdateExecutionTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollIncrementalAppInstanceUpdateExecutionTest.java index 509db61c0d..eea3294143 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollIncrementalAppInstanceUpdateExecutionTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollIncrementalAppInstanceUpdateExecutionTest.java @@ -1,13 +1,10 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.cloudfoundry.multiapps.controller.process.steps.StepsTestUtil.testIfEnabledOrDisabledAutoscaler; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - import java.util.List; import java.util.UUID; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientFactory; @@ -19,8 +16,10 @@ import org.junit.jupiter.api.Test; import org.mockito.Mockito; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; +import static org.cloudfoundry.multiapps.controller.process.steps.StepsTestUtil.testIfEnabledOrDisabledAutoscaler; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; class PollIncrementalAppInstanceUpdateExecutionTest extends AsyncStepOperationTest { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingLastOperationExecutionTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingLastOperationExecutionTest.java index bd9c8018a1..aa2646214b 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingLastOperationExecutionTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingLastOperationExecutionTest.java @@ -1,15 +1,17 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; - import java.text.MessageFormat; import java.time.LocalDateTime; import java.util.List; import java.util.UUID; import java.util.stream.Stream; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableServiceCredentialBindingOperation; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; @@ -21,12 +23,9 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import com.sap.cloudfoundry.client.facade.domain.CloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceBinding; -import com.sap.cloudfoundry.client.facade.domain.ImmutableServiceCredentialBindingOperation; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; class PollServiceBindingLastOperationExecutionTest extends AsyncStepOperationTest { @@ -88,8 +87,9 @@ void testPollingErrorMessage() { context.setVariable(Variables.APP_TO_PROCESS, buildCloudApplication()); context.setVariable(Variables.SERVICE_TO_UNBIND_BIND, SERVICE_TO_UNBIND_BIND); List asyncExecutions = getAsyncOperations(context); - String expectedErrorMessage = MessageFormat.format(Messages.ERROR_WHILE_POLLING_SERVICE_BINDING_OPERATIONS_BETWEEN_APP_0_AND_SERVICE_INSTANCE_1, - APP_TO_PROCESS_NAME, SERVICE_TO_UNBIND_BIND); + String expectedErrorMessage = MessageFormat.format( + Messages.ERROR_WHILE_POLLING_SERVICE_BINDING_OPERATIONS_BETWEEN_APP_0_AND_SERVICE_INSTANCE_1, + APP_TO_PROCESS_NAME, SERVICE_TO_UNBIND_BIND); asyncExecutions.forEach(asyncExecution -> assertEquals(expectedErrorMessage, asyncExecution.getPollingErrorMessage(context))); } diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingOperationExecutionTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingOperationExecutionTest.java index 1e3903cee6..c4c30ded04 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingOperationExecutionTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingOperationExecutionTest.java @@ -1,18 +1,17 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.when; - import java.util.List; import java.util.UUID; import org.cloudfoundry.client.v3.jobs.JobState; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudAsyncJob; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudAsyncJob; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.junit.jupiter.api.Test; -import com.sap.cloudfoundry.client.facade.domain.CloudAsyncJob; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudAsyncJob; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; class PollServiceBindingOperationExecutionTest extends AsyncStepOperationTest { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingOrKeyOperationExecutionTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingOrKeyOperationExecutionTest.java index 2e2bdf181b..f1709049ef 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingOrKeyOperationExecutionTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBindingOrKeyOperationExecutionTest.java @@ -1,25 +1,24 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; - import java.util.List; import java.util.UUID; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableServiceCredentialBindingOperation; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceBinding; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceInstance; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ImmutableServiceCredentialBindingOperation; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; +import static org.junit.jupiter.api.Assertions.assertEquals; class PollServiceBindingOrKeyOperationExecutionTest extends AsyncStepOperationTest { @@ -125,7 +124,8 @@ private CloudServiceBinding buildServiceBinding(ServiceCredentialBindingOperatio .serviceInstanceGuid(serviceInstance.getGuid()) .serviceBindingOperation(ImmutableServiceCredentialBindingOperation.builder() .state(state) - .type(ServiceCredentialBindingOperation.Type.CREATE) + .type( + ServiceCredentialBindingOperation.Type.CREATE) .build()) .build(); } @@ -135,7 +135,8 @@ private CloudServiceKey buildServiceKey(ServiceCredentialBindingOperation.State .serviceInstance(serviceInstance) .serviceKeyOperation(ImmutableServiceCredentialBindingOperation.builder() .state(state) - .type(ServiceCredentialBindingOperation.Type.CREATE) + .type( + ServiceCredentialBindingOperation.Type.CREATE) .build()) .build(); } diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBrokerOperationsExecutionTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBrokerOperationsExecutionTest.java index 63e15d22bb..fb82e84353 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBrokerOperationsExecutionTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBrokerOperationsExecutionTest.java @@ -1,20 +1,19 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.when; - import java.util.List; import java.util.stream.Stream; import org.cloudfoundry.client.v3.jobs.JobState; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudAsyncJob; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudAsyncJob; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceBroker; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import com.sap.cloudfoundry.client.facade.domain.CloudAsyncJob; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudAsyncJob; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceBroker; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; class PollServiceBrokerOperationsExecutionTest extends AsyncStepOperationTest { @@ -26,20 +25,16 @@ class PollServiceBrokerOperationsExecutionTest extends AsyncStepOperationTest testPollStateExecution() { return Stream.of(Arguments.of(ImmutableCloudAsyncJob.builder() .state(JobState.COMPLETE) - .build(), - AsyncExecutionState.FINISHED), - Arguments.of(ImmutableCloudAsyncJob.builder() - .state(JobState.FAILED) - .build(), - AsyncExecutionState.ERROR), - Arguments.of(ImmutableCloudAsyncJob.builder() - .state(JobState.POLLING) - .build(), - AsyncExecutionState.RUNNING), - Arguments.of(ImmutableCloudAsyncJob.builder() - .state(JobState.PROCESSING) - .build(), - AsyncExecutionState.RUNNING)); + .build(), AsyncExecutionState.FINISHED), Arguments.of( + ImmutableCloudAsyncJob.builder() + .state(JobState.FAILED) + .build(), AsyncExecutionState.ERROR), Arguments.of(ImmutableCloudAsyncJob.builder() + .state(JobState.POLLING) + .build(), + AsyncExecutionState.RUNNING), Arguments.of( + ImmutableCloudAsyncJob.builder() + .state(JobState.PROCESSING) + .build(), AsyncExecutionState.RUNNING)); } @ParameterizedTest diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBrokersOperationsExecutionTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBrokersOperationsExecutionTest.java index f9a45aa4ab..94760131fd 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBrokersOperationsExecutionTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceBrokersOperationsExecutionTest.java @@ -1,20 +1,19 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.when; - import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; import org.cloudfoundry.client.v3.jobs.JobState; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudAsyncJob; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudAsyncJob; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; class PollServiceBrokersOperationsExecutionTest extends AsyncStepOperationTest { @@ -22,20 +21,16 @@ class PollServiceBrokersOperationsExecutionTest extends AsyncStepOperationTest testPollStateExecution() { return Stream.of( - // (1) All brokers were deleted successfully - Arguments.of(List.of(new StepInput("broker1", "1", JobState.COMPLETE), - new StepInput("broker2", "2", JobState.COMPLETE)), - null, AsyncExecutionState.FINISHED), - // (2) 1 of 3 brokers were deleted - Arguments.of(List.of(new StepInput("broker1", "1", JobState.POLLING), - new StepInput("broker2", "2", JobState.COMPLETE), - new StepInput("broker3", "3", JobState.PROCESSING)), - Map.of("broker1", "1", "broker3", "3"), AsyncExecutionState.RUNNING), - // (3) 1 of 3 brokers deletion failed - Arguments.of(List.of(new StepInput("broker1", "1", JobState.FAILED), - new StepInput("broker2", "2", JobState.COMPLETE), - new StepInput("broker3", "3", JobState.PROCESSING)), - null, AsyncExecutionState.ERROR)); + // (1) All brokers were deleted successfully + Arguments.of(List.of(new StepInput("broker1", "1", JobState.COMPLETE), new StepInput("broker2", "2", JobState.COMPLETE)), null, + AsyncExecutionState.FINISHED), + // (2) 1 of 3 brokers were deleted + Arguments.of(List.of(new StepInput("broker1", "1", JobState.POLLING), new StepInput("broker2", "2", JobState.COMPLETE), + new StepInput("broker3", "3", JobState.PROCESSING)), Map.of("broker1", "1", "broker3", "3"), + AsyncExecutionState.RUNNING), + // (3) 1 of 3 brokers deletion failed + Arguments.of(List.of(new StepInput("broker1", "1", JobState.FAILED), new StepInput("broker2", "2", JobState.COMPLETE), + new StepInput("broker3", "3", JobState.PROCESSING)), null, AsyncExecutionState.ERROR)); } @ParameterizedTest @@ -58,7 +53,8 @@ private void initializeParameters(List stepInput) { context.setVariable(Variables.SERVICE_BROKER_NAMES_JOB_IDS, serviceBrokerNamesJobIds); stepInput.forEach(serviceBroker -> when(client.getAsyncJob(serviceBroker.jobId)).thenReturn(ImmutableCloudAsyncJob.builder() - .state(serviceBroker.jobState) + .state( + serviceBroker.jobState) .build())); } diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceInProgressOperationsExecutionTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceInProgressOperationsExecutionTest.java index 58318ed4a7..e44d08242b 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceInProgressOperationsExecutionTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceInProgressOperationsExecutionTest.java @@ -8,9 +8,9 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.util.ServiceOperationGetter; @@ -125,10 +125,8 @@ private void prepareServiceOperationGetter(List se ServiceOperation.Type serviceOperationType = servicesOperationTypes.get(i); ServiceOperation.State serviceOperationState = servicesOperationStates.get(i); if (serviceOperationType != null && serviceOperationState != null) { - when(serviceOperationGetter.getLastServiceOperation(any(), - eq(service))).thenReturn(new ServiceOperation(serviceOperationType, - "", - serviceOperationState)); + when(serviceOperationGetter.getLastServiceOperation(any(), eq(service))).thenReturn( + new ServiceOperation(serviceOperationType, "", serviceOperationState)); } } } diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyCreationOperationExecutionTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyCreationOperationExecutionTest.java index 2186fdde60..a3b563ae2c 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyCreationOperationExecutionTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyCreationOperationExecutionTest.java @@ -1,13 +1,13 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.when; - import java.util.List; import java.util.UUID; import java.util.stream.Stream; import org.cloudfoundry.client.v3.jobs.JobState; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudAsyncJob; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudAsyncJob; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.variables.Variables; @@ -16,9 +16,8 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import com.sap.cloudfoundry.client.facade.domain.CloudAsyncJob; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudAsyncJob; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; class PollServiceKeyCreationOperationExecutionTest extends AsyncStepOperationTest { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyLastOperationExecutionTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyLastOperationExecutionTest.java index 692187f441..d501342ea3 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyLastOperationExecutionTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyLastOperationExecutionTest.java @@ -1,12 +1,14 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.when; - import java.util.List; import java.util.UUID; import java.util.stream.Stream; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableServiceCredentialBindingOperation; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.variables.Variables; @@ -15,11 +17,8 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ImmutableServiceCredentialBindingOperation; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; class PollServiceKeyLastOperationExecutionTest extends AsyncStepOperationTest { @@ -73,7 +72,8 @@ private CloudServiceKey buildCloudServiceKey(ServiceCredentialBindingOperation.S .metadata(ImmutableCloudMetadata.of(SERVICE_KEY_GUID)) .serviceInstance(buildCloudServiceInstance(isServiceOptional)) .serviceKeyOperation(ImmutableServiceCredentialBindingOperation.builder() - .type(ServiceCredentialBindingOperation.Type.CREATE) + .type( + ServiceCredentialBindingOperation.Type.CREATE) .state(serviceKeyState) .build()) .build(); diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyLastOperationFailSafeExecutionTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyLastOperationFailSafeExecutionTest.java index 1a6c7ef7f0..8682c5cf17 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyLastOperationFailSafeExecutionTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceKeyLastOperationFailSafeExecutionTest.java @@ -1,21 +1,20 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.when; - import java.util.List; import java.util.UUID; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableServiceCredentialBindingOperation; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.junit.jupiter.api.Test; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ImmutableServiceCredentialBindingOperation; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; class PollServiceKeyLastOperationFailSafeExecutionTest extends AsyncStepOperationTest { @@ -41,7 +40,8 @@ private CloudServiceKey buildCloudServiceKey(ServiceCredentialBindingOperation.S .metadata(ImmutableCloudMetadata.of(SERVICE_KEY_GUID)) .serviceInstance(buildCloudServiceInstance()) .serviceKeyOperation(ImmutableServiceCredentialBindingOperation.builder() - .type(ServiceCredentialBindingOperation.Type.CREATE) + .type( + ServiceCredentialBindingOperation.Type.CREATE) .state(serviceKeyState) .build()) .build(); diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceOperationsStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceOperationsStepTest.java index 38d84116e6..e6e79457eb 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceOperationsStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceOperationsStepTest.java @@ -7,10 +7,10 @@ import java.util.function.Supplier; import java.util.stream.Stream; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.common.test.TestUtil; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.util.ServiceOperationGetter; diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceUnbindingOperationExecutionTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceUnbindingOperationExecutionTest.java index 45144f4017..f80ba24287 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceUnbindingOperationExecutionTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceUnbindingOperationExecutionTest.java @@ -1,18 +1,17 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.when; - import java.util.List; import java.util.UUID; import org.cloudfoundry.client.v3.jobs.JobState; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudAsyncJob; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudAsyncJob; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.junit.jupiter.api.Test; -import com.sap.cloudfoundry.client.facade.domain.CloudAsyncJob; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudAsyncJob; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; class PollServiceUnbindingOperationExecutionTest extends AsyncStepOperationTest { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollStageAppStatusExecutionTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollStageAppStatusExecutionTest.java index f825a26800..8b9e20bee9 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollStageAppStatusExecutionTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollStageAppStatusExecutionTest.java @@ -4,9 +4,9 @@ import java.util.UUID; import java.util.stream.Stream; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.PackageState; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.PackageState; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientFactory; diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartAppExecutionWithRollbackExecutionTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartAppExecutionWithRollbackExecutionTest.java index a3bff40c6e..bd62acde54 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartAppExecutionWithRollbackExecutionTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartAppExecutionWithRollbackExecutionTest.java @@ -1,15 +1,15 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.cloudfoundry.multiapps.controller.process.steps.StepsTestUtil.testIfEnabledOrDisabledAutoscaler; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - import java.util.List; import java.util.UUID; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableInstanceInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableInstancesInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstanceInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstanceState; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstancesInfo; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientFactory; @@ -22,13 +22,12 @@ import org.junit.jupiter.api.Test; import org.mockito.Mockito; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableInstanceInfo; -import com.sap.cloudfoundry.client.facade.domain.ImmutableInstancesInfo; -import com.sap.cloudfoundry.client.facade.domain.InstanceInfo; -import com.sap.cloudfoundry.client.facade.domain.InstanceState; -import com.sap.cloudfoundry.client.facade.domain.InstancesInfo; +import static org.cloudfoundry.multiapps.controller.process.steps.StepsTestUtil.testIfEnabledOrDisabledAutoscaler; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; class PollStartAppExecutionWithRollbackExecutionTest extends AsyncStepOperationTest { @@ -136,7 +135,8 @@ private void executeOnSuccess(CloudApplicationExtended cloudApplicationExtended) context.setVariable(Variables.INCREMENTAL_APP_INSTANCE_UPDATE_CONFIGURATION, updateConfig); step.initializeStepLogger(execution); ProcessContext wrapper = step.createProcessContext(execution); - PollStartAppExecutionWithRollbackExecution asyncExecution = (PollStartAppExecutionWithRollbackExecution) getAsyncOperations(wrapper).get(0); + PollStartAppExecutionWithRollbackExecution asyncExecution = (PollStartAppExecutionWithRollbackExecution) getAsyncOperations( + wrapper).get(0); asyncExecution.onSuccess(wrapper, "App started"); } diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartAppStatusExecutionTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartAppStatusExecutionTest.java index 457048ee5c..0422dd1687 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartAppStatusExecutionTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartAppStatusExecutionTest.java @@ -8,13 +8,13 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableInstanceInfo; -import com.sap.cloudfoundry.client.facade.domain.ImmutableInstancesInfo; -import com.sap.cloudfoundry.client.facade.domain.InstanceInfo; -import com.sap.cloudfoundry.client.facade.domain.InstanceState; -import com.sap.cloudfoundry.client.facade.domain.InstancesInfo; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableInstanceInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableInstancesInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstanceInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstanceState; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstancesInfo; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientFactory; diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartLiveAppExecutionTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartLiveAppExecutionTest.java index 91d641de23..9e321293e1 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartLiveAppExecutionTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartLiveAppExecutionTest.java @@ -1,13 +1,10 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.when; - import java.util.List; import java.util.UUID; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientFactory; @@ -23,7 +20,9 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.when; class PollStartLiveAppExecutionTest { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollUploadAppStatusExecutionTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollUploadAppStatusExecutionTest.java index f894b75b17..77780c5ff0 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollUploadAppStatusExecutionTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollUploadAppStatusExecutionTest.java @@ -1,14 +1,18 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.Mockito.when; - import java.util.List; import java.util.UUID; import java.util.stream.Stream; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableDockerData; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableErrorDetails; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableUpload; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Status; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Upload; import org.cloudfoundry.multiapps.controller.process.steps.ScaleAppStepTest.SimpleApplication; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.junit.jupiter.params.ParameterizedTest; @@ -16,19 +20,15 @@ import org.junit.jupiter.params.provider.MethodSource; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudPackage; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudPackage; -import com.sap.cloudfoundry.client.facade.domain.ImmutableDockerData; -import com.sap.cloudfoundry.client.facade.domain.ImmutableErrorDetails; -import com.sap.cloudfoundry.client.facade.domain.ImmutableUpload; -import com.sap.cloudfoundry.client.facade.domain.Status; -import com.sap.cloudfoundry.client.facade.domain.Upload; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.when; class PollUploadAppStatusExecutionTest extends AsyncStepOperationTest { - private static final CloudOperationException CLOUD_OPERATION_EXCEPTION_BAD_REQUEST = new CloudOperationException(HttpStatus.BAD_REQUEST); + private static final CloudOperationException CLOUD_OPERATION_EXCEPTION_BAD_REQUEST = new CloudOperationException( + HttpStatus.BAD_REQUEST); private static final CloudOperationException CLOUD_OPERATION_EXCEPTION_NOT_FOUND = new CloudOperationException(HttpStatus.NOT_FOUND); private static final UUID PACKAGE_GUID = UUID.fromString("20886182-1802-11e9-ab14-d663bd873d93"); private static final String APP_NAME = "test-app-1"; @@ -38,7 +38,7 @@ class PollUploadAppStatusExecutionTest extends AsyncStepOperationTest testPollStatus() { return Stream.of( -// @formatter:off + // @formatter:off // (00) The previous step used asynchronous upload but getting the upload progress fails with an exception: Arguments.of(null, null, CLOUD_OPERATION_EXCEPTION_BAD_REQUEST), // (01) The previous step used asynchronous upload and it finished successfully: diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PrepareApplicationForBackupStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PrepareApplicationForBackupStepTest.java index ae933f79b1..ee1671799e 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PrepareApplicationForBackupStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PrepareApplicationForBackupStepTest.java @@ -1,11 +1,10 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.mockito.Mockito.verify; - import java.util.UUID; import java.util.stream.Stream; import org.cloudfoundry.client.v3.Metadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadataAnnotations; @@ -16,24 +15,24 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; +import static org.mockito.Mockito.verify; class PrepareApplicationForBackupStepTest extends SyncFlowableStepTest { private static Stream testStep() { return Stream.of( - // (1) Rename standard app name with system namespace - Arguments.of("test-app", null, "mta-backup-test-app", "mta-backup"), - // (2) Rename app name with non idle suffix and add system namespace prefix - Arguments.of("test-app-idle", null, "mta-backup-test-app", "mta-backup"), - // (3) Reanme app name with blue suffix without any blue/green suffixes and add system namespace - Arguments.of("test-app-blue", null, "mta-backup-test-app", "mta-backup"), - // (4) Reanme app name with green suffix without any blue/green suffixes and add system namespace - Arguments.of("test-app-green", null, "mta-backup-test-app", "mta-backup"), - // (5) Rename app with namespace prefix to system+user namespace - Arguments.of("dev-web-app", "dev", "mta-backup-dev-web-app", "mta-backup-dev"), - // (6) Rename app with namespace prefix and blue suffix to system+user namespace only - Arguments.of("prod-web-app-blue", "prod", "mta-backup-prod-web-app", "mta-backup-prod")); + // (1) Rename standard app name with system namespace + Arguments.of("test-app", null, "mta-backup-test-app", "mta-backup"), + // (2) Rename app name with non idle suffix and add system namespace prefix + Arguments.of("test-app-idle", null, "mta-backup-test-app", "mta-backup"), + // (3) Reanme app name with blue suffix without any blue/green suffixes and add system namespace + Arguments.of("test-app-blue", null, "mta-backup-test-app", "mta-backup"), + // (4) Reanme app name with green suffix without any blue/green suffixes and add system namespace + Arguments.of("test-app-green", null, "mta-backup-test-app", "mta-backup"), + // (5) Rename app with namespace prefix to system+user namespace + Arguments.of("dev-web-app", "dev", "mta-backup-dev-web-app", "mta-backup-dev"), + // (6) Rename app with namespace prefix and blue suffix to system+user namespace only + Arguments.of("prod-web-app-blue", "prod", "mta-backup-prod-web-app", "mta-backup-prod")); } @ParameterizedTest diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PrepareToExecuteTasksStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PrepareToExecuteTasksStepTest.java index c09b81b308..12b1b75ea7 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PrepareToExecuteTasksStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PrepareToExecuteTasksStepTest.java @@ -1,17 +1,16 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; - import java.util.ArrayList; import java.util.List; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudTask; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudTask; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.junit.jupiter.api.Test; -import com.sap.cloudfoundry.client.facade.domain.CloudTask; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudTask; +import static org.junit.jupiter.api.Assertions.assertEquals; class PrepareToExecuteTasksStepTest extends SyncFlowableStepTest { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PublishConfigurationEntriesStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PublishConfigurationEntriesStepTest.java index b36d67f658..70ba663e9a 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PublishConfigurationEntriesStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PublishConfigurationEntriesStepTest.java @@ -1,18 +1,15 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.fail; -import static org.mockito.AdditionalAnswers.returnsFirstArg; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.when; - import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.stream.Stream; +import com.fasterxml.jackson.core.type.TypeReference; import org.apache.commons.collections4.CollectionUtils; import org.cloudfoundry.multiapps.common.test.TestUtil; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudMetadata; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.test.MockBuilder; @@ -30,8 +27,10 @@ import org.mockito.Mock; import org.mockito.Mockito; -import com.fasterxml.jackson.core.type.TypeReference; -import com.sap.cloudfoundry.client.facade.domain.CloudMetadata; +import static org.junit.jupiter.api.Assertions.fail; +import static org.mockito.AdditionalAnswers.returnsFirstArg; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.when; class PublishConfigurationEntriesStepTest extends SyncFlowableStepTest { @@ -54,7 +53,7 @@ private static class StepInput { public static Stream test() { return Stream.of( -// @formatter:off + // @formatter:off Arguments.of("publish-configuration-entries-step-input-1.json"), Arguments.of("publish-configuration-entries-step-input-2.json"), Arguments.of("publish-configuration-entries-step-input-3.json"), @@ -65,10 +64,9 @@ public static Stream test() { @BeforeAll public static void loadConfigurationEntries() { - existingConfigurationEntries = JsonUtil.fromJson(TestUtil.getResourceAsString("configuration-entries.json", - PublishConfigurationEntriesStepTest.class), - new TypeReference<>() { - }); + existingConfigurationEntries = JsonUtil.fromJson( + TestUtil.getResourceAsString("configuration-entries.json", PublishConfigurationEntriesStepTest.class), new TypeReference<>() { + }); } @ParameterizedTest @@ -95,19 +93,24 @@ public void initializeParameters(StepInput input) { public void prepareConfigurationEntryService() { when(configurationEntryService.createQuery()).thenReturn(configurationEntryQuery); for (ConfigurationEntry entry : existingConfigurationEntries) { - ConfigurationEntryQuery entryQueryMock = new MockBuilder<>(configurationEntryQuery).on(query -> query.providerNid(entry.getProviderNid())) - .on(query -> query.providerId(entry.getProviderId())) - .on(query -> query.version(entry.getProviderVersion() - .toString())) - .on(query -> query.target(Mockito.eq(entry.getTargetSpace()))) + ConfigurationEntryQuery entryQueryMock = new MockBuilder<>(configurationEntryQuery).on( + query -> query.providerNid(entry.getProviderNid())) + .on(query -> query.providerId( + entry.getProviderId())) + .on(query -> query.version( + entry.getProviderVersion() + .toString())) + .on(query -> query.target( + Mockito.eq(entry.getTargetSpace()))) .build(); doReturn(List.of(entry)).when(entryQueryMock) - .list(); + .list(); } } private void prapareDynamicParameterResolver(StepInput input) { - when(dynamicParameterResolver.resolveDynamicParametersOfConfigurationEntries(Mockito.anyList(), Mockito.anySet())).then(returnsFirstArg()); + when(dynamicParameterResolver.resolveDynamicParametersOfConfigurationEntries(Mockito.anyList(), Mockito.anySet())).then( + returnsFirstArg()); } private void prepareContext(StepInput input) { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/RemoveMtaBackupMetadataStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/RemoveMtaBackupMetadataStepTest.java index 56c8818b6c..3d67e6d51f 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/RemoveMtaBackupMetadataStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/RemoveMtaBackupMetadataStepTest.java @@ -1,10 +1,9 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.mockito.Mockito.verify; - import java.util.UUID; import org.cloudfoundry.client.v3.Metadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; import org.cloudfoundry.multiapps.controller.core.cf.metadata.ImmutableMtaMetadata; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadataAnnotations; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadataLabels; @@ -17,7 +16,7 @@ import org.cloudfoundry.multiapps.mta.model.Version; import org.junit.jupiter.api.Test; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; +import static org.mockito.Mockito.verify; class RemoveMtaBackupMetadataStepTest extends SyncFlowableStepTest { @@ -64,10 +63,12 @@ private DeployedMta createBackupMta(String namespace) { .moduleName(MODULE_NAME) .name(BACKUP_APP_NAME) .v3Metadata(Metadata.builder() - .label(MtaMetadataLabels.MTA_NAMESPACE, - namespace) - .annotation(MtaMetadataAnnotations.MTA_NAMESPACE, - namespace) + .label( + MtaMetadataLabels.MTA_NAMESPACE, + namespace) + .annotation( + MtaMetadataAnnotations.MTA_NAMESPACE, + namespace) .build()) .productizationState(ProductizationState.LIVE) .metadata(ImmutableCloudMetadata.builder() diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/RestartAppStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/RestartAppStepTest.java index e435b5ed4d..bf11e8a005 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/RestartAppStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/RestartAppStepTest.java @@ -1,13 +1,10 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; - import java.time.Duration; import java.util.List; import org.cloudfoundry.multiapps.controller.api.model.ProcessType; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.metadata.processor.MtaMetadataParser; @@ -27,7 +24,9 @@ import org.mockito.Mock; import org.mockito.Mockito; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication.State; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; class RestartAppStepTest extends SyncFlowableStepTest { @@ -46,7 +45,7 @@ class RestartAppStepTest extends SyncFlowableStepTest { @Test void testExecuteWhenAppIsStopped() { when(processTypeParser.getProcessType(context.getExecution())).thenReturn(ProcessType.DEPLOY); - CloudApplicationExtended app = createApplication(APP_NAME, State.STOPPED); + CloudApplicationExtended app = createApplication(APP_NAME, CloudApplication.State.STOPPED); prepareContextAndClient(app); step.execute(execution); assertStepFinishedSuccessfully(); @@ -65,7 +64,7 @@ protected void assertStepFinishedSuccessfully() { @Test void testExecuteWhenAppIsStarted() { when(processTypeParser.getProcessType(context.getExecution())).thenReturn(ProcessType.DEPLOY); - CloudApplicationExtended app = createApplication(APP_NAME, State.STARTED); + CloudApplicationExtended app = createApplication(APP_NAME, CloudApplication.State.STARTED); prepareContextAndClient(app); step.execute(execution); assertStepFinishedSuccessfully(); @@ -78,14 +77,14 @@ void testExecuteWhenAppIsStarted() { @Test void testGetHookPhasesBeforeStep() { - when(hooksPhaseBuilder.buildHookPhases(List.of(HookPhase.BEFORE_START), - context)).thenReturn(List.of(HookPhase.BLUE_GREEN_APPLICATION_BEFORE_START_LIVE)); + when(hooksPhaseBuilder.buildHookPhases(List.of(HookPhase.BEFORE_START), context)).thenReturn( + List.of(HookPhase.BLUE_GREEN_APPLICATION_BEFORE_START_LIVE)); List expectedHooks = List.of(HookPhase.BLUE_GREEN_APPLICATION_BEFORE_START_LIVE); List hookPhasesBeforeStep = step.getHookPhasesBeforeStep(context); assertEquals(expectedHooks, hookPhasesBeforeStep); } - private CloudApplicationExtended createApplication(String name, State state) { + private CloudApplicationExtended createApplication(String name, CloudApplication.State state) { return ImmutableCloudApplicationExtended.builder() .name(name) .state(state) @@ -120,8 +119,8 @@ void testGetTimeoutWhenHooksAreBeingExecuted() { .getDefaultValue()); context.setVariable(TimeoutType.TASK.getProcessVariable(), TimeoutType.TASK.getProcessVariable() .getDefaultValue()); - when(hooksPhaseGetter.getHookPhasesBeforeStop(any(), - any())).thenReturn(List.of(HookPhase.BLUE_GREEN_APPLICATION_BEFORE_START_LIVE)); + when(hooksPhaseGetter.getHookPhasesBeforeStop(any(), any())).thenReturn( + List.of(HookPhase.BLUE_GREEN_APPLICATION_BEFORE_START_LIVE)); Duration timeout = step.getTimeout(context); assertEquals(Variables.APPS_TASK_EXECUTION_TIMEOUT_PROCESS_VARIABLE.getDefaultValue(), timeout); } diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/RestartSubscribersStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/RestartSubscribersStepTest.java index bb8307b367..9c0f5a86f1 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/RestartSubscribersStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/RestartSubscribersStepTest.java @@ -5,13 +5,13 @@ import java.util.List; import java.util.UUID; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudSpace; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudOrganization; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudOrganization; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudSpace; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.junit.jupiter.api.Test; diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/ScaleAppStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/ScaleAppStepTest.java index e9c6c7430c..df8ff2463b 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/ScaleAppStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/ScaleAppStepTest.java @@ -1,11 +1,12 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.mockito.ArgumentMatchers.any; - import java.util.Collections; import java.util.UUID; import java.util.stream.Stream; +import org.cloudfoundry.multiapps.controller.client.facade.domain.HealthCheckType; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudProcess; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.process.variables.Variables; @@ -14,15 +15,13 @@ import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Mockito; -import com.sap.cloudfoundry.client.facade.domain.HealthCheckType; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudProcess; +import static org.mockito.ArgumentMatchers.any; class ScaleAppStepTest extends SyncFlowableStepTest { public static Stream testExecute() { return Stream.of( - // @formatter:off + // @formatter:off Arguments.of(new SimpleApplication("test-app-1", 2), new SimpleApplication("test-app-1", 3)), Arguments.of(new SimpleApplication("test-app-1", 2), new SimpleApplication("test-app-1", 2)), Arguments.of(new SimpleApplication("test-app-1", 2), null), diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/StageAppStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/StageAppStepTest.java index 810a922e81..046c210668 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/StageAppStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/StageAppStepTest.java @@ -1,13 +1,16 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.any; - import java.text.MessageFormat; import java.time.Duration; import java.util.List; import java.util.UUID; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudBuild; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableDockerData; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.model.SupportedParameters; import org.cloudfoundry.multiapps.controller.process.Messages; @@ -18,12 +21,8 @@ import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Mockito; -import com.sap.cloudfoundry.client.facade.domain.CloudBuild; -import com.sap.cloudfoundry.client.facade.domain.CloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.CloudPackage; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudPackage; -import com.sap.cloudfoundry.client.facade.domain.ImmutableDockerData; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; class StageAppStepTest extends SyncFlowableStepTest { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/StepsTestUtil.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/StepsTestUtil.java index cbe77badc7..53e1e33fb0 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/StepsTestUtil.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/StepsTestUtil.java @@ -3,10 +3,10 @@ import java.util.List; import java.util.UUID; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; import org.cloudfoundry.client.v3.Metadata; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadataLabels; import org.cloudfoundry.multiapps.controller.process.variables.Variables; diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/StepsUtilTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/StepsUtilTest.java index d5a46103f6..bf90085cee 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/StepsUtilTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/StepsUtilTest.java @@ -1,14 +1,15 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; - import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableDockerData; import org.cloudfoundry.multiapps.controller.client.lib.domain.BindingDetails; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; @@ -23,10 +24,8 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import com.sap.cloudfoundry.client.facade.domain.CloudPackage; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudPackage; -import com.sap.cloudfoundry.client.facade.domain.ImmutableDockerData; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; class StepsUtilTest { @@ -123,7 +122,8 @@ void testGetAppsToDeployWithBindingParameters() { @Test void testSetAndGetCloudPackage() { CloudPackage expectedCloudPackage = ImmutableCloudPackage.builder() - .metadata(ImmutableCloudMetadata.of(UUID.fromString("ab0703c2-1a50-11e9-ab14-d663bd873d93"))) + .metadata(ImmutableCloudMetadata.of( + UUID.fromString("ab0703c2-1a50-11e9-ab14-d663bd873d93"))) .type(CloudPackage.Type.DOCKER) .data(ImmutableDockerData.builder() .image("cloudfoundry/test") diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/StopAppStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/StopAppStepTest.java index 4a2cc12e0d..48c26d2867 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/StopAppStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/StopAppStepTest.java @@ -1,11 +1,10 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; - import java.util.List; import java.util.stream.Stream; import org.cloudfoundry.multiapps.controller.api.model.ProcessType; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.metadata.processor.MtaMetadataParser; @@ -24,7 +23,7 @@ import org.mockito.Mock; import org.mockito.Mockito; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication.State; +import static org.junit.jupiter.api.Assertions.assertEquals; class StopAppStepTest extends SyncFlowableStepTest { @@ -47,14 +46,14 @@ class StopAppStepTest extends SyncFlowableStepTest { private boolean shouldBeStopped; static Stream testExecute() { - return Stream.of(Arguments.of(new SimpleApplicationWithState("test-app-1", 0, State.STARTED), - new SimpleApplicationWithState("test-app-1", 0, State.STARTED)), - Arguments.of(new SimpleApplicationWithState("test-app-1", 0, State.STARTED), - new SimpleApplicationWithState("test-app-1", 0, State.STOPPED)), - Arguments.of(new SimpleApplicationWithState("test-app-1", 0, State.STOPPED), - new SimpleApplicationWithState("test-app-1", 0, State.STOPPED)), - Arguments.of(new SimpleApplicationWithState("test-app-1", 0, State.STOPPED), - new SimpleApplicationWithState("test-app-1", 0, State.STARTED))); + return Stream.of(Arguments.of(new SimpleApplicationWithState("test-app-1", 0, CloudApplication.State.STARTED), + new SimpleApplicationWithState("test-app-1", 0, CloudApplication.State.STARTED)), + Arguments.of(new SimpleApplicationWithState("test-app-1", 0, CloudApplication.State.STARTED), + new SimpleApplicationWithState("test-app-1", 0, CloudApplication.State.STOPPED)), + Arguments.of(new SimpleApplicationWithState("test-app-1", 0, CloudApplication.State.STOPPED), + new SimpleApplicationWithState("test-app-1", 0, CloudApplication.State.STOPPED)), + Arguments.of(new SimpleApplicationWithState("test-app-1", 0, CloudApplication.State.STOPPED), + new SimpleApplicationWithState("test-app-1", 0, CloudApplication.State.STARTED))); } @MethodSource @@ -75,7 +74,7 @@ void testExecute(SimpleApplicationWithState application, SimpleApplicationWithSt } private void determineActionForApplication() { - shouldBeStopped = existingApplication.state != State.STOPPED; + shouldBeStopped = existingApplication.state != CloudApplication.State.STOPPED; } private void prepareContext() { @@ -145,9 +144,9 @@ protected StopAppStep createStep() { } private static class SimpleApplicationWithState extends SimpleApplication { - final State state; + final CloudApplication.State state; - public SimpleApplicationWithState(String name, int instances, State state) { + public SimpleApplicationWithState(String name, int instances, CloudApplication.State state) { super(name, instances); this.state = state; } diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/StopApplicationUndeploymentStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/StopApplicationUndeploymentStepTest.java index 130fbfb301..a879cb776b 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/StopApplicationUndeploymentStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/StopApplicationUndeploymentStepTest.java @@ -1,10 +1,8 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.verify; - import java.util.List; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; import org.cloudfoundry.multiapps.controller.core.cf.metadata.processor.MtaMetadataParser; import org.cloudfoundry.multiapps.controller.core.model.HookPhase; import org.cloudfoundry.multiapps.controller.process.util.ApplicationWaitAfterStopHandler; @@ -14,7 +12,8 @@ import org.mockito.Mock; import org.mockito.Mockito; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.verify; class StopApplicationUndeploymentStepTest extends UndeployAppStepTest { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/SyncFlowableStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/SyncFlowableStepTest.java index 17ce837940..02bd20c43f 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/SyncFlowableStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/SyncFlowableStepTest.java @@ -8,10 +8,10 @@ import java.util.UUID; import java.util.stream.Stream; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; import org.cloudfoundry.client.v3.Metadata; import org.cloudfoundry.multiapps.common.test.Tester; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/TestData.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/TestData.java index b0ce6cd5c9..9e9d5b0b3e 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/TestData.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/TestData.java @@ -5,12 +5,11 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudDomain; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudRoute; import org.cloudfoundry.multiapps.controller.core.util.ApplicationURI; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudDomain; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudRoute; - // TODO: this class repeats code from test class org.cloudfoundry.multiapps.controller.core.util.TestData; remove if we refactor core module and stplit ApplicationUri out of it public class TestData { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UnbindServiceStepFromApplicationTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UnbindServiceStepFromApplicationTest.java index b186dc5e0e..16a249cfa1 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UnbindServiceStepFromApplicationTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UnbindServiceStepFromApplicationTest.java @@ -1,14 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - import java.text.MessageFormat; import java.time.LocalDateTime; import java.util.List; @@ -16,6 +7,14 @@ import java.util.UUID; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.ApplicationServicesUpdateCallback; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableServiceCredentialBindingOperation; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; @@ -25,14 +24,14 @@ import org.junit.jupiter.api.Test; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.ApplicationServicesUpdateCallback; -import com.sap.cloudfoundry.client.facade.CloudControllerException; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceBinding; -import com.sap.cloudfoundry.client.facade.domain.ImmutableServiceCredentialBindingOperation; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; class UnbindServiceStepFromApplicationTest extends SyncFlowableStepTest { @@ -66,9 +65,9 @@ void testAsyncServiceUnbindingWithPollingByLastOperation() { prepareContext(); when(client.unbindServiceInstance(eq(APPLICATION_NAME), eq(SERVICE_NAME), any(ApplicationServicesUpdateCallback.class))).then(answer -> { - context.setVariable(Variables.USE_LAST_OPERATION_FOR_SERVICE_BINDING_DELETION, true); - return Optional.empty(); - }); + context.setVariable(Variables.USE_LAST_OPERATION_FOR_SERVICE_BINDING_DELETION, true); + return Optional.empty(); + }); step.execute(execution); assertEquals(StepPhase.POLL.toString(), getExecutionStatus()); verify(client).unbindServiceInstance(eq(APPLICATION_NAME), eq(SERVICE_NAME), any(ApplicationServicesUpdateCallback.class)); @@ -180,10 +179,14 @@ private CloudServiceBinding buildCloudServiceBinding() { .serviceInstanceGuid(SERVICE_INSTANCE_GUID) .applicationGuid(APP_GUID) .serviceBindingOperation(ImmutableServiceCredentialBindingOperation.builder() - .type(ServiceCredentialBindingOperation.Type.CREATE) - .state(ServiceCredentialBindingOperation.State.IN_PROGRESS) - .createdAt(LocalDateTime.now()) - .updatedAt(LocalDateTime.now()) + .type( + ServiceCredentialBindingOperation.Type.CREATE) + .state( + ServiceCredentialBindingOperation.State.IN_PROGRESS) + .createdAt( + LocalDateTime.now()) + .updatedAt( + LocalDateTime.now()) .build()) .build(); } diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UndeployAppStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UndeployAppStepTest.java index f0bf89d729..eccbd046a1 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UndeployAppStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UndeployAppStepTest.java @@ -1,8 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; - import java.util.Collections; import java.util.List; import java.util.Map; @@ -13,12 +10,16 @@ import org.cloudfoundry.multiapps.common.test.TestUtil; import org.cloudfoundry.multiapps.common.util.JsonUtil; import org.cloudfoundry.multiapps.common.util.ListUtil; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudTask; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudRouteExtended; -import org.cloudfoundry.multiapps.controller.client.lib.domain.ServiceRouteBinding; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudRouteExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableServiceRouteBinding; +import org.cloudfoundry.multiapps.controller.client.lib.domain.ServiceRouteBinding; import org.cloudfoundry.multiapps.controller.core.cf.clients.ServiceInstanceRoutesGetter; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.junit.jupiter.params.ParameterizedTest; @@ -27,152 +28,153 @@ import org.mockito.Mock; import org.mockito.Mockito; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudTask; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; abstract class UndeployAppStepTest extends SyncFlowableStepTest { - @Mock - protected ServiceInstanceRoutesGetter serviceInstanceRoutesGetter; + @Mock + protected ServiceInstanceRoutesGetter serviceInstanceRoutesGetter; - protected StepInput stepInput; - protected StepOutput stepOutput; + protected StepInput stepInput; + protected StepOutput stepOutput; - static Stream testExecution() { + static Stream testExecution() { return Stream.of( - // (1) There are applications to undeploy: - Arguments.of("undeploy-apps-step-input-00.json", "undeploy-apps-step-output-00.json"), + // (1) There are applications to undeploy: + Arguments.of("undeploy-apps-step-input-00.json", "undeploy-apps-step-output-00.json"), + + // (2) No applications to undeploy: + Arguments.of("undeploy-apps-step-input-02.json", "undeploy-apps-step-output-02.json"), + + // (3) There are two routes that should be deleted, but one of them is bound to another application: + Arguments.of("undeploy-apps-step-input-03.json", "undeploy-apps-step-output-03.json"), + + // (4) There are running one-off tasks to cancel: + Arguments.of("undeploy-apps-step-input-04.json", "undeploy-apps-step-output-04.json"), + + // (5) There are not found routes matching app uri: + Arguments.of("undeploy-apps-step-input-05.json", "undeploy-apps-step-output-05.json"), + + // (6) There is a route that should be deleted, but it is bound to a service instance: + Arguments.of("undeploy-apps-step-input-06.json", "undeploy-apps-step-output-06.json"), + + // (7) All routes should be deleted; routes have no hostnames: + Arguments.of("undeploy-apps-step-input-07.json", "undeploy-apps-step-output-07.json")); + } + + @ParameterizedTest + @MethodSource + void testExecution(String stepInputLocation, String stepOutputLocation) throws Exception { + initializeParameters(stepInputLocation, stepOutputLocation); + for (CloudApplicationExtended cloudApplication : stepInput.appsToDelete) { + undeployApp(cloudApplication); + } + + performAfterUndeploymentValidation(); + } + + private void initializeParameters(String stepInputLocation, String stepOutputLocation) { + String resourceAsString = TestUtil.getResourceAsString(stepInputLocation, UndeployAppStepTest.class); + stepInput = JsonUtil.fromJson(resourceAsString, StepInput.class); + stepOutput = JsonUtil.fromJson(TestUtil.getResourceAsString(stepOutputLocation, UndeployAppStepTest.class), + StepOutput.class); + stepInput.appsToDelete = stepInput.appsToDelete.stream() + .map(this::addGuid) + .collect(Collectors.toList()); + prepareContext(); + prepareClient(); + Mockito.when(client.getTasks(Mockito.anyString())) + .thenReturn(Collections.emptyList()); + } + + protected abstract void performAfterUndeploymentValidation(); + + private void undeployApp(CloudApplicationExtended cloudApplication) { + context.setVariable(Variables.APP_TO_PROCESS, cloudApplication); + step.execute(execution); + + assertStepFinishedSuccessfully(); + performValidation(cloudApplication); + } + + protected abstract void performValidation(CloudApplication cloudApplication); - // (2) No applications to undeploy: - Arguments.of("undeploy-apps-step-input-02.json", "undeploy-apps-step-output-02.json"), + private void prepareContext() { + context.setVariable(Variables.APPS_TO_UNDEPLOY, ListUtil.cast(stepInput.appsToDelete)); + } + + private CloudApplicationExtended addGuid(CloudApplicationExtended app) { + return ImmutableCloudApplicationExtended.copyOf(app) + .withMetadata(ImmutableCloudMetadata.of(UUID.randomUUID())); + } + + private CloudRouteExtended addGuid(CloudRouteExtended route) { + return ImmutableCloudRouteExtended.copyOf(route) + .withMetadata(ImmutableCloudMetadata.of(UUID.randomUUID())); + } - // (3) There are two routes that should be deleted, but one of them is bound to another application: - Arguments.of("undeploy-apps-step-input-03.json", "undeploy-apps-step-output-03.json"), + private void prepareClient() { + for (var app : stepInput.appsToDelete) { + var routes = stepInput.appRoutesPerApplication.getOrDefault(app.getName(), Collections.emptyList()); + routes = routes.stream() + .map(this::addGuid) + .collect(Collectors.toList()); + Mockito.when(client.getApplicationRoutes(Mockito.eq(app.getGuid()))) + .thenReturn(ListUtil.cast(routes)); + var routeGuids = routes.stream() + .map(CloudRoute::getGuid) + .map(UUID::toString) + .collect(Collectors.toList()); + for (var route : routes) { + if (!route.getBoundServiceInstanceGuids() + .isEmpty()) { + Mockito.when(serviceInstanceRoutesGetter.getServiceRouteBindings(Mockito.eq(routeGuids))) + .thenReturn(route.getBoundServiceInstanceGuids() + .stream() + .map(serviceGuid -> createRouteBinding(serviceGuid, route.getGuid())) + .collect(Collectors.toList())); + } + } + } + Mockito.when(client.getTasks(anyString())) + .thenAnswer((invocation) -> { + String appName = (String) invocation.getArguments()[0]; + return stepInput.tasksPerApplication.get(appName); + + }); + Mockito.when(client.getApplication(anyString(), any(Boolean.class))) + .thenAnswer((invocation) -> { + String appName = (String) invocation.getArguments()[0]; + return stepInput.appsToDelete.stream() + .filter(app -> app.getName() + .equals(appName)) + .findFirst() + .orElse(null); + }); + } - // (4) There are running one-off tasks to cancel: - Arguments.of("undeploy-apps-step-input-04.json", "undeploy-apps-step-output-04.json"), + private ServiceRouteBinding createRouteBinding(String serviceGuid, UUID routeGuid) { + return ImmutableServiceRouteBinding.builder() + .routeId(routeGuid.toString()) + .serviceInstanceId(serviceGuid) + .build(); + } - // (5) There are not found routes matching app uri: - Arguments.of("undeploy-apps-step-input-05.json", "undeploy-apps-step-output-05.json"), + protected static class StepInput { + protected List appsToDelete = Collections.emptyList(); + protected Map> appRoutesPerApplication = Collections.emptyMap(); + protected final Map> tasksPerApplication = Collections.emptyMap(); + } - // (6) There is a route that should be deleted, but it is bound to a service instance: - Arguments.of("undeploy-apps-step-input-06.json", "undeploy-apps-step-output-06.json"), - - // (7) All routes should be deleted; routes have no hostnames: - Arguments.of("undeploy-apps-step-input-07.json", "undeploy-apps-step-output-07.json")); + protected static class StepOutput { + protected final List expectedRoutesToDelete = Collections.emptyList(); + protected List expectedTasksToCancel = Collections.emptyList(); } - @ParameterizedTest - @MethodSource - void testExecution(String stepInputLocation, String stepOutputLocation) throws Exception { - initializeParameters(stepInputLocation, stepOutputLocation); - for (CloudApplicationExtended cloudApplication : stepInput.appsToDelete) { - undeployApp(cloudApplication); - } - - performAfterUndeploymentValidation(); - } - - private void initializeParameters(String stepInputLocation, String stepOutputLocation) { - String resourceAsString = TestUtil.getResourceAsString(stepInputLocation, UndeployAppStepTest.class); - stepInput = JsonUtil.fromJson(resourceAsString, StepInput.class); - stepOutput = JsonUtil.fromJson(TestUtil.getResourceAsString(stepOutputLocation, UndeployAppStepTest.class), - StepOutput.class); - stepInput.appsToDelete = stepInput.appsToDelete.stream() - .map(this::addGuid) - .collect(Collectors.toList()); - prepareContext(); - prepareClient(); - Mockito.when(client.getTasks(Mockito.anyString())).thenReturn(Collections.emptyList()); - } - - protected abstract void performAfterUndeploymentValidation(); - - private void undeployApp(CloudApplicationExtended cloudApplication) { - context.setVariable(Variables.APP_TO_PROCESS, cloudApplication); - step.execute(execution); - - assertStepFinishedSuccessfully(); - performValidation(cloudApplication); - } - - protected abstract void performValidation(CloudApplication cloudApplication); - - private void prepareContext() { - context.setVariable(Variables.APPS_TO_UNDEPLOY, ListUtil.cast(stepInput.appsToDelete)); - } - - private CloudApplicationExtended addGuid(CloudApplicationExtended app) { - return ImmutableCloudApplicationExtended.copyOf(app) - .withMetadata(ImmutableCloudMetadata.of(UUID.randomUUID())); - } - - private CloudRouteExtended addGuid(CloudRouteExtended route) { - return ImmutableCloudRouteExtended.copyOf(route) - .withMetadata(ImmutableCloudMetadata.of(UUID.randomUUID())); - } - - private void prepareClient() { - for (var app : stepInput.appsToDelete) { - var routes = stepInput.appRoutesPerApplication.getOrDefault(app.getName(), Collections.emptyList()); - routes = routes.stream() - .map(this::addGuid) - .collect(Collectors.toList()); - Mockito.when(client.getApplicationRoutes(Mockito.eq(app.getGuid()))) - .thenReturn(ListUtil.cast(routes)); - var routeGuids = routes.stream() - .map(CloudRoute::getGuid) - .map(UUID::toString) - .collect(Collectors.toList()); - for (var route : routes) { - if (!route.getBoundServiceInstanceGuids() - .isEmpty()) { - Mockito.when(serviceInstanceRoutesGetter.getServiceRouteBindings(Mockito.eq(routeGuids))) - .thenReturn(route.getBoundServiceInstanceGuids() - .stream() - .map(serviceGuid -> createRouteBinding(serviceGuid, route.getGuid())) - .collect(Collectors.toList())); - } - } - } - Mockito.when(client.getTasks(anyString())).thenAnswer((invocation) -> { - String appName = (String) invocation.getArguments()[0]; - return stepInput.tasksPerApplication.get(appName); - - }); - Mockito.when(client.getApplication(anyString(), any(Boolean.class))).thenAnswer((invocation) -> { - String appName = (String) invocation.getArguments()[0]; - return stepInput.appsToDelete.stream() - .filter(app -> app.getName() - .equals(appName)) - .findFirst() - .orElse(null); - }); - } - - private ServiceRouteBinding createRouteBinding(String serviceGuid, UUID routeGuid) { - return ImmutableServiceRouteBinding.builder() - .routeId(routeGuid.toString()) - .serviceInstanceId(serviceGuid) - .build(); - } - - protected static class StepInput { - protected List appsToDelete = Collections.emptyList(); - protected Map> appRoutesPerApplication = Collections.emptyMap(); - protected final Map> tasksPerApplication = Collections.emptyMap(); - } - - protected static class StepOutput { - protected final List expectedRoutesToDelete = Collections.emptyList(); - protected List expectedTasksToCancel = Collections.emptyList(); - } - - protected static class Route { - protected String host = ""; - protected String domain = ""; + protected static class Route { + protected String host = ""; + protected String domain = ""; protected String path = ""; } } diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceKeysMetadataStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceKeysMetadataStepTest.java index f7104c40c8..1533a3af32 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceKeysMetadataStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceKeysMetadataStepTest.java @@ -1,14 +1,16 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.verify; - import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.UUID; import org.cloudfoundry.client.v3.Metadata; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceKey; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadataAnnotations; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadataLabels; import org.cloudfoundry.multiapps.controller.process.Messages; @@ -17,11 +19,8 @@ import org.mockito.Mockito; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceKey; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.verify; class UpdateServiceKeysMetadataStepTest extends SyncFlowableStepTest { @@ -36,8 +35,7 @@ void testUpdateServiceMetadata() { for (var key : testKeys) { verify(client).updateServiceBindingMetadata(key.getMetadata() - .getGuid(), - key.getV3Metadata()); + .getGuid(), key.getV3Metadata()); } } @@ -49,14 +47,14 @@ void testUpdateServiceMetadataFailure() { CloudServiceKey brokenKey = testKeys.get(1); doThrow(new CloudOperationException(HttpStatus.FORBIDDEN, "Test")).when(client) .updateServiceBindingMetadata(Mockito.eq(brokenKey.getGuid()), - Mockito.eq(brokenKey.getV3Metadata())); + Mockito.eq( + brokenKey.getV3Metadata())); step.execute(execution); for (var key : testKeys) { verify(client).updateServiceBindingMetadata(key.getMetadata() - .getGuid(), - key.getV3Metadata()); + .getGuid(), key.getV3Metadata()); } verify(stepLogger).errorWithoutProgressMessage(Mockito.any(CloudOperationException.class), Mockito.eq(Messages.UPDATING_SERVICE_KEY_0_METADATA_FAILED), diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceMetadataStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceMetadataStepTest.java index 1178192605..6f2eaf2aa3 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceMetadataStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceMetadataStepTest.java @@ -1,20 +1,19 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static java.lang.Boolean.FALSE; -import static java.lang.Boolean.TRUE; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.verify; - import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; +import static java.lang.Boolean.FALSE; +import static java.lang.Boolean.TRUE; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; class UpdateServiceMetadataStepTest extends SyncFlowableStepTest { @@ -27,8 +26,7 @@ void testUpdateServiceMetadata() { step.execute(execution); verify(client).updateServiceInstanceMetadata(serviceToProcess.getMetadata() - .getGuid(), - serviceToProcess.getV3Metadata()); + .getGuid(), serviceToProcess.getV3Metadata()); } @Test diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceParametersStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceParametersStepTest.java index 0fdcfa8a4c..bb2bfbcd6d 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceParametersStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceParametersStepTest.java @@ -1,14 +1,15 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.http.HttpStatus; + import static java.lang.Boolean.FALSE; import static java.lang.Boolean.TRUE; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServicePlanStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServicePlanStepTest.java index 5c94a74218..c4a0c97016 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServicePlanStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServicePlanStepTest.java @@ -1,13 +1,14 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.http.HttpStatus; + import static java.lang.Boolean.FALSE; import static java.lang.Boolean.TRUE; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -25,8 +26,7 @@ void testUpdateServicePlan() { step.execute(execution); - verify(client).updateServicePlan(serviceToProcess.getName(), - serviceToProcess.getPlan()); + verify(client).updateServicePlan(serviceToProcess.getName(), serviceToProcess.getPlan()); } @Test diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceSyslogDrainUrlStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceSyslogDrainUrlStepTest.java index 5270953547..6e82e139dc 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceSyslogDrainUrlStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceSyslogDrainUrlStepTest.java @@ -1,28 +1,25 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static java.lang.Boolean.FALSE; -import static java.lang.Boolean.TRUE; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - import java.util.UUID; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; -import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.junit.jupiter.api.Test; - -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; import org.mockito.Mockito; import org.springframework.http.HttpStatus; +import static java.lang.Boolean.FALSE; +import static java.lang.Boolean.TRUE; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; + class UpdateServiceSyslogDrainUrlStepTest extends SyncFlowableStepTest { private static final String SYSLOG_DRAIN_URL = "test-syslog-url"; @@ -98,8 +95,8 @@ void testOperationType() { private void throwExceptionOnServiceSyslogDrainUrlUpdate(HttpStatus httpStatus) { Mockito.doThrow(new CloudOperationException(httpStatus, "Error occurred")) - .when(client) - .updateServiceSyslogDrainUrl(any(), any()); + .when(client) + .updateServiceSyslogDrainUrl(any(), any()); } private CloudServiceInstanceExtended buildServiceWithSkipUpdate() { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceTagsStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceTagsStepTest.java index 6a8f5ba535..5d19b1e529 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceTagsStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceTagsStepTest.java @@ -1,13 +1,14 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.http.HttpStatus; + import static java.lang.Boolean.FALSE; import static java.lang.Boolean.TRUE; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -25,8 +26,7 @@ void testUpdateServiceTags() { step.execute(execution); - verify(client).updateServiceTags(serviceToProcess.getName(), - serviceToProcess.getTags()); + verify(client).updateServiceTags(serviceToProcess.getName(), serviceToProcess.getTags()); } @Test diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateSubscribedServiceBrokerStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateSubscribedServiceBrokerStepTest.java index c268cab652..a428442c8e 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateSubscribedServiceBrokerStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateSubscribedServiceBrokerStepTest.java @@ -1,8 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -13,6 +10,10 @@ import org.cloudfoundry.multiapps.common.test.GenericArgumentMatcher; import org.cloudfoundry.multiapps.common.test.TestUtil; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBroker; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceBroker; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.model.SupportedParameters; @@ -22,10 +23,8 @@ import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Mockito; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBroker; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceBroker; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; class UpdateSubscribedServiceBrokerStepTest extends SyncFlowableStepTest { @@ -33,7 +32,7 @@ class UpdateSubscribedServiceBrokerStepTest extends SyncFlowableStepTest testExecute() { return Stream.of( -// @formatter:off + // @formatter:off // (0) With an application that matches to an existing service broker Arguments.of("update-subscribed-service-broker-input-00.json", null, null), // (1) With an application that does not-matches to an existing service broker diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateSubscribersStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateSubscribersStepTest.java index 57e82b15ca..e800aa5604 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateSubscribersStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateSubscribersStepTest.java @@ -9,16 +9,16 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudSpace; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudApplication; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudOrganization; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudSpace; import org.cloudfoundry.multiapps.common.test.TestUtil; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudOrganization; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudSpace; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientFactory; import org.cloudfoundry.multiapps.controller.core.helpers.ClientHelper; import org.cloudfoundry.multiapps.controller.core.helpers.ModuleToDeployHelper; @@ -225,11 +225,10 @@ private CloudControllerClient getOrCreateClientForSpace(Map targets = List.of(new CloudTarget(input.currentSpace.getOrganization() - .getName(), - input.currentSpace.getName())); + .getName(), input.currentSpace.getName())); ConfigurationEntryQuery entryQueryMock = new MockBuilder<>(configurationEntryQuery).on( query -> query.providerNid(filter.getProviderNid())) .on(query -> query.providerId( diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UploadAppAsyncExecutionTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UploadAppAsyncExecutionTest.java index f9ece3060f..452fb59c15 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UploadAppAsyncExecutionTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UploadAppAsyncExecutionTest.java @@ -1,18 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.when; - import java.io.File; import java.io.FileInputStream; import java.nio.file.Files; @@ -28,6 +15,13 @@ import java.util.concurrent.RejectedExecutionException; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.UploadStatusCallback; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableDockerData; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Status; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.helpers.MtaArchiveElements; @@ -45,24 +39,34 @@ import org.junit.jupiter.api.io.TempDir; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.UploadStatusCallback; -import com.sap.cloudfoundry.client.facade.domain.CloudPackage; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudPackage; -import com.sap.cloudfoundry.client.facade.domain.ImmutableDockerData; -import com.sap.cloudfoundry.client.facade.domain.Status; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; class UploadAppAsyncExecutionTest extends AsyncStepOperationTest { private static final String APP_NAME = "sample-app-backend"; private static final String APP_FILE = "web.zip"; private static final ArchiveEntryWithStreamPositions ARCHIVE_ENTRY_WITH_STREAM_POSITIONS = ImmutableArchiveEntryWithStreamPositions.builder() - .name(APP_FILE) - .startPosition(37) - .endPosition(5012) - .compressionMethod(ArchiveEntryWithStreamPositions.CompressionMethod.DEFLATED) - .isDirectory(false) + .name( + APP_FILE) + .startPosition( + 37) + .endPosition( + 5012) + .compressionMethod( + ArchiveEntryWithStreamPositions.CompressionMethod.DEFLATED) + .isDirectory( + false) .build(); private static final String SPACE = "space"; private static final String APP_ARCHIVE = "sample-app.mtar"; diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UploadAppStepGeneralTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UploadAppStepGeneralTest.java index e8e5c521d6..d417058f2e 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UploadAppStepGeneralTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UploadAppStepGeneralTest.java @@ -1,14 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.when; - import java.io.File; import java.nio.file.Files; import java.nio.file.Path; @@ -23,6 +14,16 @@ import org.apache.commons.io.FileUtils; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.UploadStatusCallback; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudBuild; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DropletInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudBuild; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableDockerData; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableDropletInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Status; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.Constants; @@ -46,27 +47,30 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import com.sap.cloudfoundry.client.facade.UploadStatusCallback; -import com.sap.cloudfoundry.client.facade.domain.CloudBuild; -import com.sap.cloudfoundry.client.facade.domain.CloudPackage; -import com.sap.cloudfoundry.client.facade.domain.DropletInfo; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudBuild; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudPackage; -import com.sap.cloudfoundry.client.facade.domain.ImmutableDockerData; -import com.sap.cloudfoundry.client.facade.domain.ImmutableDropletInfo; -import com.sap.cloudfoundry.client.facade.domain.Status; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; class UploadAppStepGeneralTest extends SyncFlowableStepTest { private static final String APP_NAME = "sample-app-backend"; private static final String APP_FILE = "web.zip"; private static final ArchiveEntryWithStreamPositions ARCHIVE_ENTRY_WITH_STREAM_POSITIONS = ImmutableArchiveEntryWithStreamPositions.builder() - .name(APP_FILE) - .startPosition(37) - .endPosition(5012) - .compressionMethod(ArchiveEntryWithStreamPositions.CompressionMethod.DEFLATED) - .isDirectory(false) + .name( + APP_FILE) + .startPosition( + 37) + .endPosition( + 5012) + .compressionMethod( + ArchiveEntryWithStreamPositions.CompressionMethod.DEFLATED) + .isDirectory( + false) .build(); private static final String SPACE = "space"; private static final String APP_ARCHIVE = "sample-app.mtar"; @@ -105,34 +109,33 @@ private static Stream testWithBuildStates() { .dropletInfo(ImmutableDropletInfo.builder() .guid(UUID.randomUUID()) .build()) - .build()), - StepPhase.DONE, null), - Arguments.of(List.of(ImmutableCloudBuild.builder() - .metadata(ImmutableCloudMetadata.builder() - .createdAt(LocalDateTime.now()) - .build()) - .state(CloudBuild.State.FAILED) - .dropletInfo(ImmutableDropletInfo.builder() - .guid(UUID.randomUUID()) - .build()) - .build()), - StepPhase.POLL, CLOUD_PACKAGE), - Arguments.of(List.of(ImmutableCloudBuild.builder() - .state(CloudBuild.State.STAGING) - .dropletInfo(ImmutableDropletInfo.builder() - .guid(UUID.randomUUID()) - .build()) - .build()), - StepPhase.POLL, CLOUD_PACKAGE)); + .build()), StepPhase.DONE, null), Arguments.of(List.of( + ImmutableCloudBuild.builder() + .metadata(ImmutableCloudMetadata.builder() + .createdAt(LocalDateTime.now()) + .build()) + .state(CloudBuild.State.FAILED) + .dropletInfo(ImmutableDropletInfo.builder() + .guid(UUID.randomUUID()) + .build()) + .build()), StepPhase.POLL, CLOUD_PACKAGE), Arguments.of(List.of(ImmutableCloudBuild.builder() + .state( + CloudBuild.State.STAGING) + .dropletInfo( + ImmutableDropletInfo.builder() + .guid( + UUID.randomUUID()) + .build()) + .build()), StepPhase.POLL, + CLOUD_PACKAGE)); } @BeforeEach public void setUp() throws Exception { prepareFileService(); prepareContext(); - step.applicationZipBuilder = spy(new ApplicationZipBuilderMock(fileService, - new ApplicationArchiveIterator(), - new ArchiveEntryExtractor(fileService))); + step.applicationZipBuilder = spy( + new ApplicationZipBuilderMock(fileService, new ApplicationArchiveIterator(), new ArchiveEntryExtractor(fileService))); step.applicationDigestCalculator = mock(ApplicationDigestCalculator.class); } @@ -205,8 +208,8 @@ void testSkippingDigestCalculation() { prepareClients(CURRENT_MODULE_DIGEST); context.setVariable(Variables.SKIP_APP_DIGEST_CALCULATION, true); Map deployAttributes = Map.of(Constants.ATTR_APP_CONTENT_DIGEST, CURRENT_MODULE_DIGEST); - when(client.getApplicationEnvironment(APP_GUID)).thenReturn(Map.of(Constants.ENV_DEPLOY_ATTRIBUTES, - JsonUtil.toJson(deployAttributes))); + when(client.getApplicationEnvironment(APP_GUID)).thenReturn( + Map.of(Constants.ENV_DEPLOY_ATTRIBUTES, JsonUtil.toJson(deployAttributes))); step.execute(execution); assertEquals(StepPhase.POLL.toString(), getExecutionStatus()); assertTrue(context.getVariable(Variables.SHOULD_UPDATE_APPLICATION_DIGEST)); @@ -225,8 +228,8 @@ void testWithAvailableExpiredCloudPackageAndDifferentContent(String moduleDigest @ParameterizedTest void testWithBuildStates(List builds, StepPhase stepPhase, CloudPackage cloudPackage) { if (cloudPackage == null) { - when(client.getApplicationEnvironment(any(UUID.class))).thenReturn(Map.of("DEPLOY_ATTRIBUTES", "{\"app-content-digest\":\"" - + CURRENT_MODULE_DIGEST + "\"}")); + when(client.getApplicationEnvironment(any(UUID.class))).thenReturn( + Map.of("DEPLOY_ATTRIBUTES", "{\"app-content-digest\":\"" + CURRENT_MODULE_DIGEST + "\"}")); var dropletPackage = createCloudPackage(Status.READY); mockCloudPackagesGetter(dropletPackage); when(cloudPackagesGetter.getMostRecentAppPackage(any(), any())).thenReturn(Optional.of(dropletPackage)); diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationColorDetectorTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationColorDetectorTest.java index 8c6c9482e7..9c25b863e8 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationColorDetectorTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationColorDetectorTest.java @@ -1,9 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.util; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -19,6 +15,7 @@ import org.cloudfoundry.multiapps.common.test.Tester.Expectation; import org.cloudfoundry.multiapps.common.util.JsonUtil; import org.cloudfoundry.multiapps.controller.api.model.Operation; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; import org.cloudfoundry.multiapps.controller.core.cf.metadata.ImmutableMtaMetadata; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadata; import org.cloudfoundry.multiapps.controller.core.model.ApplicationColor; @@ -44,7 +41,9 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class ApplicationColorDetectorTest { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationEnvironmentCalculatorTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationEnvironmentCalculatorTest.java index da4b75ad76..3cda252d48 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationEnvironmentCalculatorTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationEnvironmentCalculatorTest.java @@ -1,14 +1,13 @@ package org.cloudfoundry.multiapps.controller.process.util; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.when; - import java.util.List; import java.util.Map; import java.util.UUID; import org.cloudfoundry.multiapps.common.util.MapUtil; import org.cloudfoundry.multiapps.controller.api.model.ProcessType; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudMetadata; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.model.DeployedMta; @@ -22,8 +21,8 @@ import org.mockito.Mockito; import org.mockito.MockitoAnnotations; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudMetadata; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; class ApplicationEnvironmentCalculatorTest { @@ -54,9 +53,10 @@ void setUp() throws Exception { @Test void testShouldNotKeepExistingEnv() { var applicationToDeploy = getApplicationToDeploy(); - when(applicationToDeploy.getAttributesUpdateStrategy()).thenReturn(ImmutableCloudApplicationExtended.AttributeUpdateStrategy.builder() - .shouldKeepExistingEnv(false) - .build()); + when(applicationToDeploy.getAttributesUpdateStrategy()).thenReturn( + ImmutableCloudApplicationExtended.ImmutableAttributeUpdateStrategy.builder() + .shouldKeepExistingEnv(false) + .build()); Map applicationEnv = applicationEnvironmentCalculator.calculateNewApplicationEnv(context, applicationToDeploy); assertEquals(APP_ENV, applicationEnv); } @@ -121,9 +121,10 @@ private CloudApplicationExtended getApplicationToDeploy() { when(applicationToDeploy.getEnv()).thenReturn(APP_ENV); when(applicationToDeploy.getName()).thenReturn(APP_NAME); when(applicationToDeploy.getModuleName()).thenReturn(MODULE_NAME); - when(applicationToDeploy.getAttributesUpdateStrategy()).thenReturn(ImmutableCloudApplicationExtended.AttributeUpdateStrategy.builder() - .shouldKeepExistingEnv(true) - .build()); + when(applicationToDeploy.getAttributesUpdateStrategy()).thenReturn( + ImmutableCloudApplicationExtended.ImmutableAttributeUpdateStrategy.builder() + .shouldKeepExistingEnv(true) + .build()); return applicationToDeploy; } diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationStagerTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationStagerTest.java index 3e9fc0365e..62a290ed0b 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationStagerTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationStagerTest.java @@ -5,19 +5,19 @@ import java.util.List; import java.util.UUID; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudBuild; -import com.sap.cloudfoundry.client.facade.domain.CloudPackage; -import com.sap.cloudfoundry.client.facade.domain.DropletInfo; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudApplication; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudBuild; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudPackage; -import com.sap.cloudfoundry.client.facade.domain.ImmutableDockerData; -import com.sap.cloudfoundry.client.facade.domain.ImmutableDropletInfo; -import com.sap.cloudfoundry.client.facade.domain.PackageState; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudBuild; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DropletInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudBuild; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableDockerData; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableDropletInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.PackageState; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientProvider; diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationWaitAfterStopVariableGetterTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationWaitAfterStopVariableGetterTest.java index 1e627a4a00..0ad1fcab48 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationWaitAfterStopVariableGetterTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationWaitAfterStopVariableGetterTest.java @@ -6,8 +6,8 @@ import java.util.UUID; import java.util.stream.Stream; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientProvider; diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/CloudPackagesGetterTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/CloudPackagesGetterTest.java index d78aea6cd8..c6239ac204 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/CloudPackagesGetterTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/CloudPackagesGetterTest.java @@ -1,29 +1,28 @@ package org.cloudfoundry.multiapps.controller.process.util; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - import java.time.LocalDateTime; import java.util.List; import java.util.Optional; import java.util.UUID; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.DropletInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudPackage; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableDropletInfo; +import org.cloudfoundry.multiapps.controller.client.facade.domain.Status; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.http.HttpStatus; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudControllerException; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.CloudPackage; -import com.sap.cloudfoundry.client.facade.domain.DropletInfo; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudPackage; -import com.sap.cloudfoundry.client.facade.domain.ImmutableDropletInfo; -import com.sap.cloudfoundry.client.facade.domain.Status; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; class CloudPackagesGetterTest { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ConfigurationEntryDynamicParameterResolverTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ConfigurationEntryDynamicParameterResolverTest.java index 823d848fbe..b73089ef6b 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ConfigurationEntryDynamicParameterResolverTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ConfigurationEntryDynamicParameterResolverTest.java @@ -1,7 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.util; -import static org.junit.jupiter.api.Assertions.assertEquals; - import java.text.MessageFormat; import java.util.Collections; import java.util.List; @@ -10,6 +8,7 @@ import java.util.Set; import java.util.stream.Stream; +import org.cloudfoundry.multiapps.controller.client.facade.util.JsonUtil; import org.cloudfoundry.multiapps.controller.core.model.DynamicResolvableParameter; import org.cloudfoundry.multiapps.controller.core.model.ImmutableDynamicResolvableParameter; import org.cloudfoundry.multiapps.controller.core.util.ConfigurationEntriesUtil; @@ -20,7 +19,7 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import com.sap.cloudfoundry.client.facade.util.JsonUtil; +import static org.junit.jupiter.api.Assertions.assertEquals; class ConfigurationEntryDynamicParameterResolverTest { @@ -49,16 +48,14 @@ static Stream testDynamicParameterResolve() { .build()), List.of(createEntry(1, JsonUtil.convertToJson(Map.of("dynamicGuid", "resolved-guid"))), createEntry(2, JsonUtil.convertToJson(Map.of("test-property", "should-not-be-resolved"))))), - Arguments.of(List.of(createEntry(1, - JsonUtil.convertToJson(Map.of("dynamicGuid", "{ds/service-1/service-guid}", - "test-property", "test-value")))), - Set.of(ImmutableDynamicResolvableParameter.builder() - .relationshipEntityName("service-1") - .parameterName("service-guid") - .value("resolved-guid") - .build()), - List.of(createEntry(1, JsonUtil.convertToJson(Map.of("test-property", "test-value", "dynamicGuid", - "resolved-guid")))))); + Arguments.of(List.of(createEntry(1, JsonUtil.convertToJson( + Map.of("dynamicGuid", "{ds/service-1/service-guid}", "test-property", "test-value")))), Set.of( + ImmutableDynamicResolvableParameter.builder() + .relationshipEntityName("service-1") + .parameterName("service-guid") + .value("resolved-guid") + .build()), List.of(createEntry(1, JsonUtil.convertToJson( + Map.of("test-property", "test-value", "dynamicGuid", "resolved-guid")))))); } @ParameterizedTest @@ -67,15 +64,16 @@ void testDynamicParameterResolve(List configurationEntriesTo Set dynamicResolvableParameters, List expectedConfigurationEntries) { ConfigurationEntryDynamicParameterResolver dynamicParameterResolver = new ConfigurationEntryDynamicParameterResolver(); - List resolvedEntries = dynamicParameterResolver.resolveDynamicParametersOfConfigurationEntries(configurationEntriesToResolve, - dynamicResolvableParameters); + List resolvedEntries = dynamicParameterResolver.resolveDynamicParametersOfConfigurationEntries( + configurationEntriesToResolve, dynamicResolvableParameters); assertEquals(expectedConfigurationEntries.size(), resolvedEntries.size()); for (ConfigurationEntry expectedEntry : expectedConfigurationEntries) { ConfigurationEntry resolvedEntry = resolvedEntries.stream() .filter(entry -> entry.getId() == expectedEntry.getId()) .findFirst() - .orElseThrow(() -> new NoSuchElementException(MessageFormat.format("Configuration entry \"{0}\" is not found after resolve", - expectedEntry.getConfigurationName()))); + .orElseThrow(() -> new NoSuchElementException(MessageFormat.format( + "Configuration entry \"{0}\" is not found after resolve", + expectedEntry.getConfigurationName()))); Map expectedEntriesMap = JsonUtil.convertJsonToMap(expectedEntry.getContent()); Map resovledEntriesMap = JsonUtil.convertJsonToMap(resolvedEntry.getContent()); @@ -86,16 +84,9 @@ void testDynamicParameterResolve(List configurationEntriesTo } private static ConfigurationEntry createEntry(long id, String content) { - return new ConfigurationEntry(id, - ConfigurationEntriesUtil.PROVIDER_NID, - PROVIDER_ID, - Version.parseVersion("3.0.0"), - PROVIDER_NAMESPACE, - new CloudTarget(TARGET_ORG, TARGET_SPACE), - content, - Collections.emptyList(), - SPACE_ID, - CONTENT_ID); + return new ConfigurationEntry(id, ConfigurationEntriesUtil.PROVIDER_NID, PROVIDER_ID, Version.parseVersion("3.0.0"), + PROVIDER_NAMESPACE, new CloudTarget(TARGET_ORG, TARGET_SPACE), content, Collections.emptyList(), + SPACE_ID, CONTENT_ID); } } diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ExistingAppsToBackupCalculatorTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ExistingAppsToBackupCalculatorTest.java index f8826f1ab9..1147c87e67 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ExistingAppsToBackupCalculatorTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ExistingAppsToBackupCalculatorTest.java @@ -1,10 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.util; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.when; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -13,6 +8,8 @@ import java.util.stream.Stream; import org.cloudfoundry.client.v3.Metadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudApplication; import org.cloudfoundry.multiapps.controller.core.cf.metadata.ImmutableMtaMetadata; import org.cloudfoundry.multiapps.controller.core.cf.metadata.MtaMetadataAnnotations; import org.cloudfoundry.multiapps.controller.core.model.DeployedMta; @@ -34,8 +31,10 @@ import org.mockito.Mockito; import org.mockito.MockitoAnnotations; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudApplication; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; class ExistingAppsToBackupCalculatorTest { @@ -58,65 +57,67 @@ void setUp() throws Exception { private static Stream testCalculateExistingAppsToBackup() { return Stream.of( - // (1) Already deployed application match version of current deployment descriptor - Arguments.of(List.of(new TestApplication("app-1", "app-1-live", "1")), Collections.emptyList(), "1", true, - List.of("app-1-live"), List.of()), - // (2) Current deployment descriptor version has different value than deployed mta - Arguments.of(List.of(new TestApplication("app-1", "app-1-live", "1"), - new TestApplication("app-1", "app-1-idle", "2", ProductizationState.IDLE)), - Collections.emptyList(), "2", true, List.of("app-1-live", "app-1-idle"), - List.of(ImmutableCloudApplication.builder() - .name("app-1-live") - .v3Metadata(Metadata.builder() - .annotation(MtaMetadataAnnotations.MTA_VERSION, - "1") - .build()) - .build())), - // (3) Current deployment descriptor match version of deployed and backup mta - Arguments.of(List.of(new TestApplication("app-1", "app-1-live", "1")), - List.of(new TestApplication("app-1", "mta-backup-app-1", "1")), "1", true, List.of("app-1-live"), - Collections.emptyList()), - // (4) Current deployment descriptor version has different value of deployed and backup mta - Arguments.of(List.of(new TestApplication("app-1", "app-1-live", "2")), - List.of(new TestApplication("app-1", - "mta-backup-app-1", - "1")), - "3", true, List.of("app-1-live", "mta-backup-app-1"), List.of(ImmutableCloudApplication.builder() - .name("app-1-live") - .v3Metadata(Metadata.builder() - .annotation(MtaMetadataAnnotations.MTA_VERSION, - "2") - .build()) - .build())), - // (5) Current deployment descriptor match version of deployed mta only - Arguments.of(List.of(new TestApplication("app-1", "app-1-live", "2")), - List.of(new TestApplication("app-1", "mta-backup-app-1", "1")), "2", true, List.of("app-1-live"), - Collections.emptyList()), - // (6) Current deployment descriptor version match value of backup mta - Arguments.of(List.of(new TestApplication("app-1", "app-1-live", "2")), - List.of(new TestApplication("app-1", "mta-backup-app-1", "1")), "1", true, - List.of("app-1-live", "app-1-idle"), Collections.emptyList()), - // (7) Deployed mta does not have backup descriptor in db and won't be preserved - Arguments.of(List.of(new TestApplication("app-1", "app-1", "1"), new TestApplication("app-2", "app-2", "1")), - Collections.emptyList(), "2", false, Collections.emptyList(), Collections.emptyList()), - // (8) Deployed mta contains applications with different versions and existing backup - Arguments.of(List.of(new TestApplication("app-1", "app-1-live", "2"), - new TestApplication("app-1", "app-1-idle", "3", ProductizationState.IDLE)), - List.of(new TestApplication("app-1", "mta-backup-app-1", "1")), "3", true, List.of("app-1-live"), - List.of(ImmutableCloudApplication.builder() - .name("app-1-live") - .v3Metadata(Metadata.builder() - .annotation(MtaMetadataAnnotations.MTA_VERSION, - "2") - .build()) - .build())), - // (9) Missing deployed mta and existing backup - Arguments.of(Collections.emptyList(), List.of(new TestApplication("app-1", "mta-backup-app-1", "1")), "2", false, - Collections.emptyList(), Collections.emptyList()), - // (10) Deployed mta contains applications with missing versions and existing backup - Arguments.of(List.of(new TestApplication("app-1", "app-1", null)), - List.of(new TestApplication("app-1", "mta-backup-app-1", "1")), "2", false, Collections.emptyList(), - Collections.emptyList())); + // (1) Already deployed application match version of current deployment descriptor + Arguments.of(List.of(new TestApplication("app-1", "app-1-live", "1")), Collections.emptyList(), "1", true, + List.of("app-1-live"), List.of()), + // (2) Current deployment descriptor version has different value than deployed mta + Arguments.of(List.of(new TestApplication("app-1", "app-1-live", "1"), + new TestApplication("app-1", "app-1-idle", "2", ProductizationState.IDLE)), + Collections.emptyList(), "2", true, List.of("app-1-live", "app-1-idle"), + List.of(ImmutableCloudApplication.builder() + .name("app-1-live") + .v3Metadata(Metadata.builder() + .annotation(MtaMetadataAnnotations.MTA_VERSION, + "1") + .build()) + .build())), + // (3) Current deployment descriptor match version of deployed and backup mta + Arguments.of(List.of(new TestApplication("app-1", "app-1-live", "1")), + List.of(new TestApplication("app-1", "mta-backup-app-1", "1")), "1", true, List.of("app-1-live"), + Collections.emptyList()), + // (4) Current deployment descriptor version has different value of deployed and backup mta + Arguments.of(List.of(new TestApplication("app-1", "app-1-live", "2")), + List.of(new TestApplication("app-1", + "mta-backup-app-1", + "1")), + "3", true, List.of("app-1-live", "mta-backup-app-1"), List.of(ImmutableCloudApplication.builder() + .name("app-1-live") + .v3Metadata( + Metadata.builder() + .annotation( + MtaMetadataAnnotations.MTA_VERSION, + "2") + .build()) + .build())), + // (5) Current deployment descriptor match version of deployed mta only + Arguments.of(List.of(new TestApplication("app-1", "app-1-live", "2")), + List.of(new TestApplication("app-1", "mta-backup-app-1", "1")), "2", true, List.of("app-1-live"), + Collections.emptyList()), + // (6) Current deployment descriptor version match value of backup mta + Arguments.of(List.of(new TestApplication("app-1", "app-1-live", "2")), + List.of(new TestApplication("app-1", "mta-backup-app-1", "1")), "1", true, + List.of("app-1-live", "app-1-idle"), Collections.emptyList()), + // (7) Deployed mta does not have backup descriptor in db and won't be preserved + Arguments.of(List.of(new TestApplication("app-1", "app-1", "1"), new TestApplication("app-2", "app-2", "1")), + Collections.emptyList(), "2", false, Collections.emptyList(), Collections.emptyList()), + // (8) Deployed mta contains applications with different versions and existing backup + Arguments.of(List.of(new TestApplication("app-1", "app-1-live", "2"), + new TestApplication("app-1", "app-1-idle", "3", ProductizationState.IDLE)), + List.of(new TestApplication("app-1", "mta-backup-app-1", "1")), "3", true, List.of("app-1-live"), + List.of(ImmutableCloudApplication.builder() + .name("app-1-live") + .v3Metadata(Metadata.builder() + .annotation(MtaMetadataAnnotations.MTA_VERSION, + "2") + .build()) + .build())), + // (9) Missing deployed mta and existing backup + Arguments.of(Collections.emptyList(), List.of(new TestApplication("app-1", "mta-backup-app-1", "1")), "2", false, + Collections.emptyList(), Collections.emptyList()), + // (10) Deployed mta contains applications with missing versions and existing backup + Arguments.of(List.of(new TestApplication("app-1", "app-1", null)), + List.of(new TestApplication("app-1", "mta-backup-app-1", "1")), "2", false, Collections.emptyList(), + Collections.emptyList())); } @ParameterizedTest @@ -132,7 +133,7 @@ void testCalculateExistingAppsToBackup(List deployedApplication ExistingAppsToBackupCalculator calculator = new ExistingAppsToBackupCalculator(deployedMta, backupMta, descriptorBackupService); List appsToUndeploy = getAppsToUndeploy(deployedMta == null ? Collections.emptyList() - : deployedMta.getApplications(), appNamesToUndeploy); + : deployedMta.getApplications(), appNamesToUndeploy); List appsToBackup = calculator.calculateExistingAppsToBackup(context, appsToUndeploy, mtaVersionOfCurrentDescriptor); @@ -141,42 +142,44 @@ void testCalculateExistingAppsToBackup(List deployedApplication private static Stream testCalculateAppsToUndeploy() { return Stream.of( - // (1) Backup apps exist and new version will be backup and older one needs to be deleted - Arguments.of(List.of(new TestApplication("app-1", "mta-backup-app-1", "1")), List.of("app-1-idle"), true, - List.of(ImmutableCloudApplication.builder() - .name("mta-backup-app-1") - .v3Metadata(Metadata.builder() - .annotation(MtaMetadataAnnotations.MTA_VERSION, - "1") - .build()) - .build())), - // (2) Backup apps does not exist and there is no need to delete applications - Arguments.of(Collections.emptyList(), List.of("special-app"), false, Collections.emptyList()), - // (3) There is no specified apps to backup and deletion will be skipped for already existing backup apps - Arguments.of(List.of(new TestApplication("app-1", "mta-backup-app-1", "1"), - new TestApplication("app-2", "mta-backup-app-2", "1")), - Collections.emptyList(), true, Collections.emptyList()), - // (4) Backup apps exist with same name and won't be deleted - Arguments.of(List.of(new TestApplication("app-1", "mta-backup-app-1", "1"), - new TestApplication("app-2", "mta-backup-app-2", "1")), - List.of("mta-backup-app-1", "mta-backup-app-2"), true, Collections.emptyList()), - // (5) Backup apps exist but descriptor is not available in db - Arguments.of(List.of(new TestApplication("app-1", "mta-backup-app-1", "2"), - new TestApplication("app-2", "mta-backup-app-2", "2")), - Collections.emptyList(), false, List.of(ImmutableCloudApplication.builder() - .name("mta-backup-app-1") - .v3Metadata(Metadata.builder() - .annotation(MtaMetadataAnnotations.MTA_VERSION, - "2") - .build()) - .build(), - ImmutableCloudApplication.builder() - .name("mta-backup-app-2") - .v3Metadata(Metadata.builder() - .annotation(MtaMetadataAnnotations.MTA_VERSION, - "2") - .build()) - .build()))); + // (1) Backup apps exist and new version will be backup and older one needs to be deleted + Arguments.of(List.of(new TestApplication("app-1", "mta-backup-app-1", "1")), List.of("app-1-idle"), true, + List.of(ImmutableCloudApplication.builder() + .name("mta-backup-app-1") + .v3Metadata(Metadata.builder() + .annotation(MtaMetadataAnnotations.MTA_VERSION, + "1") + .build()) + .build())), + // (2) Backup apps does not exist and there is no need to delete applications + Arguments.of(Collections.emptyList(), List.of("special-app"), false, Collections.emptyList()), + // (3) There is no specified apps to backup and deletion will be skipped for already existing backup apps + Arguments.of(List.of(new TestApplication("app-1", "mta-backup-app-1", "1"), + new TestApplication("app-2", "mta-backup-app-2", "1")), + Collections.emptyList(), true, Collections.emptyList()), + // (4) Backup apps exist with same name and won't be deleted + Arguments.of(List.of(new TestApplication("app-1", "mta-backup-app-1", "1"), + new TestApplication("app-2", "mta-backup-app-2", "1")), + List.of("mta-backup-app-1", "mta-backup-app-2"), true, Collections.emptyList()), + // (5) Backup apps exist but descriptor is not available in db + Arguments.of(List.of(new TestApplication("app-1", "mta-backup-app-1", "2"), + new TestApplication("app-2", "mta-backup-app-2", "2")), + Collections.emptyList(), false, List.of(ImmutableCloudApplication.builder() + .name("mta-backup-app-1") + .v3Metadata(Metadata.builder() + .annotation( + MtaMetadataAnnotations.MTA_VERSION, + "2") + .build()) + .build(), + ImmutableCloudApplication.builder() + .name("mta-backup-app-2") + .v3Metadata(Metadata.builder() + .annotation( + MtaMetadataAnnotations.MTA_VERSION, + "2") + .build()) + .build()))); } @ParameterizedTest @@ -211,12 +214,13 @@ private DeployedMta getDeployedMta(List deployedApplications) { .moduleName(application.moduleName) .name(application.appName) .v3Metadata(application.mtaVersion != null ? Metadata.builder() - .annotation(MtaMetadataAnnotations.MTA_VERSION, - application.mtaVersion) + .annotation( + MtaMetadataAnnotations.MTA_VERSION, + application.mtaVersion) .build() - : Metadata.builder() - .annotations(Collections.emptyMap()) - .build()) + : Metadata.builder() + .annotations(Collections.emptyMap()) + .build()) .productizationState(application.productizationState) .build()); } @@ -226,9 +230,11 @@ private DeployedMta getDeployedMta(List deployedApplications) { .metadata(ImmutableMtaMetadata.builder() .id(MTA_ID) .version(mtaVersion != null && deployedApplications.stream() - .allMatch(deployedApplication -> mtaVersion.equals(deployedApplication.mtaVersion)) - ? Version.parseVersion(mtaVersion) - : null) + .allMatch( + deployedApplication -> mtaVersion.equals( + deployedApplication.mtaVersion)) + ? Version.parseVersion(mtaVersion) + : null) .build()) .build(); @@ -243,7 +249,7 @@ private void prepareContext(boolean isDescriptorAvailableInDb) { when(descriptorBackupQuery.namespace(any())).thenReturn(descriptorBackupQuery); when(descriptorBackupQuery.mtaVersion(anyString())).thenReturn(descriptorBackupQuery); when(descriptorBackupQuery.list()).thenReturn(isDescriptorAvailableInDb ? List.of(Mockito.mock(BackupDescriptor.class)) - : Collections.emptyList()); + : Collections.emptyList()); } private List getAppsToUndeploy(List deployedApplications, List appNamesToUndeploy) { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ServiceBindingParametersGetterTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ServiceBindingParametersGetterTest.java index e225f755dc..bdffb03488 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ServiceBindingParametersGetterTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ServiceBindingParametersGetterTest.java @@ -1,14 +1,20 @@ package org.cloudfoundry.multiapps.controller.process.util; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceBinding; -import com.sap.cloudfoundry.client.facade.domain.ImmutableServiceCredentialBindingOperation; -import com.sap.cloudfoundry.client.facade.domain.ServiceCredentialBindingOperation; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.stream.Stream; + import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceBinding; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableServiceCredentialBindingOperation; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceCredentialBindingOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableBindingDetails; @@ -27,12 +33,6 @@ import org.mockito.MockitoAnnotations; import org.springframework.http.HttpStatus; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.stream.Stream; - import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -52,11 +52,14 @@ class ServiceBindingParametersGetterTest { private static final ArchiveEntryWithStreamPositions ARCHIVE_ENTRY_WITH_STREAM_POSITIONS = ImmutableArchiveEntryWithStreamPositions.builder() .name( SERVICE_BINDING_PARAMETERS_FILENAME) - .startPosition(37) - .endPosition(5012) + .startPosition( + 37) + .endPosition( + 5012) .compressionMethod( ArchiveEntryWithStreamPositions.CompressionMethod.DEFLATED) - .isDirectory(false) + .isDirectory( + false) .build(); private static final String TEST_SPACE_GUID = "test_space_guid"; @@ -104,7 +107,8 @@ void testGetServiceBindingParametersFromMta(Map descriptorParame prepareMtaArchiveElements(expectedParameters); prepareContext(serviceInstance); prepareFileService(expectedParameters); - Map bindingParameters = serviceBindingParametersGetter.getServiceBindingParametersFromMta(application, SERVICE_NAME); + Map bindingParameters = serviceBindingParametersGetter.getServiceBindingParametersFromMta(application, + SERVICE_NAME); assertEquals(expectedParameters, bindingParameters); } @@ -114,7 +118,8 @@ void testGetServiceBindingOfMissingService() { CloudApplicationExtended application = buildApplication(null); when(context.getVariable(Variables.SERVICES_TO_BIND)).thenReturn(Collections.emptyList()); - Map bindingParameters = serviceBindingParametersGetter.getServiceBindingParametersFromMta(application, SERVICE_NAME); + Map bindingParameters = serviceBindingParametersGetter.getServiceBindingParametersFromMta(application, + SERVICE_NAME); assertTrue(bindingParameters.isEmpty(), "Binding parameters should be empty map"); } @@ -127,7 +132,8 @@ void testGetServiceBindingParametersFromExistingInstance() { prepareContext(serviceInstance); prepareClient(bindingParametersToReturn, true); - Map bindingParameters = serviceBindingParametersGetter.getServiceBindingParametersFromExistingInstance(application, SERVICE_NAME); + Map bindingParameters = serviceBindingParametersGetter.getServiceBindingParametersFromExistingInstance(application, + SERVICE_NAME); assertEquals(bindingParametersToReturn, bindingParameters); } @@ -144,8 +150,8 @@ void testThrowingExceptionWhenServiceBindingIsMissing() { } static Stream testHandleCloudOperationExceptions() { - return Stream.of(Arguments.of(HttpStatus.BAD_REQUEST, false), Arguments.of(HttpStatus.NOT_FOUND, true), Arguments.of(HttpStatus.NOT_IMPLEMENTED, false), - Arguments.of(HttpStatus.INTERNAL_SERVER_ERROR, true)); + return Stream.of(Arguments.of(HttpStatus.BAD_REQUEST, false), Arguments.of(HttpStatus.NOT_FOUND, true), + Arguments.of(HttpStatus.NOT_IMPLEMENTED, false), Arguments.of(HttpStatus.INTERNAL_SERVER_ERROR, true)); } @ParameterizedTest @@ -162,7 +168,8 @@ void testHandleCloudOperationExceptions(HttpStatus httpStatusToReturn, boolean s () -> serviceBindingParametersGetter.getServiceBindingParametersFromExistingInstance(application, SERVICE_NAME)); return; } - Map bindingParameters = serviceBindingParametersGetter.getServiceBindingParametersFromExistingInstance(application, SERVICE_NAME); + Map bindingParameters = serviceBindingParametersGetter.getServiceBindingParametersFromExistingInstance(application, + SERVICE_NAME); assertNull(bindingParameters, "Returned result from CloudOperationException should be null"); verify(stepLogger).warnWithoutProgressMessage(anyString(), any(Object[].class)); } @@ -171,9 +178,11 @@ private CloudApplicationExtended buildApplication(Map descriptor ImmutableCloudApplicationExtended.Builder applicationBuilder = ImmutableCloudApplicationExtended.builder() .name(APP_NAME) .moduleName(APP_NAME) - .metadata(ImmutableCloudMetadata.builder() - .guid(RANDOM_GUID) - .build()); + .metadata( + ImmutableCloudMetadata.builder() + .guid( + RANDOM_GUID) + .build()); if (descriptorParameters != null) { applicationBuilder.bindingParameters(Map.of(SERVICE_NAME, ImmutableBindingDetails.builder() .bindingName(null) @@ -228,12 +237,13 @@ private void prepareClient(Map bindingParameters, boolean servic .metadata(ImmutableCloudMetadata.builder() .guid(RANDOM_GUID) .build()) - .serviceBindingOperation(ImmutableServiceCredentialBindingOperation.builder() - .type( - ServiceCredentialBindingOperation.Type.CREATE) - .state( - ServiceCredentialBindingOperation.State.SUCCEEDED) - .build()) + .serviceBindingOperation( + ImmutableServiceCredentialBindingOperation.builder() + .type( + ServiceCredentialBindingOperation.Type.CREATE) + .state( + ServiceCredentialBindingOperation.State.SUCCEEDED) + .build()) .build(); when(client.getServiceBindingForApplication(RANDOM_GUID, RANDOM_GUID)).thenReturn(serviceBinding); return; diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ServiceOperationGetterTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ServiceOperationGetterTest.java index 200b8e8ad9..d6e32d0136 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ServiceOperationGetterTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ServiceOperationGetterTest.java @@ -1,13 +1,14 @@ package org.cloudfoundry.multiapps.controller.process.util; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.mockito.Mockito.when; - import java.util.List; import java.util.UUID; import java.util.stream.Stream; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudEvent; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudEvent; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.steps.ProcessContext; import org.junit.jupiter.api.BeforeEach; @@ -17,11 +18,9 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudEvent; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudEvent; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.mockito.Mockito.when; class ServiceOperationGetterTest { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ServiceProgressReporterTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ServiceProgressReporterTest.java index 9ef2cc20e8..11a3aa3f8a 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ServiceProgressReporterTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ServiceProgressReporterTest.java @@ -1,16 +1,11 @@ package org.cloudfoundry.multiapps.controller.process.util; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Stream; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.controller.process.steps.ProcessContext; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.params.ParameterizedTest; @@ -19,7 +14,11 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; class ServiceProgressReporterTest { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ServiceRemoverTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ServiceRemoverTest.java index 8526b20b23..642b5f0065 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ServiceRemoverTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ServiceRemoverTest.java @@ -4,16 +4,16 @@ import java.util.UUID; import java.util.stream.Stream; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudControllerException; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.CloudServiceBrokerException; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudApplication; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudServiceInstance; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudServiceBrokerException; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudApplication; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudServiceInstance; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientProvider; import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration; import org.cloudfoundry.multiapps.controller.process.Messages; diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/UrisApplicationAttributeUpdaterTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/UrisApplicationAttributeUpdaterTest.java index a2c8a96052..8c30684b31 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/UrisApplicationAttributeUpdaterTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/UrisApplicationAttributeUpdaterTest.java @@ -1,14 +1,16 @@ package org.cloudfoundry.multiapps.controller.process.util; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; - import java.util.Collections; import java.util.List; import java.util.UUID; import java.util.stream.Stream; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudDomain; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudRoute; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableRouteDestination; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended; import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.process.steps.ProcessContext; @@ -19,12 +21,9 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudDomain; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudRoute; -import com.sap.cloudfoundry.client.facade.domain.ImmutableRouteDestination; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; class UrisApplicationAttributeUpdaterTest { diff --git a/multiapps-controller-shutdown-client/src/main/java/module-info.java b/multiapps-controller-shutdown-client/src/main/java/module-info.java index a861f53a96..7273b1e0cb 100644 --- a/multiapps-controller-shutdown-client/src/main/java/module-info.java +++ b/multiapps-controller-shutdown-client/src/main/java/module-info.java @@ -5,10 +5,10 @@ requires transitive org.cloudfoundry.multiapps.controller.core; - requires com.sap.cloudfoundry.client.facade; requires com.fasterxml.jackson.annotation; requires org.apache.httpcomponents.client5.httpclient5; requires org.apache.httpcomponents.core5.httpcore5; + requires org.cloudfoundry.multiapps.controller.client; requires org.cloudfoundry.multiapps.common; requires org.slf4j; diff --git a/multiapps-controller-shutdown-client/src/main/java/org/cloudfoundry/multiapps/controller/shutdown/client/ApplicationShutdownExecutor.java b/multiapps-controller-shutdown-client/src/main/java/org/cloudfoundry/multiapps/controller/shutdown/client/ApplicationShutdownExecutor.java index 2a69ed818a..544f3ddead 100644 --- a/multiapps-controller-shutdown-client/src/main/java/org/cloudfoundry/multiapps/controller/shutdown/client/ApplicationShutdownExecutor.java +++ b/multiapps-controller-shutdown-client/src/main/java/org/cloudfoundry/multiapps/controller/shutdown/client/ApplicationShutdownExecutor.java @@ -5,14 +5,13 @@ import java.text.MessageFormat; import java.util.UUID; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClientImpl; +import org.cloudfoundry.multiapps.controller.client.facade.CloudCredentials; +import org.cloudfoundry.multiapps.controller.client.facade.domain.InstancesInfo; import org.cloudfoundry.multiapps.controller.shutdown.client.configuration.EnvironmentBasedShutdownConfiguration; import org.cloudfoundry.multiapps.controller.shutdown.client.configuration.ShutdownConfiguration; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudControllerClientImpl; -import com.sap.cloudfoundry.client.facade.CloudCredentials; -import com.sap.cloudfoundry.client.facade.domain.InstancesInfo; - public class ApplicationShutdownExecutor { public static void main(String[] args) { @@ -21,8 +20,9 @@ public static void main(String[] args) { private final ShutdownConfiguration shutdownConfiguration = new EnvironmentBasedShutdownConfiguration(); private final ShutdownClientFactory shutdownClientFactory = new ShutdownClientFactory(); - private final ApplicationInstanceShutdownExecutor instanceShutdownExecutor = new ApplicationInstanceShutdownExecutor(shutdownConfiguration, - shutdownClientFactory); + private final ApplicationInstanceShutdownExecutor instanceShutdownExecutor = new ApplicationInstanceShutdownExecutor( + shutdownConfiguration, + shutdownClientFactory); public void execute() { int applicationInstancesCount = getApplicationInstancesCount(shutdownConfiguration); diff --git a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/api/impl/MtasApiServiceImpl.java b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/api/impl/MtasApiServiceImpl.java index 87a1335d65..5f6ba786e5 100644 --- a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/api/impl/MtasApiServiceImpl.java +++ b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/api/impl/MtasApiServiceImpl.java @@ -5,8 +5,6 @@ import java.util.Optional; import java.util.stream.Collectors; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; import jakarta.inject.Inject; import jakarta.inject.Named; import org.cloudfoundry.multiapps.common.ConflictException; @@ -18,6 +16,8 @@ import org.cloudfoundry.multiapps.controller.api.model.Metadata; import org.cloudfoundry.multiapps.controller.api.model.Module; import org.cloudfoundry.multiapps.controller.api.model.Mta; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; import org.cloudfoundry.multiapps.controller.core.auditlogging.MtasApiServiceAuditLog; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientProvider; import org.cloudfoundry.multiapps.controller.core.cf.detect.DeployedMtaDetector; diff --git a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/api/impl/OperationsApiServiceImpl.java b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/api/impl/OperationsApiServiceImpl.java index 856452528d..e919a60b75 100644 --- a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/api/impl/OperationsApiServiceImpl.java +++ b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/api/impl/OperationsApiServiceImpl.java @@ -15,9 +15,6 @@ import java.util.UUID; import java.util.stream.Collectors; -import com.sap.cloudfoundry.client.facade.domain.CloudOrganization; -import com.sap.cloudfoundry.client.facade.domain.CloudSpace; -import com.sap.cloudfoundry.client.facade.rest.CloudSpaceClient; import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.persistence.NoResultException; @@ -35,6 +32,9 @@ import org.cloudfoundry.multiapps.controller.api.model.Operation; import org.cloudfoundry.multiapps.controller.api.model.ParameterMetadata; import org.cloudfoundry.multiapps.controller.api.model.parameters.ParameterConversion; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudOrganization; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.rest.CloudSpaceClient; import org.cloudfoundry.multiapps.controller.core.auditlogging.OperationsApiServiceAuditLog; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientFactory; import org.cloudfoundry.multiapps.controller.core.security.token.TokenService; @@ -104,8 +104,9 @@ public ResponseEntity executeOperationAction(HttpServletRequest request, S Operation operation = getOperationByOperationGuidAndSpaceGuid(operationId, spaceGuid); List availableOperations = getAvailableActions(operation); if (!availableOperations.contains(actionId)) { - throw new IllegalArgumentException(MessageFormat.format(Messages.ACTION_0_CANNOT_BE_EXECUTED_OVER_OPERATION_1_IN_STATE_2, - actionId, operationId, operation.getState())); + throw new IllegalArgumentException( + MessageFormat.format(Messages.ACTION_0_CANNOT_BE_EXECUTED_OVER_OPERATION_1_IN_STATE_2, actionId, operationId, + operation.getState())); } ProcessAction action = processActionRegistry.getAction(Action.fromString(actionId)); action.execute(getAuthenticatedUser(request), operationId); diff --git a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/configuration/SecurityConfiguration.java b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/configuration/SecurityConfiguration.java index 996e3ea96b..26c84f5d20 100644 --- a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/configuration/SecurityConfiguration.java +++ b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/configuration/SecurityConfiguration.java @@ -1,8 +1,12 @@ package org.cloudfoundry.multiapps.controller.web.configuration; -import com.sap.cloudfoundry.client.facade.oauth2.TokenFactory; import jakarta.inject.Inject; -import org.cloudfoundry.multiapps.controller.web.security.*; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.TokenFactory; +import org.cloudfoundry.multiapps.controller.web.security.AuthenticationLoaderFilter; +import org.cloudfoundry.multiapps.controller.web.security.CompositeUriAuthorizationFilter; +import org.cloudfoundry.multiapps.controller.web.security.CsrfHeadersFilter; +import org.cloudfoundry.multiapps.controller.web.security.ExceptionHandlerFilter; +import org.cloudfoundry.multiapps.controller.web.security.RequestSizeFilter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.http.HttpMethod; diff --git a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/configuration/UAAClientConfiguration.java b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/configuration/UAAClientConfiguration.java index 2409fb6a4e..be8b6a24ce 100644 --- a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/configuration/UAAClientConfiguration.java +++ b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/configuration/UAAClientConfiguration.java @@ -5,9 +5,8 @@ import java.util.Map; import jakarta.inject.Inject; - -import com.sap.cloudfoundry.client.facade.util.RestUtil; import org.cloudfoundry.multiapps.common.util.JsonUtil; +import org.cloudfoundry.multiapps.controller.client.facade.util.RestUtil; import org.cloudfoundry.multiapps.controller.client.uaa.UAAClient; import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration; import org.cloudfoundry.multiapps.controller.core.util.SSLUtil; @@ -24,8 +23,7 @@ public UAAClient uaaClient(ApplicationConfiguration configuration) { if (configuration.shouldSkipSslValidation()) { SSLUtil.disableSSLValidation(); } - return new UAAClient(readTokenEndpoint(configuration.getControllerUrl()), - new RestUtil().createWebClient(false)); + return new UAAClient(readTokenEndpoint(configuration.getControllerUrl()), new RestUtil().createWebClient(false)); } @SuppressWarnings("unchecked") @@ -36,8 +34,8 @@ private URL readTokenEndpoint(URL targetURL) { var uaa = (Map) links.get("uaa"); Object endpoint = uaa.get("href"); if (endpoint == null) { - throw new IllegalStateException(MessageFormat.format("Response from {0} does not contain a valid token endpoint", - targetURL.toString())); + throw new IllegalStateException( + MessageFormat.format("Response from {0} does not contain a valid token endpoint", targetURL.toString())); } return new URL(endpoint.toString()); } catch (Exception e) { diff --git a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/resources/CFExceptionMapper.java b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/resources/CFExceptionMapper.java index d1807581c4..b5c8243937 100644 --- a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/resources/CFExceptionMapper.java +++ b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/resources/CFExceptionMapper.java @@ -2,11 +2,13 @@ import java.sql.SQLException; +import jakarta.servlet.ServletException; import org.apache.ibatis.exceptions.PersistenceException; import org.cloudfoundry.multiapps.common.ConflictException; import org.cloudfoundry.multiapps.common.ContentException; import org.cloudfoundry.multiapps.common.NotFoundException; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; import org.cloudfoundry.multiapps.controller.web.Messages; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -18,10 +20,6 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.server.ResponseStatusException; -import com.sap.cloudfoundry.client.facade.CloudOperationException; - -import jakarta.servlet.ServletException; - @ControllerAdvice public class CFExceptionMapper { diff --git a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/resources/ConfigurationEntriesResource.java b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/resources/ConfigurationEntriesResource.java index c30965f665..b552f21b39 100644 --- a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/resources/ConfigurationEntriesResource.java +++ b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/resources/ConfigurationEntriesResource.java @@ -1,8 +1,8 @@ package org.cloudfoundry.multiapps.controller.web.resources; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; import jakarta.inject.Inject; import jakarta.inject.Named; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; import org.cloudfoundry.multiapps.controller.core.auditlogging.MtaConfigurationPurgerAuditLog; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientFactory; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientProvider; diff --git a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/security/AuthenticationLoaderFilter.java b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/security/AuthenticationLoaderFilter.java index 404bdf26b5..25fa49654a 100644 --- a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/security/AuthenticationLoaderFilter.java +++ b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/security/AuthenticationLoaderFilter.java @@ -2,6 +2,13 @@ import java.io.IOException; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration; import org.cloudfoundry.multiapps.controller.core.util.SSLUtil; import org.cloudfoundry.multiapps.controller.core.util.SecurityUtil; @@ -18,15 +25,6 @@ import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.server.ResponseStatusException; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; - -import jakarta.inject.Inject; -import jakarta.inject.Named; -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - @Named public class AuthenticationLoaderFilter extends OncePerRequestFilter { diff --git a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/security/AuthorizationChecker.java b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/security/AuthorizationChecker.java index 75c2456bda..425ffbd75f 100644 --- a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/security/AuthorizationChecker.java +++ b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/security/AuthorizationChecker.java @@ -5,14 +5,14 @@ import java.util.Set; import java.util.UUID; -import com.sap.cloudfoundry.client.facade.CloudCredentials; -import com.sap.cloudfoundry.client.facade.domain.UserRole; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; -import com.sap.cloudfoundry.client.facade.oauth2.TokenFactory; import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.servlet.http.HttpServletRequest; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudCredentials; +import org.cloudfoundry.multiapps.controller.client.facade.domain.UserRole; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.TokenFactory; import org.cloudfoundry.multiapps.controller.core.Messages; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientFactory; import org.cloudfoundry.multiapps.controller.core.cf.clients.CfRolesGetter; diff --git a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/util/BasicTokenGenerator.java b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/util/BasicTokenGenerator.java index d84338f395..b31959b047 100644 --- a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/util/BasicTokenGenerator.java +++ b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/util/BasicTokenGenerator.java @@ -4,10 +4,10 @@ import java.util.Base64; import java.util.Optional; -import com.sap.cloudfoundry.client.facade.CloudCredentials; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; -import com.sap.cloudfoundry.client.facade.oauth2.OAuthClient; -import com.sap.cloudfoundry.client.facade.util.RestUtil; +import org.cloudfoundry.multiapps.controller.client.facade.CloudCredentials; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuthClient; +import org.cloudfoundry.multiapps.controller.client.facade.util.RestUtil; import org.cloudfoundry.multiapps.controller.core.security.token.parsers.TokenParserChain; import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration; import org.cloudfoundry.multiapps.controller.persistence.model.AccessToken; diff --git a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/util/OauthTokenGenerator.java b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/util/OauthTokenGenerator.java index 7a69830e4b..3080cc1738 100644 --- a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/util/OauthTokenGenerator.java +++ b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/util/OauthTokenGenerator.java @@ -5,7 +5,7 @@ import java.time.Instant; import java.util.Optional; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; import org.cloudfoundry.multiapps.controller.core.security.token.parsers.TokenParserChain; import org.cloudfoundry.multiapps.controller.persistence.model.AccessToken; import org.cloudfoundry.multiapps.controller.persistence.services.AccessTokenService; diff --git a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/util/TokenGenerator.java b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/util/TokenGenerator.java index 0004e1bffd..344dd6b22a 100644 --- a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/util/TokenGenerator.java +++ b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/util/TokenGenerator.java @@ -6,7 +6,7 @@ import java.time.LocalDateTime; import java.time.ZoneId; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; import org.cloudfoundry.multiapps.controller.client.util.TokenProperties; import org.cloudfoundry.multiapps.controller.persistence.model.AccessToken; import org.cloudfoundry.multiapps.controller.persistence.model.ImmutableAccessToken; @@ -15,7 +15,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static com.sap.cloudfoundry.client.facade.oauth2.TokenFactory.EXPIRES_AT_KEY; +import static org.cloudfoundry.multiapps.controller.client.facade.oauth2.TokenFactory.EXPIRES_AT_KEY; public abstract class TokenGenerator { diff --git a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/util/TokenReuser.java b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/util/TokenReuser.java index e47f76f850..f96afa95f1 100644 --- a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/util/TokenReuser.java +++ b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/util/TokenReuser.java @@ -7,8 +7,8 @@ import java.util.List; import java.util.Optional; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; import jakarta.inject.Named; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; import org.cloudfoundry.multiapps.controller.persistence.OrderDirection; import org.cloudfoundry.multiapps.controller.persistence.model.AccessToken; import org.cloudfoundry.multiapps.controller.persistence.services.AccessTokenService; diff --git a/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/api/impl/MtasApiServiceImplTest.java b/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/api/impl/MtasApiServiceImplTest.java index ba933ce7e6..bf6ae6f123 100644 --- a/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/api/impl/MtasApiServiceImplTest.java +++ b/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/api/impl/MtasApiServiceImplTest.java @@ -8,8 +8,6 @@ import java.util.stream.Collectors; import com.fasterxml.jackson.core.type.TypeReference; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; import org.cloudfoundry.multiapps.common.ConflictException; import org.cloudfoundry.multiapps.common.NotFoundException; import org.cloudfoundry.multiapps.common.test.TestUtil; @@ -17,6 +15,8 @@ import org.cloudfoundry.multiapps.controller.api.model.Metadata; import org.cloudfoundry.multiapps.controller.api.model.Module; import org.cloudfoundry.multiapps.controller.api.model.Mta; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; import org.cloudfoundry.multiapps.controller.core.auditlogging.MtasApiServiceAuditLog; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientProvider; import org.cloudfoundry.multiapps.controller.core.cf.detect.DeployedMtaRequiredDataOnlyDetector; @@ -109,8 +109,7 @@ void testGetAllMtas() { void testGetMtasByName() { Mta mtaToGet = mtas.get(1); Mockito.when(deployedMtaDetector.detectDeployedMtasByName(mtaToGet.getMetadata() - .getId(), - client)) + .getId(), client)) .thenReturn(List.of(getDeployedMta(mtaToGet))); ResponseEntity> response = testedClass.getMtas(SPACE_GUID, null, mtaToGet.getMetadata() @@ -124,13 +123,11 @@ void testGetMtasByName() { void testGetMtasByNamespace() { Mta mtaToGet = mtas.get(0); Mockito.when(deployedMtaDetector.detectDeployedMtasByNamespace(mtaToGet.getMetadata() - .getNamespace(), - client)) + .getNamespace(), client)) .thenReturn(List.of(getDeployedMta(mtaToGet))); ResponseEntity> response = testedClass.getMtas(SPACE_GUID, mtaToGet.getMetadata() - .getNamespace(), - null); + .getNamespace(), null); assertEquals(HttpStatus.OK, response.getStatusCode()); List responseMtas = response.getBody(); assertEquals(List.of(mtaToGet), responseMtas); @@ -140,16 +137,13 @@ void testGetMtasByNamespace() { void testGetMtasByNameAndNamespace() { Mta mtaToGet = mtas.get(0); Mockito.when(deployedMtaDetector.detectDeployedMtaByNameAndNamespace(mtaToGet.getMetadata() - .getId(), - mtaToGet.getMetadata() - .getNamespace(), - client)) + .getId(), mtaToGet.getMetadata() + .getNamespace(), client)) .thenReturn(Optional.of(getDeployedMta(mtaToGet))); ResponseEntity> response = testedClass.getMtas(SPACE_GUID, mtaToGet.getMetadata() - .getNamespace(), - mtaToGet.getMetadata() - .getId()); + .getNamespace(), mtaToGet.getMetadata() + .getId()); assertEquals(HttpStatus.OK, response.getStatusCode()); List responseMtas = response.getBody(); assertEquals(List.of(mtaToGet), responseMtas); @@ -159,8 +153,7 @@ void testGetMtasByNameAndNamespace() { void testGetMta() { Mta mtaToGet = mtas.get(1); Mockito.when(deployedMtaDetector.detectDeployedMtasByName(mtaToGet.getMetadata() - .getId(), - client)) + .getId(), client)) .thenReturn(List.of(getDeployedMta(mtaToGet))); ResponseEntity response = testedClass.getMta(SPACE_GUID, mtaToGet.getMetadata() diff --git a/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/api/impl/OperationsApiServiceImplTest.java b/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/api/impl/OperationsApiServiceImplTest.java index 33402893ff..aa0d80df7c 100644 --- a/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/api/impl/OperationsApiServiceImplTest.java +++ b/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/api/impl/OperationsApiServiceImplTest.java @@ -9,11 +9,6 @@ import java.util.UUID; import java.util.stream.Collectors; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudOrganization; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudSpace; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; -import com.sap.cloudfoundry.client.facade.rest.CloudSpaceClient; import jakarta.persistence.NoResultException; import jakarta.servlet.http.HttpServletRequest; import org.cloudfoundry.multiapps.common.ContentException; @@ -21,6 +16,11 @@ import org.cloudfoundry.multiapps.controller.api.model.ImmutableOperation; import org.cloudfoundry.multiapps.controller.api.model.Operation; import org.cloudfoundry.multiapps.controller.api.model.ProcessType; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudOrganization; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; +import org.cloudfoundry.multiapps.controller.client.facade.rest.CloudSpaceClient; import org.cloudfoundry.multiapps.controller.client.util.TokenProperties; import org.cloudfoundry.multiapps.controller.core.auditlogging.OperationsApiServiceAuditLog; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientFactory; diff --git a/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/resources/CFExceptionMapperTest.java b/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/resources/CFExceptionMapperTest.java index 836f2b348b..d485ee1610 100644 --- a/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/resources/CFExceptionMapperTest.java +++ b/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/resources/CFExceptionMapperTest.java @@ -1,7 +1,5 @@ package org.cloudfoundry.multiapps.controller.web.resources; -import static org.junit.jupiter.api.Assertions.assertEquals; - import java.sql.SQLException; import java.util.stream.Stream; @@ -11,6 +9,7 @@ import org.cloudfoundry.multiapps.common.NotFoundException; import org.cloudfoundry.multiapps.common.ParsingException; import org.cloudfoundry.multiapps.common.SLException; +import org.cloudfoundry.multiapps.controller.client.facade.CloudOperationException; import org.cloudfoundry.multiapps.controller.web.Messages; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -21,7 +20,7 @@ import org.springframework.web.HttpMediaTypeNotSupportedException; import org.springframework.web.server.ResponseStatusException; -import com.sap.cloudfoundry.client.facade.CloudOperationException; +import static org.junit.jupiter.api.Assertions.assertEquals; class CFExceptionMapperTest { @@ -45,11 +44,9 @@ static Stream testHandleException() { Arguments.of(new ResponseStatusException(HttpStatus.BAD_REQUEST, "Bad request"), new RestResponse(400, "Bad request")), Arguments.of(new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "Something went wrong"), - new RestResponse(500, "Something went wrong")), - Arguments.of(new CloudOperationException(HttpStatus.TOO_MANY_REQUESTS, - HttpStatus.TOO_MANY_REQUESTS.getReasonPhrase(), - "Rate limit exceeded"), - new RestResponse(429, "429 Too Many Requests: Rate limit exceeded")), + new RestResponse(500, "Something went wrong")), Arguments.of( + new CloudOperationException(HttpStatus.TOO_MANY_REQUESTS, HttpStatus.TOO_MANY_REQUESTS.getReasonPhrase(), + "Rate limit exceeded"), new RestResponse(429, "429 Too Many Requests: Rate limit exceeded")), Arguments.of(new HttpMediaTypeNotSupportedException("Not supported content type"), new RestResponse(415, "Not supported content type")), Arguments.of(new IllegalArgumentException("Illegal argument exception"), @@ -64,8 +61,8 @@ static Stream testHandleException() { @ParameterizedTest @MethodSource void testHandleExceptionForCloudOperationExceptionWithAllHttpStatuses(HttpStatus httpStatus) { - ResponseEntity response = exceptionMapper.handleException(new CloudOperationException(httpStatus, - httpStatus.getReasonPhrase())); + ResponseEntity response = exceptionMapper.handleException( + new CloudOperationException(httpStatus, httpStatus.getReasonPhrase())); StringBuilder expectedMessage = new StringBuilder(); expectedMessage.append(httpStatus.value()); expectedMessage.append(" "); diff --git a/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/security/AuthenticationLoaderFilterTest.java b/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/security/AuthenticationLoaderFilterTest.java index 6728ae5c03..66ede8aaaf 100644 --- a/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/security/AuthenticationLoaderFilterTest.java +++ b/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/security/AuthenticationLoaderFilterTest.java @@ -1,13 +1,6 @@ package org.cloudfoundry.multiapps.controller.web.security; -import static com.sap.cloudfoundry.client.facade.oauth2.TokenFactory.EXPIRES_AT_KEY; -import static org.cloudfoundry.multiapps.controller.client.util.TokenProperties.USER_NAME_KEY; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.any; - import java.io.IOException; -import java.text.MessageFormat; import java.time.Duration; import java.time.Instant; import java.util.Map; @@ -18,11 +11,10 @@ import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; - +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration; import org.cloudfoundry.multiapps.controller.web.util.TokenGenerator; import org.cloudfoundry.multiapps.controller.web.util.TokenGeneratorFactory; -import org.cloudfoundry.multiapps.mta.Messages; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -37,7 +29,11 @@ import org.springframework.security.oauth2.core.OAuth2AccessToken; import org.springframework.web.server.ResponseStatusException; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; +import static org.cloudfoundry.multiapps.controller.client.facade.oauth2.TokenFactory.EXPIRES_AT_KEY; +import static org.cloudfoundry.multiapps.controller.client.util.TokenProperties.USER_NAME_KEY; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; class AuthenticationLoaderFilterTest { @@ -67,7 +63,8 @@ void testNonAuthorizedRequest() { ResponseStatusException responseStatusException = assertThrows(ResponseStatusException.class, () -> authenticationLoaderFilter.doFilterInternal(request, response, filterChain)); - assertEquals(HttpStatus.UNAUTHORIZED, HttpStatus.valueOf(responseStatusException.getStatusCode().value())); + assertEquals(HttpStatus.UNAUTHORIZED, HttpStatus.valueOf(responseStatusException.getStatusCode() + .value())); } @Test @@ -83,7 +80,7 @@ void testAuthorizedCall() throws ServletException, IOException { public static Stream testWithInvalidAuthorizationHeaderBasicAuth() { return Stream.of( -// @formatter:off + // @formatter:off Arguments.of("Bearer "), Arguments.of("Basic ") // @formatter:on @@ -95,10 +92,13 @@ public static Stream testWithInvalidAuthorizationHeaderBasicAuth() { void testWithInvalidAuthorizationHeaderBasicAuth(String bearerToken) throws ServletException, IOException { OAuth2AccessTokenWithAdditionalInfo mockedToken = getMockedOAuth2AccessTokenWithAdditionalInfo(); Mockito.when(request.getHeader(HttpHeaders.AUTHORIZATION)) - .thenReturn(bearerToken); + .thenReturn(bearerToken); mockTokenParsingStrategyFactory(mockedToken); - ResponseStatusException responseStatusException = assertThrows(ResponseStatusException.class, () -> authenticationLoaderFilter.doFilterInternal(request, response, filterChain)); - assertEquals(HttpStatus.UNAUTHORIZED, HttpStatus.valueOf(responseStatusException.getStatusCode().value())); + ResponseStatusException responseStatusException = assertThrows(ResponseStatusException.class, + () -> authenticationLoaderFilter.doFilterInternal(request, response, + filterChain)); + assertEquals(HttpStatus.UNAUTHORIZED, HttpStatus.valueOf(responseStatusException.getStatusCode() + .value())); } private OAuth2AccessTokenWithAdditionalInfo getMockedOAuth2AccessTokenWithAdditionalInfo() { diff --git a/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/security/AuthorizationCheckerTest.java b/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/security/AuthorizationCheckerTest.java index 286fca6606..617d3b8bfc 100644 --- a/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/security/AuthorizationCheckerTest.java +++ b/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/security/AuthorizationCheckerTest.java @@ -8,14 +8,14 @@ import java.util.UUID; import java.util.stream.Stream; -import com.sap.cloudfoundry.client.facade.domain.CloudOrganization; -import com.sap.cloudfoundry.client.facade.domain.CloudSpace; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudOrganization; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudSpace; -import com.sap.cloudfoundry.client.facade.domain.UserRole; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; -import com.sap.cloudfoundry.client.facade.rest.CloudSpaceClient; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudOrganization; +import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudMetadata; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudOrganization; +import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudSpace; +import org.cloudfoundry.multiapps.controller.client.facade.domain.UserRole; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; +import org.cloudfoundry.multiapps.controller.client.facade.rest.CloudSpaceClient; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientFactory; import org.cloudfoundry.multiapps.controller.core.cf.clients.CfRolesGetter; import org.cloudfoundry.multiapps.controller.core.cf.clients.WebClientFactory; @@ -185,11 +185,8 @@ private CloudSpace getCloudSpace(CloudOrganization organization) { private UserInfo getUserInfo() { OAuth2AccessTokenWithAdditionalInfo accessToken = new OAuth2AccessTokenWithAdditionalInfo( - new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER, - "token_value", - Instant.now(), - Instant.now() - .plus(5, ChronoUnit.MINUTES)), + new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER, "token_value", Instant.now(), Instant.now() + .plus(5, ChronoUnit.MINUTES)), Collections.emptyMap()); return new UserInfo(USER_ID.toString(), USERNAME, accessToken); } diff --git a/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/util/BasicTokenGeneratorTest.java b/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/util/BasicTokenGeneratorTest.java index 51d8bcf056..945500015f 100644 --- a/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/util/BasicTokenGeneratorTest.java +++ b/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/util/BasicTokenGeneratorTest.java @@ -5,9 +5,9 @@ import java.util.Map; import java.util.Optional; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; -import com.sap.cloudfoundry.client.facade.oauth2.OAuthClient; -import com.sap.cloudfoundry.client.facade.util.RestUtil; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuthClient; +import org.cloudfoundry.multiapps.controller.client.facade.util.RestUtil; import org.cloudfoundry.multiapps.controller.core.security.token.parsers.TokenParserChain; import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration; import org.cloudfoundry.multiapps.controller.persistence.model.AccessToken; @@ -22,8 +22,8 @@ import org.springframework.security.authentication.InternalAuthenticationServiceException; import org.springframework.security.oauth2.core.OAuth2AccessToken; -import static com.sap.cloudfoundry.client.facade.oauth2.TokenFactory.EXPIRES_AT_KEY; -import static com.sap.cloudfoundry.client.facade.oauth2.TokenFactory.USER_NAME; +import static org.cloudfoundry.multiapps.controller.client.facade.oauth2.TokenFactory.EXPIRES_AT_KEY; +import static org.cloudfoundry.multiapps.controller.client.facade.oauth2.TokenFactory.USER_NAME; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; diff --git a/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/util/OauthTokenGeneratorTest.java b/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/util/OauthTokenGeneratorTest.java index 21766bd3a3..829bb593e1 100644 --- a/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/util/OauthTokenGeneratorTest.java +++ b/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/util/OauthTokenGeneratorTest.java @@ -1,19 +1,12 @@ package org.cloudfoundry.multiapps.controller.web.util; -import static com.sap.cloudfoundry.client.facade.oauth2.TokenFactory.EXPIRES_AT_KEY; -import static com.sap.cloudfoundry.client.facade.oauth2.TokenFactory.USER_NAME; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.Mockito.times; - import java.nio.charset.StandardCharsets; import java.time.Duration; import java.time.Instant; import java.util.Map; import java.util.Optional; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; import org.cloudfoundry.multiapps.controller.core.security.token.parsers.TokenParserChain; import org.cloudfoundry.multiapps.controller.persistence.model.AccessToken; import org.cloudfoundry.multiapps.controller.persistence.services.AccessTokenService; @@ -27,7 +20,13 @@ import org.springframework.security.oauth2.core.OAuth2AccessToken; import org.springframework.web.server.ResponseStatusException; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; +import static org.cloudfoundry.multiapps.controller.client.facade.oauth2.TokenFactory.EXPIRES_AT_KEY; +import static org.cloudfoundry.multiapps.controller.client.facade.oauth2.TokenFactory.USER_NAME; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.times; class OauthTokenGeneratorTest { @@ -80,7 +79,7 @@ void testParseTokenWithExpiredToken() { mockTokenParserChain(mockedToken); ResponseStatusException exception = assertThrows(ResponseStatusException.class, () -> oauthTokenParsingStrategy.generate(TOKEN_STRING)); - assertEquals(HttpStatus.UNAUTHORIZED, exception.getStatusCode()); + assertEquals(HttpStatus.UNAUTHORIZED, exception.getStatusCode()); } @Test diff --git a/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/util/TokenReuserTest.java b/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/util/TokenReuserTest.java index cbdf30dc60..2e7f6af1bd 100644 --- a/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/util/TokenReuserTest.java +++ b/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/util/TokenReuserTest.java @@ -8,7 +8,7 @@ import java.util.List; import java.util.Optional; -import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; +import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo; import org.cloudfoundry.multiapps.controller.persistence.model.AccessToken; import org.cloudfoundry.multiapps.controller.persistence.query.AccessTokenQuery; import org.cloudfoundry.multiapps.controller.persistence.services.AccessTokenService; diff --git a/pom.xml b/pom.xml index 932f147f8c..187d6dc69e 100644 --- a/pom.xml +++ b/pom.xml @@ -39,7 +39,8 @@ 2.19.1 4.32.0 5.1.0 - 2.58.0 + 5.14.0.RELEASE + 1.2.8 1.6.16 2.7.0 33.4.8-jre @@ -58,6 +59,7 @@ 3.0.0 2.1.9 1.27.1 + 1.3.1 multiapps-controller-client @@ -164,7 +166,7 @@ - + **/*IntegrationTest random @@ -815,12 +817,19 @@ java-cfenv-jdbc ${java-cfenv.version} - + - com.sap.cloud.lm.sl - cloudfoundry-client-facade + org.cloudfoundry + cloudfoundry-client-reactor ${cloudfoundry-client.version} + + + + io.projectreactor.netty + reactor-netty + ${reactor-netty.version} + org.cloudfoundry.multiapps