From d79aeb5a1661a8bdb41450f3ccebef5d4786a97c Mon Sep 17 00:00:00 2001 From: Guillaume Lamirand Date: Fri, 23 Feb 2024 18:33:49 +0100 Subject: [PATCH] feat: use latest cockpit connector --- .../auth/CockpitAuthenticationResource.java | 36 ++- .../command/CockpitCommandService.java | 8 +- .../command/CockpitCommandServiceImpl.java | 24 +- ...ockpitConnectorCommandHandlersFactory.java | 64 +++++ .../command/adapter/HelloCommandAdapter.java | 158 +++++++++++ .../command/adapter/HelloReplyAdapter.java | 94 +++++++ .../command/bridge/BridgeCommandFactory.java | 92 +++---- .../command/bridge/BridgeCommandHandler.java | 32 +-- .../operation/BridgeOperationHandler.java | 4 +- .../ListEnvironmentOperationHandler.java | 66 ++--- .../ProcessPromotionOperationHandler.java | 76 +++--- .../operation/PromoteApiOperationHandler.java | 82 +++--- .../handler/DeployModelCommandHandler.java | 50 ++-- .../DisableEnvironmentCommandHandler.java | 24 +- .../DisableOrganizationCommandHandler.java | 32 ++- .../handler/EnvironmentCommandHandler.java | 52 ++-- ...andler.java => GoodByeCommandHandler.java} | 39 ++- .../handler/InstallationCommandHandler.java | 40 ++- .../handler/MembershipCommandHandler.java | 84 +++--- .../handler/OrganizationCommandHandler.java | 57 ++-- .../UnlinkInstallationCommandHandler.java | 49 ++-- .../command/handler/UserCommandHandler.java | 107 ++++---- .../command/handler/V4ApiCommandHandler.java | 56 ++-- .../producer/HelloCommandProducer.java | 181 ------------- .../service/cockpit/model/DeploymentMode.java | 14 +- .../services/CockpitPromotionServiceImpl.java | 95 +++---- .../command/CockpitCommandServiceTest.java | 51 ++-- .../adapter/HelloCommandAdapterTest.java | 123 +++++++++ .../adapter/HelloReplyAdapterTest.java | 204 +++++++++++++++ .../bridge/BridgeCommandFactoryTest.java | 36 +-- .../bridge/BridgeCommandHandlerTest.java | 44 ++-- .../ListEnvironmentOperationHandlerTest.java | 73 +++--- .../ProcessPromotionOperationHandlerTest.java | 94 ++++--- .../PromoteApiOperationHandlerTest.java | 113 ++++---- .../DeployModelCommandHandlerTest.java | 207 ++++++++------- .../DisableEnvironmentCommandHandlerTest.java | 17 +- ...DisableOrganizationCommandHandlerTest.java | 16 +- .../EnvironmentCommandHandlerTest.java | 117 +++++---- ...st.java => GoodByeCommandHandlerTest.java} | 33 ++- .../InstallationCommandHandlerTest.java | 36 +-- .../handler/MembershipCommandHandlerTest.java | 111 ++++---- .../OrganizationCommandHandlerTest.java | 108 ++++---- .../UnlinkInstallationCommandHandlerTest.java | 31 ++- .../handler/UserCommandHandlerTest.java | 107 ++++---- .../handler/V4ApiCommandHandlerTest.java | 35 ++- .../producer/HelloCommandProducerTest.java | 245 ------------------ .../services/CockpitPromotionServiceTest.java | 66 ++--- .../service/impl/DashboardServiceTest.java | 12 +- .../api/standalone/GraviteeApisContainer.java | 1 - pom.xml | 4 +- 50 files changed, 1819 insertions(+), 1681 deletions(-) create mode 100644 gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/CockpitConnectorCommandHandlersFactory.java create mode 100644 gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/adapter/HelloCommandAdapter.java create mode 100644 gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/adapter/HelloReplyAdapter.java rename gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/{GoodbyeCommandHandler.java => GoodByeCommandHandler.java} (65%) delete mode 100644 gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/producer/HelloCommandProducer.java create mode 100644 gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/adapter/HelloCommandAdapterTest.java create mode 100644 gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/adapter/HelloReplyAdapterTest.java rename gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/{GoodbyeCommandHandlerTest.java => GoodByeCommandHandlerTest.java} (88%) delete mode 100644 gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/producer/HelloCommandProducerTest.java diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-management/gravitee-apim-rest-api-management-rest/src/main/java/io/gravitee/rest/api/management/rest/resource/auth/CockpitAuthenticationResource.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-management/gravitee-apim-rest-api-management-rest/src/main/java/io/gravitee/rest/api/management/rest/resource/auth/CockpitAuthenticationResource.java index 333d732548e..07f4f345e83 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-management/gravitee-apim-rest-api-management-rest/src/main/java/io/gravitee/rest/api/management/rest/resource/auth/CockpitAuthenticationResource.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-management/gravitee-apim-rest-api-management-rest/src/main/java/io/gravitee/rest/api/management/rest/resource/auth/CockpitAuthenticationResource.java @@ -43,11 +43,15 @@ import jakarta.ws.rs.core.Context; import jakarta.ws.rs.core.Response; import java.io.File; +import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.security.Key; import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; import java.security.cert.Certificate; +import java.security.cert.CertificateException; import java.security.interfaces.RSAPublicKey; import java.util.Optional; import java.util.Set; @@ -170,21 +174,37 @@ public Response tokenExchange(@QueryParam(value = "token") final String token, @ } } - private Key getPublicKey() throws Exception { + private Key getPublicKey() throws CertificateException, KeyStoreException, IOException, NoSuchAlgorithmException { final KeyStore trustStore = loadTrustStore(); - final Certificate cert = trustStore.getCertificate(environment.getProperty("cockpit.keystore.key.alias", "cockpit-client")); + final Certificate cert = trustStore.getCertificate( + getProperty("cockpit.connector.ws.ssl.keystore.key.alias", "cockpit.keystore.key.alias", "cockpit-client") + ); return cert.getPublicKey(); } - private KeyStore loadTrustStore() throws Exception { - final KeyStore keystore = KeyStore.getInstance(environment.getProperty("cockpit.keystore.type")); - - try (InputStream is = new File(environment.getProperty("cockpit.keystore.path")).toURI().toURL().openStream()) { - final String password = environment.getProperty("cockpit.keystore.password"); + private KeyStore loadTrustStore() throws KeyStoreException, IOException, CertificateException, NoSuchAlgorithmException { + final KeyStore keystore = KeyStore.getInstance( + getProperty("cockpit.connector.ws.ssl.keystore.type", "cockpit.keystore.type", null) + ); + + try ( + InputStream is = new File(getProperty("cockpit.connector.ws.ssl.keystore.path", "cockpit.keystore.path", null)) + .toURI() + .toURL() + .openStream() + ) { + final String password = getProperty("cockpit.connector.ws.ssl.keystore.password", "cockpit.keystore.password", null); keystore.load(is, null == password ? null : password.toCharArray()); } - return keystore; } + + private String getProperty(final String property, final String fallback, final String defaultValue) { + String value = environment.getProperty(property); + if (value == null) { + value = environment.getProperty(fallback); + } + return value != null ? value : defaultValue; + } } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/CockpitCommandService.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/CockpitCommandService.java index a2da502b927..00aa9410f27 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/CockpitCommandService.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/CockpitCommandService.java @@ -15,13 +15,9 @@ */ package io.gravitee.rest.api.service.cockpit.command; -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.Payload; -import io.gravitee.cockpit.api.command.Reply; -import io.gravitee.cockpit.api.command.bridge.BridgeCommand; -import io.gravitee.cockpit.api.command.bridge.BridgeReply; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeCommand; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeReply; public interface CockpitCommandService { BridgeReply send(BridgeCommand command); - Reply send(Command command); } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/CockpitCommandServiceImpl.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/CockpitCommandServiceImpl.java index bf2e7f7ede6..edf124b8246 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/CockpitCommandServiceImpl.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/CockpitCommandServiceImpl.java @@ -16,14 +16,8 @@ package io.gravitee.rest.api.service.cockpit.command; import io.gravitee.cockpit.api.CockpitConnector; -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.Payload; -import io.gravitee.cockpit.api.command.Reply; -import io.gravitee.cockpit.api.command.bridge.BridgeCommand; -import io.gravitee.cockpit.api.command.bridge.BridgePayload; -import io.gravitee.cockpit.api.command.bridge.BridgeReply; -import io.gravitee.cockpit.api.command.bridge.BridgeSimpleReply; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeCommand; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeReply; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; @@ -41,20 +35,10 @@ public CockpitCommandServiceImpl( @Override public BridgeReply send(BridgeCommand command) { - return (BridgeReply) send((Command) command); - } - - @Override - public Reply send(Command command) { return cockpitConnector .sendCommand(command) - .onErrorReturn(error -> - new BridgeSimpleReply( - command.getId(), - CommandStatus.ERROR, - error.getMessage() != null ? error.getMessage() : error.toString() - ) - ) + .onErrorReturn(error -> new BridgeReply(command.getId(), error.getMessage() != null ? error.getMessage() : error.toString())) + .cast(BridgeReply.class) .blockingGet(); } } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/CockpitConnectorCommandHandlersFactory.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/CockpitConnectorCommandHandlersFactory.java new file mode 100644 index 00000000000..737f40f7e0d --- /dev/null +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/CockpitConnectorCommandHandlersFactory.java @@ -0,0 +1,64 @@ +/* + * Copyright © 2015 The Gravitee team (http://gravitee.io) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.gravitee.rest.api.service.cockpit.command; + +import io.gravitee.exchange.api.command.Command; +import io.gravitee.exchange.api.command.CommandAdapter; +import io.gravitee.exchange.api.command.CommandHandler; +import io.gravitee.exchange.api.command.Reply; +import io.gravitee.exchange.api.command.ReplyAdapter; +import io.gravitee.exchange.api.connector.ConnectorCommandContext; +import io.gravitee.exchange.api.connector.ConnectorCommandHandlersFactory; +import io.gravitee.exchange.api.websocket.protocol.ProtocolVersion; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +/** + * @author Guillaume LAMIRAND (guillaume.lamirand at graviteesource.com) + * @author GraviteeSource Team + */ +@Component("cockpitConnectorCommandHandlersFactory") +@RequiredArgsConstructor +public class CockpitConnectorCommandHandlersFactory implements ConnectorCommandHandlersFactory { + + private final List, ? extends Reply>> commandHandlers; + private final List, ? extends Command, ? extends Reply>> commandAdapters; + private final List, ? extends Reply>> replyAdapters; + + @Override + public List, ? extends Reply>> buildCommandHandlers( + final ConnectorCommandContext connectorCommandContext + ) { + return commandHandlers; + } + + @Override + public List, ? extends Command, ? extends Reply>> buildCommandAdapters( + final ConnectorCommandContext connectorCommandContext, + final ProtocolVersion protocolVersion + ) { + return commandAdapters; + } + + @Override + public List, ? extends Reply>> buildReplyAdapters( + final ConnectorCommandContext connectorCommandContext, + final ProtocolVersion protocolVersion + ) { + return replyAdapters; + } +} diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/adapter/HelloCommandAdapter.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/adapter/HelloCommandAdapter.java new file mode 100644 index 00000000000..f5bf9ab9bf0 --- /dev/null +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/adapter/HelloCommandAdapter.java @@ -0,0 +1,158 @@ +/* + * Copyright © 2015 The Gravitee team (http://gravitee.io) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.gravitee.rest.api.service.cockpit.command.adapter; + +import io.gravitee.apim.core.cockpit.query_service.CockpitAccessService; +import io.gravitee.apim.core.installation.domain_service.InstallationTypeDomainService; +import io.gravitee.apim.core.installation.model.InstallationType; +import io.gravitee.cockpit.api.CockpitConnector; +import io.gravitee.cockpit.api.command.model.accesspoint.AccessPoint; +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; +import io.gravitee.cockpit.api.command.v1.hello.HelloCommand; +import io.gravitee.cockpit.api.command.v1.hello.HelloCommandPayload; +import io.gravitee.cockpit.api.command.v1.hello.HelloReply; +import io.gravitee.cockpit.api.command.v1.installation.AdditionalInfoConstants; +import io.gravitee.common.util.Version; +import io.gravitee.exchange.api.command.CommandAdapter; +import io.gravitee.node.api.Node; +import io.gravitee.plugin.core.api.PluginRegistry; +import io.gravitee.rest.api.service.InstallationService; +import io.gravitee.rest.api.service.common.GraviteeContext; +import io.reactivex.rxjava3.core.Single; +import jakarta.annotation.PostConstruct; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +/** + * @author Florent CHAMFROY (florent.chamfroy at graviteesource.com) + * @author GraviteeSource Team + */ +@Component +@RequiredArgsConstructor +@Slf4j +public class HelloCommandAdapter implements CommandAdapter { + + private static final String PATH_SUFFIX = "/"; + + @Value("${installation.api.url:http://localhost:8083}") + private String apiURL; + + @Value("${installation.api.proxyPath.management:${http.api.management.entrypoint:${http.api.entrypoint:/}management}}") + private String managementProxyPath; + + @Value("${cockpit.auth.path:/auth/cockpit?token={token}}") + private String authPath; + + @Value("${cockpit.trial:false}") + private boolean cockpitTrial; + + private final Node node; + private final InstallationService installationService; + private final InstallationTypeDomainService installationTypeDomainService; + private final CockpitAccessService cockpitAccessService; + private final PluginRegistry pluginRegistry; + private String buildAuthPath; + + @PostConstruct + public void afterPropertiesSet() { + StringBuilder authPathBuilder = new StringBuilder(managementProxyPath); + if (managementProxyPath.endsWith(PATH_SUFFIX) && authPath.startsWith(PATH_SUFFIX)) { + authPathBuilder.append(authPath.substring(1)); + } else if ( + (managementProxyPath.endsWith(PATH_SUFFIX) && !authPath.startsWith(PATH_SUFFIX)) || + (!managementProxyPath.endsWith(PATH_SUFFIX) && authPath.startsWith(PATH_SUFFIX)) + ) { + authPathBuilder.append(authPath); + } else if (!managementProxyPath.endsWith(PATH_SUFFIX) && !authPath.startsWith(PATH_SUFFIX)) { + authPathBuilder.append(managementProxyPath).append(PATH_SUFFIX).append(authPath); + } + this.buildAuthPath = authPathBuilder.toString(); + } + + @Override + public String supportType() { + return CockpitCommandType.HELLO.name(); + } + + @Override + public Single adapt(final io.gravitee.exchange.api.command.hello.HelloCommand command) { + return Single + .fromCallable(installationService::getOrInitialize) + .map(installation -> { + InstallationType installationType = installationTypeDomainService.get(); + + HelloCommandPayload.HelloCommandPayloadBuilder payloadBuilder = HelloCommandPayload + .builder() + .node( + io.gravitee.cockpit.api.command.model.Node + .builder() + .application(node.application()) + .installationId(installation.getId()) + .hostname(node.hostname()) + .version(Version.RUNTIME_VERSION.MAJOR_VERSION) + .connectorVersion(connectorVersion()) + .build() + ) + .installationType(installationType.getLabel()) + .trial(cockpitTrial) + .defaultOrganizationId(GraviteeContext.getDefaultOrganization()) + .defaultEnvironmentId(GraviteeContext.getDefaultEnvironment()); + Map additionalInformation = new HashMap<>(installation.getAdditionalInformation()); + additionalInformation.put(AdditionalInfoConstants.AUTH_PATH, buildAuthPath); + if (installationType == InstallationType.MULTI_TENANT) { + Map> accessPointTemplates = new EnumMap<>(AccessPoint.Type.class); + cockpitAccessService + .getAccessPointsTemplate() + .forEach((type, accessPoints) -> + accessPointTemplates.put( + AccessPoint.Type.valueOf(type.name()), + accessPoints + .stream() + .map(accessPoint -> + AccessPoint + .builder() + .host(accessPoint.getHost()) + .secured(accessPoint.isSecured()) + .target(AccessPoint.Target.valueOf(accessPoint.getTarget().name())) + .build() + ) + .toList() + ) + ); + payloadBuilder.accessPointsTemplate(accessPointTemplates); + } else { + additionalInformation.put(AdditionalInfoConstants.AUTH_BASE_URL, apiURL); + } + payloadBuilder.additionalInformation(additionalInformation); + return new HelloCommand(payloadBuilder.build()); + }); + } + + private String connectorVersion() { + try { + return this.pluginRegistry.get("cockpit", "cockpit-connectors-ws").manifest().version(); + } catch (Exception e) { + return "unknown"; + } + } +} diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/adapter/HelloReplyAdapter.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/adapter/HelloReplyAdapter.java new file mode 100644 index 00000000000..d04707ae464 --- /dev/null +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/adapter/HelloReplyAdapter.java @@ -0,0 +1,94 @@ +/* + * Copyright © 2015 The Gravitee team (http://gravitee.io) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.gravitee.rest.api.service.cockpit.command.adapter; + +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; +import io.gravitee.cockpit.api.command.v1.hello.HelloReply; +import io.gravitee.exchange.api.command.CommandStatus; +import io.gravitee.exchange.api.command.ReplyAdapter; +import io.gravitee.rest.api.model.EnvironmentEntity; +import io.gravitee.rest.api.model.OrganizationEntity; +import io.gravitee.rest.api.model.UpdateEnvironmentEntity; +import io.gravitee.rest.api.model.UpdateOrganizationEntity; +import io.gravitee.rest.api.service.EnvironmentService; +import io.gravitee.rest.api.service.InstallationService; +import io.gravitee.rest.api.service.OrganizationService; +import io.reactivex.rxjava3.core.Single; +import java.util.Map; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author Florent CHAMFROY (florent.chamfroy at graviteesource.com) + * @author GraviteeSource Team + */ +@Component +@RequiredArgsConstructor +@Slf4j +public class HelloReplyAdapter implements ReplyAdapter { + + private final InstallationService installationService; + private final EnvironmentService environmentService; + private final OrganizationService organizationService; + + @Override + public String supportType() { + return CockpitCommandType.HELLO.name(); + } + + @Override + public Single adapt(final HelloReply reply) { + return Single + .just(reply.getPayload()) + .map(replyPayload -> { + if (reply.getCommandStatus() == CommandStatus.SUCCEEDED) { + final Map additionalInformation = installationService.getOrInitialize().getAdditionalInformation(); + additionalInformation.put(InstallationService.COCKPIT_INSTALLATION_ID, replyPayload.getInstallationId()); + additionalInformation.put(InstallationService.COCKPIT_INSTALLATION_STATUS, replyPayload.getInstallationStatus()); + installationService.setAdditionalInformation(additionalInformation); + + if (replyPayload.getDefaultEnvironmentCockpitId() != null) { + updateDefaultEnvironmentCockpitId(replyPayload.getDefaultEnvironmentCockpitId()); + } + + if (replyPayload.getDefaultOrganizationCockpitId() != null) { + updateDefaultOrganizationCockpitId(replyPayload.getDefaultOrganizationCockpitId()); + } + } + + return new io.gravitee.exchange.api.command.hello.HelloReply(reply.getCommandId(), replyPayload); + }); + } + + private void updateDefaultEnvironmentCockpitId(String defaultEnvironmentCockpitId) { + EnvironmentEntity defaultEnvironment = environmentService.getDefaultOrInitialize(); + + UpdateEnvironmentEntity updateEnvironment = new UpdateEnvironmentEntity(defaultEnvironment); + updateEnvironment.setCockpitId(defaultEnvironmentCockpitId); + + environmentService.createOrUpdate(defaultEnvironment.getOrganizationId(), defaultEnvironment.getId(), updateEnvironment); + } + + private void updateDefaultOrganizationCockpitId(String defaultOrganizationCockpitId) { + OrganizationEntity defaultOrganization = organizationService.getDefaultOrInitialize(); + + UpdateOrganizationEntity updateOrganization = new UpdateOrganizationEntity(defaultOrganization); + updateOrganization.setCockpitId(defaultOrganizationCockpitId); + + organizationService.updateOrganization(defaultOrganization.getId(), updateOrganization); + } +} diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/bridge/BridgeCommandFactory.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/bridge/BridgeCommandFactory.java index b978ad14005..a51f5c5a63c 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/bridge/BridgeCommandFactory.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/bridge/BridgeCommandFactory.java @@ -15,9 +15,8 @@ */ package io.gravitee.rest.api.service.cockpit.command.bridge; -import io.gravitee.cockpit.api.command.bridge.BridgeCommand; -import io.gravitee.cockpit.api.command.bridge.BridgePayload; -import io.gravitee.cockpit.api.command.bridge.BridgeTarget; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeCommand; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeCommandPayload; import io.gravitee.rest.api.service.InstallationService; import io.gravitee.rest.api.service.cockpit.command.bridge.operation.BridgeOperation; import java.util.Collections; @@ -35,15 +34,20 @@ public BridgeCommandFactory(InstallationService installationService) { } public BridgeCommand createListEnvironmentCommand(String organizationId, String environmentId) { - BridgeCommand listEnvironmentCommand = initBridgeCommand(organizationId, environmentId); - - BridgeTarget target = new BridgeTarget(); - target.setScopes(Collections.singletonList(BRIDGE_SCOPE_APIM)); - listEnvironmentCommand.setTarget(target); - - listEnvironmentCommand.setOperation(BridgeOperation.LIST_ENVIRONMENT.name()); - - return listEnvironmentCommand; + BridgeCommandPayload.BridgeTarget target = new BridgeCommandPayload.BridgeTarget( + Collections.singletonList(BRIDGE_SCOPE_APIM), + null + ); + return new BridgeCommand( + BridgeCommandPayload + .builder() + .environmentId(environmentId) + .organizationId(organizationId) + .installationId(installationService.get().getId()) + .operation(BridgeOperation.LIST_ENVIRONMENT.name()) + .target(target) + .build() + ); } public BridgeCommand createPromoteApiCommand( @@ -52,19 +56,21 @@ public BridgeCommand createPromoteApiCommand( String targetEnvironmentId, String serializedPromotion ) { - BridgeCommand createPromoteApiCommand = initBridgeCommand(organizationId, environmentId); - createPromoteApiCommand.setOperation(BridgeOperation.PROMOTE_API.name()); - - BridgePayload payload = new BridgePayload(); - payload.setContent(serializedPromotion); - createPromoteApiCommand.setPayload(payload); - - BridgeTarget target = new BridgeTarget(); - target.setScopes(Collections.singletonList(BRIDGE_SCOPE_APIM)); - target.setEnvironmentId(targetEnvironmentId); - createPromoteApiCommand.setTarget(target); - - return createPromoteApiCommand; + BridgeCommandPayload.BridgeTarget target = new BridgeCommandPayload.BridgeTarget( + Collections.singletonList(BRIDGE_SCOPE_APIM), + targetEnvironmentId + ); + return new BridgeCommand( + BridgeCommandPayload + .builder() + .environmentId(environmentId) + .organizationId(organizationId) + .installationId(installationService.get().getId()) + .operation(BridgeOperation.PROMOTE_API.name()) + .target(target) + .content(serializedPromotion) + .build() + ); } public BridgeCommand createProcessPromotionCommand( @@ -73,26 +79,20 @@ public BridgeCommand createProcessPromotionCommand( String sourceEnvCockpitId, String serializedPromotion ) { - BridgeCommand processPromotionCommand = initBridgeCommand(organizationId, environmentId); - processPromotionCommand.setOperation(BridgeOperation.PROCESS_API_PROMOTION.name()); - - BridgePayload payload = new BridgePayload(); - payload.setContent(serializedPromotion); - processPromotionCommand.setPayload(payload); - - BridgeTarget target = new BridgeTarget(); - target.setScopes(Collections.singletonList(BRIDGE_SCOPE_APIM)); - target.setEnvironmentId(sourceEnvCockpitId); - processPromotionCommand.setTarget(target); - - return processPromotionCommand; - } - - private BridgeCommand initBridgeCommand(String organizationId, String environmentId) { - BridgeCommand command = new BridgeCommand(); - command.setEnvironmentId(environmentId); - command.setOrganizationId(organizationId); - command.setInstallationId(installationService.get().getId()); - return command; + BridgeCommandPayload.BridgeTarget target = new BridgeCommandPayload.BridgeTarget( + Collections.singletonList(BRIDGE_SCOPE_APIM), + sourceEnvCockpitId + ); + return new BridgeCommand( + BridgeCommandPayload + .builder() + .environmentId(environmentId) + .organizationId(organizationId) + .installationId(installationService.get().getId()) + .operation(BridgeOperation.PROCESS_API_PROMOTION.name()) + .target(target) + .content(serializedPromotion) + .build() + ); } } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/bridge/BridgeCommandHandler.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/bridge/BridgeCommandHandler.java index 90c4ae28d94..ce39207a21b 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/bridge/BridgeCommandHandler.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/bridge/BridgeCommandHandler.java @@ -15,17 +15,15 @@ */ package io.gravitee.rest.api.service.cockpit.command.bridge; -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandHandler; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.bridge.BridgeCommand; -import io.gravitee.cockpit.api.command.bridge.BridgeReply; -import io.gravitee.cockpit.api.command.bridge.BridgeSimpleReply; +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeCommand; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeReply; +import io.gravitee.exchange.api.command.CommandHandler; import io.gravitee.rest.api.service.cockpit.command.bridge.operation.BridgeOperationHandler; import io.reactivex.rxjava3.core.Single; import java.util.List; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; /** @@ -33,10 +31,10 @@ * @author GraviteeSource Team */ @Component +@RequiredArgsConstructor +@Slf4j public class BridgeCommandHandler implements CommandHandler { - private final Logger logger = LoggerFactory.getLogger(BridgeCommandHandler.class); - private List operationHandlers; public BridgeCommandHandler(List operationHandlers) { @@ -44,15 +42,15 @@ public BridgeCommandHandler(List operationHandlers) { } @Override - public Command.Type handleType() { - return Command.Type.BRIDGE_COMMAND; + public String supportType() { + return CockpitCommandType.BRIDGE.name(); } @Override public Single handle(BridgeCommand command) { return operationHandlers .stream() - .filter(handle -> handle.canHandle(command.getOperation())) + .filter(handle -> handle.canHandle(command.getPayload().operation())) .findFirst() .orElse(noOperationHandler) .handle(command); @@ -66,13 +64,9 @@ public boolean canHandle(String bridgeOperation) { @Override public Single handle(BridgeCommand command) { - logger.warn("No handler found for this operation {} ", command.getOperation()); + log.warn("No handler found for this operation {} ", command.getPayload().operation()); return Single.just( - new BridgeSimpleReply( - command.getId(), - CommandStatus.ERROR, - "No handler found for this operation: " + command.getOperation() - ) + new BridgeReply(command.getId(), "No handler found for this operation: " + command.getPayload().operation()) ); } }; diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/BridgeOperationHandler.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/BridgeOperationHandler.java index 10b9290014d..a68207c9c5a 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/BridgeOperationHandler.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/BridgeOperationHandler.java @@ -15,8 +15,8 @@ */ package io.gravitee.rest.api.service.cockpit.command.bridge.operation; -import io.gravitee.cockpit.api.command.bridge.BridgeCommand; -import io.gravitee.cockpit.api.command.bridge.BridgeReply; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeCommand; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeReply; import io.reactivex.rxjava3.core.Single; public interface BridgeOperationHandler { diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/ListEnvironmentOperationHandler.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/ListEnvironmentOperationHandler.java index 815f8957dc9..28b3bb67eba 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/ListEnvironmentOperationHandler.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/ListEnvironmentOperationHandler.java @@ -17,42 +17,28 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.bridge.BridgeCommand; -import io.gravitee.cockpit.api.command.bridge.BridgeMultiReply; -import io.gravitee.cockpit.api.command.bridge.BridgeReply; -import io.gravitee.cockpit.api.command.bridge.BridgeSimpleReply; -import io.gravitee.rest.api.model.EnvironmentEntity; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeCommand; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeReply; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeReplyPayload; import io.gravitee.rest.api.service.EnvironmentService; import io.gravitee.rest.api.service.InstallationService; import io.gravitee.rest.api.service.exceptions.TechnicalManagementException; import io.reactivex.rxjava3.core.Single; import java.util.List; import java.util.Objects; -import java.util.stream.Collectors; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +@RequiredArgsConstructor @Component +@Slf4j public class ListEnvironmentOperationHandler implements BridgeOperationHandler { - private final Logger logger = LoggerFactory.getLogger(ListEnvironmentOperationHandler.class); - private final EnvironmentService environmentService; private final InstallationService installationService; private final ObjectMapper objectMapper; - public ListEnvironmentOperationHandler( - EnvironmentService environmentService, - InstallationService installationService, - ObjectMapper objectMapper - ) { - this.environmentService = environmentService; - this.installationService = installationService; - this.objectMapper = objectMapper; - } - @Override public boolean canHandle(String bridgeOperation) { return Objects.equals(BridgeOperation.LIST_ENVIRONMENT.name(), bridgeOperation); @@ -60,37 +46,29 @@ public boolean canHandle(String bridgeOperation) { @Override public Single handle(BridgeCommand bridgeCommand) { - BridgeMultiReply multiReply = new BridgeMultiReply(); - multiReply.setCommandId(bridgeCommand.getId()); + String organizationId = bridgeCommand.getPayload().organizationId(); try { - final List managedEnvironments = - this.environmentService.findByOrganization(bridgeCommand.getOrganizationId()); - multiReply.setCommandStatus(CommandStatus.SUCCEEDED); - multiReply.setReplies( - managedEnvironments + List replyContents = + this.environmentService.findByOrganization(organizationId) .stream() .map(environmentEntity -> { - BridgeSimpleReply simpleReply = new BridgeSimpleReply(); - simpleReply.setCommandId(bridgeCommand.getId()); - simpleReply.setCommandStatus(CommandStatus.SUCCEEDED); - simpleReply.setOrganizationId(environmentEntity.getOrganizationId()); - simpleReply.setEnvironmentId(environmentEntity.getId()); - simpleReply.setInstallationId(installationService.get().getId()); + BridgeReplyPayload.BridgeReplyContent.BridgeReplyContentBuilder builder = BridgeReplyPayload.BridgeReplyContent + .builder() + .environmentId(environmentEntity.getId()) + .organizationId(environmentEntity.getOrganizationId()) + .installationId(installationService.get().getId()); try { - simpleReply.setPayload(objectMapper.writeValueAsString(environmentEntity)); + return builder.content(objectMapper.writeValueAsString(environmentEntity)).build(); } catch (JsonProcessingException e) { - logger.warn("Problem while serializing environment {}", environmentEntity.getId()); - simpleReply.setMessage("Problem while serializing environment: " + environmentEntity.getId()); - simpleReply.setCommandStatus(CommandStatus.ERROR); + log.warn("Problem while serializing environment {}", environmentEntity.getId()); + return builder.error(true).build(); } - return simpleReply; }) - .collect(Collectors.toList()) - ); + .filter(Objects::nonNull) + .toList(); + return Single.just(new BridgeReply(bridgeCommand.getId(), new BridgeReplyPayload(replyContents))); } catch (TechnicalManagementException ex) { - multiReply.setCommandStatus(CommandStatus.ERROR); - multiReply.setMessage("No environment available for organization: " + bridgeCommand.getOrganizationId()); + return Single.just(new BridgeReply(bridgeCommand.getId(), "No environment available for organization: " + organizationId)); } - return Single.just(multiReply); } } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/ProcessPromotionOperationHandler.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/ProcessPromotionOperationHandler.java index 199eabadc4d..646fce49d25 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/ProcessPromotionOperationHandler.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/ProcessPromotionOperationHandler.java @@ -17,17 +17,18 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.bridge.BridgeCommand; -import io.gravitee.cockpit.api.command.bridge.BridgeReply; -import io.gravitee.cockpit.api.command.bridge.BridgeSimpleReply; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeCommand; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeCommandPayload; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeReply; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeReplyPayload; import io.gravitee.rest.api.model.promotion.PromotionEntity; import io.gravitee.rest.api.service.InstallationService; import io.gravitee.rest.api.service.promotion.PromotionService; import io.reactivex.rxjava3.core.Single; +import java.util.List; import java.util.Objects; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; /** @@ -35,24 +36,14 @@ * @author GraviteeSource Team */ @Component +@Slf4j +@RequiredArgsConstructor public class ProcessPromotionOperationHandler implements BridgeOperationHandler { - private final Logger logger = LoggerFactory.getLogger(ProcessPromotionOperationHandler.class); - private final PromotionService promotionService; private final InstallationService installationService; private final ObjectMapper objectMapper; - public ProcessPromotionOperationHandler( - PromotionService promotionService, - InstallationService installationService, - ObjectMapper objectMapper - ) { - this.promotionService = promotionService; - this.installationService = installationService; - this.objectMapper = objectMapper; - } - @Override public boolean canHandle(String bridgeOperation) { return Objects.equals(BridgeOperation.PROCESS_API_PROMOTION.name(), bridgeOperation); @@ -60,36 +51,41 @@ public boolean canHandle(String bridgeOperation) { @Override public Single handle(BridgeCommand bridgeCommand) { - BridgeSimpleReply reply = new BridgeSimpleReply(); - reply.setCommandId(bridgeCommand.getId()); - final PromotionEntity promotionEntity; try { - promotionEntity = objectMapper.readValue(bridgeCommand.getPayload().getContent(), PromotionEntity.class); + promotionEntity = objectMapper.readValue(bridgeCommand.getPayload().content(), PromotionEntity.class); } catch (JsonProcessingException e) { - logger.warn("Problem while deserializing promotion for environment {}", bridgeCommand.getEnvironmentId()); - reply.setCommandStatus(CommandStatus.ERROR); - reply.setMessage("Problem while deserializing promotion for environment [" + bridgeCommand.getEnvironmentId() + "]"); - return Single.just(reply); + String errorDetails = + "Problem while deserializing promotion for environment [%s]".formatted(bridgeCommand.getPayload().environmentId()); + log.warn(errorDetails, e); + return Single.just(new BridgeReply(bridgeCommand.getId(), errorDetails)); } - PromotionEntity promotion = promotionService.createOrUpdate(promotionEntity); - - reply.setCommandStatus(CommandStatus.SUCCEEDED); - reply.setOrganizationId(bridgeCommand.getOrganizationId()); - reply.setEnvironmentId(bridgeCommand.getTarget().getEnvironmentId()); - reply.setInstallationId(installationService.get().getId()); - try { - reply.setPayload(objectMapper.writeValueAsString(promotion)); + PromotionEntity promotion = promotionService.createOrUpdate(promotionEntity); + BridgeCommandPayload commandPayload = bridgeCommand.getPayload(); + return Single.just( + new BridgeReply( + bridgeCommand.getId(), + new BridgeReplyPayload( + List.of( + BridgeReplyPayload.BridgeReplyContent + .builder() + .environmentId(commandPayload.target().environmentId()) + .organizationId(commandPayload.organizationId()) + .installationId(installationService.get().getId()) + .content(objectMapper.writeValueAsString(promotion)) + .build() + ) + ) + ) + ); } catch (JsonProcessingException e) { - logger.warn("Problem while serializing promotion for environment {}", promotion.getId()); - reply.setCommandStatus(CommandStatus.ERROR); - reply.setMessage("Problem while serializing promotion for environment [" + bridgeCommand.getEnvironmentId() + "]"); - return Single.just(reply); + String errorDetails = + "Problem while serializing promotion for environment [%s]".formatted(bridgeCommand.getPayload().environmentId()); + log.warn(errorDetails); + return Single.just(new BridgeReply(bridgeCommand.getId(), errorDetails)); } - - return Single.just(reply); } } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/PromoteApiOperationHandler.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/PromoteApiOperationHandler.java index 7a65ee51d15..c84b36765a4 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/PromoteApiOperationHandler.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/PromoteApiOperationHandler.java @@ -17,17 +17,22 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.bridge.BridgeCommand; -import io.gravitee.cockpit.api.command.bridge.BridgeReply; -import io.gravitee.cockpit.api.command.bridge.BridgeSimpleReply; +import io.gravitee.cockpit.api.command.legacy.bridge.BridgeSimpleReply; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeCommand; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeCommandPayload; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeReply; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeReplyPayload; +import io.gravitee.exchange.api.command.CommandStatus; import io.gravitee.rest.api.model.promotion.PromotionEntity; import io.gravitee.rest.api.model.promotion.PromotionEntityStatus; import io.gravitee.rest.api.service.InstallationService; import io.gravitee.rest.api.service.promotion.PromotionService; import io.reactivex.rxjava3.core.Single; import io.reactivex.rxjava3.schedulers.Schedulers; +import java.util.List; import java.util.Objects; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @@ -37,24 +42,14 @@ * @author GraviteeSource Team */ @Component +@Slf4j +@RequiredArgsConstructor public class PromoteApiOperationHandler implements BridgeOperationHandler { - private final Logger logger = LoggerFactory.getLogger(PromoteApiOperationHandler.class); - private final PromotionService promotionService; private final InstallationService installationService; private final ObjectMapper objectMapper; - public PromoteApiOperationHandler( - PromotionService promotionService, - InstallationService installationService, - ObjectMapper objectMapper - ) { - this.promotionService = promotionService; - this.installationService = installationService; - this.objectMapper = objectMapper; - } - @Override public boolean canHandle(String bridgeOperation) { return Objects.equals(BridgeOperation.PROMOTE_API.name(), bridgeOperation); @@ -62,18 +57,17 @@ public boolean canHandle(String bridgeOperation) { @Override public Single handle(BridgeCommand bridgeCommand) { - BridgeSimpleReply reply = new BridgeSimpleReply(); - reply.setCommandId(bridgeCommand.getId()); + BridgeCommandPayload commandPayload = bridgeCommand.getPayload(); final PromotionEntity promotionEntity; try { - promotionEntity = objectMapper.readValue(bridgeCommand.getPayload().getContent(), PromotionEntity.class); + promotionEntity = objectMapper.readValue(commandPayload.content(), PromotionEntity.class); } catch (JsonProcessingException e) { - logger.warn("Problem while deserializing promotion request for environment {}", bridgeCommand.getEnvironmentId()); - reply.setCommandStatus(CommandStatus.ERROR); - reply.setMessage("Problem while deserializing promotion request for environment [" + bridgeCommand.getEnvironmentId() + "]"); - return Single.just(reply); + String errorDetails = + "Problem while deserializing promotion request for environment [%s]".formatted(commandPayload.environmentId()); + log.warn(errorDetails, e); + return Single.just(new BridgeReply(bridgeCommand.getId(), errorDetails)); } promotionEntity.setStatus(PromotionEntityStatus.TO_BE_VALIDATED); @@ -82,27 +76,37 @@ public Single handle(BridgeCommand bridgeCommand) { .fromCallable(() -> promotionService.createOrUpdate(promotionEntity)) .subscribeOn(Schedulers.io()) .map(promotion -> { - reply.setCommandStatus(CommandStatus.SUCCEEDED); - reply.setOrganizationId(bridgeCommand.getOrganizationId()); - reply.setEnvironmentId(bridgeCommand.getTarget().getEnvironmentId()); - reply.setInstallationId(installationService.get().getId()); - try { - reply.setPayload(objectMapper.writeValueAsString(promotion)); - } catch (JsonProcessingException e) { - logger.warn("Problem while serializing promotion request for environment {}", promotion.getId()); - reply.setCommandStatus(CommandStatus.ERROR); - reply.setMessage( - "Problem while serializing promotion request for environment [" + bridgeCommand.getEnvironmentId() + "]" + return new BridgeReply( + bridgeCommand.getId(), + new BridgeReplyPayload( + List.of( + BridgeReplyPayload.BridgeReplyContent + .builder() + .environmentId(commandPayload.target().environmentId()) + .organizationId(commandPayload.organizationId()) + .installationId(installationService.get().getId()) + .content(objectMapper.writeValueAsString(promotion)) + .build() + ) + ) ); + } catch (JsonProcessingException e) { + String errorDetails = + "Problem while serializing promotion request for environment [%s]".formatted( + bridgeCommand.getPayload().environmentId() + ); + log.warn(errorDetails); + return new BridgeReply(bridgeCommand.getId(), errorDetails); } - return (BridgeReply) reply; }) .onErrorReturn(throwable -> { - logger.warn("Problem while creating or updating promotion for environment {}", bridgeCommand.getEnvironmentId()); - reply.setCommandStatus(CommandStatus.ERROR); - reply.setMessage("Problem while creating or updating promotion for environment [" + bridgeCommand.getEnvironmentId() + "]"); - return reply; + String errorDetails = + "Problem while serializing promotion request for environment [%s]".formatted( + bridgeCommand.getPayload().environmentId() + ); + log.warn(errorDetails); + return new BridgeReply(bridgeCommand.getId(), errorDetails); }); } } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/DeployModelCommandHandler.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/DeployModelCommandHandler.java index 0bdecad43ff..4eb1058a4f5 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/DeployModelCommandHandler.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/DeployModelCommandHandler.java @@ -17,12 +17,11 @@ import static io.gravitee.rest.api.service.common.SecurityContextHelper.authenticateAs; -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandHandler; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.designer.DeployModelCommand; -import io.gravitee.cockpit.api.command.designer.DeployModelPayload; -import io.gravitee.cockpit.api.command.designer.DeployModelReply; +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; +import io.gravitee.cockpit.api.command.v1.designer.DeployModelCommand; +import io.gravitee.cockpit.api.command.v1.designer.DeployModelCommandPayload; +import io.gravitee.cockpit.api.command.v1.designer.DeployModelReply; +import io.gravitee.exchange.api.command.CommandHandler; import io.gravitee.rest.api.model.EnvironmentEntity; import io.gravitee.rest.api.model.UserEntity; import io.gravitee.rest.api.model.api.ApiEntityResult; @@ -59,20 +58,20 @@ public class DeployModelCommandHandler implements CommandHandler handle(DeployModelCommand command) { - DeployModelPayload payload = command.getPayload(); + DeployModelCommandPayload payload = command.getPayload(); - String apiCrossId = payload.getModelId(); - String userId = payload.getUserId(); - String swaggerDefinition = payload.getSwaggerDefinition(); - String environmentId = payload.getEnvironmentId(); + String apiCrossId = payload.modelId(); + String userId = payload.userId(); + String swaggerDefinition = payload.swaggerDefinition(); + String environmentId = payload.environmentId(); DeploymentMode mode = DeploymentMode.fromDeployModelPayload(payload); - List labels = payload.getLabels(); + List labels = payload.labels(); try { final EnvironmentEntity environment = getEnvironment(environmentId); @@ -98,9 +97,7 @@ public Single handle(DeployModelCommand command) { ); if (message.isPresent()) { - var reply = new DeployModelReply(command.getId(), CommandStatus.FAILED); - reply.setMessage(message.get()); - return Single.just(reply); + return Single.just(new DeployModelReply(command.getId(), message.get())); } result = @@ -122,9 +119,7 @@ public Single handle(DeployModelCommand command) { ); if (message.isPresent()) { - var reply = new DeployModelReply(command.getId(), CommandStatus.FAILED); - reply.setMessage(message.get()); - return Single.just(reply); + return Single.just(new DeployModelReply(command.getId(), message.get())); } result = @@ -141,16 +136,15 @@ public Single handle(DeployModelCommand command) { if (result.isSuccess()) { logger.info("Api imported [{}].", result.getApi().getId()); - - return Single.just(new DeployModelReply(command.getId(), CommandStatus.SUCCEEDED)); + return Single.just(new DeployModelReply(command.getId())); } - logger.error("Failed to import API [{}].", result.getErrorMessage()); - var reply = new DeployModelReply(command.getId(), CommandStatus.FAILED); - reply.setMessage(result.getErrorMessage()); - return Single.just(reply); + String errorDetails = "Failed to import API [%s].".formatted(result.getErrorMessage()); + logger.error(errorDetails); + return Single.just(new DeployModelReply(command.getId(), errorDetails)); } catch (Exception e) { - logger.error("Error occurred when importing api [{}].", payload.getModelId(), e); - return Single.just(new DeployModelReply(command.getId(), CommandStatus.ERROR)); + String errorDetails = "Error occurred when importing api [%s]".formatted(payload.modelId()); + logger.error(errorDetails, e); + return Single.just(new DeployModelReply(command.getId(), errorDetails)); } } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/DisableEnvironmentCommandHandler.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/DisableEnvironmentCommandHandler.java index 02b1d732ccf..3b332de1118 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/DisableEnvironmentCommandHandler.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/DisableEnvironmentCommandHandler.java @@ -17,10 +17,10 @@ import io.gravitee.apim.core.access_point.crud_service.AccessPointCrudService; import io.gravitee.apim.core.access_point.model.AccessPoint; -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandHandler; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.environment.*; +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; +import io.gravitee.cockpit.api.command.v1.environment.DisableEnvironmentCommand; +import io.gravitee.cockpit.api.command.v1.environment.DisableEnvironmentReply; +import io.gravitee.exchange.api.command.CommandHandler; import io.gravitee.repository.management.api.ApiRepository; import io.gravitee.repository.management.api.search.ApiCriteria; import io.gravitee.repository.management.api.search.ApiFieldFilter; @@ -31,7 +31,6 @@ import io.gravitee.rest.api.service.configuration.identity.IdentityProviderActivationService; import io.gravitee.rest.api.service.v4.ApiStateService; import io.reactivex.rxjava3.core.Single; -import java.util.List; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; @@ -61,8 +60,8 @@ public DisableEnvironmentCommandHandler( } @Override - public Command.Type handleType() { - return Command.Type.DISABLE_ENVIRONMENT_COMMAND; + public String supportType() { + return CockpitCommandType.DISABLE_ENVIRONMENT.name(); } @Override @@ -70,7 +69,7 @@ public Single handle(DisableEnvironmentCommand command) var payload = command.getPayload(); try { - var environment = environmentService.findByCockpitId(payload.getCockpitId()); + var environment = environmentService.findByCockpitId(payload.cockpitId()); var executionContext = new ExecutionContext(environment); // Stop all Environment APIs @@ -79,7 +78,7 @@ public Single handle(DisableEnvironmentCommand command) new ApiCriteria.Builder().state(LifecycleState.STARTED).environmentId(environment.getId()).build(), new ApiFieldFilter.Builder().excludeDefinition().excludePicture().build() ) - .forEach(api -> apiStateService.stop(executionContext, api.getId(), payload.getUserId())); + .forEach(api -> apiStateService.stop(executionContext, api.getId(), payload.userId())); // Delete related access points this.accessPointService.deleteAccessPoints(AccessPoint.ReferenceType.ENVIRONMENT, environment.getId()); @@ -94,10 +93,11 @@ public Single handle(DisableEnvironmentCommand command) ); log.info("Environment [{}] with id [{}] has been disabled.", environment.getName(), environment.getId()); - return Single.just(new DisableEnvironmentReply(command.getId(), CommandStatus.SUCCEEDED)); + return Single.just(new DisableEnvironmentReply(command.getId())); } catch (Exception e) { - log.error("Error occurred when disabling environment [{}] with id [{}].", payload.getName(), payload.getId(), e); - return Single.just(new DisableEnvironmentReply(command.getId(), CommandStatus.ERROR)); + String errorDetails = "Error occurred when disabling environment [%s] with id [%s].".formatted(payload.name(), payload.id()); + log.error(errorDetails, e); + return Single.just(new DisableEnvironmentReply(command.getId(), errorDetails)); } } } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/DisableOrganizationCommandHandler.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/DisableOrganizationCommandHandler.java index aa53820dc6c..f14cb73fb6b 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/DisableOrganizationCommandHandler.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/DisableOrganizationCommandHandler.java @@ -17,17 +17,15 @@ import io.gravitee.apim.core.access_point.crud_service.AccessPointCrudService; import io.gravitee.apim.core.access_point.model.AccessPoint; -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandHandler; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.organization.DisableOrganizationCommand; -import io.gravitee.cockpit.api.command.organization.DisableOrganizationReply; +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; +import io.gravitee.cockpit.api.command.v1.organization.DisableOrganizationCommand; +import io.gravitee.cockpit.api.command.v1.organization.DisableOrganizationReply; +import io.gravitee.exchange.api.command.CommandHandler; import io.gravitee.rest.api.model.configuration.identity.IdentityProviderActivationReferenceType; import io.gravitee.rest.api.service.OrganizationService; import io.gravitee.rest.api.service.common.ExecutionContext; import io.gravitee.rest.api.service.configuration.identity.IdentityProviderActivationService; import io.reactivex.rxjava3.core.Single; -import java.util.List; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -50,15 +48,15 @@ public DisableOrganizationCommandHandler( } @Override - public Command.Type handleType() { - return Command.Type.DISABLE_ORGANIZATION_COMMAND; + public String supportType() { + return CockpitCommandType.DISABLE_ORGANIZATION.name(); } @Override public Single handle(DisableOrganizationCommand command) { var organizationPayload = command.getPayload(); try { - var organization = organizationService.findByCockpitId(organizationPayload.getCockpitId()); + var organization = organizationService.findByCockpitId(organizationPayload.cockpitId()); // Delete related access points this.accessPointService.deleteAccessPoints(AccessPoint.ReferenceType.ORGANIZATION, organization.getId()); @@ -75,15 +73,15 @@ public Single handle(DisableOrganizationCommand comman ); log.info("Organization [{}] with id [{}] has been disabled.", organization.getName(), organization.getId()); - return Single.just(new DisableOrganizationReply(command.getId(), CommandStatus.SUCCEEDED)); + return Single.just(new DisableOrganizationReply(command.getId())); } catch (Exception e) { - log.error( - "Error occurred when disabling organization [{}] with id [{}].", - organizationPayload.getName(), - organizationPayload.getId(), - e - ); - return Single.just(new DisableOrganizationReply(command.getId(), CommandStatus.ERROR)); + String errorDetails = + "Error occurred when disabling organization [%s] with id [%s].".formatted( + organizationPayload.name(), + organizationPayload.id() + ); + log.error(errorDetails, e); + return Single.just(new DisableOrganizationReply(command.getId(), errorDetails)); } } } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/EnvironmentCommandHandler.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/EnvironmentCommandHandler.java index 27a0a1c2382..76cc2ae3d86 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/EnvironmentCommandHandler.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/EnvironmentCommandHandler.java @@ -16,13 +16,12 @@ package io.gravitee.rest.api.service.cockpit.command.handler; import io.gravitee.apim.core.access_point.crud_service.AccessPointCrudService; -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandHandler; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.environment.EnvironmentCommand; -import io.gravitee.cockpit.api.command.environment.EnvironmentPayload; -import io.gravitee.cockpit.api.command.environment.EnvironmentReply; -import io.gravitee.repository.management.model.Environment; +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; +import io.gravitee.cockpit.api.command.v1.environment.EnvironmentCommand; +import io.gravitee.cockpit.api.command.v1.environment.EnvironmentCommandPayload; +import io.gravitee.cockpit.api.command.v1.environment.EnvironmentReply; +import io.gravitee.exchange.api.command.CommandHandler; +import io.gravitee.exchange.api.command.CommandStatus; import io.gravitee.rest.api.model.EnvironmentEntity; import io.gravitee.rest.api.model.UpdateEnvironmentEntity; import io.gravitee.rest.api.service.EnvironmentService; @@ -47,33 +46,33 @@ public class EnvironmentCommandHandler implements CommandHandler handle(EnvironmentCommand command) { - EnvironmentPayload environmentPayload = command.getPayload(); + EnvironmentCommandPayload environmentPayload = command.getPayload(); try { EnvironmentEntity existingEnvironment = this.getEnvironment(environmentPayload); UpdateEnvironmentEntity newEnvironment = new UpdateEnvironmentEntity(); - newEnvironment.setCockpitId(environmentPayload.getCockpitId()); - newEnvironment.setHrids(environmentPayload.getHrids()); - newEnvironment.setName(environmentPayload.getName()); - newEnvironment.setDescription(environmentPayload.getDescription()); + newEnvironment.setCockpitId(environmentPayload.cockpitId()); + newEnvironment.setHrids(environmentPayload.hrids()); + newEnvironment.setName(environmentPayload.name()); + newEnvironment.setDescription(environmentPayload.description()); final EnvironmentEntity environment = environmentService.createOrUpdate( - existingEnvironment != null ? existingEnvironment.getOrganizationId() : environmentPayload.getOrganizationId(), - existingEnvironment != null ? existingEnvironment.getId() : environmentPayload.getId(), + existingEnvironment != null ? existingEnvironment.getOrganizationId() : environmentPayload.organizationId(), + existingEnvironment != null ? existingEnvironment.getId() : environmentPayload.id(), newEnvironment ); List accessPointsToCreate; - if (environmentPayload.getAccessPoints() != null) { + if (environmentPayload.accessPoints() != null) { accessPointsToCreate = environmentPayload - .getAccessPoints() + .accessPoints() .stream() .map(cockpitAccessPoint -> io.gravitee.apim.core.access_point.model.AccessPoint @@ -100,21 +99,18 @@ public Single handle(EnvironmentCommand command) { accessPointsToCreate ); log.info("Environment [{}] handled with id [{}].", environment.getName(), environment.getId()); - return Single.just(new EnvironmentReply(command.getId(), CommandStatus.SUCCEEDED)); + return Single.just(new EnvironmentReply(command.getId())); } catch (Exception e) { - log.error( - "Error occurred when handling environment [{}] with id [{}].", - environmentPayload.getName(), - environmentPayload.getId(), - e - ); - return Single.just(new EnvironmentReply(command.getId(), CommandStatus.ERROR)); + String errorDetails = + "Error occurred when handling environment [%s] with id [%s]".formatted(environmentPayload.name(), environmentPayload.id()); + log.error(errorDetails, e); + return Single.just(new EnvironmentReply(command.getId(), errorDetails)); } } - private EnvironmentEntity getEnvironment(EnvironmentPayload environmentPayload) { + private EnvironmentEntity getEnvironment(EnvironmentCommandPayload environmentPayload) { try { - return this.environmentService.findByCockpitId(environmentPayload.getCockpitId()); + return this.environmentService.findByCockpitId(environmentPayload.cockpitId()); } catch (EnvironmentNotFoundException ex) { return null; } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/GoodbyeCommandHandler.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/GoodByeCommandHandler.java similarity index 65% rename from gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/GoodbyeCommandHandler.java rename to gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/GoodByeCommandHandler.java index effb934e75a..1e2bd166a7b 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/GoodbyeCommandHandler.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/GoodByeCommandHandler.java @@ -15,11 +15,10 @@ */ package io.gravitee.rest.api.service.cockpit.command.handler; -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandHandler; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.goodbye.GoodbyeCommand; -import io.gravitee.cockpit.api.command.goodbye.GoodbyeReply; +import io.gravitee.exchange.api.command.CommandHandler; +import io.gravitee.exchange.api.command.goodbye.GoodByeCommand; +import io.gravitee.exchange.api.command.goodbye.GoodByeReply; +import io.gravitee.exchange.api.command.goodbye.GoodByeReplyPayload; import io.gravitee.rest.api.model.promotion.PromotionEntityStatus; import io.gravitee.rest.api.model.promotion.PromotionQuery; import io.gravitee.rest.api.service.InstallationService; @@ -27,8 +26,8 @@ import io.reactivex.rxjava3.core.Single; import java.util.List; import java.util.Map; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; /** @@ -36,26 +35,21 @@ * @author GraviteeSource Team */ @Component -public class GoodbyeCommandHandler implements CommandHandler { +@RequiredArgsConstructor +@Slf4j +public class GoodByeCommandHandler implements CommandHandler { static final String DELETED_STATUS = "DELETED"; - private final Logger logger = LoggerFactory.getLogger(GoodbyeCommandHandler.class); - private final InstallationService installationService; private final PromotionService promotionService; - public GoodbyeCommandHandler(final InstallationService installationService, PromotionService promotionService) { - this.installationService = installationService; - this.promotionService = promotionService; - } - @Override - public Command.Type handleType() { - return Command.Type.GOODBYE_COMMAND; + public String supportType() { + return GoodByeCommand.COMMAND_TYPE; } @Override - public Single handle(GoodbyeCommand command) { + public Single handle(GoodByeCommand command) { final Map additionalInformation = this.installationService.getOrInitialize().getAdditionalInformation(); additionalInformation.put(InstallationService.COCKPIT_INSTALLATION_STATUS, DELETED_STATUS); @@ -63,11 +57,12 @@ public Single handle(GoodbyeCommand command) { try { this.installationService.setAdditionalInformation(additionalInformation); - logger.info("Installation status is [{}].", DELETED_STATUS); - return Single.just(new GoodbyeReply(command.getId(), CommandStatus.SUCCEEDED)); + log.info("Installation status is [{}].", DELETED_STATUS); + return Single.just(new GoodByeReply(command.getId(), new GoodByeReplyPayload())); } catch (Exception ex) { - logger.info("Error occurred when deleting installation.", ex); - return Single.just(new GoodbyeReply(command.getId(), CommandStatus.ERROR)); + String errorDetails = "Error occurred when deleting installation."; + log.info(errorDetails, ex); + return Single.just(new GoodByeReply(command.getId(), errorDetails)); } } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/InstallationCommandHandler.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/InstallationCommandHandler.java index 7b929ae9dcf..201a6fd5da4 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/InstallationCommandHandler.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/InstallationCommandHandler.java @@ -15,17 +15,16 @@ */ package io.gravitee.rest.api.service.cockpit.command.handler; -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandHandler; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.installation.InstallationCommand; -import io.gravitee.cockpit.api.command.installation.InstallationPayload; -import io.gravitee.cockpit.api.command.installation.InstallationReply; +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; +import io.gravitee.cockpit.api.command.v1.installation.InstallationCommand; +import io.gravitee.cockpit.api.command.v1.installation.InstallationCommandPayload; +import io.gravitee.cockpit.api.command.v1.installation.InstallationReply; +import io.gravitee.exchange.api.command.CommandHandler; import io.gravitee.rest.api.service.InstallationService; import io.reactivex.rxjava3.core.Single; import java.util.Map; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; /** @@ -33,34 +32,31 @@ * @author GraviteeSource Team */ @Component +@Slf4j +@RequiredArgsConstructor public class InstallationCommandHandler implements CommandHandler { - private final Logger logger = LoggerFactory.getLogger(InstallationCommandHandler.class); - private final InstallationService installationService; - public InstallationCommandHandler(InstallationService installationService) { - this.installationService = installationService; - } - @Override - public Command.Type handleType() { - return Command.Type.INSTALLATION_COMMAND; + public String supportType() { + return CockpitCommandType.INSTALLATION.name(); } @Override public Single handle(InstallationCommand command) { - InstallationPayload installationPayload = command.getPayload(); + InstallationCommandPayload installationPayload = command.getPayload(); final Map additionalInformation = this.installationService.getOrInitialize().getAdditionalInformation(); - additionalInformation.put(InstallationService.COCKPIT_INSTALLATION_STATUS, installationPayload.getStatus()); + additionalInformation.put(InstallationService.COCKPIT_INSTALLATION_STATUS, installationPayload.status()); try { this.installationService.setAdditionalInformation(additionalInformation); - logger.info("Installation status is [{}].", installationPayload.getStatus()); - return Single.just(new InstallationReply(command.getId(), CommandStatus.SUCCEEDED)); + log.info("Installation status is [{}].", installationPayload.status()); + return Single.just(new InstallationReply(command.getId())); } catch (Exception ex) { - logger.info("Error occurred when updating installation status.", ex); - return Single.just(new InstallationReply(command.getId(), CommandStatus.ERROR)); + String errorDetails = "Error occurred when updating installation status."; + log.info(errorDetails, ex); + return Single.just(new InstallationReply(command.getId(), errorDetails)); } } } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/MembershipCommandHandler.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/MembershipCommandHandler.java index 9bb05aa98de..3e6ac852f18 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/MembershipCommandHandler.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/MembershipCommandHandler.java @@ -17,12 +17,11 @@ import static io.gravitee.rest.api.service.cockpit.command.handler.UserCommandHandler.COCKPIT_SOURCE; -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandHandler; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.membership.MembershipCommand; -import io.gravitee.cockpit.api.command.membership.MembershipPayload; -import io.gravitee.cockpit.api.command.membership.MembershipReply; +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; +import io.gravitee.cockpit.api.command.v1.membership.MembershipCommand; +import io.gravitee.cockpit.api.command.v1.membership.MembershipCommandPayload; +import io.gravitee.cockpit.api.command.v1.membership.MembershipReply; +import io.gravitee.exchange.api.command.CommandHandler; import io.gravitee.rest.api.model.MembershipMemberType; import io.gravitee.rest.api.model.MembershipReferenceType; import io.gravitee.rest.api.model.RoleEntity; @@ -36,8 +35,8 @@ import io.reactivex.rxjava3.core.Single; import java.util.Collections; import java.util.Optional; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; /** @@ -45,56 +44,51 @@ * @author GraviteeSource Team */ @Component +@RequiredArgsConstructor +@Slf4j public class MembershipCommandHandler implements CommandHandler { - private final Logger logger = LoggerFactory.getLogger(MembershipCommandHandler.class); - private final UserService userService; private final RoleService roleService; private final MembershipService membershipService; - public MembershipCommandHandler(UserService userService, RoleService roleService, MembershipService membershipService) { - this.userService = userService; - this.roleService = roleService; - this.membershipService = membershipService; - } - @Override - public Command.Type handleType() { - return Command.Type.MEMBERSHIP_COMMAND; + public String supportType() { + return CockpitCommandType.MEMBERSHIP.name(); } @Override public Single handle(MembershipCommand command) { - MembershipPayload membershipPayload = command.getPayload(); + MembershipCommandPayload membershipPayload = command.getPayload(); try { RoleScope roleScope; MembershipReferenceType membershipReferenceType; try { - roleScope = RoleScope.valueOf(membershipPayload.getReferenceType()); - membershipReferenceType = MembershipReferenceType.valueOf(membershipPayload.getReferenceType()); + roleScope = RoleScope.valueOf(membershipPayload.referenceType()); + membershipReferenceType = MembershipReferenceType.valueOf(membershipPayload.referenceType()); } catch (Exception e) { - logger.error("Invalid referenceType [{}].", membershipPayload.getReferenceType()); - return Single.just(new MembershipReply(command.getId(), CommandStatus.ERROR)); + String errorDetails = "Invalid referenceType [%s].".formatted(membershipPayload.referenceType()); + log.error(errorDetails, e); + return Single.just(new MembershipReply(command.getId(), errorDetails)); } ExecutionContext executionContext = new ExecutionContext( - membershipPayload.getOrganizationId(), - membershipReferenceType.equals(MembershipReferenceType.ENVIRONMENT) ? membershipPayload.getReferenceId() : null + membershipPayload.organizationId(), + membershipReferenceType.equals(MembershipReferenceType.ENVIRONMENT) ? membershipPayload.referenceId() : null ); final UserEntity userEntity = userService.findBySource( executionContext.getOrganizationId(), COCKPIT_SOURCE, - membershipPayload.getUserId(), + membershipPayload.userId(), false ); - final RoleEntity roleEntity = findRole(executionContext.getOrganizationId(), roleScope, membershipPayload.getRole()); + final RoleEntity roleEntity = findRole(executionContext.getOrganizationId(), roleScope, membershipPayload.role()); final MembershipService.MembershipReference membershipReference = new MembershipService.MembershipReference( membershipReferenceType, - membershipPayload.getReferenceId() + membershipPayload.referenceId() ); final MembershipService.MembershipMember membershipMember = new MembershipService.MembershipMember( userEntity.getId(), @@ -115,26 +109,26 @@ public Single handle(MembershipCommand command) { false ); - logger.info( + log.info( "Role [{}] assigned on {} [{}] for user [{}] and organization [{}].", - membershipPayload.getRole(), - membershipPayload.getReferenceType(), - membershipPayload.getReferenceId(), + membershipPayload.role(), + membershipPayload.referenceType(), + membershipPayload.referenceId(), userEntity.getId(), - membershipPayload.getOrganizationId() + membershipPayload.organizationId() ); - return Single.just(new MembershipReply(command.getId(), CommandStatus.SUCCEEDED)); + return Single.just(new MembershipReply(command.getId())); } catch (Exception e) { - logger.error( - "Error occurred when trying to assign role [{}] on {} [{}] for cockpit user [{}] and organization [{}].", - membershipPayload.getRole(), - membershipPayload.getReferenceType(), - membershipPayload.getReferenceId(), - membershipPayload.getUserId(), - membershipPayload.getOrganizationId(), - e - ); - return Single.just(new MembershipReply(command.getId(), CommandStatus.ERROR)); + String errorDetails = + "Error occurred when trying to assign role [%s] on %s [%s] for cockpit user [%s] and organization [%s].".formatted( + membershipPayload.role(), + membershipPayload.referenceType(), + membershipPayload.referenceId(), + membershipPayload.userId(), + membershipPayload.organizationId() + ); + log.error(errorDetails, e); + return Single.just(new MembershipReply(command.getId(), errorDetails)); } } @@ -147,7 +141,7 @@ private RoleEntity findRole(String organizationId, RoleScope roleScope, String r final Optional role = roleService.findByScopeAndName(roleScope, mappedRoleName, organizationId); - if (!role.isPresent()) { + if (role.isEmpty()) { throw new RoleNotFoundException(roleScope, mappedRoleName); } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/OrganizationCommandHandler.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/OrganizationCommandHandler.java index 379b387eacc..e4fb824ce62 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/OrganizationCommandHandler.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/OrganizationCommandHandler.java @@ -18,12 +18,11 @@ import io.gravitee.apim.core.access_point.crud_service.AccessPointCrudService; import io.gravitee.apim.core.license.domain_service.LicenseDomainService; import io.gravitee.apim.core.license.model.License; -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandHandler; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.organization.OrganizationCommand; -import io.gravitee.cockpit.api.command.organization.OrganizationPayload; -import io.gravitee.cockpit.api.command.organization.OrganizationReply; +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; +import io.gravitee.cockpit.api.command.v1.organization.OrganizationCommand; +import io.gravitee.cockpit.api.command.v1.organization.OrganizationCommandPayload; +import io.gravitee.cockpit.api.command.v1.organization.OrganizationReply; +import io.gravitee.exchange.api.command.CommandHandler; import io.gravitee.rest.api.model.OrganizationEntity; import io.gravitee.rest.api.model.UpdateOrganizationEntity; import io.gravitee.rest.api.service.OrganizationService; @@ -50,39 +49,39 @@ public class OrganizationCommandHandler implements CommandHandler handle(OrganizationCommand command) { - OrganizationPayload organizationPayload = command.getPayload(); + OrganizationCommandPayload organizationPayload = command.getPayload(); try { final OrganizationEntity organization = createOrUpdateOrganization(organizationPayload); - handleLicense(organization, command.getPayload().getLicense()); + handleLicense(organization, command.getPayload().license()); handleAccessPoints(organizationPayload, organization); log.info("Organization [{}] handled with id [{}].", organization.getName(), organization.getId()); - return Single.just(new OrganizationReply(command.getId(), CommandStatus.SUCCEEDED)); + return Single.just(new OrganizationReply(command.getId())); } catch (Exception e) { - log.error( - "Error occurred when handling organization [{}] with id [{}].", - organizationPayload.getName(), - organizationPayload.getId(), - e - ); - return Single.just(new OrganizationReply(command.getId(), CommandStatus.ERROR)); + String errorDetails = + "Error occurred when handling organization [%s] with id [%s].".formatted( + organizationPayload.name(), + organizationPayload.id() + ); + log.error(errorDetails, e); + return Single.just(new OrganizationReply(command.getId(), errorDetails)); } } - private void handleAccessPoints(OrganizationPayload organizationPayload, OrganizationEntity organization) { + private void handleAccessPoints(OrganizationCommandPayload organizationPayload, OrganizationEntity organization) { List accessPointsToCreate; - if (organizationPayload.getAccessPoints() != null) { + if (organizationPayload.accessPoints() != null) { accessPointsToCreate = organizationPayload - .getAccessPoints() + .accessPoints() .stream() .map(cockpitAccessPoint -> io.gravitee.apim.core.access_point.model.AccessPoint @@ -112,23 +111,23 @@ private void handleLicense(OrganizationEntity organization, String license) { organizationLicenseService.createOrUpdateOrganizationLicense(organization.getId(), license); } - private OrganizationEntity createOrUpdateOrganization(OrganizationPayload organizationPayload) { + private OrganizationEntity createOrUpdateOrganization(OrganizationCommandPayload organizationPayload) { String organizationId = this.getOrganizationId(organizationPayload); UpdateOrganizationEntity newOrganization = new UpdateOrganizationEntity(); - newOrganization.setCockpitId(organizationPayload.getCockpitId()); - newOrganization.setHrids(organizationPayload.getHrids()); - newOrganization.setName(organizationPayload.getName()); - newOrganization.setDescription(organizationPayload.getDescription()); + newOrganization.setCockpitId(organizationPayload.cockpitId()); + newOrganization.setHrids(organizationPayload.hrids()); + newOrganization.setName(organizationPayload.name()); + newOrganization.setDescription(organizationPayload.description()); return organizationService.createOrUpdate(organizationId, newOrganization); } - private String getOrganizationId(OrganizationPayload organizationPayload) { + private String getOrganizationId(OrganizationCommandPayload organizationPayload) { try { - OrganizationEntity byCockpitId = this.organizationService.findByCockpitId(organizationPayload.getCockpitId()); + OrganizationEntity byCockpitId = this.organizationService.findByCockpitId(organizationPayload.cockpitId()); return byCockpitId.getId(); } catch (OrganizationNotFoundException ex) { - return organizationPayload.getId(); + return organizationPayload.id(); } } } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/UnlinkInstallationCommandHandler.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/UnlinkInstallationCommandHandler.java index 236c7a30d5a..9f317abeccc 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/UnlinkInstallationCommandHandler.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/UnlinkInstallationCommandHandler.java @@ -17,67 +17,58 @@ import io.gravitee.apim.core.access_point.crud_service.AccessPointCrudService; import io.gravitee.apim.core.access_point.model.AccessPoint; -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandHandler; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.installation.*; +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; +import io.gravitee.cockpit.api.command.v1.installation.UnlinkInstallationCommand; +import io.gravitee.cockpit.api.command.v1.installation.UnlinkInstallationCommandPayload; +import io.gravitee.cockpit.api.command.v1.installation.UnlinkInstallationReply; +import io.gravitee.exchange.api.command.CommandHandler; import io.gravitee.rest.api.model.EnvironmentEntity; import io.gravitee.rest.api.model.OrganizationEntity; import io.gravitee.rest.api.service.EnvironmentService; import io.gravitee.rest.api.service.OrganizationService; import io.reactivex.rxjava3.core.Single; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @Component +@Slf4j +@RequiredArgsConstructor public class UnlinkInstallationCommandHandler implements CommandHandler { - private final Logger logger = LoggerFactory.getLogger(UnlinkInstallationCommandHandler.class); - private final OrganizationService organizationService; private final EnvironmentService environmentService; private final AccessPointCrudService accessPointService; - public UnlinkInstallationCommandHandler( - OrganizationService organizationService, - EnvironmentService environmentService, - AccessPointCrudService accessPointService - ) { - this.organizationService = organizationService; - this.environmentService = environmentService; - this.accessPointService = accessPointService; - } - @Override - public Command.Type handleType() { - return Command.Type.UNLINK_INSTALLATION_COMMAND; + public String supportType() { + return CockpitCommandType.UNLINK_INSTALLATION.name(); } @Override public Single handle(UnlinkInstallationCommand command) { - UnlinkInstallationPayload unlinkInstallationPayload = command.getPayload(); + UnlinkInstallationCommandPayload unlinkInstallationPayload = command.getPayload(); try { - if (unlinkInstallationPayload.getOrganizationCockpitId() != null) { + if (unlinkInstallationPayload.organizationCockpitId() != null) { OrganizationEntity organization = - this.organizationService.findByCockpitId(unlinkInstallationPayload.getOrganizationCockpitId()); + this.organizationService.findByCockpitId(unlinkInstallationPayload.organizationCockpitId()); this.accessPointService.deleteAccessPoints(AccessPoint.ReferenceType.ORGANIZATION, organization.getId()); } - if (unlinkInstallationPayload.getEnvironmentCockpitId() != null) { - EnvironmentEntity environment = - this.environmentService.findByCockpitId(unlinkInstallationPayload.getEnvironmentCockpitId()); + if (unlinkInstallationPayload.environmentCockpitId() != null) { + EnvironmentEntity environment = this.environmentService.findByCockpitId(unlinkInstallationPayload.environmentCockpitId()); this.accessPointService.deleteAccessPoints( io.gravitee.apim.core.access_point.model.AccessPoint.ReferenceType.ENVIRONMENT, environment.getId() ); } - return Single.just(new UnlinkInstallationReply(command.getId(), CommandStatus.SUCCEEDED)); + return Single.just(new UnlinkInstallationReply(command.getId())); } catch (Exception ex) { - logger.info("Error occurred when unlink installation.", ex); - return Single.just(new UnlinkInstallationReply(command.getId(), CommandStatus.ERROR)); + String errorDetails = "Error occurred when unlink installation."; + log.info(errorDetails, ex); + return Single.just(new UnlinkInstallationReply(command.getId(), errorDetails)); } } } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/UserCommandHandler.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/UserCommandHandler.java index 07f9f6b01db..6439a2b7a97 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/UserCommandHandler.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/UserCommandHandler.java @@ -18,12 +18,11 @@ import static io.gravitee.rest.api.model.configuration.identity.SocialIdentityProviderEntity.UserProfile.PICTURE; import static io.gravitee.rest.api.model.configuration.identity.SocialIdentityProviderEntity.UserProfile.SUB; -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandHandler; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.user.UserCommand; -import io.gravitee.cockpit.api.command.user.UserPayload; -import io.gravitee.cockpit.api.command.user.UserReply; +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; +import io.gravitee.cockpit.api.command.v1.user.UserCommand; +import io.gravitee.cockpit.api.command.v1.user.UserCommandPayload; +import io.gravitee.cockpit.api.command.v1.user.UserReply; +import io.gravitee.exchange.api.command.CommandHandler; import io.gravitee.rest.api.model.NewExternalUserEntity; import io.gravitee.rest.api.model.UpdateUserEntity; import io.gravitee.rest.api.model.UserEntity; @@ -32,8 +31,8 @@ import io.gravitee.rest.api.service.exceptions.UserNotFoundException; import io.reactivex.rxjava3.core.Single; import java.util.HashMap; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; /** @@ -41,90 +40,82 @@ * @author GraviteeSource Team */ @Component +@Slf4j +@RequiredArgsConstructor public class UserCommandHandler implements CommandHandler { public static final String COCKPIT_SOURCE = "cockpit"; - private final Logger logger = LoggerFactory.getLogger(UserCommandHandler.class); private final UserService userService; - public UserCommandHandler(UserService userService) { - this.userService = userService; - } - @Override - public Command.Type handleType() { - return Command.Type.USER_COMMAND; + public String supportType() { + return CockpitCommandType.USER.name(); } @Override public Single handle(UserCommand command) { - UserPayload userPayload = command.getPayload(); - ExecutionContext executionContext = new ExecutionContext(userPayload.getOrganizationId(), null); + UserCommandPayload userPayload = command.getPayload(); + ExecutionContext executionContext = new ExecutionContext(userPayload.organizationId(), null); try { - final UserEntity existingUser = userService.findBySource( - userPayload.getOrganizationId(), - COCKPIT_SOURCE, - userPayload.getId(), - false - ); + final UserEntity existingUser = userService.findBySource(userPayload.organizationId(), COCKPIT_SOURCE, userPayload.id(), false); UpdateUserEntity updatedUser = new UpdateUserEntity(); - updatedUser.setFirstname(userPayload.getFirstName()); - updatedUser.setLastname(userPayload.getLastName()); - updatedUser.setEmail(userPayload.getEmail()); - updatedUser.setPicture(userPayload.getPicture()); + updatedUser.setFirstname(userPayload.firstName()); + updatedUser.setLastname(userPayload.lastName()); + updatedUser.setEmail(userPayload.email()); + updatedUser.setPicture(userPayload.picture()); updatedUser.setCustomFields(new HashMap<>()); - if (userPayload.getAdditionalInformation() != null) { - updatedUser.getCustomFields().putAll(userPayload.getAdditionalInformation()); + if (userPayload.additionalInformation() != null) { + updatedUser.getCustomFields().putAll(userPayload.additionalInformation()); } - updatedUser.getCustomFields().computeIfAbsent(PICTURE, k -> userPayload.getPicture()); - updatedUser.getCustomFields().computeIfAbsent(SUB, k -> userPayload.getUsername()); + updatedUser.getCustomFields().computeIfAbsent(PICTURE, k -> userPayload.picture()); + updatedUser.getCustomFields().computeIfAbsent(SUB, k -> userPayload.username()); UserEntity cockpitUserEntity = userService.update(executionContext, existingUser.getId(), updatedUser); - logger.info("User [{}] with APIM id [{}] updated.", userPayload.getUsername(), cockpitUserEntity.getId()); + log.info("User [{}] with APIM id [{}] updated.", userPayload.username(), cockpitUserEntity.getId()); - return Single.just(new UserReply(command.getId(), CommandStatus.SUCCEEDED)); + return Single.just(new UserReply(command.getId())); } catch (UserNotFoundException unfe) { NewExternalUserEntity newUser = new NewExternalUserEntity(); - newUser.setSourceId(userPayload.getId()); - newUser.setFirstname(userPayload.getFirstName()); - newUser.setLastname(userPayload.getLastName()); - newUser.setEmail(userPayload.getEmail()); - newUser.setPicture(userPayload.getPicture()); + newUser.setSourceId(userPayload.id()); + newUser.setFirstname(userPayload.firstName()); + newUser.setLastname(userPayload.lastName()); + newUser.setEmail(userPayload.email()); + newUser.setPicture(userPayload.picture()); newUser.setSource(COCKPIT_SOURCE); newUser.setCustomFields(new HashMap<>()); - if (userPayload.getAdditionalInformation() != null) { - newUser.getCustomFields().putAll(userPayload.getAdditionalInformation()); + if (userPayload.additionalInformation() != null) { + newUser.getCustomFields().putAll(userPayload.additionalInformation()); } - newUser.getCustomFields().computeIfAbsent(PICTURE, k -> userPayload.getPicture()); - newUser.getCustomFields().computeIfAbsent(SUB, k -> userPayload.getUsername()); + newUser.getCustomFields().computeIfAbsent(PICTURE, k -> userPayload.picture()); + newUser.getCustomFields().computeIfAbsent(SUB, k -> userPayload.username()); try { UserEntity cockpitUserEntity = userService.create(executionContext, newUser, false); - logger.info("User [{}] created with APIM id [{}].", userPayload.getUsername(), cockpitUserEntity.getId()); - return Single.just(new UserReply(command.getId(), CommandStatus.SUCCEEDED)); + log.info("User [{}] created with APIM id [{}].", userPayload.username(), cockpitUserEntity.getId()); + return Single.just(new UserReply(command.getId())); } catch (Exception e) { - logger.info( - "Error occurred when creating user [{}] for organization [{}].", - userPayload.getUsername(), - userPayload.getOrganizationId(), - e - ); - return Single.just(new UserReply(command.getId(), CommandStatus.ERROR)); + String errorDetails = + "Error occurred when creating user [%s] for organization [%s].".formatted( + userPayload.username(), + userPayload.organizationId() + ); + log.error(errorDetails, e); + return Single.just(new UserReply(command.getId(), errorDetails)); } } catch (Exception e) { - logger.info( - "Error occurred when updating user [{}] for organization [{}].", - userPayload.getUsername(), - userPayload.getOrganizationId(), - e - ); - return Single.just(new UserReply(command.getId(), CommandStatus.ERROR)); + String errorDetails = + "Error occurred when updating user [%s] for organization [%s].".formatted( + userPayload.username(), + userPayload.organizationId() + ); + log.error(errorDetails, e); + return Single.just(new UserReply(command.getId(), errorDetails)); } } } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/V4ApiCommandHandler.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/V4ApiCommandHandler.java index 98b2821aa52..609d9a9e98c 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/V4ApiCommandHandler.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/V4ApiCommandHandler.java @@ -18,19 +18,18 @@ import static io.gravitee.rest.api.service.common.SecurityContextHelper.authenticateAs; import com.fasterxml.jackson.core.JsonProcessingException; -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandHandler; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.v4api.V4ApiCommand; -import io.gravitee.cockpit.api.command.v4api.V4ApiPayload; -import io.gravitee.cockpit.api.command.v4api.V4ApiReply; +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; +import io.gravitee.cockpit.api.command.v1.v4api.V4ApiCommand; +import io.gravitee.cockpit.api.command.v1.v4api.V4ApiCommandPayload; +import io.gravitee.cockpit.api.command.v1.v4api.V4ApiReply; +import io.gravitee.cockpit.api.command.v1.v4api.V4ApiReplyPayload; +import io.gravitee.exchange.api.command.CommandHandler; import io.gravitee.rest.api.model.UserEntity; import io.gravitee.rest.api.service.UserService; import io.gravitee.rest.api.service.cockpit.services.V4ApiServiceCockpit; -import io.gravitee.rest.api.service.common.GraviteeContext; import io.reactivex.rxjava3.core.Single; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; /** @@ -38,46 +37,43 @@ * @author GraviteeSource Team */ @Component +@Slf4j +@RequiredArgsConstructor public class V4ApiCommandHandler implements CommandHandler { - private final Logger logger = LoggerFactory.getLogger(V4ApiCommandHandler.class); - private final V4ApiServiceCockpit v4ApiServiceCockpit; private final UserService userService; - public V4ApiCommandHandler(V4ApiServiceCockpit v4ApiServiceCockpit, UserService userService) { - this.v4ApiServiceCockpit = v4ApiServiceCockpit; - this.userService = userService; - } - @Override - public Command.Type handleType() { - return Command.Type.V4_API_COMMAND; + public String supportType() { + return CockpitCommandType.V4_API.name(); } @Override public Single handle(V4ApiCommand command) { - final V4ApiPayload payload = command.getPayload(); - final UserEntity user = userService.findBySource(payload.getOrganizationId(), "cockpit", payload.getUserId(), true); + final V4ApiCommandPayload payload = command.getPayload(); + final UserEntity user = userService.findBySource(payload.organizationId(), "cockpit", payload.userId(), true); authenticateAs(user); try { return v4ApiServiceCockpit - .createPublishApi(payload.getOrganizationId(), payload.getEnvironmentId(), user.getId(), payload.getApiDefinition()) + .createPublishApi(payload.organizationId(), payload.environmentId(), user.getId(), payload.apiDefinition()) .flatMap(apiEntity -> { - final V4ApiReply reply = new V4ApiReply(command.getId(), CommandStatus.SUCCEEDED); - reply.setApiId(apiEntity.getId()); - reply.setApiName(apiEntity.getName()); - reply.setApiVersion(apiEntity.getApiVersion()); - logger.info("Api {} successfully created.", apiEntity.getName()); + final V4ApiReplyPayload v4ApiReplyPayload = V4ApiReplyPayload + .builder() + .apiId(apiEntity.getId()) + .apiName(apiEntity.getName()) + .apiVersion(apiEntity.getApiVersion()) + .build(); + log.info("Api {} successfully created.", apiEntity.getName()); - return Single.just(reply); + return Single.just(new V4ApiReply(command.getId(), v4ApiReplyPayload)); }); } catch (JsonProcessingException exception) { - logger.error("An error occurred while creating Api.", exception); - - return Single.just(new V4ApiReply(command.getId(), CommandStatus.FAILED)); + String errorDetails = "An error occurred while creating Api."; + log.error(errorDetails, exception); + return Single.just(new V4ApiReply(command.getId(), errorDetails)); } } } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/producer/HelloCommandProducer.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/producer/HelloCommandProducer.java deleted file mode 100644 index 9ef5bc31885..00000000000 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/producer/HelloCommandProducer.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright © 2015 The Gravitee team (http://gravitee.io) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.gravitee.rest.api.service.cockpit.command.producer; - -import io.gravitee.apim.core.cockpit.query_service.CockpitAccessService; -import io.gravitee.apim.core.installation.domain_service.InstallationTypeDomainService; -import io.gravitee.apim.core.installation.model.InstallationType; -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandProducer; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.accesspoint.AccessPoint; -import io.gravitee.cockpit.api.command.hello.HelloCommand; -import io.gravitee.cockpit.api.command.hello.HelloReply; -import io.gravitee.cockpit.api.command.installation.AdditionalInfoConstants; -import io.gravitee.node.api.Node; -import io.gravitee.rest.api.model.EnvironmentEntity; -import io.gravitee.rest.api.model.InstallationEntity; -import io.gravitee.rest.api.model.OrganizationEntity; -import io.gravitee.rest.api.model.UpdateEnvironmentEntity; -import io.gravitee.rest.api.model.UpdateOrganizationEntity; -import io.gravitee.rest.api.service.EnvironmentService; -import io.gravitee.rest.api.service.InstallationService; -import io.gravitee.rest.api.service.OrganizationService; -import io.gravitee.rest.api.service.common.GraviteeContext; -import io.reactivex.rxjava3.core.Single; -import jakarta.annotation.PostConstruct; -import java.util.EnumMap; -import java.util.List; -import java.util.Map; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -/** - * @author Florent CHAMFROY (florent.chamfroy at graviteesource.com) - * @author GraviteeSource Team - */ -@Component("cockpitHelloCommandProducer") -@RequiredArgsConstructor -@Slf4j -public class HelloCommandProducer implements CommandProducer { - - private static final String PATH_SUFFIX = "/"; - - @Value("${installation.api.url:http://localhost:8083}") - private String apiURL; - - @Value("${installation.api.proxyPath.management:${http.api.management.entrypoint:${http.api.entrypoint:/}management}}") - private String managementProxyPath; - - @Value("${cockpit.auth.path:/auth/cockpit?token={token}}") - private String authPath; - - @Value("${cockpit.trial:false}") - private boolean cockpitTrial; - - private final Node node; - private final InstallationService installationService; - private final EnvironmentService environmentService; - private final OrganizationService organizationService; - private final InstallationTypeDomainService installationTypeDomainService; - private final CockpitAccessService cockpitAccessService; - - private String buildAuthPath; - - @PostConstruct - public void afterPropertiesSet() { - StringBuilder authPathBuilder = new StringBuilder(managementProxyPath); - if (managementProxyPath.endsWith(PATH_SUFFIX) && authPath.startsWith(PATH_SUFFIX)) { - authPathBuilder.append(authPath.substring(1)); - } else if ( - (managementProxyPath.endsWith(PATH_SUFFIX) && !authPath.startsWith(PATH_SUFFIX)) || - (!managementProxyPath.endsWith(PATH_SUFFIX) && authPath.startsWith(PATH_SUFFIX)) - ) { - authPathBuilder.append(authPath); - } else if (!managementProxyPath.endsWith(PATH_SUFFIX) && !authPath.startsWith(PATH_SUFFIX)) { - authPathBuilder.append(managementProxyPath).append(PATH_SUFFIX).append(authPath); - } - this.buildAuthPath = authPathBuilder.toString(); - } - - @Override - public Command.Type produceType() { - return Command.Type.HELLO_COMMAND; - } - - @Override - public Single prepare(HelloCommand command) { - final InstallationEntity installation = installationService.getOrInitialize(); - - command.getPayload().getNode().setInstallationId(installation.getId()); - command.getPayload().getNode().setHostname(node.hostname()); - command.getPayload().getAdditionalInformation().putAll(installation.getAdditionalInformation()); - - InstallationType installationType = installationTypeDomainService.get(); - command.getPayload().setInstallationType(installationType.getLabel()); - command.getPayload().setTrial(cockpitTrial); - command.getPayload().getAdditionalInformation().put(AdditionalInfoConstants.AUTH_PATH, buildAuthPath); - if (installationType == InstallationType.MULTI_TENANT) { - Map> accessPointTemplates = new EnumMap<>(AccessPoint.Type.class); - cockpitAccessService - .getAccessPointsTemplate() - .forEach((type, accessPoints) -> - accessPointTemplates.put( - AccessPoint.Type.valueOf(type.name()), - accessPoints - .stream() - .map(accessPoint -> - AccessPoint - .builder() - .host(accessPoint.getHost()) - .secured(accessPoint.isSecured()) - .target(AccessPoint.Target.valueOf(accessPoint.getTarget().name())) - .build() - ) - .toList() - ) - ); - command.getPayload().setAccessPointsTemplate(accessPointTemplates); - } else { - command.getPayload().getAdditionalInformation().put(AdditionalInfoConstants.AUTH_BASE_URL, apiURL); - } - - command.getPayload().setDefaultOrganizationId(GraviteeContext.getDefaultOrganization()); - command.getPayload().setDefaultEnvironmentId(GraviteeContext.getDefaultEnvironment()); - - return Single.just(command); - } - - @Override - public Single handleReply(HelloReply reply) { - if (reply.getCommandStatus() == CommandStatus.SUCCEEDED) { - final Map additionalInformation = installationService.getOrInitialize().getAdditionalInformation(); - additionalInformation.put(InstallationService.COCKPIT_INSTALLATION_ID, reply.getInstallationId()); - additionalInformation.put(InstallationService.COCKPIT_INSTALLATION_STATUS, reply.getInstallationStatus()); - installationService.setAdditionalInformation(additionalInformation); - - if (reply.getDefaultEnvironmentCockpitId() != null) { - updateDefaultEnvironmentCockpitId(reply.getDefaultEnvironmentCockpitId()); - } - - if (reply.getDefaultOrganizationCockpitId() != null) { - updateDefaultOrganizationCockpitId(reply.getDefaultOrganizationCockpitId()); - } - } - - return Single.just(reply); - } - - private void updateDefaultEnvironmentCockpitId(String defaultEnvironmentCockpitId) { - EnvironmentEntity defaultEnvironment = environmentService.getDefaultOrInitialize(); - - UpdateEnvironmentEntity updateEnvironment = new UpdateEnvironmentEntity(defaultEnvironment); - updateEnvironment.setCockpitId(defaultEnvironmentCockpitId); - - environmentService.createOrUpdate(defaultEnvironment.getOrganizationId(), defaultEnvironment.getId(), updateEnvironment); - } - - private void updateDefaultOrganizationCockpitId(String defaultOrganizationCockpitId) { - OrganizationEntity defaultOrganization = organizationService.getDefaultOrInitialize(); - - UpdateOrganizationEntity updateOrganization = new UpdateOrganizationEntity(defaultOrganization); - updateOrganization.setCockpitId(defaultOrganizationCockpitId); - - organizationService.updateOrganization(defaultOrganization.getId(), updateOrganization); - } -} diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/model/DeploymentMode.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/model/DeploymentMode.java index ab1fbb9fe7a..e59d4e9eee8 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/model/DeploymentMode.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/model/DeploymentMode.java @@ -15,7 +15,7 @@ */ package io.gravitee.rest.api.service.cockpit.model; -import io.gravitee.cockpit.api.command.designer.DeployModelPayload; +import io.gravitee.cockpit.api.command.v1.designer.DeployModelCommandPayload; import java.util.Optional; public enum DeploymentMode { @@ -23,16 +23,16 @@ public enum DeploymentMode { API_MOCKED, API_PUBLISHED; - public static DeploymentMode fromDeployModelPayload(DeployModelPayload payload) { - DeployModelPayload.DeploymentMode mode = Optional - .ofNullable(payload.getMode()) - .orElse(DeployModelPayload.DeploymentMode.API_DOCUMENTED); + public static DeploymentMode fromDeployModelPayload(DeployModelCommandPayload payload) { + DeployModelCommandPayload.DeploymentMode mode = Optional + .ofNullable(payload.mode()) + .orElse(DeployModelCommandPayload.DeploymentMode.API_DOCUMENTED); - if (mode == DeployModelPayload.DeploymentMode.API_MOCKED) { + if (mode == DeployModelCommandPayload.DeploymentMode.API_MOCKED) { return DeploymentMode.API_MOCKED; } - if (mode == DeployModelPayload.DeploymentMode.API_PUBLISHED) { + if (mode == DeployModelCommandPayload.DeploymentMode.API_PUBLISHED) { return DeploymentMode.API_PUBLISHED; } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/services/CockpitPromotionServiceImpl.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/services/CockpitPromotionServiceImpl.java index 282db9a2cf3..f663499be3e 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/services/CockpitPromotionServiceImpl.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/services/CockpitPromotionServiceImpl.java @@ -17,10 +17,9 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.bridge.BridgeCommand; -import io.gravitee.cockpit.api.command.bridge.BridgeMultiReply; -import io.gravitee.cockpit.api.command.bridge.BridgeReply; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeCommand; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeReply; +import io.gravitee.exchange.api.command.CommandStatus; import io.gravitee.rest.api.model.EnvironmentEntity; import io.gravitee.rest.api.model.promotion.PromotionEntity; import io.gravitee.rest.api.model.promotion.PromotionTargetEntity; @@ -31,70 +30,58 @@ import java.util.List; import java.util.Objects; import java.util.stream.Collectors; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @Component +@RequiredArgsConstructor +@Slf4j public class CockpitPromotionServiceImpl implements CockpitPromotionService { - /** - * Logger. - */ - private final Logger logger = LoggerFactory.getLogger(CockpitPromotionServiceImpl.class); - private final BridgeCommandFactory bridgeCommandFactory; private final CockpitCommandService cockpitCommandService; private final ObjectMapper objectMapper; - public CockpitPromotionServiceImpl( - BridgeCommandFactory bridgeCommandFactory, - CockpitCommandService cockpitCommandService, - ObjectMapper objectMapper - ) { - this.bridgeCommandFactory = bridgeCommandFactory; - this.cockpitCommandService = cockpitCommandService; - this.objectMapper = objectMapper; - } - @Override public CockpitReply> listPromotionTargets(String organizationId, String environmentId) { final BridgeCommand listEnvironmentCommand = this.bridgeCommandFactory.createListEnvironmentCommand(organizationId, environmentId); BridgeReply bridgeReply = cockpitCommandService.send(listEnvironmentCommand); if (bridgeReply.getCommandStatus() != CommandStatus.SUCCEEDED) { - logger.warn("Problem while listing promotion targets through cockpit. \n {}", bridgeReply.getMessage()); + log.warn("Problem while listing promotion targets through cockpit. \n {}", bridgeReply.getErrorDetails()); return new CockpitReply<>(Collections.emptyList(), CockpitReplyStatus.ERROR); } - final List environmentEntities = - ((BridgeMultiReply) bridgeReply).getReplies() - .stream() - .filter(simpleReply -> CommandStatus.SUCCEEDED == simpleReply.getCommandStatus()) - .map(simpleReply -> { - try { - final EnvironmentEntity environmentEntity = - this.objectMapper.readValue(simpleReply.getPayload(), EnvironmentEntity.class); - - // Be careful with env and org ids, we need to use the one from the reply and not the payload - // because cockpit has updated them to handle the case were id is "DEFAULT" - return new PromotionTargetEntity( - environmentEntity, - simpleReply.getOrganizationId(), - simpleReply.getEnvironmentId(), - simpleReply.getInstallationId() - ); - } catch (JsonProcessingException e) { - logger.warn( - "Problem while deserializing environment {} with payload {}", - simpleReply.getEnvironmentId(), - simpleReply.getPayload() - ); - return null; - } - }) - .filter(Objects::nonNull) - .collect(Collectors.toList()); + final List environmentEntities = bridgeReply + .getPayload() + .contents() + .stream() + .filter(bridgeReplyContent -> bridgeReplyContent.content() != null) + .map(bridgeReplyContent -> { + try { + final EnvironmentEntity environmentEntity = + this.objectMapper.readValue(bridgeReplyContent.content(), EnvironmentEntity.class); + + // Be careful with env and org ids, we need to use the one from the reply and not the payload + // because cockpit has updated them to handle the case were id is "DEFAULT" + return new PromotionTargetEntity( + environmentEntity, + bridgeReplyContent.organizationId(), + bridgeReplyContent.environmentId(), + bridgeReplyContent.installationId() + ); + } catch (JsonProcessingException e) { + log.warn( + "Problem while deserializing environment {} with payload {}", + bridgeReplyContent.environmentId(), + bridgeReplyContent.content() + ); + return null; + } + }) + .filter(Objects::nonNull) + .toList(); return new CockpitReply<>(environmentEntities, CockpitReplyStatus.SUCCEEDED); } @@ -104,7 +91,7 @@ public CockpitReply requestPromotion(ExecutionContext execution try { serializedPromotion = objectMapper.writeValueAsString(promotionEntity); } catch (JsonProcessingException e) { - logger.warn("Problem while serializing promotion {}", promotionEntity.getId()); + log.warn("Problem while serializing promotion {}", promotionEntity.getId()); } final BridgeCommand promoteApiCommand = @@ -117,7 +104,7 @@ public CockpitReply requestPromotion(ExecutionContext execution BridgeReply bridgeReply = cockpitCommandService.send(promoteApiCommand); if (bridgeReply.getCommandStatus() != CommandStatus.SUCCEEDED) { - logger.warn("Problem while sending API promotion request through cockpit. \n {}", bridgeReply.getMessage()); + log.warn("Problem while sending API promotion request through cockpit. \n {}", bridgeReply.getErrorDetails()); return new CockpitReply<>(null, CockpitReplyStatus.ERROR); } @@ -130,7 +117,7 @@ public CockpitReply processPromotion(ExecutionContext execution try { serializedPromotion = objectMapper.writeValueAsString(promotionEntity); } catch (JsonProcessingException e) { - logger.warn("Problem while serializing promotion {}", promotionEntity.getId()); + log.warn("Problem while serializing promotion {}", promotionEntity.getId()); } final BridgeCommand processPromotionCommand = @@ -143,7 +130,7 @@ public CockpitReply processPromotion(ExecutionContext execution final BridgeReply bridgeReply = cockpitCommandService.send(processPromotionCommand); if (bridgeReply.getCommandStatus() != CommandStatus.SUCCEEDED) { - logger.warn("Problem while processing API promotion request through cockpit. \n {}", bridgeReply.getMessage()); + log.warn("Problem while processing API promotion request through cockpit. \n {}", bridgeReply.getErrorDetails()); return new CockpitReply<>(null, CockpitReplyStatus.ERROR); } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/CockpitCommandServiceTest.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/CockpitCommandServiceTest.java index 339ca4b8246..7e4ffca4c0e 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/CockpitCommandServiceTest.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/CockpitCommandServiceTest.java @@ -16,15 +16,16 @@ package io.gravitee.rest.api.service.cockpit.command; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import io.gravitee.cockpit.api.CockpitConnector; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.bridge.BridgeCommand; -import io.gravitee.cockpit.api.command.bridge.BridgePayload; -import io.gravitee.cockpit.api.command.bridge.BridgeReply; -import io.gravitee.cockpit.api.command.bridge.BridgeTarget; +import io.gravitee.cockpit.api.command.legacy.bridge.BridgePayload; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeCommand; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeCommandPayload; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeReply; import io.gravitee.common.utils.UUID; +import io.gravitee.exchange.api.command.CommandStatus; import io.reactivex.rxjava3.core.Single; import org.junit.Before; import org.junit.Test; @@ -47,16 +48,15 @@ public void setup() { @Test public void shouldSendCommandToCockpitConnector() { - BridgePayload payload = new BridgePayload(); - payload.setContent("a content"); - - BridgeCommand command = new BridgeCommand(); - command.setId(UUID.toString(UUID.random())); - command.setInstallationId(UUID.toString(UUID.random())); - command.setOrganizationId(UUID.toString(UUID.random())); - command.setOperation("an_operation"); - command.setTarget(new BridgeTarget()); - command.setPayload(payload); + BridgeCommandPayload payload = BridgeCommandPayload + .builder() + .installationId(UUID.toString(UUID.random())) + .organizationId(UUID.toString(UUID.random())) + .operation("an_operation") + .target(new BridgeCommandPayload.BridgeTarget(null, null)) + .content("a content") + .build(); + BridgeCommand command = new BridgeCommand(payload); BridgeReply reply = mock(BridgeReply.class); when(cockpitConnector.sendCommand(command)).thenReturn(Single.just(reply)); @@ -68,17 +68,16 @@ public void shouldSendCommandToCockpitConnector() { @Test public void shouldReturnAnErrorBridgeReplyWhenWebSocketIsThrowing() { - BridgePayload payload = new BridgePayload(); - payload.setContent("a content"); - - BridgeCommand command = new BridgeCommand(); - command.setId(UUID.toString(UUID.random())); - command.setInstallationId(UUID.toString(UUID.random())); - command.setOrganizationId(UUID.toString(UUID.random())); - command.setOperation("an_operation"); - command.setTarget(new BridgeTarget()); - command.setPayload(payload); + BridgeCommandPayload payload = BridgeCommandPayload + .builder() + .installationId(UUID.toString(UUID.random())) + .organizationId(UUID.toString(UUID.random())) + .operation("an_operation") + .target(new BridgeCommandPayload.BridgeTarget(null, null)) + .content("a content") + .build(); + BridgeCommand command = new BridgeCommand(payload); when(cockpitConnector.sendCommand(command)).thenReturn(Single.error(new RuntimeException())); BridgeReply bridgeReply = cockpitCommandService.send(command); diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/adapter/HelloCommandAdapterTest.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/adapter/HelloCommandAdapterTest.java new file mode 100644 index 00000000000..5da0ca2a427 --- /dev/null +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/adapter/HelloCommandAdapterTest.java @@ -0,0 +1,123 @@ +/* + * Copyright © 2015 The Gravitee team (http://gravitee.io) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.gravitee.rest.api.service.cockpit.command.adapter; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.when; + +import io.gravitee.apim.core.cockpit.query_service.CockpitAccessService; +import io.gravitee.apim.core.installation.domain_service.InstallationTypeDomainService; +import io.gravitee.apim.core.installation.model.InstallationType; +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; +import io.gravitee.cockpit.api.command.v1.hello.HelloCommand; +import io.gravitee.cockpit.api.command.v1.installation.AdditionalInfoConstants; +import io.gravitee.exchange.api.command.hello.HelloCommandPayload; +import io.gravitee.node.api.Node; +import io.gravitee.plugin.core.api.PluginRegistry; +import io.gravitee.rest.api.model.InstallationEntity; +import io.gravitee.rest.api.service.EnvironmentService; +import io.gravitee.rest.api.service.InstallationService; +import io.gravitee.rest.api.service.OrganizationService; +import io.gravitee.rest.api.service.common.GraviteeContext; +import io.gravitee.rest.api.service.exceptions.TechnicalManagementException; +import io.reactivex.rxjava3.observers.TestObserver; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +/** + * @author Florent CHAMFROY (florent.chamfroy at graviteesource.com) + * @author GraviteeSource Team + */ +@ExtendWith(MockitoExtension.class) +public class HelloCommandAdapterTest { + + private static final String HOSTNAME = "test.gravitee.io"; + private static final String CUSTOM_VALUE = "customValue"; + private static final String CUSTOM_KEY = "customKey"; + private static final String INSTALLATION_ID = "installation#1"; + + @Mock + private InstallationService installationService; + + @Mock + private Node node; + + @Mock + private InstallationTypeDomainService installationTypeDomainService; + + @Mock + private CockpitAccessService cockpitAccessService; + + @Mock + private PluginRegistry pluginRegistry; + + private HelloCommandAdapter cut; + + @BeforeEach + public void beforeEach() { + cut = new HelloCommandAdapter(node, installationService, installationTypeDomainService, cockpitAccessService, pluginRegistry); + } + + @Test + void produceType() { + Assertions.assertEquals(CockpitCommandType.HELLO.name(), cut.supportType()); + } + + @Test + void adapt() throws InterruptedException { + final InstallationEntity installationEntity = new InstallationEntity(); + installationEntity.setId(INSTALLATION_ID); + installationEntity.getAdditionalInformation().put(CUSTOM_KEY, CUSTOM_VALUE); + + when(node.hostname()).thenReturn(HOSTNAME); + when(installationService.getOrInitialize()).thenReturn(installationEntity); + when(installationTypeDomainService.get()).thenReturn(InstallationType.STANDALONE); + + final TestObserver obs = cut + .adapt(new io.gravitee.exchange.api.command.hello.HelloCommand(new HelloCommandPayload())) + .test(); + + obs.await(); + obs.assertValue(helloCommand -> { + assertEquals(CUSTOM_VALUE, helloCommand.getPayload().getAdditionalInformation().get(CUSTOM_KEY)); + assertTrue(helloCommand.getPayload().getAdditionalInformation().containsKey(AdditionalInfoConstants.AUTH_PATH)); + assertTrue(helloCommand.getPayload().getAdditionalInformation().containsKey(AdditionalInfoConstants.AUTH_BASE_URL)); + assertEquals(InstallationType.STANDALONE.getLabel(), helloCommand.getPayload().getInstallationType()); + + assertEquals(HOSTNAME, helloCommand.getPayload().getNode().hostname()); + assertEquals(GraviteeContext.getDefaultOrganization(), helloCommand.getPayload().getDefaultOrganizationId()); + assertEquals(GraviteeContext.getDefaultEnvironment(), helloCommand.getPayload().getDefaultEnvironmentId()); + assertEquals(INSTALLATION_ID, helloCommand.getPayload().getNode().installationId()); + assertEquals(HOSTNAME, helloCommand.getPayload().getNode().hostname()); + + return true; + }); + } + + @Test + void adaptWithException() { + when(installationService.getOrInitialize()).thenThrow(new TechnicalManagementException()); + cut + .adapt(new io.gravitee.exchange.api.command.hello.HelloCommand(new HelloCommandPayload())) + .test() + .assertError(TechnicalManagementException.class); + } +} diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/adapter/HelloReplyAdapterTest.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/adapter/HelloReplyAdapterTest.java new file mode 100644 index 00000000000..94d2237e706 --- /dev/null +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/adapter/HelloReplyAdapterTest.java @@ -0,0 +1,204 @@ +/* + * Copyright © 2015 The Gravitee team (http://gravitee.io) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.gravitee.rest.api.service.cockpit.command.adapter; + +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.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import io.gravitee.apim.core.cockpit.query_service.CockpitAccessService; +import io.gravitee.apim.core.installation.domain_service.InstallationTypeDomainService; +import io.gravitee.apim.core.installation.model.InstallationType; +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; +import io.gravitee.cockpit.api.command.v1.hello.HelloReply; +import io.gravitee.cockpit.api.command.v1.hello.HelloReplyPayload; +import io.gravitee.definition.model.FlowMode; +import io.gravitee.definition.model.flow.Flow; +import io.gravitee.node.api.Node; +import io.gravitee.rest.api.model.EnvironmentEntity; +import io.gravitee.rest.api.model.InstallationEntity; +import io.gravitee.rest.api.model.OrganizationEntity; +import io.gravitee.rest.api.service.EnvironmentService; +import io.gravitee.rest.api.service.InstallationService; +import io.gravitee.rest.api.service.OrganizationService; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import org.junit.Before; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; + +/** + * @author Florent CHAMFROY (florent.chamfroy at graviteesource.com) + * @author GraviteeSource Team + */ +@ExtendWith(MockitoExtension.class) +public class HelloReplyAdapterTest { + + @Mock + private InstallationService installationService; + + @Mock + private EnvironmentService environmentService; + + @Mock + private OrganizationService organizationService; + + private HelloReplyAdapter cut; + + @BeforeEach + public void beforeEach() { + cut = new HelloReplyAdapter(installationService, environmentService, organizationService); + } + + @Test + void produceType() { + assertEquals(CockpitCommandType.HELLO.name(), cut.supportType()); + } + + @Test + void handleReply_shouldUpdateDefaultEnvironmentCockpitId() throws InterruptedException { + HelloReply helloReply = new HelloReply( + "commandId", + HelloReplyPayload.builder().defaultEnvironmentCockpitId("env#cockpit-1").build() + ); + + String defaultEnvId = "DEFAULT"; + EnvironmentEntity defaultEnvironment = new EnvironmentEntity(); + defaultEnvironment.setId(defaultEnvId); + defaultEnvironment.setOrganizationId("org#1"); + + when(installationService.getOrInitialize()).thenReturn(new InstallationEntity()); + when(environmentService.getDefaultOrInitialize()).thenReturn(defaultEnvironment); + + cut + .adapt(helloReply) + .test() + .await() + .assertValue(helloReplyResponse -> { + assertEquals(helloReply.getCommandId(), helloReplyResponse.getCommandId()); + assertEquals(helloReply.getPayload().getTargetId(), helloReplyResponse.getPayload().getTargetId()); + return true; + }); + + verify(environmentService) + .createOrUpdate( + eq(defaultEnvironment.getOrganizationId()), + eq(defaultEnvId), + argThat(env -> env.getCockpitId().equals("env#cockpit-1")) + ); + } + + @Test + void handleReply_shouldUpdateDefaultOrganizationCockpitId() throws InterruptedException { + HelloReply helloReply = new HelloReply( + "commandId", + HelloReplyPayload.builder().defaultOrganizationCockpitId("org#cockpit-1").build() + ); + Flow flow = new Flow(); + flow.setName("My-Flow"); + + String defaultOrgId = "DEFAULT"; + OrganizationEntity defaultOrganization = new OrganizationEntity(); + defaultOrganization.setId(defaultOrgId); + defaultOrganization.setFlows(Collections.singletonList(flow)); + defaultOrganization.setFlowMode(FlowMode.DEFAULT); + + when(installationService.getOrInitialize()).thenReturn(new InstallationEntity()); + when(organizationService.getDefaultOrInitialize()).thenReturn(defaultOrganization); + + cut + .adapt(helloReply) + .test() + .await() + .assertValue(helloReplyResponse -> { + assertEquals(helloReply.getCommandId(), helloReplyResponse.getCommandId()); + assertEquals(helloReply.getPayload().getTargetId(), helloReplyResponse.getPayload().getTargetId()); + return true; + }); + + verify(organizationService) + .updateOrganization( + argThat(organizationId -> organizationId.equals(defaultOrgId)), + argThat(org -> + org.getCockpitId().equals("org#cockpit-1") && + FlowMode.DEFAULT.equals(org.getFlowMode()) && + org.getFlows() != null && + org.getFlows().size() == 1 && + org.getFlows().get(0).getName().equals("My-Flow") + ) + ); + } + + @Test + void handleReply_shouldUpdateCockpitInstallationStatusAndId_butKeepAlreadyExistingInstallationInformations() + throws InterruptedException { + // mock already existing installation with informations + InstallationEntity installation = new InstallationEntity(); + installation.setAdditionalInformation( + new HashMap<>( + Map.of( + "key1", + "value1", + "key2", + "value2", + "COCKPIT_INSTALLATION_STATUS", + "old-installation-status", + "COCKPIT_INSTALLATION_ID", + "old-installation-id" + ) + ) + ); + when(installationService.getOrInitialize()).thenReturn(installation); + + HelloReply helloReply = new HelloReply( + "commandId", + HelloReplyPayload.builder().installationId("new-installation-id").installationStatus("new-installation-status").build() + ); + + cut + .adapt(helloReply) + .test() + .await() + .assertValue(helloReplyResponse -> { + assertEquals(helloReply.getCommandId(), helloReplyResponse.getCommandId()); + assertEquals(helloReply.getPayload().getTargetId(), helloReplyResponse.getPayload().getTargetId()); + return true; + }); + + verify(installationService, times(1)) + .setAdditionalInformation( + Map.of( + "key1", + "value1", + "key2", + "value2", + "COCKPIT_INSTALLATION_STATUS", + "new-installation-status", + "COCKPIT_INSTALLATION_ID", + "new-installation-id" + ) + ); + } +} diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/bridge/BridgeCommandFactoryTest.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/bridge/BridgeCommandFactoryTest.java index 42c31c61406..0618b266a0e 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/bridge/BridgeCommandFactoryTest.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/bridge/BridgeCommandFactoryTest.java @@ -18,8 +18,8 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; -import io.gravitee.cockpit.api.command.bridge.BridgeCommand; -import io.gravitee.cockpit.api.command.bridge.BridgeTarget; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeCommand; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeCommandPayload; import io.gravitee.rest.api.model.InstallationEntity; import io.gravitee.rest.api.model.promotion.PromotionEntity; import io.gravitee.rest.api.service.InstallationService; @@ -71,16 +71,16 @@ public void shouldCreateListEnvironmentsCommand() { // Then assertThat(listEnvironmentCommand).isNotNull(); - assertThat(listEnvironmentCommand.getEnvironmentId()).isEqualTo(ENVIRONMENT_ID); - assertThat(listEnvironmentCommand.getOrganizationId()).isEqualTo(ORGANIZATION_ID); - assertThat(listEnvironmentCommand.getInstallationId()).isEqualTo(INSTALLATION_ID); - assertThat(listEnvironmentCommand.getOperation()).isEqualTo(BridgeOperation.LIST_ENVIRONMENT.name()); + assertThat(listEnvironmentCommand.getPayload().environmentId()).isEqualTo(ENVIRONMENT_ID); + assertThat(listEnvironmentCommand.getPayload().organizationId()).isEqualTo(ORGANIZATION_ID); + assertThat(listEnvironmentCommand.getPayload().installationId()).isEqualTo(INSTALLATION_ID); + assertThat(listEnvironmentCommand.getPayload().operation()).isEqualTo(BridgeOperation.LIST_ENVIRONMENT.name()); - final BridgeTarget bridgeTarget = listEnvironmentCommand.getTarget(); + final BridgeCommandPayload.BridgeTarget bridgeTarget = listEnvironmentCommand.getPayload().target(); assertThat(bridgeTarget).isNotNull(); - assertThat(bridgeTarget.getScopes()).isNotNull(); - assertThat(bridgeTarget.getScopes().size()).isEqualTo(1); - assertThat(bridgeTarget.getScopes().get(0)).isEqualTo("APIM"); + assertThat(bridgeTarget.scopes()).isNotNull(); + assertThat(bridgeTarget.scopes().size()).isEqualTo(1); + assertThat(bridgeTarget.scopes().get(0)).isEqualTo("APIM"); } @Test @@ -96,13 +96,13 @@ public void shouldCreatePromoteApiCommand() { ); assertThat(promoteApiCommand).isNotNull(); - assertThat(promoteApiCommand.getEnvironmentId()).isEqualTo(ENVIRONMENT_ID); - assertThat(promoteApiCommand.getOrganizationId()).isEqualTo(ORGANIZATION_ID); - assertThat(promoteApiCommand.getInstallationId()).isEqualTo(INSTALLATION_ID); - assertThat(promoteApiCommand.getOperation()).isEqualTo(BridgeOperation.PROMOTE_API.name()); - assertThat(promoteApiCommand.getPayload().getContent()).isEqualTo("{ \"id\": \"test\"}"); - - final BridgeTarget bridgeTarget = promoteApiCommand.getTarget(); - assertThat(bridgeTarget.getEnvironmentId()).isEqualTo("env#target"); + assertThat(promoteApiCommand.getPayload().environmentId()).isEqualTo(ENVIRONMENT_ID); + assertThat(promoteApiCommand.getPayload().organizationId()).isEqualTo(ORGANIZATION_ID); + assertThat(promoteApiCommand.getPayload().installationId()).isEqualTo(INSTALLATION_ID); + assertThat(promoteApiCommand.getPayload().operation()).isEqualTo(BridgeOperation.PROMOTE_API.name()); + assertThat(promoteApiCommand.getPayload().content()).isEqualTo("{ \"id\": \"test\"}"); + + final BridgeCommandPayload.BridgeTarget bridgeTarget = promoteApiCommand.getPayload().target(); + assertThat(bridgeTarget.environmentId()).isEqualTo("env#target"); } } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/bridge/BridgeCommandHandlerTest.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/bridge/BridgeCommandHandlerTest.java index 41d36bc67b1..1314b336349 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/bridge/BridgeCommandHandlerTest.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/bridge/BridgeCommandHandlerTest.java @@ -17,17 +17,20 @@ import static org.junit.Assert.assertEquals; -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.bridge.BridgeCommand; -import io.gravitee.cockpit.api.command.bridge.BridgeMultiReply; -import io.gravitee.cockpit.api.command.bridge.BridgeReply; +import io.gravitee.cockpit.api.command.legacy.bridge.BridgeMultiReply; +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeCommand; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeCommandPayload; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeReply; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeReplyPayload; +import io.gravitee.exchange.api.command.CommandStatus; import io.gravitee.rest.api.service.cockpit.command.bridge.operation.BridgeOperation; import io.gravitee.rest.api.service.cockpit.command.bridge.operation.BridgeOperationHandler; import io.reactivex.rxjava3.core.Single; import io.reactivex.rxjava3.observers.TestObserver; import java.util.Arrays; import java.util.Collections; +import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -48,14 +51,13 @@ public void before() { } @Test - public void handleType() { - assertEquals(Command.Type.BRIDGE_COMMAND, cut.handleType()); + public void supportType() { + assertEquals(CockpitCommandType.BRIDGE.name(), cut.supportType()); } @Test public void shouldNotHandleUnknownOperation() throws InterruptedException { - BridgeCommand command = new BridgeCommand(); - command.setOperation("UNKWOWN_OPERATION"); + BridgeCommand command = new BridgeCommand(BridgeCommandPayload.builder().operation("UNKWOWN_OPERATION").build()); TestObserver obs = cut.handle(command).test(); @@ -63,15 +65,15 @@ public void shouldNotHandleUnknownOperation() throws InterruptedException { obs.assertValue(reply -> reply.getCommandId().equals(command.getId()) && reply.getCommandStatus().equals(CommandStatus.ERROR) && - reply.getMessage().equals("No handler found for this operation: UNKWOWN_OPERATION") + reply.getErrorDetails().equals("No handler found for this operation: UNKWOWN_OPERATION") ); } @Test public void shouldHandleListEnvironmentsOperation() throws InterruptedException { - BridgeCommand command = new BridgeCommand(); - command.setOperation(BridgeOperation.LIST_ENVIRONMENT.name()); - command.setId("command-id"); + BridgeCommand command = new BridgeCommand( + BridgeCommandPayload.builder().operation(BridgeOperation.LIST_ENVIRONMENT.name()).build() + ); cut = new BridgeCommandHandler( @@ -81,11 +83,7 @@ public void shouldHandleListEnvironmentsOperation() throws InterruptedException TestObserver obs = cut.handle(command).test(); obs.await(); - obs.assertValue(reply -> - reply.getCommandId().equals(command.getId()) && - reply.getCommandStatus().equals(CommandStatus.SUCCEEDED) && - reply.getMessage().equals("Fake operation handler") - ); + obs.assertValue(reply -> reply.getCommandId().equals(command.getId()) && reply.getCommandStatus().equals(CommandStatus.SUCCEEDED)); } static class TestingFakeListEnvironmentOperationHandler implements BridgeOperationHandler { @@ -97,10 +95,7 @@ public boolean canHandle(String bridgeOperation) { @Override public Single handle(BridgeCommand bridgeCommand) { - final BridgeMultiReply reply = new BridgeMultiReply(); - reply.setCommandId(bridgeCommand.getId()); - reply.setCommandStatus(CommandStatus.SUCCEEDED); - reply.setMessage("Fake operation handler"); + final BridgeReply reply = new BridgeReply(bridgeCommand.getId(), new BridgeReplyPayload(List.of())); return Single.just(reply); } } @@ -114,10 +109,7 @@ public boolean canHandle(String bridgeOperation) { @Override public Single handle(BridgeCommand bridgeCommand) { - final BridgeMultiReply reply = new BridgeMultiReply(); - reply.setCommandId(bridgeCommand.getId()); - reply.setCommandStatus(CommandStatus.SUCCEEDED); - reply.setMessage("Another fake operation handler"); + final BridgeReply reply = new BridgeReply(bridgeCommand.getId(), new BridgeReplyPayload(List.of())); return Single.just(reply); } } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/ListEnvironmentOperationHandlerTest.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/ListEnvironmentOperationHandlerTest.java index 8734cc31368..a44e446515e 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/ListEnvironmentOperationHandlerTest.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/ListEnvironmentOperationHandlerTest.java @@ -15,16 +15,19 @@ */ package io.gravitee.rest.api.service.cockpit.command.bridge.operation; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.bridge.BridgeCommand; -import io.gravitee.cockpit.api.command.bridge.BridgeMultiReply; -import io.gravitee.cockpit.api.command.bridge.BridgeReply; -import io.gravitee.cockpit.api.command.bridge.BridgeSimpleReply; +import io.gravitee.cockpit.api.command.legacy.bridge.BridgeMultiReply; +import io.gravitee.cockpit.api.command.legacy.bridge.BridgeSimpleReply; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeCommand; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeCommandPayload; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeReply; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeReplyPayload; +import io.gravitee.exchange.api.command.CommandStatus; import io.gravitee.rest.api.model.EnvironmentEntity; import io.gravitee.rest.api.model.InstallationEntity; import io.gravitee.rest.api.service.EnvironmentService; @@ -32,6 +35,7 @@ import io.gravitee.rest.api.service.exceptions.TechnicalManagementException; import io.reactivex.rxjava3.observers.TestObserver; import java.util.Arrays; +import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -103,42 +107,40 @@ public void shouldListEnvironments() throws JsonProcessingException, Interrupted when(installationService.get()).thenReturn(installationEntity); - BridgeCommand command = new BridgeCommand(); - command.setOperation(BridgeOperation.LIST_ENVIRONMENT.name()); - command.setId(COMMAND_ID); - command.setInstallationId(INSTALLATION_ID); - command.setOrganizationId(ORGANIZATION_ID); - command.setEnvironmentId(ENVIRONMENT_ID); + BridgeCommandPayload bridgeCommandPayload = BridgeCommandPayload + .builder() + .operation(BridgeOperation.LIST_ENVIRONMENT.name()) + .installationId(INSTALLATION_ID) + .organizationId(ORGANIZATION_ID) + .environmentId(ENVIRONMENT_ID) + .build(); + BridgeCommand command = new BridgeCommand(bridgeCommandPayload); // When TestObserver obs = cut.handle(command).test(); // Then obs.await(); obs.assertValue(reply -> { - if ( - reply.getCommandId().equals(command.getId()) && - reply.getCommandStatus().equals(CommandStatus.SUCCEEDED) && - BridgeMultiReply.class.isInstance(reply) - ) { - BridgeMultiReply multiReply = ((BridgeMultiReply) reply); - if (multiReply.getReplies() != null && multiReply.getReplies().size() == 3) { - for (BridgeSimpleReply simpleReply : multiReply.getReplies()) { - if (simpleReply.getEnvironmentId().equals(envA.getId()) && simpleReply.getCommandStatus() == CommandStatus.ERROR) { - return false; - } - if (simpleReply.getEnvironmentId().equals(envB.getId()) && simpleReply.getCommandStatus() == CommandStatus.ERROR) { - return false; - } - if ( - simpleReply.getEnvironmentId().equals(envC_ERROR.getId()) && - simpleReply.getCommandStatus() == CommandStatus.SUCCEEDED - ) { - return false; - } + if (reply.getCommandId().equals(command.getId()) && reply.getCommandStatus().equals(CommandStatus.SUCCEEDED)) { + BridgeReplyPayload replyPayload = reply.getPayload(); + List contents = replyPayload.contents(); + assertEquals(3, contents.size()); + for (BridgeReplyPayload.BridgeReplyContent replyContent : contents) { + if (replyContent.environmentId().equals(envA.getId()) && replyContent.error()) { + return false; + } + if (replyContent.environmentId().equals(envB.getId()) && replyContent.error()) { + return false; + } + if (replyContent.environmentId().equals(envC_ERROR.getId()) && !replyContent.error()) { + return false; } - return true; } + assertTrue(contents.stream().anyMatch(bridgeReplyContent -> bridgeReplyContent.environmentId().equals(envA.getId()))); + assertTrue(contents.stream().anyMatch(bridgeReplyContent -> bridgeReplyContent.environmentId().equals(envB.getId()))); + assertTrue(contents.stream().anyMatch(bridgeReplyContent -> bridgeReplyContent.environmentId().equals(envC_ERROR.getId()))); + return true; } return false; }); @@ -149,8 +151,9 @@ public void shouldNotListEnvironments() throws InterruptedException { // Given when(environmentService.findByOrganization(ORGANIZATION_ID)).thenThrow(new TechnicalManagementException()); - BridgeCommand command = new BridgeCommand(); - command.setOrganizationId(ORGANIZATION_ID); + BridgeCommandPayload bridgeCommandPayload = BridgeCommandPayload.builder().organizationId(ORGANIZATION_ID).build(); + + BridgeCommand command = new BridgeCommand(bridgeCommandPayload); // When TestObserver obs = cut.handle(command).test(); @@ -160,7 +163,7 @@ public void shouldNotListEnvironments() throws InterruptedException { obs.assertValue(reply -> reply.getCommandId().equals(command.getId()) && reply.getCommandStatus().equals(CommandStatus.ERROR) && - reply.getMessage().equals("No environment available for organization: " + ORGANIZATION_ID) + reply.getErrorDetails().equals("No environment available for organization: " + ORGANIZATION_ID) ); } } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/ProcessPromotionOperationHandlerTest.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/ProcessPromotionOperationHandlerTest.java index ff48a195aac..9e301cb8bd5 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/ProcessPromotionOperationHandlerTest.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/ProcessPromotionOperationHandlerTest.java @@ -24,12 +24,11 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.bridge.BridgeCommand; -import io.gravitee.cockpit.api.command.bridge.BridgePayload; -import io.gravitee.cockpit.api.command.bridge.BridgeReply; -import io.gravitee.cockpit.api.command.bridge.BridgeSimpleReply; -import io.gravitee.cockpit.api.command.bridge.BridgeTarget; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeCommand; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeCommandPayload; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeReply; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeReplyPayload; +import io.gravitee.exchange.api.command.CommandStatus; import io.gravitee.rest.api.model.InstallationEntity; import io.gravitee.rest.api.model.promotion.PromotionEntity; import io.gravitee.rest.api.model.promotion.PromotionEntityStatus; @@ -79,20 +78,19 @@ public void handleOperation() { @Test public void shouldHandlePromotionRequest() throws JsonProcessingException, InterruptedException { - BridgeCommand command = new BridgeCommand(); - command.setOperation(BridgeOperation.PROMOTE_API.name()); - command.setId(COMMAND_ID); - command.setInstallationId(INSTALLATION_ID); - command.setOrganizationId(ORGANIZATION_ID); - command.setEnvironmentId(ENVIRONMENT_ID); - command.setPayload(new BridgePayload()); - final BridgeTarget bridgeTarget = new BridgeTarget(); - bridgeTarget.setEnvironmentId("source"); - command.setTarget(bridgeTarget); + BridgeCommandPayload bridgeCommandPayload = BridgeCommandPayload + .builder() + .operation(BridgeOperation.PROMOTE_API.name()) + .installationId(INSTALLATION_ID) + .organizationId(ORGANIZATION_ID) + .environmentId(ENVIRONMENT_ID) + .target(new BridgeCommandPayload.BridgeTarget(null, "source")) + .build(); + BridgeCommand command = new BridgeCommand(bridgeCommandPayload); ArgumentCaptor argument = ArgumentCaptor.forClass(PromotionEntity.class); - when(objectMapper.readValue(command.getPayload().getContent(), PromotionEntity.class)).thenReturn(getAPromotionEntity()); + when(objectMapper.readValue(command.getPayload().content(), PromotionEntity.class)).thenReturn(getAPromotionEntity()); InstallationEntity installationEntity = new InstallationEntity(); installationEntity.setId(INSTALLATION_ID); when(installationService.get()).thenReturn(installationEntity); @@ -105,31 +103,30 @@ public void shouldHandlePromotionRequest() throws JsonProcessingException, Inter obs.await(); obs.assertValue(reply -> { - BridgeSimpleReply simpleReply = (BridgeSimpleReply) reply; + BridgeReplyPayload.BridgeReplyContent bridgeReplyContent = reply.getPayload().contents().get(0); return ( - simpleReply.getCommandStatus().equals(CommandStatus.SUCCEEDED) && - simpleReply.getOrganizationId().equals(ORGANIZATION_ID) && - simpleReply.getEnvironmentId().equals("source") && - simpleReply.getInstallationId().equals(INSTALLATION_ID) && - simpleReply.getCommandId().equals(COMMAND_ID) + reply.getCommandStatus().equals(CommandStatus.SUCCEEDED) && + bridgeReplyContent.organizationId().equals(ORGANIZATION_ID) && + bridgeReplyContent.environmentId().equals("source") && + bridgeReplyContent.installationId().equals(INSTALLATION_ID) && + reply.getCommandId().equals(command.getId()) ); }); } @Test public void shouldHandlePromotionRequestIfCannotReadPromotionEntity() throws JsonProcessingException, InterruptedException { - BridgeCommand command = new BridgeCommand(); - command.setOperation(BridgeOperation.PROMOTE_API.name()); - command.setId(COMMAND_ID); - command.setInstallationId(INSTALLATION_ID); - command.setOrganizationId(ORGANIZATION_ID); - command.setEnvironmentId(ENVIRONMENT_ID); - command.setPayload(new BridgePayload()); - final BridgeTarget bridgeTarget = new BridgeTarget(); - bridgeTarget.setEnvironmentId("source"); - command.setTarget(bridgeTarget); - - when(objectMapper.readValue(command.getPayload().getContent(), PromotionEntity.class)).thenThrow(JsonMappingException.class); + BridgeCommandPayload payload = BridgeCommandPayload + .builder() + .operation(BridgeOperation.PROMOTE_API.name()) + .installationId(INSTALLATION_ID) + .organizationId(ORGANIZATION_ID) + .environmentId(ENVIRONMENT_ID) + .target(new BridgeCommandPayload.BridgeTarget(null, "source")) + .build(); + BridgeCommand command = new BridgeCommand(payload); + + when(objectMapper.readValue(command.getPayload().content(), PromotionEntity.class)).thenThrow(JsonMappingException.class); // When TestObserver obs = cut.handle(command).test(); @@ -139,24 +136,23 @@ public void shouldHandlePromotionRequestIfCannotReadPromotionEntity() throws Jso obs.assertValue(reply -> reply.getCommandId().equals(command.getId()) && reply.getCommandStatus().equals(CommandStatus.ERROR) && - reply.getMessage().equals("Problem while deserializing promotion for environment [" + ENVIRONMENT_ID + "]") + reply.getErrorDetails().equals("Problem while deserializing promotion for environment [" + ENVIRONMENT_ID + "]") ); } @Test public void shouldHandlePromotionRequestIfCannotWritePayload() throws JsonProcessingException, InterruptedException { - BridgeCommand command = new BridgeCommand(); - command.setOperation(BridgeOperation.PROMOTE_API.name()); - command.setId(COMMAND_ID); - command.setInstallationId(INSTALLATION_ID); - command.setOrganizationId(ORGANIZATION_ID); - command.setEnvironmentId(ENVIRONMENT_ID); - command.setPayload(new BridgePayload()); - final BridgeTarget bridgeTarget = new BridgeTarget(); - bridgeTarget.setEnvironmentId("source"); - command.setTarget(bridgeTarget); - - when(objectMapper.readValue(command.getPayload().getContent(), PromotionEntity.class)).thenReturn(getAPromotionEntity()); + BridgeCommandPayload bridgeCommandPayload = BridgeCommandPayload + .builder() + .operation(BridgeOperation.PROMOTE_API.name()) + .installationId(INSTALLATION_ID) + .organizationId(ORGANIZATION_ID) + .environmentId(ENVIRONMENT_ID) + .target(new BridgeCommandPayload.BridgeTarget(null, "source")) + .build(); + BridgeCommand command = new BridgeCommand(bridgeCommandPayload); + + when(objectMapper.readValue(command.getPayload().content(), PromotionEntity.class)).thenReturn(getAPromotionEntity()); InstallationEntity installationEntity = new InstallationEntity(); installationEntity.setId(INSTALLATION_ID); when(installationService.get()).thenReturn(installationEntity); @@ -171,7 +167,7 @@ public void shouldHandlePromotionRequestIfCannotWritePayload() throws JsonProces obs.assertValue(reply -> reply.getCommandId().equals(command.getId()) && reply.getCommandStatus().equals(CommandStatus.ERROR) && - reply.getMessage().equals("Problem while serializing promotion for environment [" + ENVIRONMENT_ID + "]") + reply.getErrorDetails().equals("Problem while serializing promotion for environment [" + ENVIRONMENT_ID + "]") ); } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/PromoteApiOperationHandlerTest.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/PromoteApiOperationHandlerTest.java index f662d1fcc64..7d0a948ad96 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/PromoteApiOperationHandlerTest.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/bridge/operation/PromoteApiOperationHandlerTest.java @@ -24,12 +24,12 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.bridge.BridgeCommand; -import io.gravitee.cockpit.api.command.bridge.BridgePayload; -import io.gravitee.cockpit.api.command.bridge.BridgeReply; -import io.gravitee.cockpit.api.command.bridge.BridgeSimpleReply; -import io.gravitee.cockpit.api.command.bridge.BridgeTarget; +import io.gravitee.cockpit.api.command.legacy.bridge.BridgePayload; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeCommand; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeCommandPayload; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeReply; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeReplyPayload; +import io.gravitee.exchange.api.command.CommandStatus; import io.gravitee.rest.api.model.InstallationEntity; import io.gravitee.rest.api.model.promotion.PromotionEntity; import io.gravitee.rest.api.model.promotion.PromotionEntityStatus; @@ -80,20 +80,18 @@ public void handleOperation() { @Test public void shouldHandlePromotionRequest() throws JsonProcessingException, InterruptedException { - BridgeCommand command = new BridgeCommand(); - command.setOperation(BridgeOperation.PROMOTE_API.name()); - command.setId(COMMAND_ID); - command.setInstallationId(INSTALLATION_ID); - command.setOrganizationId(ORGANIZATION_ID); - command.setEnvironmentId(ENVIRONMENT_ID); - command.setPayload(new BridgePayload()); - final BridgeTarget bridgeTarget = new BridgeTarget(); - bridgeTarget.setEnvironmentId("target"); - command.setTarget(bridgeTarget); - + BridgeCommandPayload bridgeCommandPayload = BridgeCommandPayload + .builder() + .operation(BridgeOperation.PROMOTE_API.name()) + .installationId(INSTALLATION_ID) + .organizationId(ORGANIZATION_ID) + .environmentId(ENVIRONMENT_ID) + .target(new BridgeCommandPayload.BridgeTarget(null, "target")) + .build(); + BridgeCommand command = new BridgeCommand(bridgeCommandPayload); ArgumentCaptor argument = ArgumentCaptor.forClass(PromotionEntity.class); - when(objectMapper.readValue(command.getPayload().getContent(), PromotionEntity.class)).thenReturn(getAPromotionEntity()); + when(objectMapper.readValue(command.getPayload().content(), PromotionEntity.class)).thenReturn(getAPromotionEntity()); InstallationEntity installationEntity = new InstallationEntity(); installationEntity.setId(INSTALLATION_ID); when(installationService.get()).thenReturn(installationEntity); @@ -103,13 +101,13 @@ public void shouldHandlePromotionRequest() throws JsonProcessingException, Inter obs.await(); obs.assertValue(reply -> { - BridgeSimpleReply simpleReply = (BridgeSimpleReply) reply; + BridgeReplyPayload.BridgeReplyContent bridgeReplyContent = reply.getPayload().contents().get(0); return ( - simpleReply.getCommandStatus().equals(CommandStatus.SUCCEEDED) && - simpleReply.getOrganizationId().equals(ORGANIZATION_ID) && - simpleReply.getEnvironmentId().equals("target") && - simpleReply.getInstallationId().equals(INSTALLATION_ID) && - simpleReply.getCommandId().equals(COMMAND_ID) + reply.getCommandStatus().equals(CommandStatus.SUCCEEDED) && + bridgeReplyContent.organizationId().equals(ORGANIZATION_ID) && + bridgeReplyContent.environmentId().equals("target") && + bridgeReplyContent.installationId().equals(INSTALLATION_ID) && + reply.getCommandId().equals(command.getId()) ); }); @@ -119,18 +117,17 @@ public void shouldHandlePromotionRequest() throws JsonProcessingException, Inter @Test public void shouldHandlePromotionRequestIfCannotReadPromotionEntity() throws JsonProcessingException, InterruptedException { - BridgeCommand command = new BridgeCommand(); - command.setOperation(BridgeOperation.PROMOTE_API.name()); - command.setId(COMMAND_ID); - command.setInstallationId(INSTALLATION_ID); - command.setOrganizationId(ORGANIZATION_ID); - command.setEnvironmentId(ENVIRONMENT_ID); - command.setPayload(new BridgePayload()); - final BridgeTarget bridgeTarget = new BridgeTarget(); - bridgeTarget.setEnvironmentId("target"); - command.setTarget(bridgeTarget); - - when(objectMapper.readValue(command.getPayload().getContent(), PromotionEntity.class)).thenThrow(JsonMappingException.class); + BridgeCommandPayload bridgeCommandPayload = BridgeCommandPayload + .builder() + .operation(BridgeOperation.PROMOTE_API.name()) + .installationId(INSTALLATION_ID) + .organizationId(ORGANIZATION_ID) + .environmentId(ENVIRONMENT_ID) + .target(new BridgeCommandPayload.BridgeTarget(null, "target")) + .build(); + BridgeCommand command = new BridgeCommand(bridgeCommandPayload); + + when(objectMapper.readValue(command.getPayload().content(), PromotionEntity.class)).thenThrow(JsonMappingException.class); // When TestObserver obs = cut.handle(command).test(); @@ -140,24 +137,23 @@ public void shouldHandlePromotionRequestIfCannotReadPromotionEntity() throws Jso obs.assertValue(reply -> reply.getCommandId().equals(command.getId()) && reply.getCommandStatus().equals(CommandStatus.ERROR) && - reply.getMessage().equals("Problem while deserializing promotion request for environment [" + ENVIRONMENT_ID + "]") + reply.getErrorDetails().equals("Problem while deserializing promotion request for environment [" + ENVIRONMENT_ID + "]") ); } @Test public void shouldHandlePromotionRequestIfCannotWritePayload() throws JsonProcessingException, InterruptedException { - BridgeCommand command = new BridgeCommand(); - command.setOperation(BridgeOperation.PROMOTE_API.name()); - command.setId(COMMAND_ID); - command.setInstallationId(INSTALLATION_ID); - command.setOrganizationId(ORGANIZATION_ID); - command.setEnvironmentId(ENVIRONMENT_ID); - command.setPayload(new BridgePayload()); - final BridgeTarget bridgeTarget = new BridgeTarget(); - bridgeTarget.setEnvironmentId("target"); - command.setTarget(bridgeTarget); - - when(objectMapper.readValue(command.getPayload().getContent(), PromotionEntity.class)).thenReturn(getAPromotionEntity()); + BridgeCommandPayload bridgeCommandPayload = BridgeCommandPayload + .builder() + .operation(BridgeOperation.PROMOTE_API.name()) + .installationId(INSTALLATION_ID) + .organizationId(ORGANIZATION_ID) + .environmentId(ENVIRONMENT_ID) + .target(new BridgeCommandPayload.BridgeTarget(null, "target")) + .build(); + BridgeCommand command = new BridgeCommand(bridgeCommandPayload); + + when(objectMapper.readValue(command.getPayload().content(), PromotionEntity.class)).thenReturn(getAPromotionEntity()); InstallationEntity installationEntity = new InstallationEntity(); installationEntity.setId(INSTALLATION_ID); when(installationService.get()).thenReturn(installationEntity); @@ -172,22 +168,21 @@ public void shouldHandlePromotionRequestIfCannotWritePayload() throws JsonProces obs.assertValue(reply -> reply.getCommandId().equals(command.getId()) && reply.getCommandStatus().equals(CommandStatus.ERROR) && - reply.getMessage().equals("Problem while serializing promotion request for environment [" + ENVIRONMENT_ID + "]") + reply.getErrorDetails().equals("Problem while serializing promotion request for environment [" + ENVIRONMENT_ID + "]") ); } @Test public void shouldReturnErrorCommand() throws JsonProcessingException, InterruptedException { when(promotionService.createOrUpdate(any())).thenThrow(new TechnicalManagementException("error")); - - BridgeCommand command = new BridgeCommand(); - command.setId(COMMAND_ID); - command.setPayload(new BridgePayload()); - command.setInstallationId(INSTALLATION_ID); - command.setOrganizationId(ORGANIZATION_ID); - command.setEnvironmentId(ENVIRONMENT_ID); - - when(objectMapper.readValue(command.getPayload().getContent(), PromotionEntity.class)).thenReturn(getAPromotionEntity()); + BridgeCommandPayload bridgeCommandPayload = BridgeCommandPayload + .builder() + .installationId(INSTALLATION_ID) + .organizationId(ORGANIZATION_ID) + .environmentId(ENVIRONMENT_ID) + .build(); + BridgeCommand command = new BridgeCommand(bridgeCommandPayload); + when(objectMapper.readValue(command.getPayload().content(), PromotionEntity.class)).thenReturn(getAPromotionEntity()); TestObserver obs = cut.handle(command).test(); diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/DeployModelCommandHandlerTest.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/DeployModelCommandHandlerTest.java index 51a7993a9fd..82110131dee 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/DeployModelCommandHandlerTest.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/DeployModelCommandHandlerTest.java @@ -23,11 +23,11 @@ import static org.mockito.Mockito.when; import static org.mockito.Mockito.withSettings; -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.designer.DeployModelCommand; -import io.gravitee.cockpit.api.command.designer.DeployModelPayload; -import io.gravitee.cockpit.api.command.designer.DeployModelReply; +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; +import io.gravitee.cockpit.api.command.v1.designer.DeployModelCommand; +import io.gravitee.cockpit.api.command.v1.designer.DeployModelCommandPayload; +import io.gravitee.cockpit.api.command.v1.designer.DeployModelReply; +import io.gravitee.exchange.api.command.CommandStatus; import io.gravitee.rest.api.model.EnvironmentEntity; import io.gravitee.rest.api.model.UserEntity; import io.gravitee.rest.api.model.api.ApiEntity; @@ -91,25 +91,27 @@ public void setUp() throws Exception { } @Test - public void handleType() { - assertEquals(Command.Type.DEPLOY_MODEL_COMMAND, cut.handleType()); + public void supportType() { + assertEquals(CockpitCommandType.DEPLOY_MODEL.name(), cut.supportType()); } @Test public void creates_an_API_DOCUMENTED() throws InterruptedException { - DeployModelPayload payload = new DeployModelPayload(); - payload.setModelId("model#1"); - payload.setSwaggerDefinition("swagger-definition"); - payload.setUserId("cockpit_user#id"); - payload.setMode(DeployModelPayload.DeploymentMode.API_DOCUMENTED); - payload.setLabels(List.of("label1", "label2")); - payload.setEnvironmentId(COCKPIT_ENVIRONMENT_ID); - payload.setOrganizationId(COCKPIT_ORGANIZATION_ID); + DeployModelCommandPayload payload = DeployModelCommandPayload + .builder() + .modelId("model#1") + .swaggerDefinition("swagger-definition") + .userId("cockpit_user#id") + .mode(DeployModelCommandPayload.DeploymentMode.API_DOCUMENTED) + .labels(List.of("label1", "label2")) + .environmentId(COCKPIT_ENVIRONMENT_ID) + .organizationId(COCKPIT_ORGANIZATION_ID) + .build(); DeployModelCommand command = new DeployModelCommand(payload); UserEntity user = createUserEntity(payload); - when(userService.findBySource(any(), eq("cockpit"), eq(payload.getUserId()), eq(true))).thenReturn(user); + when(userService.findBySource(any(), eq("cockpit"), eq(payload.userId()), eq(true))).thenReturn(user); when(permissionChecker.checkCreatePermission(EXECUTION_CONTEXT, user.getId(), ENVIRONMENT_ID, DeploymentMode.API_DOCUMENTED)) .thenReturn(Optional.empty()); @@ -117,12 +119,12 @@ public void creates_an_API_DOCUMENTED() throws InterruptedException { when( cockpitApiService.createApi( EXECUTION_CONTEXT, - payload.getModelId(), + payload.modelId(), user.getId(), - payload.getSwaggerDefinition(), + payload.swaggerDefinition(), ENVIRONMENT_ID, DeploymentMode.API_DOCUMENTED, - payload.getLabels() + payload.labels() ) ) .thenAnswer(i -> { @@ -139,12 +141,12 @@ public void creates_an_API_DOCUMENTED() throws InterruptedException { @Test public void creates_an_API_MOCKED_mode() throws InterruptedException { - DeployModelPayload payload = createDeployPayload(DeployModelPayload.DeploymentMode.API_MOCKED); + DeployModelCommandPayload payload = createDeployPayload(DeployModelCommandPayload.DeploymentMode.API_MOCKED); DeployModelCommand command = new DeployModelCommand(payload); UserEntity user = createUserEntity(payload); - when(userService.findBySource(ORGANIZATION_ID, "cockpit", payload.getUserId(), true)).thenReturn(user); + when(userService.findBySource(ORGANIZATION_ID, "cockpit", payload.userId(), true)).thenReturn(user); when(permissionChecker.checkCreatePermission(EXECUTION_CONTEXT, user.getId(), ENVIRONMENT_ID, DeploymentMode.API_MOCKED)) .thenReturn(Optional.empty()); @@ -152,12 +154,12 @@ public void creates_an_API_MOCKED_mode() throws InterruptedException { when( cockpitApiService.createApi( EXECUTION_CONTEXT, - payload.getModelId(), + payload.modelId(), user.getId(), - payload.getSwaggerDefinition(), + payload.swaggerDefinition(), ENVIRONMENT_ID, DeploymentMode.API_MOCKED, - payload.getLabels() + payload.labels() ) ) .thenAnswer(i -> { @@ -174,12 +176,12 @@ public void creates_an_API_MOCKED_mode() throws InterruptedException { @Test public void creates_an_API_PUBLISHED_mode() throws InterruptedException { - DeployModelPayload payload = createDeployPayload(DeployModelPayload.DeploymentMode.API_PUBLISHED); + DeployModelCommandPayload payload = createDeployPayload(DeployModelCommandPayload.DeploymentMode.API_PUBLISHED); DeployModelCommand command = new DeployModelCommand(payload); UserEntity user = createUserEntity(payload); - when(userService.findBySource(ORGANIZATION_ID, "cockpit", payload.getUserId(), true)).thenReturn(user); + when(userService.findBySource(ORGANIZATION_ID, "cockpit", payload.userId(), true)).thenReturn(user); when(permissionChecker.checkCreatePermission(EXECUTION_CONTEXT, user.getId(), ENVIRONMENT_ID, DeploymentMode.API_PUBLISHED)) .thenReturn(Optional.empty()); @@ -187,12 +189,12 @@ public void creates_an_API_PUBLISHED_mode() throws InterruptedException { when( cockpitApiService.createApi( EXECUTION_CONTEXT, - payload.getModelId(), + payload.modelId(), user.getId(), - payload.getSwaggerDefinition(), + payload.swaggerDefinition(), ENVIRONMENT_ID, DeploymentMode.API_PUBLISHED, - payload.getLabels() + payload.labels() ) ) .thenAnswer(i -> { @@ -209,15 +211,15 @@ public void creates_an_API_PUBLISHED_mode() throws InterruptedException { @Test public void updates_an_API_DOCUMENTED() throws InterruptedException { - DeployModelPayload payload = createDeployPayload(DeployModelPayload.DeploymentMode.API_DOCUMENTED); + DeployModelCommandPayload payload = createDeployPayload(DeployModelCommandPayload.DeploymentMode.API_DOCUMENTED); DeployModelCommand command = new DeployModelCommand(payload); String apiId = "api#id"; - when(apiSearchService.findIdByEnvironmentIdAndCrossId(ENVIRONMENT_ID, payload.getModelId())).thenReturn(Optional.of(apiId)); + when(apiSearchService.findIdByEnvironmentIdAndCrossId(ENVIRONMENT_ID, payload.modelId())).thenReturn(Optional.of(apiId)); UserEntity user = createUserEntity(payload); - when(userService.findBySource(any(), eq("cockpit"), eq(payload.getUserId()), eq(true))).thenReturn(user); + when(userService.findBySource(any(), eq("cockpit"), eq(payload.userId()), eq(true))).thenReturn(user); when(permissionChecker.checkUpdatePermission(EXECUTION_CONTEXT, user.getId(), ENVIRONMENT_ID, apiId, DeploymentMode.API_DOCUMENTED)) .thenReturn(Optional.empty()); @@ -227,10 +229,10 @@ public void updates_an_API_DOCUMENTED() throws InterruptedException { EXECUTION_CONTEXT, apiId, user.getId(), - payload.getSwaggerDefinition(), + payload.swaggerDefinition(), ENVIRONMENT_ID, DeploymentMode.API_DOCUMENTED, - payload.getLabels() + payload.labels() ) ) .thenAnswer(i -> { @@ -247,15 +249,15 @@ public void updates_an_API_DOCUMENTED() throws InterruptedException { @Test public void updates_an_API_MOCKED_mode() throws InterruptedException { - DeployModelPayload payload = createDeployPayload(DeployModelPayload.DeploymentMode.API_MOCKED); + DeployModelCommandPayload payload = createDeployPayload(DeployModelCommandPayload.DeploymentMode.API_MOCKED); DeployModelCommand command = new DeployModelCommand(payload); String apiId = "api#id"; - when(apiSearchService.findIdByEnvironmentIdAndCrossId(ENVIRONMENT_ID, payload.getModelId())).thenReturn(Optional.of(apiId)); + when(apiSearchService.findIdByEnvironmentIdAndCrossId(ENVIRONMENT_ID, payload.modelId())).thenReturn(Optional.of(apiId)); UserEntity user = createUserEntity(payload); - when(userService.findBySource(any(), eq("cockpit"), eq(payload.getUserId()), eq(true))).thenReturn(user); + when(userService.findBySource(any(), eq("cockpit"), eq(payload.userId()), eq(true))).thenReturn(user); when(permissionChecker.checkUpdatePermission(EXECUTION_CONTEXT, user.getId(), ENVIRONMENT_ID, apiId, DeploymentMode.API_MOCKED)) .thenReturn(Optional.empty()); @@ -265,10 +267,10 @@ public void updates_an_API_MOCKED_mode() throws InterruptedException { EXECUTION_CONTEXT, apiId, user.getId(), - payload.getSwaggerDefinition(), + payload.swaggerDefinition(), ENVIRONMENT_ID, DeploymentMode.API_MOCKED, - payload.getLabels() + payload.labels() ) ) .thenAnswer(i -> { @@ -285,15 +287,15 @@ public void updates_an_API_MOCKED_mode() throws InterruptedException { @Test public void updates_an_API_PUBLISHED_mode() throws InterruptedException { - DeployModelPayload payload = createDeployPayload(DeployModelPayload.DeploymentMode.API_PUBLISHED); + DeployModelCommandPayload payload = createDeployPayload(DeployModelCommandPayload.DeploymentMode.API_PUBLISHED); DeployModelCommand command = new DeployModelCommand(payload); String apiId = "api#id"; - when(apiSearchService.findIdByEnvironmentIdAndCrossId(ENVIRONMENT_ID, payload.getModelId())).thenReturn(Optional.of(apiId)); + when(apiSearchService.findIdByEnvironmentIdAndCrossId(ENVIRONMENT_ID, payload.modelId())).thenReturn(Optional.of(apiId)); UserEntity user = createUserEntity(payload); - when(userService.findBySource(ORGANIZATION_ID, "cockpit", payload.getUserId(), true)).thenReturn(user); + when(userService.findBySource(ORGANIZATION_ID, "cockpit", payload.userId(), true)).thenReturn(user); when(permissionChecker.checkUpdatePermission(EXECUTION_CONTEXT, user.getId(), ENVIRONMENT_ID, apiId, DeploymentMode.API_PUBLISHED)) .thenReturn(Optional.empty()); @@ -303,10 +305,10 @@ public void updates_an_API_PUBLISHED_mode() throws InterruptedException { EXECUTION_CONTEXT, apiId, user.getId(), - payload.getSwaggerDefinition(), + payload.swaggerDefinition(), ENVIRONMENT_ID, DeploymentMode.API_PUBLISHED, - payload.getLabels() + payload.labels() ) ) .thenAnswer(i -> { @@ -323,12 +325,12 @@ public void updates_an_API_PUBLISHED_mode() throws InterruptedException { @Test public void handle_null_mode() throws InterruptedException { - DeployModelPayload payload = createDeployPayload(null); + DeployModelCommandPayload payload = createDeployPayload(null); DeployModelCommand command = new DeployModelCommand(payload); UserEntity user = createUserEntity(payload); - when(userService.findBySource(ORGANIZATION_ID, "cockpit", payload.getUserId(), true)).thenReturn(user); + when(userService.findBySource(ORGANIZATION_ID, "cockpit", payload.userId(), true)).thenReturn(user); when(permissionChecker.checkCreatePermission(EXECUTION_CONTEXT, user.getId(), ENVIRONMENT_ID, DeploymentMode.API_DOCUMENTED)) .thenReturn(Optional.empty()); @@ -336,12 +338,12 @@ public void handle_null_mode() throws InterruptedException { when( cockpitApiService.createApi( EXECUTION_CONTEXT, - payload.getModelId(), + payload.modelId(), user.getId(), - payload.getSwaggerDefinition(), + payload.swaggerDefinition(), ENVIRONMENT_ID, DeploymentMode.API_DOCUMENTED, - payload.getLabels() + payload.labels() ) ) .thenAnswer(i -> { @@ -358,12 +360,12 @@ public void handle_null_mode() throws InterruptedException { @Test public void handleWithException() throws InterruptedException { - DeployModelPayload payload = createDeployPayload(DeployModelPayload.DeploymentMode.API_DOCUMENTED); + DeployModelCommandPayload payload = createDeployPayload(DeployModelCommandPayload.DeploymentMode.API_DOCUMENTED); DeployModelCommand command = new DeployModelCommand(payload); UserEntity user = createUserEntity(payload); - when(userService.findBySource(ORGANIZATION_ID, "cockpit", payload.getUserId(), true)).thenReturn(user); + when(userService.findBySource(ORGANIZATION_ID, "cockpit", payload.userId(), true)).thenReturn(user); when(permissionChecker.checkCreatePermission(EXECUTION_CONTEXT, user.getId(), ENVIRONMENT_ID, DeploymentMode.API_DOCUMENTED)) .thenReturn(Optional.empty()); @@ -371,12 +373,12 @@ public void handleWithException() throws InterruptedException { when( cockpitApiService.createApi( EXECUTION_CONTEXT, - payload.getModelId(), + payload.modelId(), user.getId(), - payload.getSwaggerDefinition(), + payload.swaggerDefinition(), ENVIRONMENT_ID, DeploymentMode.API_DOCUMENTED, - payload.getLabels() + payload.labels() ) ) .thenThrow(new RuntimeException("fake error")); @@ -390,12 +392,12 @@ public void handleWithException() throws InterruptedException { @Test public void fails_to_create_due_to_permission_issues() throws InterruptedException { - DeployModelPayload payload = createDeployPayload(DeployModelPayload.DeploymentMode.API_DOCUMENTED); + DeployModelCommandPayload payload = createDeployPayload(DeployModelCommandPayload.DeploymentMode.API_DOCUMENTED); DeployModelCommand command = new DeployModelCommand(payload); UserEntity user = createUserEntity(payload); - when(userService.findBySource(ORGANIZATION_ID, "cockpit", payload.getUserId(), true)).thenReturn(user); + when(userService.findBySource(ORGANIZATION_ID, "cockpit", payload.userId(), true)).thenReturn(user); when(permissionChecker.checkCreatePermission(EXECUTION_CONTEXT, user.getId(), ENVIRONMENT_ID, DeploymentMode.API_DOCUMENTED)) .thenReturn(Optional.of("You are not allowed to create APIs on this environment.")); @@ -407,23 +409,23 @@ public void fails_to_create_due_to_permission_issues() throws InterruptedExcepti obs.assertValue(reply -> { Assertions .assertThat(reply) - .extracting(DeployModelReply::getCommandId, DeployModelReply::getCommandStatus, DeployModelReply::getMessage) - .containsExactly(command.getId(), CommandStatus.FAILED, "You are not allowed to create APIs on this environment."); + .extracting(DeployModelReply::getCommandId, DeployModelReply::getCommandStatus, DeployModelReply::getErrorDetails) + .containsExactly(command.getId(), CommandStatus.ERROR, "You are not allowed to create APIs on this environment."); return true; }); } @Test public void fails_to_update_due_to_permission_issues() throws InterruptedException { - DeployModelPayload payload = createDeployPayload(DeployModelPayload.DeploymentMode.API_DOCUMENTED); + DeployModelCommandPayload payload = createDeployPayload(DeployModelCommandPayload.DeploymentMode.API_DOCUMENTED); DeployModelCommand command = new DeployModelCommand(payload); String apiId = "api#id"; - when(apiSearchService.findIdByEnvironmentIdAndCrossId(ENVIRONMENT_ID, payload.getModelId())).thenReturn(Optional.of(apiId)); + when(apiSearchService.findIdByEnvironmentIdAndCrossId(ENVIRONMENT_ID, payload.modelId())).thenReturn(Optional.of(apiId)); UserEntity user = createUserEntity(payload); - when(userService.findBySource(ORGANIZATION_ID, "cockpit", payload.getUserId(), true)).thenReturn(user); + when(userService.findBySource(ORGANIZATION_ID, "cockpit", payload.userId(), true)).thenReturn(user); when(permissionChecker.checkUpdatePermission(EXECUTION_CONTEXT, user.getId(), ENVIRONMENT_ID, apiId, DeploymentMode.API_DOCUMENTED)) .thenReturn(Optional.of("You are not allowed to create APIs on this environment.")); @@ -435,20 +437,20 @@ public void fails_to_update_due_to_permission_issues() throws InterruptedExcepti obs.assertValue(reply -> { Assertions .assertThat(reply) - .extracting(DeployModelReply::getCommandId, DeployModelReply::getCommandStatus, DeployModelReply::getMessage) - .containsExactly(command.getId(), CommandStatus.FAILED, "You are not allowed to create APIs on this environment."); + .extracting(DeployModelReply::getCommandId, DeployModelReply::getCommandStatus, DeployModelReply::getErrorDetails) + .containsExactly(command.getId(), CommandStatus.ERROR, "You are not allowed to create APIs on this environment."); return true; }); } @Test public void clean_gravitee_context_on_success() throws InterruptedException { - DeployModelPayload payload = createDeployPayload(DeployModelPayload.DeploymentMode.API_DOCUMENTED); + DeployModelCommandPayload payload = createDeployPayload(DeployModelCommandPayload.DeploymentMode.API_DOCUMENTED); DeployModelCommand command = new DeployModelCommand(payload); UserEntity user = createUserEntity(payload); - when(userService.findBySource(ORGANIZATION_ID, "cockpit", payload.getUserId(), true)).thenReturn(user); + when(userService.findBySource(ORGANIZATION_ID, "cockpit", payload.userId(), true)).thenReturn(user); when(permissionChecker.checkCreatePermission(EXECUTION_CONTEXT, user.getId(), ENVIRONMENT_ID, DeploymentMode.API_DOCUMENTED)) .thenReturn(Optional.empty()); @@ -456,12 +458,12 @@ public void clean_gravitee_context_on_success() throws InterruptedException { when( cockpitApiService.createApi( EXECUTION_CONTEXT, - payload.getModelId(), + payload.modelId(), user.getId(), - payload.getSwaggerDefinition(), + payload.swaggerDefinition(), ENVIRONMENT_ID, DeploymentMode.API_DOCUMENTED, - payload.getLabels() + payload.labels() ) ) .thenAnswer(i -> { @@ -477,12 +479,12 @@ public void clean_gravitee_context_on_success() throws InterruptedException { @Test public void clean_gravitee_context_on_error() throws InterruptedException { - DeployModelPayload payload = createDeployPayload(DeployModelPayload.DeploymentMode.API_DOCUMENTED); + DeployModelCommandPayload payload = createDeployPayload(DeployModelCommandPayload.DeploymentMode.API_DOCUMENTED); DeployModelCommand command = new DeployModelCommand(payload); UserEntity user = createUserEntity(payload); - when(userService.findBySource(ORGANIZATION_ID, "cockpit", payload.getUserId(), true)).thenReturn(user); + when(userService.findBySource(ORGANIZATION_ID, "cockpit", payload.userId(), true)).thenReturn(user); when(permissionChecker.checkCreatePermission(EXECUTION_CONTEXT, user.getId(), ENVIRONMENT_ID, DeploymentMode.API_DOCUMENTED)) .thenReturn(Optional.of("You are not allowed to create APIs on this environment.")); @@ -495,12 +497,12 @@ public void clean_gravitee_context_on_error() throws InterruptedException { @Test public void fails_to_create_due_to_context_path_already_used() throws InterruptedException { - DeployModelPayload payload = createDeployPayload(DeployModelPayload.DeploymentMode.API_DOCUMENTED); + DeployModelCommandPayload payload = createDeployPayload(DeployModelCommandPayload.DeploymentMode.API_DOCUMENTED); DeployModelCommand command = new DeployModelCommand(payload); UserEntity user = createUserEntity(payload); - when(userService.findBySource(ORGANIZATION_ID, "cockpit", payload.getUserId(), true)).thenReturn(user); + when(userService.findBySource(ORGANIZATION_ID, "cockpit", payload.userId(), true)).thenReturn(user); when(permissionChecker.checkCreatePermission(EXECUTION_CONTEXT, user.getId(), ENVIRONMENT_ID, DeploymentMode.API_DOCUMENTED)) .thenReturn(Optional.empty()); @@ -508,12 +510,12 @@ public void fails_to_create_due_to_context_path_already_used() throws Interrupte when( cockpitApiService.createApi( EXECUTION_CONTEXT, - payload.getModelId(), + payload.modelId(), user.getId(), - payload.getSwaggerDefinition(), + payload.swaggerDefinition(), ENVIRONMENT_ID, DeploymentMode.API_DOCUMENTED, - payload.getLabels() + payload.labels() ) ) .thenReturn(ApiEntityResult.failure("context path not available")); @@ -525,40 +527,41 @@ public void fails_to_create_due_to_context_path_already_used() throws Interrupte obs.assertValue(reply -> { Assertions .assertThat(reply) - .extracting(DeployModelReply::getCommandId, DeployModelReply::getCommandStatus, DeployModelReply::getMessage) - .containsExactly(command.getId(), CommandStatus.FAILED, "context path not available"); + .extracting(DeployModelReply::getCommandId, DeployModelReply::getCommandStatus, DeployModelReply::getErrorDetails) + .containsExactly(command.getId(), CommandStatus.ERROR, "Failed to import API [context path not available]."); return true; }); } @Test public void creates_an_API_PUBLISHED_mode_with_apim_ids() throws InterruptedException { - DeployModelPayload payload = createDeployPayload(DeployModelPayload.DeploymentMode.API_PUBLISHED); - payload.setOrganizationId(ORGANIZATION_ID); - payload.setEnvironmentId(ENVIRONMENT_ID); + DeployModelCommandPayload payload = createDeployPayload( + DeployModelCommandPayload.DeploymentMode.API_PUBLISHED, + ENVIRONMENT_ID, + ORGANIZATION_ID + ); when(environmentService.findByCockpitId(ENVIRONMENT_ID)).thenThrow(new EnvironmentNotFoundException(ENVIRONMENT_ID)); when(environmentService.findById(ENVIRONMENT_ID)) .thenReturn( EnvironmentEntity.builder().id(ENVIRONMENT_ID).organizationId(ORGANIZATION_ID).cockpitId(COCKPIT_ENVIRONMENT_ID).build() ); - DeployModelCommand command = new DeployModelCommand(payload); UserEntity user = createUserEntity(payload); - when(userService.findBySource(ORGANIZATION_ID, "cockpit", payload.getUserId(), true)).thenReturn(user); + when(userService.findBySource(ORGANIZATION_ID, "cockpit", payload.userId(), true)).thenReturn(user); when(permissionChecker.checkCreatePermission(EXECUTION_CONTEXT, user.getId(), ENVIRONMENT_ID, DeploymentMode.API_PUBLISHED)) .thenReturn(Optional.empty()); when( cockpitApiService.createApi( EXECUTION_CONTEXT, - payload.getModelId(), + payload.modelId(), user.getId(), - payload.getSwaggerDefinition(), + payload.swaggerDefinition(), ENVIRONMENT_ID, DeploymentMode.API_PUBLISHED, - payload.getLabels() + payload.labels() ) ) .thenAnswer(i -> { @@ -570,25 +573,35 @@ public void creates_an_API_PUBLISHED_mode_with_apim_ids() throws InterruptedExce TestObserver obs = cut.handle(command).test(); obs.await(); + obs.assertValue(reply -> reply.getCommandId().equals(command.getId()) && reply.getCommandStatus().equals(CommandStatus.SUCCEEDED)); } - private static DeployModelPayload createDeployPayload(final DeployModelPayload.DeploymentMode deploymentMode) { - DeployModelPayload payload = new DeployModelPayload(); - payload.setModelId("model#1"); - payload.setSwaggerDefinition("swagger-definition"); - payload.setUserId("cockpit_user#id"); - payload.setMode(deploymentMode); - payload.setLabels(List.of("label1", "label2")); - payload.setEnvironmentId(COCKPIT_ENVIRONMENT_ID); - payload.setOrganizationId(COCKPIT_ORGANIZATION_ID); - return payload; + private static DeployModelCommandPayload createDeployPayload( + final DeployModelCommandPayload.DeploymentMode deploymentMode, + final String environmentId, + final String organizationId + ) { + return DeployModelCommandPayload + .builder() + .modelId("model#1") + .swaggerDefinition("swagger-definition") + .userId("cockpit_user#id") + .mode(deploymentMode) + .labels(List.of("label1", "label2")) + .environmentId(environmentId) + .organizationId(organizationId) + .build(); + } + + private static DeployModelCommandPayload createDeployPayload(final DeployModelCommandPayload.DeploymentMode deploymentMode) { + return createDeployPayload(deploymentMode, COCKPIT_ENVIRONMENT_ID, COCKPIT_ORGANIZATION_ID); } - private static UserEntity createUserEntity(final DeployModelPayload payload) { + private static UserEntity createUserEntity(final DeployModelCommandPayload payload) { UserEntity user = new UserEntity(); user.setId("user#id"); - user.setSourceId(payload.getUserId()); + user.setSourceId(payload.userId()); user.setOrganizationId(ORGANIZATION_ID); return user; } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/DisableEnvironmentCommandHandlerTest.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/DisableEnvironmentCommandHandlerTest.java index df4d46ab598..d8d163d3537 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/DisableEnvironmentCommandHandlerTest.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/DisableEnvironmentCommandHandlerTest.java @@ -21,10 +21,10 @@ import io.gravitee.apim.core.access_point.crud_service.AccessPointCrudService; import io.gravitee.apim.core.access_point.model.AccessPoint; -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.environment.DisableEnvironmentCommand; -import io.gravitee.cockpit.api.command.environment.DisableEnvironmentPayload; +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; +import io.gravitee.cockpit.api.command.v1.environment.DisableEnvironmentCommand; +import io.gravitee.cockpit.api.command.v1.environment.DisableEnvironmentCommandPayload; +import io.gravitee.exchange.api.command.CommandStatus; import io.gravitee.repository.management.api.ApiRepository; import io.gravitee.repository.management.api.search.ApiCriteria; import io.gravitee.repository.management.api.search.ApiFieldFilter; @@ -83,8 +83,8 @@ void setUp() { } @Test - void handleType() { - assertEquals(Command.Type.DISABLE_ENVIRONMENT_COMMAND, cut.handleType()); + void supportType() { + assertEquals(CockpitCommandType.DISABLE_ENVIRONMENT.name(), cut.supportType()); } @Test @@ -127,9 +127,6 @@ void handleThrowsException() { } private DisableEnvironmentCommand aDisableEnvCommand() { - var payload = new DisableEnvironmentPayload(); - payload.setCockpitId(ENV_COCKPIT_ID); - payload.setUserId(USER_ID); - return new DisableEnvironmentCommand(payload); + return new DisableEnvironmentCommand(DisableEnvironmentCommandPayload.builder().cockpitId(ENV_COCKPIT_ID).userId(USER_ID).build()); } } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/DisableOrganizationCommandHandlerTest.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/DisableOrganizationCommandHandlerTest.java index 71b49f7b1cb..064f8e46611 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/DisableOrganizationCommandHandlerTest.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/DisableOrganizationCommandHandlerTest.java @@ -22,10 +22,10 @@ import io.gravitee.apim.core.access_point.crud_service.AccessPointCrudService; import io.gravitee.apim.core.access_point.model.AccessPoint; -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.organization.DisableOrganizationCommand; -import io.gravitee.cockpit.api.command.organization.DisableOrganizationPayload; +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; +import io.gravitee.cockpit.api.command.v1.organization.DisableOrganizationCommand; +import io.gravitee.cockpit.api.command.v1.organization.DisableOrganizationCommandPayload; +import io.gravitee.exchange.api.command.CommandStatus; import io.gravitee.rest.api.model.OrganizationEntity; import io.gravitee.rest.api.model.configuration.identity.IdentityProviderActivationReferenceType; import io.gravitee.rest.api.service.OrganizationService; @@ -63,8 +63,8 @@ void setUp() { } @Test - void handleType() { - assertEquals(Command.Type.DISABLE_ORGANIZATION_COMMAND, cut.handleType()); + void supportType() { + assertEquals(CockpitCommandType.DISABLE_ORGANIZATION.name(), cut.supportType()); } @Test @@ -105,8 +105,6 @@ void handleThrowsException() { } private DisableOrganizationCommand aDisableOrgCommand() { - var payload = new DisableOrganizationPayload(); - payload.setCockpitId(ORG_COCKPIT_ID); - return new DisableOrganizationCommand(payload); + return new DisableOrganizationCommand(DisableOrganizationCommandPayload.builder().cockpitId(ORG_COCKPIT_ID).build()); } } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/EnvironmentCommandHandlerTest.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/EnvironmentCommandHandlerTest.java index a389f3d1609..998877e5de0 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/EnvironmentCommandHandlerTest.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/EnvironmentCommandHandlerTest.java @@ -23,12 +23,12 @@ import static org.mockito.Mockito.when; import io.gravitee.apim.core.access_point.crud_service.AccessPointCrudService; -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.accesspoint.AccessPoint; -import io.gravitee.cockpit.api.command.environment.EnvironmentCommand; -import io.gravitee.cockpit.api.command.environment.EnvironmentPayload; -import io.gravitee.cockpit.api.command.environment.EnvironmentReply; +import io.gravitee.cockpit.api.command.model.accesspoint.AccessPoint; +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; +import io.gravitee.cockpit.api.command.v1.environment.EnvironmentCommand; +import io.gravitee.cockpit.api.command.v1.environment.EnvironmentCommandPayload; +import io.gravitee.cockpit.api.command.v1.environment.EnvironmentReply; +import io.gravitee.exchange.api.command.CommandStatus; import io.gravitee.rest.api.model.EnvironmentEntity; import io.gravitee.rest.api.model.UpdateEnvironmentEntity; import io.gravitee.rest.api.service.EnvironmentService; @@ -63,37 +63,39 @@ public void before() { } @Test - public void handleType() { - assertEquals(Command.Type.ENVIRONMENT_COMMAND, cut.handleType()); + public void supportType() { + assertEquals(CockpitCommandType.ENVIRONMENT.name(), cut.supportType()); } @Test public void handle() throws InterruptedException { - EnvironmentPayload environmentPayload = new EnvironmentPayload(); + EnvironmentCommandPayload environmentPayload = EnvironmentCommandPayload + .builder() + .id("env#1") + .cockpitId("env#cockpit-1") + .hrids(Collections.singletonList("env-1")) + .organizationId("orga#1") + .description("Environment description") + .name("Environment name") + .accessPoints( + List.of( + AccessPoint.builder().target(AccessPoint.Target.CONSOLE).host("domain.restriction1.io").build(), + AccessPoint.builder().target(AccessPoint.Target.CONSOLE).host("domain.restriction2.io").build() + ) + ) + .build(); EnvironmentCommand command = new EnvironmentCommand(environmentPayload); - environmentPayload.setId("env#1"); - environmentPayload.setCockpitId("env#cockpit-1"); - environmentPayload.setHrids(Collections.singletonList("env-1")); - environmentPayload.setOrganizationId("orga#1"); - environmentPayload.setDescription("Environment description"); - environmentPayload.setName("Environment name"); - environmentPayload.setAccessPoints( - List.of( - AccessPoint.builder().target(AccessPoint.Target.CONSOLE).host("domain.restriction1.io").build(), - AccessPoint.builder().target(AccessPoint.Target.CONSOLE).host("domain.restriction2.io").build() - ) - ); when(environmentService.findByCockpitId(any())).thenThrow(new EnvironmentNotFoundException("Env not found")); when( environmentService.createOrUpdate( eq("orga#1"), eq("env#1"), argThat(newEnvironment -> - newEnvironment.getCockpitId().equals(environmentPayload.getCockpitId()) && - newEnvironment.getHrids().equals(environmentPayload.getHrids()) && - newEnvironment.getDescription().equals(environmentPayload.getDescription()) && - newEnvironment.getName().equals(environmentPayload.getName()) + newEnvironment.getCockpitId().equals(environmentPayload.cockpitId()) && + newEnvironment.getHrids().equals(environmentPayload.hrids()) && + newEnvironment.getDescription().equals(environmentPayload.description()) && + newEnvironment.getName().equals(environmentPayload.name()) ) ) ) @@ -107,20 +109,22 @@ public void handle() throws InterruptedException { @Test public void handleWithException() throws InterruptedException { - EnvironmentPayload environmentPayload = new EnvironmentPayload(); - EnvironmentCommand command = new EnvironmentCommand(environmentPayload); - - environmentPayload.setId("env#1"); - environmentPayload.setCockpitId("env#cockpit-1"); - environmentPayload.setOrganizationId("orga#1"); - environmentPayload.setDescription("Environment description"); - environmentPayload.setName("Environment name"); - environmentPayload.setAccessPoints( - List.of( - AccessPoint.builder().target(AccessPoint.Target.CONSOLE).host("domain.restriction1.io").build(), - AccessPoint.builder().target(AccessPoint.Target.CONSOLE).host("domain.restriction2.io").build() + EnvironmentCommandPayload environmentPayload = EnvironmentCommandPayload + .builder() + .id("env#1") + .cockpitId("env#cockpit-1") + .hrids(Collections.singletonList("env-1")) + .organizationId("orga#1") + .description("Environment description") + .name("Environment name") + .accessPoints( + List.of( + AccessPoint.builder().target(AccessPoint.Target.CONSOLE).host("domain.restriction1.io").build(), + AccessPoint.builder().target(AccessPoint.Target.CONSOLE).host("domain.restriction2.io").build() + ) ) - ); + .build(); + EnvironmentCommand command = new EnvironmentCommand(environmentPayload); when(environmentService.findByCockpitId(any())).thenThrow(new EnvironmentNotFoundException("Env not found")); when(environmentService.createOrUpdate(eq("orga#1"), eq("env#1"), any(UpdateEnvironmentEntity.class))) @@ -135,21 +139,22 @@ public void handleWithException() throws InterruptedException { @Test public void handleWithExistingCockpitId() throws InterruptedException { - EnvironmentPayload environmentPayload = new EnvironmentPayload(); - EnvironmentCommand command = new EnvironmentCommand(environmentPayload); - - environmentPayload.setId("env#1"); - environmentPayload.setCockpitId("env#cockpit-1"); - environmentPayload.setHrids(Collections.singletonList("env-1")); - environmentPayload.setOrganizationId("orga#1"); - environmentPayload.setDescription("Environment description"); - environmentPayload.setName("Environment name"); - environmentPayload.setAccessPoints( - List.of( - AccessPoint.builder().target(AccessPoint.Target.CONSOLE).host("domain.restriction1.io").build(), - AccessPoint.builder().target(AccessPoint.Target.CONSOLE).host("domain.restriction2.io").build() + EnvironmentCommandPayload environmentPayload = EnvironmentCommandPayload + .builder() + .id("env#1") + .cockpitId("env#cockpit-1") + .hrids(Collections.singletonList("env-1")) + .organizationId("orga#1") + .description("Environment description") + .name("Environment name") + .accessPoints( + List.of( + AccessPoint.builder().target(AccessPoint.Target.CONSOLE).host("domain.restriction1.io").build(), + AccessPoint.builder().target(AccessPoint.Target.CONSOLE).host("domain.restriction2.io").build() + ) ) - ); + .build(); + EnvironmentCommand command = new EnvironmentCommand(environmentPayload); EnvironmentEntity existingEnvironment = mock(EnvironmentEntity.class); when(existingEnvironment.getId()).thenReturn("DEFAULT"); when(existingEnvironment.getOrganizationId()).thenReturn("DEFAULT"); @@ -159,10 +164,10 @@ public void handleWithExistingCockpitId() throws InterruptedException { eq("DEFAULT"), eq("DEFAULT"), argThat(newEnvironment -> - newEnvironment.getCockpitId().equals(environmentPayload.getCockpitId()) && - newEnvironment.getHrids().equals(environmentPayload.getHrids()) && - newEnvironment.getDescription().equals(environmentPayload.getDescription()) && - newEnvironment.getName().equals(environmentPayload.getName()) + newEnvironment.getCockpitId().equals(environmentPayload.cockpitId()) && + newEnvironment.getHrids().equals(environmentPayload.hrids()) && + newEnvironment.getDescription().equals(environmentPayload.description()) && + newEnvironment.getName().equals(environmentPayload.name()) ) ) ) diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/GoodbyeCommandHandlerTest.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/GoodByeCommandHandlerTest.java similarity index 88% rename from gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/GoodbyeCommandHandlerTest.java rename to gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/GoodByeCommandHandlerTest.java index 44723251f3a..dee787e50e3 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/GoodbyeCommandHandlerTest.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/GoodByeCommandHandlerTest.java @@ -15,20 +15,19 @@ */ package io.gravitee.rest.api.service.cockpit.command.handler; -import static io.gravitee.rest.api.service.cockpit.command.handler.GoodbyeCommandHandler.DELETED_STATUS; +import static io.gravitee.rest.api.service.cockpit.command.handler.GoodByeCommandHandler.DELETED_STATUS; import static java.util.Collections.emptyList; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.groups.Tuple.tuple; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.*; -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.goodbye.GoodbyeCommand; -import io.gravitee.cockpit.api.command.goodbye.GoodbyeReply; +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; import io.gravitee.common.data.domain.Page; +import io.gravitee.exchange.api.command.CommandStatus; +import io.gravitee.exchange.api.command.goodbye.GoodByeCommand; +import io.gravitee.exchange.api.command.goodbye.GoodByeReply; import io.gravitee.rest.api.model.InstallationEntity; -import io.gravitee.rest.api.model.NewApplicationEntity; import io.gravitee.rest.api.model.promotion.PromotionEntity; import io.gravitee.rest.api.model.promotion.PromotionEntityAuthor; import io.gravitee.rest.api.model.promotion.PromotionEntityStatus; @@ -50,7 +49,7 @@ * @author GraviteeSource Team */ @RunWith(MockitoJUnitRunner.class) -public class GoodbyeCommandHandlerTest { +public class GoodByeCommandHandlerTest { private static final String CUSTOM_VALUE = "customValue"; private static final String CUSTOM_KEY = "customKey"; @@ -62,16 +61,16 @@ public class GoodbyeCommandHandlerTest { @Mock private PromotionService promotionService; - private GoodbyeCommandHandler cut; + private GoodByeCommandHandler cut; @Before public void before() { - cut = new GoodbyeCommandHandler(installationService, promotionService); + cut = new GoodByeCommandHandler(installationService, promotionService); } @Test - public void handleType() { - assertEquals(Command.Type.GOODBYE_COMMAND, cut.handleType()); + public void supportType() { + assertEquals(GoodByeCommand.COMMAND_TYPE, cut.supportType()); } @Test @@ -80,12 +79,12 @@ public void handle() throws InterruptedException { installation.setId(INSTALLATION_ID); installation.getAdditionalInformation().put(CUSTOM_KEY, CUSTOM_VALUE); - GoodbyeCommand command = new GoodbyeCommand(); + GoodByeCommand command = new GoodByeCommand(); when(installationService.getOrInitialize()).thenReturn(installation); when(promotionService.search(any(), any(), any())).thenReturn(new Page<>(emptyList(), 0, 0, 0)); - TestObserver obs = cut.handle(command).test(); + TestObserver obs = cut.handle(command).test(); obs.await(); obs.assertValue(reply -> reply.getCommandId().equals(command.getId()) && reply.getCommandStatus().equals(CommandStatus.SUCCEEDED)); @@ -102,13 +101,13 @@ public void handleWithException() throws InterruptedException { installation.setId(INSTALLATION_ID); installation.getAdditionalInformation().put(CUSTOM_KEY, CUSTOM_VALUE); - GoodbyeCommand command = new GoodbyeCommand(); + GoodByeCommand command = new GoodByeCommand(); when(installationService.getOrInitialize()).thenReturn(installation); when(installationService.setAdditionalInformation(anyMap())).thenThrow(new TechnicalManagementException()); when(promotionService.search(any(), any(), any())).thenReturn(new Page<>(emptyList(), 0, 0, 0)); - TestObserver obs = cut.handle(command).test(); + TestObserver obs = cut.handle(command).test(); obs.await(); obs.assertValue(reply -> reply.getCommandId().equals(command.getId()) && reply.getCommandStatus().equals(CommandStatus.ERROR)); @@ -120,7 +119,7 @@ public void handleRejectAllPromotionToValidate() throws InterruptedException { installation.setId(INSTALLATION_ID); installation.getAdditionalInformation().put(CUSTOM_KEY, CUSTOM_VALUE); - GoodbyeCommand command = new GoodbyeCommand(); + GoodByeCommand command = new GoodByeCommand(); when(installationService.getOrInitialize()).thenReturn(installation); @@ -128,7 +127,7 @@ public void handleRejectAllPromotionToValidate() throws InterruptedException { PromotionEntity promotionEntity2 = getAPromotionEntity("promotion#2"); when(promotionService.search(any(), any(), any())).thenReturn(new Page<>(List.of(promotionEntity1, promotionEntity2), 0, 0, 0)); - TestObserver obs = cut.handle(command).test(); + TestObserver obs = cut.handle(command).test(); obs.await(); obs.assertValue(reply -> reply.getCommandId().equals(command.getId()) && reply.getCommandStatus().equals(CommandStatus.SUCCEEDED)); diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/InstallationCommandHandlerTest.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/InstallationCommandHandlerTest.java index 21fb3c1ed7b..3f13f0a4a06 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/InstallationCommandHandlerTest.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/InstallationCommandHandlerTest.java @@ -16,13 +16,15 @@ package io.gravitee.rest.api.service.cockpit.command.handler; import static org.mockito.ArgumentMatchers.anyMap; -import static org.mockito.Mockito.*; - -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.installation.InstallationCommand; -import io.gravitee.cockpit.api.command.installation.InstallationPayload; -import io.gravitee.cockpit.api.command.installation.InstallationReply; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; +import io.gravitee.cockpit.api.command.v1.installation.InstallationCommand; +import io.gravitee.cockpit.api.command.v1.installation.InstallationCommandPayload; +import io.gravitee.cockpit.api.command.v1.installation.InstallationReply; +import io.gravitee.exchange.api.command.CommandStatus; import io.gravitee.rest.api.model.InstallationEntity; import io.gravitee.rest.api.service.InstallationService; import io.gravitee.rest.api.service.exceptions.TechnicalManagementException; @@ -57,8 +59,8 @@ public void before() { } @Test - public void handleType() { - assertEquals(Command.Type.INSTALLATION_COMMAND, cut.handleType()); + public void supportType() { + assertEquals(CockpitCommandType.INSTALLATION.name(), cut.supportType()); } @Test @@ -67,10 +69,12 @@ public void handle() throws InterruptedException { installation.setId(INSTALLATION_ID); installation.getAdditionalInformation().put(CUSTOM_KEY, CUSTOM_VALUE); - InstallationPayload installationPayload = new InstallationPayload(); + InstallationCommandPayload installationPayload = InstallationCommandPayload + .builder() + .id(INSTALLATION_ID) + .status("ACCEPTED") + .build(); InstallationCommand command = new InstallationCommand(installationPayload); - installationPayload.setId(INSTALLATION_ID); - installationPayload.setStatus("ACCEPTED"); when(installationService.getOrInitialize()).thenReturn(installation); @@ -91,10 +95,12 @@ public void handleWithException() throws InterruptedException { installation.setId(INSTALLATION_ID); installation.getAdditionalInformation().put(CUSTOM_KEY, CUSTOM_VALUE); - InstallationPayload installationPayload = new InstallationPayload(); + InstallationCommandPayload installationPayload = InstallationCommandPayload + .builder() + .id(INSTALLATION_ID) + .status("ACCEPTED") + .build(); InstallationCommand command = new InstallationCommand(installationPayload); - installationPayload.setId(INSTALLATION_ID); - installationPayload.setStatus("ACCEPTED"); when(installationService.getOrInitialize()).thenReturn(installation); when(installationService.setAdditionalInformation(anyMap())).thenThrow(new TechnicalManagementException()); diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/MembershipCommandHandlerTest.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/MembershipCommandHandlerTest.java index 1abe78615d3..7e8761d3f10 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/MembershipCommandHandlerTest.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/MembershipCommandHandlerTest.java @@ -18,14 +18,19 @@ import static io.gravitee.rest.api.service.cockpit.command.handler.UserCommandHandler.COCKPIT_SOURCE; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.*; - -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.membership.MembershipCommand; -import io.gravitee.cockpit.api.command.membership.MembershipPayload; -import io.gravitee.cockpit.api.command.membership.MembershipReply; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.argThat; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoInteractions; +import static org.mockito.Mockito.when; + +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; +import io.gravitee.cockpit.api.command.v1.membership.MembershipCommand; +import io.gravitee.cockpit.api.command.v1.membership.MembershipCommandPayload; +import io.gravitee.cockpit.api.command.v1.membership.MembershipReply; import io.gravitee.common.utils.UUID; +import io.gravitee.exchange.api.command.CommandStatus; import io.gravitee.rest.api.model.MembershipMemberType; import io.gravitee.rest.api.model.MembershipReferenceType; import io.gravitee.rest.api.model.RoleEntity; @@ -69,18 +74,20 @@ public void before() { } @Test - public void handleType() { - assertEquals(Command.Type.MEMBERSHIP_COMMAND, cut.handleType()); + public void supportType() { + assertEquals(CockpitCommandType.MEMBERSHIP.name(), cut.supportType()); } @Test public void handleWithAdminRole() throws InterruptedException { - MembershipPayload membershipPayload = new MembershipPayload(); - membershipPayload.setUserId("user#1"); - membershipPayload.setOrganizationId("orga#1"); - membershipPayload.setReferenceType(MembershipReferenceType.ENVIRONMENT.name()); - membershipPayload.setReferenceId("env#1"); - membershipPayload.setRole("ENVIRONMENT_PRIMARY_OWNER"); + MembershipCommandPayload membershipPayload = MembershipCommandPayload + .builder() + .userId("user#1") + .organizationId("orga#1") + .referenceType(MembershipReferenceType.ENVIRONMENT.name()) + .referenceId("env#1") + .role("ENVIRONMENT_PRIMARY_OWNER") + .build(); MembershipCommand command = new MembershipCommand(membershipPayload); @@ -92,7 +99,7 @@ public void handleWithAdminRole() throws InterruptedException { role.setScope(RoleScope.ENVIRONMENT); role.setName("ADMIN"); - when(userService.findBySource(any(), eq(COCKPIT_SOURCE), eq(membershipPayload.getUserId()), eq(false))).thenReturn(user); + when(userService.findBySource(any(), eq(COCKPIT_SOURCE), eq(membershipPayload.userId()), eq(false))).thenReturn(user); when(roleService.findByScopeAndName(RoleScope.ENVIRONMENT, "ADMIN", "orga#1")).thenReturn(Optional.of(role)); TestObserver obs = cut.handle(command).test(); @@ -120,7 +127,7 @@ public void handleWithAdminRole() throws InterruptedException { ); assertEquals(MembershipReferenceType.ENVIRONMENT, membershipReference.getValue().getType()); - assertEquals(membershipPayload.getReferenceId(), membershipReference.getValue().getId()); + assertEquals(membershipPayload.referenceId(), membershipReference.getValue().getId()); assertEquals(MembershipMemberType.USER, membershipMember.getValue().getMemberType()); assertEquals(user.getId(), membershipMember.getValue().getMemberId()); assertTrue( @@ -134,12 +141,14 @@ public void handleWithAdminRole() throws InterruptedException { @Test public void handleWithRole() throws InterruptedException { - MembershipPayload membershipPayload = new MembershipPayload(); - membershipPayload.setUserId("user#1"); - membershipPayload.setOrganizationId("orga#1"); - membershipPayload.setReferenceType(MembershipReferenceType.ORGANIZATION.name()); - membershipPayload.setReferenceId("orga#1"); - membershipPayload.setRole("ORGANIZATION_OWNER"); + MembershipCommandPayload membershipPayload = MembershipCommandPayload + .builder() + .userId("user#1") + .organizationId("orga#1") + .referenceType(MembershipReferenceType.ORGANIZATION.name()) + .referenceId("orga#1") + .role("ORGANIZATION_OWNER") + .build(); MembershipCommand command = new MembershipCommand(membershipPayload); @@ -151,7 +160,7 @@ public void handleWithRole() throws InterruptedException { role.setScope(RoleScope.ORGANIZATION); role.setName("ADMIN"); - when(userService.findBySource(any(), eq(COCKPIT_SOURCE), eq(membershipPayload.getUserId()), eq(false))).thenReturn(user); + when(userService.findBySource(any(), eq(COCKPIT_SOURCE), eq(membershipPayload.userId()), eq(false))).thenReturn(user); when(roleService.findByScopeAndName(RoleScope.ORGANIZATION, "ADMIN", "orga#1")).thenReturn(Optional.of(role)); TestObserver obs = cut.handle(command).test(); @@ -179,7 +188,7 @@ public void handleWithRole() throws InterruptedException { ); assertEquals(MembershipReferenceType.ORGANIZATION, membershipReference.getValue().getType()); - assertEquals(membershipPayload.getReferenceId(), membershipReference.getValue().getId()); + assertEquals(membershipPayload.referenceId(), membershipReference.getValue().getId()); assertEquals(MembershipMemberType.USER, membershipMember.getValue().getMemberType()); assertEquals(user.getId(), membershipMember.getValue().getMemberId()); assertTrue( @@ -193,12 +202,14 @@ public void handleWithRole() throws InterruptedException { @Test public void handleWithUserRole() throws InterruptedException { - MembershipPayload membershipPayload = new MembershipPayload(); - membershipPayload.setUserId("user#1"); - membershipPayload.setOrganizationId("orga#1"); - membershipPayload.setReferenceType(MembershipReferenceType.ENVIRONMENT.name()); - membershipPayload.setReferenceId("env#1"); - membershipPayload.setRole("ENVIRONMENT_USER"); + MembershipCommandPayload membershipPayload = MembershipCommandPayload + .builder() + .userId("user#1") + .organizationId("orga#1") + .referenceType(MembershipReferenceType.ENVIRONMENT.name()) + .referenceId("env#1") + .role("ENVIRONMENT_USER") + .build(); MembershipCommand command = new MembershipCommand(membershipPayload); @@ -210,7 +221,7 @@ public void handleWithUserRole() throws InterruptedException { role.setScope(RoleScope.ENVIRONMENT); role.setName("USER"); - when(userService.findBySource(any(), eq(COCKPIT_SOURCE), eq(membershipPayload.getUserId()), eq(false))).thenReturn(user); + when(userService.findBySource(any(), eq(COCKPIT_SOURCE), eq(membershipPayload.userId()), eq(false))).thenReturn(user); when(roleService.findByScopeAndName(RoleScope.ENVIRONMENT, "USER", "orga#1")).thenReturn(Optional.of(role)); TestObserver obs = cut.handle(command).test(); @@ -238,7 +249,7 @@ public void handleWithUserRole() throws InterruptedException { ); assertEquals(MembershipReferenceType.ENVIRONMENT, membershipReference.getValue().getType()); - assertEquals(membershipPayload.getReferenceId(), membershipReference.getValue().getId()); + assertEquals(membershipPayload.referenceId(), membershipReference.getValue().getId()); assertEquals(MembershipMemberType.USER, membershipMember.getValue().getMemberType()); assertEquals(user.getId(), membershipMember.getValue().getMemberId()); assertTrue( @@ -252,12 +263,14 @@ public void handleWithUserRole() throws InterruptedException { @Test public void handleWithUnknownRole() throws InterruptedException { - MembershipPayload membershipPayload = new MembershipPayload(); - membershipPayload.setUserId("user#1"); - membershipPayload.setOrganizationId("orga#1"); - membershipPayload.setReferenceType(MembershipReferenceType.ENVIRONMENT.name()); - membershipPayload.setReferenceId("env#1"); - membershipPayload.setRole("UNKNOWN"); + MembershipCommandPayload membershipPayload = MembershipCommandPayload + .builder() + .userId("user#1") + .organizationId("orga#1") + .referenceType(MembershipReferenceType.ENVIRONMENT.name()) + .referenceId("env#1") + .role("UNKNOWN") + .build(); MembershipCommand command = new MembershipCommand(membershipPayload); @@ -267,7 +280,7 @@ public void handleWithUnknownRole() throws InterruptedException { RoleEntity role = new RoleEntity(); role.setId(UUID.random().toString()); - when(userService.findBySource(any(), eq(COCKPIT_SOURCE), eq(membershipPayload.getUserId()), eq(false))).thenReturn(user); + when(userService.findBySource(any(), eq(COCKPIT_SOURCE), eq(membershipPayload.userId()), eq(false))).thenReturn(user); TestObserver obs = cut.handle(command).test(); @@ -280,17 +293,19 @@ public void handleWithUnknownRole() throws InterruptedException { @Test public void handleWithUnknownUser() throws InterruptedException { - MembershipPayload membershipPayload = new MembershipPayload(); - membershipPayload.setUserId("user#1"); - membershipPayload.setOrganizationId("orga#1"); - membershipPayload.setReferenceType(MembershipReferenceType.ENVIRONMENT.name()); - membershipPayload.setReferenceId("env#1"); - membershipPayload.setRole("UNKNOWN"); + MembershipCommandPayload membershipPayload = MembershipCommandPayload + .builder() + .userId("user#1") + .organizationId("orga#1") + .referenceType(MembershipReferenceType.ENVIRONMENT.name()) + .referenceId("env#1") + .role("UNKNOWN") + .build(); MembershipCommand command = new MembershipCommand(membershipPayload); - when(userService.findBySource(any(), eq(COCKPIT_SOURCE), eq(membershipPayload.getUserId()), eq(false))) - .thenThrow(new UserNotFoundException(membershipPayload.getUserId())); + when(userService.findBySource(any(), eq(COCKPIT_SOURCE), eq(membershipPayload.userId()), eq(false))) + .thenThrow(new UserNotFoundException(membershipPayload.userId())); TestObserver obs = cut.handle(command).test(); diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/OrganizationCommandHandlerTest.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/OrganizationCommandHandlerTest.java index 793842a28c7..fb96582c6db 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/OrganizationCommandHandlerTest.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/OrganizationCommandHandlerTest.java @@ -23,16 +23,15 @@ import io.gravitee.apim.core.access_point.crud_service.AccessPointCrudService; import io.gravitee.apim.core.license.domain_service.LicenseDomainService; -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.accesspoint.AccessPoint; -import io.gravitee.cockpit.api.command.organization.OrganizationCommand; -import io.gravitee.cockpit.api.command.organization.OrganizationPayload; -import io.gravitee.cockpit.api.command.organization.OrganizationReply; +import io.gravitee.cockpit.api.command.model.accesspoint.AccessPoint; +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; +import io.gravitee.cockpit.api.command.v1.organization.OrganizationCommand; +import io.gravitee.cockpit.api.command.v1.organization.OrganizationCommandPayload; +import io.gravitee.cockpit.api.command.v1.organization.OrganizationReply; +import io.gravitee.exchange.api.command.CommandStatus; import io.gravitee.rest.api.model.OrganizationEntity; import io.gravitee.rest.api.model.UpdateOrganizationEntity; import io.gravitee.rest.api.service.OrganizationService; -import io.gravitee.rest.api.service.exceptions.EnvironmentNotFoundException; import io.gravitee.rest.api.service.exceptions.OrganizationNotFoundException; import io.reactivex.rxjava3.observers.TestObserver; import java.util.Collections; @@ -68,35 +67,37 @@ public void before() { } @Test - public void handleType() { - assertEquals(Command.Type.ORGANIZATION_COMMAND, cut.handleType()); + public void supportType() { + assertEquals(CockpitCommandType.ORGANIZATION.name(), cut.supportType()); } @Test public void handle() throws InterruptedException { - OrganizationPayload organizationPayload = new OrganizationPayload(); + OrganizationCommandPayload organizationPayload = OrganizationCommandPayload + .builder() + .id("orga#1") + .cockpitId("org#cockpit-1") + .hrids(Collections.singletonList("orga-1")) + .description("Organization description") + .name("Organization name") + .accessPoints( + List.of( + AccessPoint.builder().target(AccessPoint.Target.CONSOLE).host("domain.restriction1.io").build(), + AccessPoint.builder().target(AccessPoint.Target.CONSOLE).host("domain.restriction2.io").build() + ) + ) + .build(); OrganizationCommand command = new OrganizationCommand(organizationPayload); - organizationPayload.setId("orga#1"); - organizationPayload.setCockpitId("org#cockpit-1"); - organizationPayload.setHrids(Collections.singletonList("orga-1")); - organizationPayload.setDescription("Organization description"); - organizationPayload.setName("Organization name"); - organizationPayload.setAccessPoints( - List.of( - AccessPoint.builder().target(AccessPoint.Target.CONSOLE).host("domain.restriction1.io").build(), - AccessPoint.builder().target(AccessPoint.Target.CONSOLE).host("domain.restriction2.io").build() - ) - ); when(organizationService.findByCockpitId(any())).thenThrow(new OrganizationNotFoundException("Org not found")); when( organizationService.createOrUpdate( argThat(orgaId -> orgaId.equals("orga#1")), argThat(newOrganization -> - newOrganization.getCockpitId().equals(organizationPayload.getCockpitId()) && - newOrganization.getHrids().equals(organizationPayload.getHrids()) && - newOrganization.getDescription().equals(organizationPayload.getDescription()) && - newOrganization.getName().equals(organizationPayload.getName()) + newOrganization.getCockpitId().equals(organizationPayload.cockpitId()) && + newOrganization.getHrids().equals(organizationPayload.hrids()) && + newOrganization.getDescription().equals(organizationPayload.description()) && + newOrganization.getName().equals(organizationPayload.name()) ) ) ) @@ -110,18 +111,19 @@ public void handle() throws InterruptedException { @Test public void handleWithException() throws InterruptedException { - OrganizationPayload organizationPayload = new OrganizationPayload(); - OrganizationCommand command = new OrganizationCommand(organizationPayload); - - organizationPayload.setId("orga#1"); - organizationPayload.setDescription("Organization description"); - organizationPayload.setName("Organization name"); - organizationPayload.setAccessPoints( - List.of( - AccessPoint.builder().target(AccessPoint.Target.CONSOLE).host("domain.restriction1.io").build(), - AccessPoint.builder().target(AccessPoint.Target.CONSOLE).host("domain.restriction2.io").build() + OrganizationCommandPayload organizationPayload = OrganizationCommandPayload + .builder() + .id("orga#1") + .description("Organization description") + .name("Organization name") + .accessPoints( + List.of( + AccessPoint.builder().target(AccessPoint.Target.CONSOLE).host("domain.restriction1.io").build(), + AccessPoint.builder().target(AccessPoint.Target.CONSOLE).host("domain.restriction2.io").build() + ) ) - ); + .build(); + OrganizationCommand command = new OrganizationCommand(organizationPayload); when(organizationService.findByCockpitId(any())).thenThrow(new OrganizationNotFoundException("Org not found")); when(organizationService.createOrUpdate(argThat(orgaId -> orgaId.equals("orga#1")), any(UpdateOrganizationEntity.class))) @@ -136,20 +138,22 @@ public void handleWithException() throws InterruptedException { @Test public void handleWithExistingCockpitId() throws InterruptedException { - OrganizationPayload organizationPayload = new OrganizationPayload(); + OrganizationCommandPayload organizationPayload = OrganizationCommandPayload + .builder() + .id("orga#1") + .cockpitId("org#cockpit-1") + .hrids(Collections.singletonList("orga-1")) + .description("Organization description") + .name("Organization name") + .accessPoints( + List.of( + AccessPoint.builder().target(AccessPoint.Target.CONSOLE).host("domain.restriction1.io").build(), + AccessPoint.builder().target(AccessPoint.Target.CONSOLE).host("domain.restriction2.io").build() + ) + ) + .build(); OrganizationCommand command = new OrganizationCommand(organizationPayload); - organizationPayload.setId("orga#1"); - organizationPayload.setCockpitId("org#cockpit-1"); - organizationPayload.setHrids(Collections.singletonList("orga-1")); - organizationPayload.setDescription("Organization description"); - organizationPayload.setName("Organization name"); - organizationPayload.setAccessPoints( - List.of( - AccessPoint.builder().target(AccessPoint.Target.CONSOLE).host("domain.restriction1.io").build(), - AccessPoint.builder().target(AccessPoint.Target.CONSOLE).host("domain.restriction2.io").build() - ) - ); OrganizationEntity existingOrganization = mock(OrganizationEntity.class); when(existingOrganization.getId()).thenReturn("DEFAULT"); when(organizationService.findByCockpitId(any())).thenReturn(existingOrganization); @@ -157,10 +161,10 @@ public void handleWithExistingCockpitId() throws InterruptedException { organizationService.createOrUpdate( argThat(orgaId -> orgaId.equals("DEFAULT")), argThat(newOrganization -> - newOrganization.getCockpitId().equals(organizationPayload.getCockpitId()) && - newOrganization.getHrids().equals(organizationPayload.getHrids()) && - newOrganization.getDescription().equals(organizationPayload.getDescription()) && - newOrganization.getName().equals(organizationPayload.getName()) + newOrganization.getCockpitId().equals(organizationPayload.cockpitId()) && + newOrganization.getHrids().equals(organizationPayload.hrids()) && + newOrganization.getDescription().equals(organizationPayload.description()) && + newOrganization.getName().equals(organizationPayload.name()) ) ) ) diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/UnlinkInstallationCommandHandlerTest.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/UnlinkInstallationCommandHandlerTest.java index 6e2bad9b1c9..45ebe677d5a 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/UnlinkInstallationCommandHandlerTest.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/UnlinkInstallationCommandHandlerTest.java @@ -15,13 +15,18 @@ */ package io.gravitee.rest.api.service.cockpit.command.handler; -import static org.mockito.Mockito.*; +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 io.gravitee.apim.core.access_point.crud_service.AccessPointCrudService; import io.gravitee.apim.core.access_point.model.AccessPoint; -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.installation.*; +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; +import io.gravitee.cockpit.api.command.v1.installation.UnlinkInstallationCommand; +import io.gravitee.cockpit.api.command.v1.installation.UnlinkInstallationCommandPayload; +import io.gravitee.cockpit.api.command.v1.installation.UnlinkInstallationReply; +import io.gravitee.exchange.api.command.CommandStatus; import io.gravitee.rest.api.model.EnvironmentEntity; import io.gravitee.rest.api.model.OrganizationEntity; import io.gravitee.rest.api.service.EnvironmentService; @@ -57,15 +62,17 @@ public void before() { } @Test - public void handleType() { - assertEquals(Command.Type.UNLINK_INSTALLATION_COMMAND, cut.handleType()); + public void supportType() { + assertEquals(CockpitCommandType.UNLINK_INSTALLATION.name(), cut.supportType()); } @Test public void handle() throws InterruptedException { - final UnlinkInstallationPayload payload = new UnlinkInstallationPayload(); - payload.setEnvironmentCockpitId(COCKPIT_ENV_ID); - payload.setOrganizationCockpitId(COCKPIT_ORG_ID); + final UnlinkInstallationCommandPayload payload = UnlinkInstallationCommandPayload + .builder() + .environmentCockpitId(COCKPIT_ENV_ID) + .organizationCockpitId(COCKPIT_ORG_ID) + .build(); EnvironmentEntity environment = mock(EnvironmentEntity.class); String envId = "env#1"; @@ -90,8 +97,10 @@ public void handle() throws InterruptedException { @Test public void handleWithException() throws InterruptedException { - final UnlinkInstallationPayload payload = new UnlinkInstallationPayload(); - payload.setEnvironmentCockpitId(COCKPIT_ENV_ID); + final UnlinkInstallationCommandPayload payload = UnlinkInstallationCommandPayload + .builder() + .environmentCockpitId(COCKPIT_ENV_ID) + .build(); UnlinkInstallationCommand command = new UnlinkInstallationCommand(payload); diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/UserCommandHandlerTest.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/UserCommandHandlerTest.java index 8d6721b53af..c5c3c18f52d 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/UserCommandHandlerTest.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/UserCommandHandlerTest.java @@ -18,14 +18,16 @@ import static io.gravitee.rest.api.model.configuration.identity.SocialIdentityProviderEntity.UserProfile.PICTURE; import static io.gravitee.rest.api.model.configuration.identity.SocialIdentityProviderEntity.UserProfile.SUB; import static org.junit.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.when; -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.user.UserCommand; -import io.gravitee.cockpit.api.command.user.UserPayload; -import io.gravitee.cockpit.api.command.user.UserReply; +import io.gravitee.cockpit.api.command.v1.CockpitCommandType; +import io.gravitee.cockpit.api.command.v1.user.UserCommand; +import io.gravitee.cockpit.api.command.v1.user.UserCommandPayload; +import io.gravitee.cockpit.api.command.v1.user.UserReply; +import io.gravitee.exchange.api.command.CommandStatus; import io.gravitee.rest.api.model.NewExternalUserEntity; import io.gravitee.rest.api.model.UpdateUserEntity; import io.gravitee.rest.api.model.UserEntity; @@ -57,28 +59,29 @@ public void before() { } @Test - public void handleType() { - assertEquals(Command.Type.USER_COMMAND, cut.handleType()); + public void supportType() { + assertEquals(CockpitCommandType.USER.name(), cut.supportType()); } @Test public void handleCreation() throws InterruptedException { - UserPayload userPayload = new UserPayload(); - UserCommand command = new UserCommand(userPayload); - final String sourceId = "user#1"; - userPayload.setId(sourceId); - userPayload.setOrganizationId("orga#1"); - userPayload.setUsername("Username"); - userPayload.setFirstName("Firstname"); - userPayload.setLastName("Lastname"); - userPayload.setPicture("https://gravitee.io/my-picture"); - userPayload.setEmail("email@gravitee.io"); - HashMap additionalInformation = new HashMap<>(); additionalInformation.put("info1", "value1"); additionalInformation.put("info2", "value2"); - userPayload.setAdditionalInformation(additionalInformation); + UserCommandPayload userPayload = UserCommandPayload + .builder() + .id(sourceId) + .organizationId("orga#1") + .username("Username") + .firstName("Firstname") + .lastName("Lastname") + .picture("https://gravitee.io/my-picture") + .email("email@gravitee.io") + .additionalInformation(additionalInformation) + .build(); + + UserCommand command = new UserCommand(userPayload); when(userService.findBySource(any(), eq("cockpit"), eq(sourceId), eq(false))).thenThrow(new UserNotFoundException(sourceId)); @@ -86,16 +89,16 @@ public void handleCreation() throws InterruptedException { userService.create( any(), argThat(newUser -> - newUser.getSourceId().equals(userPayload.getId()) && + newUser.getSourceId().equals(userPayload.id()) && newUser.getSource().equals("cockpit") && - newUser.getFirstname().equals(userPayload.getFirstName()) && - newUser.getLastname().equals(userPayload.getLastName()) && - newUser.getEmail().equals(userPayload.getEmail()) && - newUser.getPicture().equals(userPayload.getPicture()) && + newUser.getFirstname().equals(userPayload.firstName()) && + newUser.getLastname().equals(userPayload.lastName()) && + newUser.getEmail().equals(userPayload.email()) && + newUser.getPicture().equals(userPayload.picture()) && newUser.getCustomFields().get("info1").equals(additionalInformation.get("info1")) && newUser.getCustomFields().get("info2").equals(additionalInformation.get("info2")) && - newUser.getCustomFields().get(PICTURE).equals(userPayload.getPicture()) && - newUser.getCustomFields().get(SUB).equals(userPayload.getUsername()) + newUser.getCustomFields().get(PICTURE).equals(userPayload.picture()) && + newUser.getCustomFields().get(SUB).equals(userPayload.username()) ), eq(false) ) @@ -110,22 +113,22 @@ public void handleCreation() throws InterruptedException { @Test public void handleUpdate() throws InterruptedException { - UserPayload userPayload = new UserPayload(); - UserCommand command = new UserCommand(userPayload); - final String sourceId = "user#1"; - userPayload.setId(sourceId); - userPayload.setOrganizationId("orga#1"); - userPayload.setUsername("New Username"); - userPayload.setFirstName("New Firstname"); - userPayload.setLastName("New Lastname"); - userPayload.setPicture("https://gravitee.io/my-new-picture"); - userPayload.setEmail("my-new-email@gravitee.io"); - HashMap additionalInformation = new HashMap<>(); additionalInformation.put("info1", "new_value1"); additionalInformation.put("new_info3", "new_value3"); - userPayload.setAdditionalInformation(additionalInformation); + UserCommandPayload userPayload = UserCommandPayload + .builder() + .id(sourceId) + .organizationId("orga#1") + .username("New Username") + .firstName("New Firstname") + .lastName("New Lastname") + .picture("https://gravitee.io/my-new-picture") + .email("my-new-email@gravitee.io") + .additionalInformation(additionalInformation) + .build(); + UserCommand command = new UserCommand(userPayload); UserEntity existingCockpitUser = new UserEntity(); existingCockpitUser.setId("apim_user#1"); @@ -147,14 +150,14 @@ public void handleUpdate() throws InterruptedException { any(), eq("apim_user#1"), argThat(updatedUser -> - updatedUser.getFirstname().equals(userPayload.getFirstName()) && - updatedUser.getLastname().equals(userPayload.getLastName()) && - updatedUser.getEmail().equals(userPayload.getEmail()) && - updatedUser.getPicture().equals(userPayload.getPicture()) && + updatedUser.getFirstname().equals(userPayload.firstName()) && + updatedUser.getLastname().equals(userPayload.lastName()) && + updatedUser.getEmail().equals(userPayload.email()) && + updatedUser.getPicture().equals(userPayload.picture()) && updatedUser.getCustomFields().get("info1").equals(additionalInformation.get("info1")) && updatedUser.getCustomFields().get("new_info3").equals(additionalInformation.get("new_info3")) && - updatedUser.getCustomFields().get(PICTURE).equals(userPayload.getPicture()) && - updatedUser.getCustomFields().get(SUB).equals(userPayload.getUsername()) + updatedUser.getCustomFields().get(PICTURE).equals(userPayload.picture()) && + updatedUser.getCustomFields().get(SUB).equals(userPayload.username()) ) ) ) @@ -168,12 +171,9 @@ public void handleUpdate() throws InterruptedException { @Test public void handleWithCreateException() throws InterruptedException { - UserPayload userPayload = new UserPayload(); - UserCommand command = new UserCommand(userPayload); - final String sourceId = "user#1"; - userPayload.setId(sourceId); - userPayload.setOrganizationId("orga#1"); + UserCommandPayload userPayload = UserCommandPayload.builder().id(sourceId).organizationId("orga#1").build(); + UserCommand command = new UserCommand(userPayload); when(userService.findBySource(any(), eq("cockpit"), eq(sourceId), eq(false))).thenThrow(new UserNotFoundException(sourceId)); when(userService.create(any(), any(NewExternalUserEntity.class), eq(false))).thenThrow(new RuntimeException("fake error")); @@ -186,12 +186,9 @@ public void handleWithCreateException() throws InterruptedException { @Test public void handleWithUpdateException() throws InterruptedException { - UserPayload userPayload = new UserPayload(); - UserCommand command = new UserCommand(userPayload); - final String sourceId = "user#1"; - userPayload.setId(sourceId); - userPayload.setOrganizationId("orga#1"); + UserCommandPayload userPayload = UserCommandPayload.builder().id(sourceId).organizationId("orga#1").build(); + UserCommand command = new UserCommand(userPayload); when(userService.findBySource(any(), eq("cockpit"), eq(sourceId), eq(false))).thenReturn(new UserEntity()); when(userService.update(any(), any(), any(UpdateUserEntity.class))).thenThrow(new RuntimeException("fake error")); diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/V4ApiCommandHandlerTest.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/V4ApiCommandHandlerTest.java index 90d14348055..86d4c9275ee 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/V4ApiCommandHandlerTest.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/V4ApiCommandHandlerTest.java @@ -22,10 +22,10 @@ import static org.mockito.Mockito.when; import com.fasterxml.jackson.core.JsonProcessingException; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.v4api.V4ApiCommand; -import io.gravitee.cockpit.api.command.v4api.V4ApiPayload; -import io.gravitee.cockpit.api.command.v4api.V4ApiReply; +import io.gravitee.cockpit.api.command.v1.v4api.V4ApiCommand; +import io.gravitee.cockpit.api.command.v1.v4api.V4ApiCommandPayload; +import io.gravitee.cockpit.api.command.v1.v4api.V4ApiReply; +import io.gravitee.exchange.api.command.CommandStatus; import io.gravitee.rest.api.model.UserEntity; import io.gravitee.rest.api.model.v4.api.ApiEntity; import io.gravitee.rest.api.service.UserService; @@ -60,21 +60,21 @@ public class V4ApiCommandHandlerTest { @BeforeEach public void setUp() throws Exception { - command = new V4ApiCommand(); - command.setId("test-id"); - final V4ApiPayload payload = new V4ApiPayload(); - payload.setUserId("123"); - payload.setApiDefinition("any-definition"); - payload.setEnvironmentId("environment-id"); - payload.setOrganizationId("organization-id"); - command.setPayload(payload); + final V4ApiCommandPayload payload = V4ApiCommandPayload + .builder() + .userId("123") + .apiDefinition("any-definition") + .environmentId("environment-id") + .organizationId("organization-id") + .build(); + command = new V4ApiCommand(payload); apiEntity = new ApiEntity(); apiEntity.setId("test-id"); apiEntity.setName("test-name"); apiEntity.setApiVersion("V4"); - when(userService.findBySource(eq("organization-id"), eq("cockpit"), eq(payload.getUserId()), eq(true))).thenReturn(userEntity); + when(userService.findBySource(eq("organization-id"), eq("cockpit"), eq(payload.userId()), eq(true))).thenReturn(userEntity); when(userEntity.getId()).thenReturn("user-id"); commandHandler = new V4ApiCommandHandler(v4ApiServiceCockpit, userService); @@ -90,9 +90,9 @@ public void handleSuccessfulCommand() throws InterruptedException, JsonProcessin observer.assertValue(reply -> reply.getCommandId().equals(command.getId()) && reply.getCommandStatus().equals(CommandStatus.SUCCEEDED) && - reply.getApiId().equals("test-id") && - reply.getApiName().equals("test-name") && - reply.getApiVersion().equals("V4") + reply.getPayload().apiId().equals("test-id") && + reply.getPayload().apiName().equals("test-name") && + reply.getPayload().apiVersion().equals("V4") ); verify(v4ApiServiceCockpit, times(1)).createPublishApi(anyString(), anyString(), anyString(), anyString()); } @@ -105,7 +105,6 @@ public void handleException() throws Exception { TestObserver observer = commandHandler.handle(command).test(); observer.await(); - observer.assertValue(reply -> reply.getCommandId().equals(command.getId()) && reply.getCommandStatus().equals(CommandStatus.FAILED) - ); + observer.assertValue(reply -> reply.getCommandId().equals(command.getId()) && reply.getCommandStatus().equals(CommandStatus.ERROR)); } } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/producer/HelloCommandProducerTest.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/producer/HelloCommandProducerTest.java deleted file mode 100644 index 87fa1578bc5..00000000000 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/producer/HelloCommandProducerTest.java +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright © 2015 The Gravitee team (http://gravitee.io) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.gravitee.rest.api.service.cockpit.command.producer; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.argThat; -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 io.gravitee.apim.core.cockpit.query_service.CockpitAccessService; -import io.gravitee.apim.core.installation.domain_service.InstallationTypeDomainService; -import io.gravitee.apim.core.installation.model.InstallationType; -import io.gravitee.cockpit.api.command.Command; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.hello.HelloCommand; -import io.gravitee.cockpit.api.command.hello.HelloPayload; -import io.gravitee.cockpit.api.command.hello.HelloReply; -import io.gravitee.cockpit.api.command.installation.AdditionalInfoConstants; -import io.gravitee.definition.model.FlowMode; -import io.gravitee.definition.model.flow.Flow; -import io.gravitee.node.api.Node; -import io.gravitee.rest.api.model.EnvironmentEntity; -import io.gravitee.rest.api.model.InstallationEntity; -import io.gravitee.rest.api.model.OrganizationEntity; -import io.gravitee.rest.api.service.EnvironmentService; -import io.gravitee.rest.api.service.InstallationService; -import io.gravitee.rest.api.service.OrganizationService; -import io.gravitee.rest.api.service.common.GraviteeContext; -import io.gravitee.rest.api.service.exceptions.TechnicalManagementException; -import io.reactivex.rxjava3.observers.TestObserver; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; - -/** - * @author Florent CHAMFROY (florent.chamfroy at graviteesource.com) - * @author GraviteeSource Team - */ -@RunWith(MockitoJUnitRunner.class) -public class HelloCommandProducerTest { - - private static final String HOSTNAME = "test.gravitee.io"; - private static final String CUSTOM_VALUE = "customValue"; - private static final String CUSTOM_KEY = "customKey"; - private static final String INSTALLATION_ID = "installation#1"; - - @Mock - private InstallationService installationService; - - @Mock - private EnvironmentService environmentService; - - @Mock - private OrganizationService organizationService; - - @Mock - private Node node; - - @Mock - private InstallationTypeDomainService installationTypeDomainService; - - @Mock - private CockpitAccessService cockpitAccessService; - - private HelloCommandProducer cut; - - @Before - public void before() { - cut = - new HelloCommandProducer( - node, - installationService, - environmentService, - organizationService, - installationTypeDomainService, - cockpitAccessService - ); - when(installationTypeDomainService.get()).thenReturn(InstallationType.STANDALONE); - } - - @Test - public void produceType() { - assertEquals(Command.Type.HELLO_COMMAND, cut.produceType()); - } - - @Test - public void produce() throws InterruptedException { - final InstallationEntity installationEntity = new InstallationEntity(); - installationEntity.setId(INSTALLATION_ID); - installationEntity.getAdditionalInformation().put(CUSTOM_KEY, CUSTOM_VALUE); - - when(node.hostname()).thenReturn(HOSTNAME); - when(installationService.getOrInitialize()).thenReturn(installationEntity); - - final HelloCommand command = new HelloCommand(); - final HelloPayload payload = new HelloPayload(); - payload.setNode(new io.gravitee.cockpit.api.command.Node()); - command.setPayload(payload); - final TestObserver obs = cut.prepare(command).test(); - - obs.await(); - obs.assertValue(helloCommand -> { - assertEquals(CUSTOM_VALUE, helloCommand.getPayload().getAdditionalInformation().get(CUSTOM_KEY)); - assertTrue(helloCommand.getPayload().getAdditionalInformation().containsKey(AdditionalInfoConstants.AUTH_PATH)); - assertTrue(helloCommand.getPayload().getAdditionalInformation().containsKey(AdditionalInfoConstants.AUTH_BASE_URL)); - assertEquals(InstallationType.STANDALONE.getLabel(), helloCommand.getPayload().getInstallationType()); - - assertEquals(HOSTNAME, helloCommand.getPayload().getNode().getHostname()); - assertEquals(GraviteeContext.getDefaultOrganization(), helloCommand.getPayload().getDefaultOrganizationId()); - assertEquals(GraviteeContext.getDefaultEnvironment(), helloCommand.getPayload().getDefaultEnvironmentId()); - assertEquals(INSTALLATION_ID, helloCommand.getPayload().getNode().getInstallationId()); - assertEquals(HOSTNAME, helloCommand.getPayload().getNode().getHostname()); - - return true; - }); - } - - @Test(expected = TechnicalManagementException.class) - public void produceWithException() { - when(installationService.getOrInitialize()).thenThrow(new TechnicalManagementException()); - final TestObserver obs = cut.prepare(new HelloCommand()).test(); - } - - @Test - public void handleReply_shouldUpdateDefaultEnvironmentCockpitId() { - HelloReply helloReply = new HelloReply(); - helloReply.setCommandStatus(CommandStatus.SUCCEEDED); - helloReply.setDefaultEnvironmentCockpitId("env#cockpit-1"); - - String defaultEnvId = "DEFAULT"; - EnvironmentEntity defaultEnvironment = new EnvironmentEntity(); - defaultEnvironment.setId(defaultEnvId); - defaultEnvironment.setOrganizationId("org#1"); - - when(installationService.getOrInitialize()).thenReturn(new InstallationEntity()); - when(environmentService.getDefaultOrInitialize()).thenReturn(defaultEnvironment); - - cut.handleReply(helloReply); - - verify(environmentService) - .createOrUpdate( - eq(defaultEnvironment.getOrganizationId()), - eq(defaultEnvId), - argThat(env -> env.getCockpitId().equals("env#cockpit-1")) - ); - } - - @Test - public void handleReply_shouldUpdateDefaultOrganizationCockpitId() { - HelloReply helloReply = new HelloReply(); - helloReply.setCommandStatus(CommandStatus.SUCCEEDED); - helloReply.setDefaultOrganizationCockpitId("org#cockpit-1"); - - Flow flow = new Flow(); - flow.setName("My-Flow"); - - String defaultOrgId = "DEFAULT"; - OrganizationEntity defaultOrganization = new OrganizationEntity(); - defaultOrganization.setId(defaultOrgId); - defaultOrganization.setFlows(Collections.singletonList(flow)); - defaultOrganization.setFlowMode(FlowMode.DEFAULT); - - when(installationService.getOrInitialize()).thenReturn(new InstallationEntity()); - when(organizationService.getDefaultOrInitialize()).thenReturn(defaultOrganization); - - cut.handleReply(helloReply); - - verify(organizationService) - .updateOrganization( - argThat(organizationId -> organizationId.equals(defaultOrgId)), - argThat(org -> - org.getCockpitId().equals("org#cockpit-1") && - FlowMode.DEFAULT.equals(org.getFlowMode()) && - org.getFlows() != null && - org.getFlows().size() == 1 && - org.getFlows().get(0).getName().equals("My-Flow") - ) - ); - } - - @Test - public void handleReply_shouldUpdateCockpitInstallationStatusAndId_butKeepAlreadyExistingInstallationInformations() { - // mock already existing installation with informations - InstallationEntity installation = new InstallationEntity(); - installation.setAdditionalInformation( - new HashMap( - Map.of( - "key1", - "value1", - "key2", - "value2", - "COCKPIT_INSTALLATION_STATUS", - "old-installation-status", - "COCKPIT_INSTALLATION_ID", - "old-installation-id" - ) - ) - ); - when(installationService.getOrInitialize()).thenReturn(installation); - - HelloReply helloReply = new HelloReply(); - helloReply.setInstallationId("new-installation-id"); - helloReply.setInstallationStatus("new-installation-status"); - helloReply.setCommandStatus(CommandStatus.SUCCEEDED); - - cut.handleReply(helloReply); - - verify(installationService, times(1)) - .setAdditionalInformation( - eq( - Map.of( - "key1", - "value1", - "key2", - "value2", - "COCKPIT_INSTALLATION_STATUS", - "new-installation-status", - "COCKPIT_INSTALLATION_ID", - "new-installation-id" - ) - ) - ); - } -} diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/services/CockpitPromotionServiceTest.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/services/CockpitPromotionServiceTest.java index fb42eb451ef..02f298dad1f 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/services/CockpitPromotionServiceTest.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/services/CockpitPromotionServiceTest.java @@ -21,11 +21,12 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import io.gravitee.cockpit.api.command.CommandStatus; -import io.gravitee.cockpit.api.command.bridge.BridgeMultiReply; -import io.gravitee.cockpit.api.command.bridge.BridgeReply; -import io.gravitee.cockpit.api.command.bridge.BridgeSimpleReply; +import io.gravitee.cockpit.api.command.legacy.bridge.BridgeMultiReply; +import io.gravitee.cockpit.api.command.legacy.bridge.BridgeSimpleReply; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeReply; +import io.gravitee.cockpit.api.command.v1.bridge.BridgeReplyPayload; import io.gravitee.definition.jackson.datatype.GraviteeMapper; +import io.gravitee.exchange.api.command.CommandStatus; import io.gravitee.rest.api.model.EnvironmentEntity; import io.gravitee.rest.api.model.promotion.PromotionEntity; import io.gravitee.rest.api.model.promotion.PromotionTargetEntity; @@ -64,10 +65,9 @@ public void setUp() { @Test public void shouldNotListEnvironments() { // Given - BridgeMultiReply environmentsMultiReply = new BridgeMultiReply(); - environmentsMultiReply.setCommandStatus(CommandStatus.ERROR); + BridgeReply bridgeReply = new BridgeReply("commandId", "error"); - when(cockpitCommandService.send(any())).thenReturn(environmentsMultiReply); + when(cockpitCommandService.send(any())).thenReturn(bridgeReply); // When final CockpitReply> listCockpitReply = cockpitPromotionService.listPromotionTargets( @@ -91,40 +91,28 @@ public void shouldListEnvironmentsFromSuccessfulReplies() throws JsonProcessingE envA.setOrganizationId(ORGANIZATION_ID); envA.setName("ENV A"); - BridgeSimpleReply envASimpleReply = new BridgeSimpleReply(); - envASimpleReply.setCommandStatus(CommandStatus.SUCCEEDED); - envASimpleReply.setInstallationId(INSTALLATION_ID); - envASimpleReply.setOrganizationId(ORGANIZATION_ID); - envASimpleReply.setEnvironmentId(envA.getId()); - envASimpleReply.setPayload(objectMapper.writeValueAsString(envA)); + BridgeReplyPayload.BridgeReplyContent envAContent = BridgeReplyPayload.BridgeReplyContent + .builder() + .environmentId(envA.getId()) + .installationId(INSTALLATION_ID) + .organizationId(ORGANIZATION_ID) + .content(objectMapper.writeValueAsString(envA)) + .build(); EnvironmentEntity envB = new EnvironmentEntity(); envB.setId("my-env-B"); envB.setOrganizationId(ORGANIZATION_ID); envB.setName("ENV B"); - BridgeSimpleReply envBSimpleReply = new BridgeSimpleReply(); - envBSimpleReply.setCommandStatus(CommandStatus.SUCCEEDED); - envBSimpleReply.setInstallationId(INSTALLATION_ID); - envBSimpleReply.setOrganizationId(ORGANIZATION_ID); - envBSimpleReply.setEnvironmentId(envB.getId()); - envBSimpleReply.setPayload(objectMapper.writeValueAsString(envB)); - - EnvironmentEntity envC_ERROR = new EnvironmentEntity(); - envC_ERROR.setId("my-env-C"); - envC_ERROR.setOrganizationId(ORGANIZATION_ID); - envC_ERROR.setName("ENV C"); - - BridgeSimpleReply envCSimpleReply = new BridgeSimpleReply(); - envCSimpleReply.setCommandStatus(CommandStatus.ERROR); - envCSimpleReply.setInstallationId(INSTALLATION_ID); - envCSimpleReply.setOrganizationId(ORGANIZATION_ID); - envCSimpleReply.setEnvironmentId(envC_ERROR.getId()); - envCSimpleReply.setMessage("Problem while serializing environment: " + envC_ERROR.getId()); - - BridgeMultiReply environmentsMultiReply = new BridgeMultiReply(); - environmentsMultiReply.setCommandStatus(CommandStatus.SUCCEEDED); - environmentsMultiReply.setReplies(Arrays.asList(envASimpleReply, envBSimpleReply, envCSimpleReply)); + BridgeReplyPayload.BridgeReplyContent envBContent = BridgeReplyPayload.BridgeReplyContent + .builder() + .environmentId(envB.getId()) + .installationId(INSTALLATION_ID) + .organizationId(ORGANIZATION_ID) + .content(objectMapper.writeValueAsString(envB)) + .build(); + + BridgeReply environmentsMultiReply = new BridgeReply("commandId", new BridgeReplyPayload(List.of(envAContent, envBContent))); when(cockpitCommandService.send(any())).thenReturn(environmentsMultiReply); @@ -145,9 +133,7 @@ public void shouldListEnvironmentsFromSuccessfulReplies() throws JsonProcessingE @Test public void shouldNotProcessPromotionCommandError() { - BridgeReply reply = new BridgeSimpleReply(); - reply.setCommandStatus(CommandStatus.ERROR); - + BridgeReply reply = new BridgeReply("commandId", "error"); when(cockpitCommandService.send(any())).thenReturn(reply); final CockpitReply result = cockpitPromotionService.processPromotion( @@ -163,9 +149,7 @@ public void shouldNotProcessPromotionCommandError() { @Test public void shouldProcessPromotion() { - BridgeReply reply = new BridgeSimpleReply(); - reply.setCommandStatus(CommandStatus.SUCCEEDED); - + BridgeReply reply = new BridgeReply("commandid", new BridgeReplyPayload(List.of())); when(cockpitCommandService.send(any())).thenReturn(reply); final PromotionEntity promotionEntity = new PromotionEntity(); diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/impl/DashboardServiceTest.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/impl/DashboardServiceTest.java index 2bb9f0719d7..dda4304da6e 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/impl/DashboardServiceTest.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/impl/DashboardServiceTest.java @@ -25,11 +25,14 @@ import static java.util.Optional.empty; import static java.util.Optional.of; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.InstanceOfAssertFactories.throwable; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.argThat; +import static org.mockito.Mockito.isNull; +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 com.google.common.collect.ImmutableMap; import io.gravitee.repository.exceptions.TechnicalException; @@ -37,7 +40,6 @@ import io.gravitee.repository.management.model.Dashboard; import io.gravitee.repository.management.model.DashboardType; import io.gravitee.rest.api.model.DashboardEntity; -import io.gravitee.rest.api.model.DashboardReferenceType; import io.gravitee.rest.api.model.NewDashboardEntity; import io.gravitee.rest.api.model.UpdateDashboardEntity; import io.gravitee.rest.api.service.AuditService; diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-standalone/gravitee-apim-rest-api-standalone-container/src/main/java/io/gravitee/rest/api/standalone/GraviteeApisContainer.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-standalone/gravitee-apim-rest-api-standalone-container/src/main/java/io/gravitee/rest/api/standalone/GraviteeApisContainer.java index bc24fefcfbd..feced9b0ad3 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-standalone/gravitee-apim-rest-api-standalone-container/src/main/java/io/gravitee/rest/api/standalone/GraviteeApisContainer.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-standalone/gravitee-apim-rest-api-standalone-container/src/main/java/io/gravitee/rest/api/standalone/GraviteeApisContainer.java @@ -16,7 +16,6 @@ package io.gravitee.rest.api.standalone; import io.gravitee.node.container.spring.SpringBasedContainer; -import io.gravitee.rest.api.standalone.node.GraviteeApisNode; import io.gravitee.rest.api.standalone.spring.StandaloneConfiguration; import java.util.List; import org.slf4j.bridge.SLF4JBridgeHandler; diff --git a/pom.xml b/pom.xml index bd20a767adc..30023a8ef50 100644 --- a/pom.xml +++ b/pom.xml @@ -59,7 +59,7 @@ 7.0.13 1.9.1 - 2.6.2 + 3.0.2 4.0.0 1.1.4 3.1.0 @@ -230,7 +230,7 @@ 2.0.2 1.3.0 - 4.0.4 + 5.0.0 1.7.1 1.8.2 1.6.0