diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b3123092..3d7a3755e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). # [1.14.3] In progress ### Fixed - Error mapping is not applied when importing "app" (See issue [#437](https://github.com/Axway-API-Management-Plus/apim-cli/issues/437)) +- Handling backend changes and removal of organization from api-config json file in one command [#441](https://github.com/Axway-API-Management-Plus/apim-cli/issues/441)) # [1.14.2] 2023-08-29 ### Fixed diff --git a/modules/apis/src/main/java/com/axway/apim/apiimport/APIChangeState.java b/modules/apis/src/main/java/com/axway/apim/apiimport/APIChangeState.java index 628b95d15..077d6ce21 100644 --- a/modules/apis/src/main/java/com/axway/apim/apiimport/APIChangeState.java +++ b/modules/apis/src/main/java/com/axway/apim/apiimport/APIChangeState.java @@ -1,21 +1,19 @@ package com.axway.apim.apiimport; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; -import java.util.Vector; - -import com.axway.apim.lib.utils.Utils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.axway.apim.adapter.APIManagerAdapter; import com.axway.apim.api.API; import com.axway.apim.apiimport.lib.params.APIImportParams; import com.axway.apim.lib.APIPropertyAnnotation; import com.axway.apim.lib.error.AppException; import com.axway.apim.lib.error.ErrorCode; +import com.axway.apim.lib.utils.Utils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; /** * This class is key, as the desired and actual API comes together. @@ -39,8 +37,8 @@ public class APIChangeState { private boolean updateExistingAPI = true; private boolean recreateAPI = false; private boolean proxyUpdateRequired = false; - private final List breakingChanges = new Vector<>(); - private final List nonBreakingChanges = new Vector<>(); + private final List breakingChanges = new ArrayList<>(); + private final List nonBreakingChanges = new ArrayList<>(); /** diff --git a/modules/apis/src/main/java/com/axway/apim/apiimport/actions/CreateNewAPI.java b/modules/apis/src/main/java/com/axway/apim/apiimport/actions/CreateNewAPI.java index 62f8bce5a..f0359d146 100644 --- a/modules/apis/src/main/java/com/axway/apim/apiimport/actions/CreateNewAPI.java +++ b/modules/apis/src/main/java/com/axway/apim/apiimport/actions/CreateNewAPI.java @@ -98,7 +98,7 @@ public void execute(APIChangeState changes, boolean reCreation) throws AppExcept // Is a Quota is defined we must manage it new APIQuotaManager(desiredAPI, actualAPI).execute(createdAPI); // Grant access to the API - new ManageClientOrgs(desiredAPI, createdAPI).execute(reCreation); + new ManageClientOrganization(desiredAPI, createdAPI).execute(reCreation); // Handle subscription to applications new ManageClientApps(desiredAPI, createdAPI, actualAPI).execute(reCreation); // Provide the ID of the created API to the desired API just for logging purposes diff --git a/modules/apis/src/main/java/com/axway/apim/apiimport/actions/ManageClientOrgs.java b/modules/apis/src/main/java/com/axway/apim/apiimport/actions/ManageClientOrganization.java similarity index 87% rename from modules/apis/src/main/java/com/axway/apim/apiimport/actions/ManageClientOrgs.java rename to modules/apis/src/main/java/com/axway/apim/apiimport/actions/ManageClientOrganization.java index 5f343d254..90c4e15b8 100644 --- a/modules/apis/src/main/java/com/axway/apim/apiimport/actions/ManageClientOrgs.java +++ b/modules/apis/src/main/java/com/axway/apim/apiimport/actions/ManageClientOrganization.java @@ -13,16 +13,16 @@ import com.axway.apim.lib.error.AppException; import com.axway.apim.lib.error.ErrorCode; -public class ManageClientOrgs { +public class ManageClientOrganization { - private static final Logger LOG = LoggerFactory.getLogger(ManageClientOrgs.class); + private static final Logger LOG = LoggerFactory.getLogger(ManageClientOrganization.class); APIManagerAdapter apiManager; private final API desiredState; private final API actualState; - public ManageClientOrgs(API desiredState, API actualState) throws AppException { + public ManageClientOrganization(API desiredState, API actualState) throws AppException { this.desiredState = desiredState; this.actualState = actualState; apiManager = APIManagerAdapter.getInstance(); @@ -30,6 +30,7 @@ public ManageClientOrgs(API desiredState, API actualState) throws AppException { } public void execute(boolean reCreation) throws AppException { + LOG.info("reCreation : {}", reCreation); if (CoreParameters.getInstance().isIgnoreClientOrgs()) { LOG.info("Configured client organizations are ignored, as flag ignoreClientOrgs has been set."); return; @@ -51,14 +52,15 @@ public void execute(boolean reCreation) throws AppException { LOG.info("All desired organizations: {} have already access. Nothing to do.", desiredState.getClientOrganizations()); } } else { + LOG.info("Granting access for organizations : {} to API : {}", missingDesiredOrgs, actualState.getName()); apiManager.getApiAdapter().grantClientOrganization(missingDesiredOrgs, actualState, false); } if (!removingActualOrgs.isEmpty()) { if (CoreParameters.getInstance().getClientOrgsMode().equals(CoreParameters.Mode.replace)) { - LOG.info("Removing access for orgs: {} from API: {}", removingActualOrgs, actualState.getName()); + LOG.info("Removing access for organizations: {} from API: {}", removingActualOrgs, actualState.getName()); apiManager.getAccessAdapter().removeClientOrganization(removingActualOrgs, actualState.getId()); } else { - LOG.info("NOT removing access for existing orgs: {} from API: {} as clientOrgsMode NOT set to replace.",removingActualOrgs,actualState.getName()); + LOG.info("NOT removing access for existing organizations: {} from API: {} as clientOrgsMode NOT set to replace.",removingActualOrgs,actualState.getName()); } } } diff --git a/modules/apis/src/main/java/com/axway/apim/apiimport/actions/RepublishToUpdateAPI.java b/modules/apis/src/main/java/com/axway/apim/apiimport/actions/RepublishToUpdateAPI.java index a1b3b0429..5a8b0068c 100644 --- a/modules/apis/src/main/java/com/axway/apim/apiimport/actions/RepublishToUpdateAPI.java +++ b/modules/apis/src/main/java/com/axway/apim/apiimport/actions/RepublishToUpdateAPI.java @@ -1,17 +1,16 @@ package com.axway.apim.apiimport.actions; -import java.util.ArrayList; -import java.util.List; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.axway.apim.adapter.APIStatusManager; import com.axway.apim.api.API; import com.axway.apim.apiimport.APIChangeState; import com.axway.apim.lib.CoreParameters; import com.axway.apim.lib.CoreParameters.Mode; import com.axway.apim.lib.error.AppException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; public class RepublishToUpdateAPI { @@ -50,6 +49,8 @@ public void execute(APIChangeState changes) throws AppException { } APIStatusManager statusManager = new APIStatusManager(); statusManager.update(actualAPI, API.STATE_UNPUBLISHED, true); + actualAPI.setClientOrganizations(new ArrayList<>()); // remove all client organizations + actualAPI.setApplications(new ArrayList<>()); // remove all consumer applications UpdateExistingAPI updateExistingAPI = new UpdateExistingAPI(); updateExistingAPI.execute(changes); LOG.debug("Existing API successfully updated: {} (ID: {})", actualAPI.getName(), actualAPI.getId()); diff --git a/modules/apis/src/main/java/com/axway/apim/apiimport/actions/UpdateExistingAPI.java b/modules/apis/src/main/java/com/axway/apim/apiimport/actions/UpdateExistingAPI.java index cc87053c7..5b2df4039 100644 --- a/modules/apis/src/main/java/com/axway/apim/apiimport/actions/UpdateExistingAPI.java +++ b/modules/apis/src/main/java/com/axway/apim/apiimport/actions/UpdateExistingAPI.java @@ -73,7 +73,7 @@ public void execute(APIChangeState changes) throws AppException { apiAdapter.updateAPIProxy(changes.getActualAPI()); } new APIQuotaManager(changes.getDesiredAPI(), changes.getActualAPI()).execute(changes.getActualAPI()); - new ManageClientOrgs(changes.getDesiredAPI(), changes.getActualAPI()).execute(false); + new ManageClientOrganization(changes.getDesiredAPI(), changes.getActualAPI()).execute(false); // Handle subscription to applications new ManageClientApps(changes.getDesiredAPI(), changes.getActualAPI(), null).execute(false); if (actualAPI.getState().equals(API.STATE_DELETED)) { diff --git a/modules/apps/src/test/java/com/axway/apim/appimport/it/share/ImportAppWithPermissionsTestIT.java b/modules/apps/src/test/java/com/axway/apim/appimport/it/share/ImportAppWithPermissionsTestIT.java index b5c38b5ae..56060ac6f 100644 --- a/modules/apps/src/test/java/com/axway/apim/appimport/it/share/ImportAppWithPermissionsTestIT.java +++ b/modules/apps/src/test/java/com/axway/apim/appimport/it/share/ImportAppWithPermissionsTestIT.java @@ -101,7 +101,7 @@ public void run(@Optional @CitrusResource TestContext context) throws IOExceptio echo("####### Validate application: '${appName}' (${appId}) has permissions for ALL users #######"); http(builder -> builder.client("apiManager").send().get("/applications/${appId}/permissions").header("Content-Type", "application/json")); - http(builder -> builder.client("apiManager").receive().response(HttpStatus.OK).messageType(MessageType.JSON) + http(builder -> builder.client("apiManager").receive().response(HttpStatus.OK).messageType(MessageType.JSON) .validate("$.*.id", "@assertThat(hasSize(4))@") // Must be four, as the application is created by an OrgAdmin .validate("$.[?(@.userId=='${userId-1}')].permission", "view") .validate("$.[?(@.userId=='${userId-2}')].permission", "view")