diff --git a/openapi/openapi-component_provisioner-v1.0.0.yaml b/openapi/openapi-component_provisioner-v1.0.0.yaml index 00aef16..83581de 100644 --- a/openapi/openapi-component_provisioner-v1.0.0.yaml +++ b/openapi/openapi-component_provisioner-v1.0.0.yaml @@ -176,10 +176,6 @@ paths: type: string description: The bitbucket repository url for the provisioned component. example: "https://bitbucket.com/projects/myproject/repos/repo_name" - accessToken: - type: string - description: The access token for the provisioned component. - example: "secret-access-token" responses: "200": description: Provisioning completion notified. diff --git a/openapi/openapi-projects-info-service-v1.0.0.yaml b/openapi/openapi-projects-info-service-v1.0.0.yaml index 724fcf5..d0741d8 100644 --- a/openapi/openapi-projects-info-service-v1.0.0.yaml +++ b/openapi/openapi-projects-info-service-v1.0.0.yaml @@ -34,13 +34,6 @@ paths: description: > This endpoint receives an azure token, and returns all the groups associated to the user. operationId: getAzureGroups - parameters: - - name: token - in: header - required: true - schema: - type: string - description: Azure token used to get the groups. responses: "200": description: List of azure groups associated to the user. @@ -77,13 +70,6 @@ paths: Get all the projects a user get access to. For that, first of all it will get all the azure groups associated to the user, and then it will get all the projects associated to those groups. operationId: getProjects - parameters: - - name: token - in: header - required: true - schema: - type: string - description: Azure token used to get the groups. responses: "200": description: List of projects the user has access to. @@ -120,12 +106,6 @@ paths: Get all project info and cluster for a given project key. operationId: getProjectClusters parameters: - - name: token - in: header - required: true - schema: - type: string - description: Azure token used to get the groups. - name: projectKey in: path required: true diff --git a/src/main/java/org/opendevstack/component_provisioner/server/controllers/ProvisionResultsApiController.java b/src/main/java/org/opendevstack/component_provisioner/server/controllers/ProvisionResultsApiController.java index bc0670d..cabcf37 100644 --- a/src/main/java/org/opendevstack/component_provisioner/server/controllers/ProvisionResultsApiController.java +++ b/src/main/java/org/opendevstack/component_provisioner/server/controllers/ProvisionResultsApiController.java @@ -8,6 +8,7 @@ import org.opendevstack.component_provisioner.server.model.NotifyProvisioningStatusUpdateRequest; import org.opendevstack.component_provisioner.server.model.ProvisionActionResponse; import org.opendevstack.component_provisioner.server.model.ProvisioningDeleteRequest; +import org.opendevstack.component_provisioner.server.services.AuthenticationProvider; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @@ -17,9 +18,11 @@ @Slf4j public class ProvisionResultsApiController implements ProvisionResultsApi { + private final AuthenticationProvider authenticationProvider; private final ProvisionResultsApiFacade provisionResultsApiFacade; - public ProvisionResultsApiController(ProvisionResultsApiFacade provisionResultsApiFacade) { + public ProvisionResultsApiController(AuthenticationProvider authenticationProvider, ProvisionResultsApiFacade provisionResultsApiFacade) { + this.authenticationProvider = authenticationProvider; this.provisionResultsApiFacade = provisionResultsApiFacade; } @@ -27,6 +30,8 @@ public ProvisionResultsApiController(ProvisionResultsApiFacade provisionResultsA public ResponseEntity notifyProvisioningStatusUpdate(String projectKey, String status, NotifyProvisioningStatusUpdateRequest notifyProvisioningCompletedRequest) { log.debug("Notifying provision status update. ProjectKey: {}, Status: {}, notifyProvisioningCompletedRequest: {}", projectKey, status, notifyProvisioningCompletedRequest); + var accessToken = authenticationProvider.getAccessToken(); + provisionResultsApiFacade.validate(projectKey, status); provisionResultsApiFacade.notifyProvisioningStatusUpdate(projectKey, @@ -34,8 +39,7 @@ public ResponseEntity notifyProvisioningStatusUpdate(String projectKey, St notifyProvisioningCompletedRequest.getComponentId(), notifyProvisioningCompletedRequest.getCatalogItemId(), notifyProvisioningCompletedRequest.getComponentUrl(), - provisionResultsApiFacade.getIdToken(), - notifyProvisioningCompletedRequest.getAccessToken()); + accessToken); return ResponseEntity.ok().build(); } @@ -44,7 +48,9 @@ public ResponseEntity notifyProvisioningStatusUpdate(String projectKey, St public ResponseEntity deleteProvisioningStatus(String projectKey, ProvisioningDeleteRequest provisioningDeleteRequest) { log.debug("Delete provisioning status. ProjectKey: {}, provisioningDeleteRequest: {}", projectKey, provisioningDeleteRequest); - provisionResultsApiFacade.deleteProvisioningStatus(projectKey, provisioningDeleteRequest.getComponentId(), provisionResultsApiFacade.getIdToken()); + var accessToken = authenticationProvider.getAccessToken(); + + provisionResultsApiFacade.deleteProvisioningStatus(projectKey, provisioningDeleteRequest.getComponentId(), accessToken); return ResponseEntity.ok().build(); } @@ -53,11 +59,12 @@ public ResponseEntity deleteProvisioningStatus(String projectKey, Provisio public ResponseEntity createIncident(String projectKey, String componentId, CreateIncidentAction createIncidentAction) { log.debug("Creating incident. ProjectKey: {}, componentId: {}, CreateIncidentAction: {}", projectKey, componentId, createIncidentAction); - var idToken = provisionResultsApiFacade.getIdToken(); + var accessToken = authenticationProvider.getAccessToken(); provisionResultsApiFacade.validate(projectKey, componentId, createIncidentAction); + provisionResultsApiFacade.addSystemParametersToAction(projectKey, createIncidentAction); - var isInDeletingState = provisionResultsApiFacade.isInDeletingState(projectKey, componentId, idToken, createIncidentAction); + var isInDeletingState = provisionResultsApiFacade.isInDeletingState(projectKey, componentId, accessToken); if (isInDeletingState) { log.debug("Project component already in DELETING state, skipping create of the incident via AWX"); @@ -65,13 +72,13 @@ public ResponseEntity createIncident(String projectKey, return ResponseEntity.ok().build(); } else { log.debug("Setting state to DELETING"); + provisionResultsApiFacade.notifyProvisioningStatusUpdate(projectKey, ProjectComponentStatus.DELETING, componentId, null, null, - provisionResultsApiFacade.getIdToken(), - null); + accessToken); log.debug("Creating incident via AWX"); diff --git a/src/main/java/org/opendevstack/component_provisioner/server/controllers/validators/MandatoryFieldsValidator.java b/src/main/java/org/opendevstack/component_provisioner/server/controllers/validators/MandatoryFieldsValidator.java index b27c057..cf4e52c 100644 --- a/src/main/java/org/opendevstack/component_provisioner/server/controllers/validators/MandatoryFieldsValidator.java +++ b/src/main/java/org/opendevstack/component_provisioner/server/controllers/validators/MandatoryFieldsValidator.java @@ -20,7 +20,6 @@ import java.util.function.Function; import java.util.stream.Collectors; -import static org.opendevstack.component_provisioner.server.controllers.validators.ProvisionerActionsApiValidator.getAccessToken; import static org.opendevstack.component_provisioner.server.controllers.validators.ProvisionerActionsApiValidator.getCatalogItemId; import static org.opendevstack.component_provisioner.server.controllers.validators.ProvisionerActionsApiValidator.getParameterString; import static org.opendevstack.component_provisioner.server.controllers.validators.ProvisionerActionsApiValidator.getProjectKey; @@ -35,12 +34,11 @@ public class MandatoryFieldsValidator { public void validate(ProvisionAction provisionAction) { var projectKey = getProjectKey(provisionAction); - var accessToken = getAccessToken(provisionAction); var catalogItemId = getCatalogItemId(provisionAction); - var idToken = authenticationProvider.getIdToken(); + var accessToken = authenticationProvider.getAccessToken(); var location = getLocation(provisionAction); - var catalogItem = componentCatalogService.getCatalogItem(idToken, accessToken, catalogItemId, projectKey); + var catalogItem = componentCatalogService.getCatalogItem(accessToken, catalogItemId, projectKey); var provisionUserAction = Optional.ofNullable(catalogItem) .map(CatalogItem::getUserActions) .map(userActions -> userActions.stream() @@ -99,9 +97,10 @@ private boolean hasNoOptions(CatalogItemUserActionParameter param) { return param.getOptions() == null || param.getOptions().isEmpty(); } - private boolean isListType(ProvisionActionParameter param) { - return MandatoryFieldType.SINGLELIST.getValue().equalsIgnoreCase(param.getType()) - || MandatoryFieldType.MULTIPLELIST.getValue().equalsIgnoreCase(param.getType()); + private boolean isListTypeAnswer(ProvisionActionParameter param) { + // MULTIPLELIST is the only type that stores multiple values as a list for the answers; + // SINGLELIST and STRING types store single string values for the answer. + return MandatoryFieldType.MULTIPLELIST.getValue().equalsIgnoreCase(param.getType()); } private void applyDefaultValue( @@ -142,7 +141,7 @@ private void validateAgainstOptions( ProvisionActionParameter param, CatalogItemUserActionParameter catalogParam ) { - if (isListType(param)) { + if (isListTypeAnswer(param)) { validateListValues(param, catalogParam); } else { validateSingleValue(param, catalogParam); diff --git a/src/main/java/org/opendevstack/component_provisioner/server/controllers/validators/ProvisionerActionsApiValidator.java b/src/main/java/org/opendevstack/component_provisioner/server/controllers/validators/ProvisionerActionsApiValidator.java index 1ee822d..a35b8a7 100644 --- a/src/main/java/org/opendevstack/component_provisioner/server/controllers/validators/ProvisionerActionsApiValidator.java +++ b/src/main/java/org/opendevstack/component_provisioner/server/controllers/validators/ProvisionerActionsApiValidator.java @@ -38,20 +38,19 @@ public void validate(ProvisionAction provisionAction) { log.debug("Start validation for provisionActions: {}", provisionAction); var projectKey = getProjectKey(provisionAction); - var accessToken = getAccessToken(provisionAction); var componentId = getComponentId(provisionAction); - var idToken = authenticationProvider.getIdToken(); + var accessToken = authenticationProvider.getAccessToken(); validateInputParams(projectKey, accessToken, componentId); - validateComponentIsNotProvisioned(projectKey, idToken, accessToken, componentId); + validateComponentIsNotProvisioned(projectKey, accessToken, componentId); - validateUserHasPermissionsToProvision(projectKey, idToken, accessToken); + validateUserHasPermissionsToProvision(projectKey, accessToken); mandatoryFieldsValidator.validate(provisionAction); } - private void validateUserHasPermissionsToProvision(String projectKey, String idToken, String accessToken) { + private void validateUserHasPermissionsToProvision(String projectKey, String accessToken) { log.debug("Validating user has permissions to provision. projectKey: {}", projectKey); CatalogItemUserActionGroupsRestriction catalogItemUserActionGroupsRestriction = CatalogItemUserActionGroupsRestriction.builder() @@ -63,7 +62,7 @@ private void validateUserHasPermissionsToProvision(String projectKey, String idT .build(); EvaluationRestrictions restrictions = new EvaluationRestrictions(projectKey, userActionEntityRestrictions); - List userGroups = projectsInfoService.getProjectGroups(idToken, accessToken); + List userGroups = projectsInfoService.getProjectGroups(accessToken); RestrictionsParams params = RestrictionsParams.builder() .projectKey(projectKey) .userGroups(userGroups) @@ -82,10 +81,10 @@ private void validateUserHasPermissionsToProvision(String projectKey, String idT } } - private void validateComponentIsNotProvisioned(String projectKey, String idToken, String accessToken, String componentId) { + private void validateComponentIsNotProvisioned(String projectKey, String accessToken, String componentId) { log.debug("Validating component is not provisioned. projectKey: {}, componentId: {}", projectKey, componentId); - var projectComponents = componentCatalogService.getProjectComponents(projectKey, idToken, accessToken); + var projectComponents = componentCatalogService.getProjectComponents(projectKey, accessToken); var componentIdAlreadyProvisioned = projectComponents.stream() .filter(projectComponent -> projectComponent.getComponentId() != null) @@ -112,10 +111,6 @@ protected static String getProjectKey(ProvisionAction provisionAction) { return getParameterString(provisionAction, "project_key"); } - protected static String getAccessToken(ProvisionAction provisionAction) { - return getParameterString(provisionAction, "access_token"); - } - protected static String getCatalogItemId(ProvisionAction provisionAction) { return getParameterString(provisionAction, "catalog_item_id"); } diff --git a/src/main/java/org/opendevstack/component_provisioner/server/facade/ProvisionResultsApiFacade.java b/src/main/java/org/opendevstack/component_provisioner/server/facade/ProvisionResultsApiFacade.java index 03cef4e..2ff022d 100644 --- a/src/main/java/org/opendevstack/component_provisioner/server/facade/ProvisionResultsApiFacade.java +++ b/src/main/java/org/opendevstack/component_provisioner/server/facade/ProvisionResultsApiFacade.java @@ -4,6 +4,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.util.Strings; import org.opendevstack.component_provisioner.server.controllers.exceptions.InvalidRestEntityException; +import org.opendevstack.component_provisioner.server.controllers.exceptions.ProjectConfigurationException; import org.opendevstack.component_provisioner.server.controllers.model.ProjectComponentStatus; import org.opendevstack.component_provisioner.server.controllers.model.awx.AwxResponse; import org.opendevstack.component_provisioner.server.controllers.validators.ParameterType; @@ -13,6 +14,7 @@ import org.opendevstack.component_provisioner.server.services.AuthenticationProvider; import org.opendevstack.component_provisioner.server.services.AwxService; import org.opendevstack.component_provisioner.server.services.ComponentCatalogService; +import org.opendevstack.component_provisioner.server.services.ProjectsInfoService; import org.opendevstack.component_provisioner.server.services.ProvisionService; import org.opendevstack.component_provisioner.server.services.awx.AwxWorkflowJobLaunch; import org.springframework.beans.factory.annotation.Value; @@ -24,13 +26,12 @@ @Slf4j public class ProvisionResultsApiFacade { - public static final String ACCESS_TOKEN_PARAMETER_NAME = "access_token"; - private final AwxService awxService; private final ComponentCatalogService componentCatalogService; private final EntitiesMapper entitiesMapper; private final ProvisionService provisionService; private final AuthenticationProvider authenticationProvider; + private final ProjectsInfoService projectsInfoService; @Value("${component-provisioner.support.create-incident-workflow-id:WORKFLOW}") @@ -40,18 +41,19 @@ public ProvisionResultsApiFacade(AwxService awxService, ComponentCatalogService componentCatalogService, EntitiesMapper entitiesMapper, ProvisionService provisionService, - AuthenticationProvider authenticationProvider) { + AuthenticationProvider authenticationProvider, + ProjectsInfoService projectsInfoService) { this.awxService = awxService; this.componentCatalogService = componentCatalogService; this.entitiesMapper = entitiesMapper; this.provisionService = provisionService; this.authenticationProvider = authenticationProvider; + this.projectsInfoService = projectsInfoService; } - public boolean isInDeletingState(String projectKey, String componentId, String idToken, CreateIncidentAction createIncidentAction) { - var accessToken = getParameterString(createIncidentAction, ACCESS_TOKEN_PARAMETER_NAME); + public boolean isInDeletingState(String projectKey, String componentId, String accessToken) { - var projectComponents = componentCatalogService.getProjectComponents(projectKey, idToken, accessToken); + var projectComponents = componentCatalogService.getProjectComponents(projectKey, accessToken); return projectComponents.stream() .filter(component -> component.getComponentId() != null) @@ -76,16 +78,12 @@ public AwxResponse requestProvisionToAwx(String projectKey, String componentId, } public void notifyProvisioningStatusUpdate(String projectKey, ProjectComponentStatus status, String componentId, - String catalogItemId, String componentUrl, String idToken, String accessToken) { - provisionService.notifyProvisioningStatusUpdate(projectKey, status, componentId, catalogItemId, componentUrl, idToken, accessToken); - } - - public void deleteProvisioningStatus(String projectKey, String componentId, String idToken) { - provisionService.deleteProvisioningStatus(projectKey, componentId, idToken); + String catalogItemId, String componentUrl, String accessToken) { + provisionService.notifyProvisioningStatusUpdate(projectKey, status, componentId, catalogItemId, componentUrl, accessToken); } - public String getIdToken() { - return authenticationProvider.getIdToken(); + public void deleteProvisioningStatus(String projectKey, String componentId, String accessToken) { + provisionService.deleteProvisioningStatus(projectKey, componentId, accessToken); } public void validate(String projectKey, String status) { @@ -102,30 +100,49 @@ public void validate(String projectKey, String status) { } public void validate(String projectKey, String componentId, CreateIncidentAction createIncidentAction) { - var caller = getParameterString(createIncidentAction, "caller"); - var clusterLocation = getParameterString(createIncidentAction, "cluster_location"); var isDeployed = getParameterString(createIncidentAction, "is_deployed"); var changeNumber = getParameterString(createIncidentAction, "change_number"); var reason = getParameterString(createIncidentAction, "reason"); - var accessToken = getParameterString(createIncidentAction, ACCESS_TOKEN_PARAMETER_NAME); - var mainParamsAreEmpty = StringUtils.isBlank(projectKey) || StringUtils.isBlank(componentId); - var extraParamsAreEmtpy = StringUtils.isBlank(caller) || StringUtils.isBlank(clusterLocation) || StringUtils.isBlank(isDeployed) + var extraParamsAreEmtpy = StringUtils.isBlank(isDeployed) || StringUtils.isBlank(changeNumber) || StringUtils.isBlank(reason); - var tokenIsEmpty = StringUtils.isBlank(accessToken); if (mainParamsAreEmpty) { throw new InvalidRestEntityException("project_key, component_id are required."); } if (extraParamsAreEmtpy) { - throw new InvalidRestEntityException("caller, cluster_location, is_deployed, change_number and reason are required."); + throw new InvalidRestEntityException("is_deployed, change_number and reason are required."); } + } - if (tokenIsEmpty) { - throw new InvalidRestEntityException("access_token is required."); + public void addSystemParametersToAction(String projectKey, CreateIncidentAction action) { + addClusterLocationParameter(projectKey, action); + addCallerParameter(action); + } + + private void addClusterLocationParameter(String projectKey, CreateIncidentAction action) { + var accessToken = authenticationProvider.getAccessToken(); + var clusters = projectsInfoService.getProjectClusters(accessToken, projectKey).getClusters(); + if (clusters.isEmpty()) { + throw new ProjectConfigurationException("Cannot retrieve the current project location for project: " + projectKey); } + var clusterLocation = clusters.getFirst(); + action.addParametersItem(CreateIncidentParameter.builder() + .name("cluster_location") + .type(ParameterType.STRING.getValue()) + .value(clusterLocation) + .build()); + } + + private void addCallerParameter(CreateIncidentAction action) { + var caller = authenticationProvider.getUserPrincipalName(); + action.addParametersItem(CreateIncidentParameter.builder() + .name("caller") + .type(ParameterType.STRING.getValue()) + .value(caller) + .build()); } public String getParameterString(CreateIncidentAction createIncidentAction, String parameterName) { diff --git a/src/main/java/org/opendevstack/component_provisioner/server/facade/ProvisionerActionsApiFacade.java b/src/main/java/org/opendevstack/component_provisioner/server/facade/ProvisionerActionsApiFacade.java index 67e8c5e..f4f8c44 100644 --- a/src/main/java/org/opendevstack/component_provisioner/server/facade/ProvisionerActionsApiFacade.java +++ b/src/main/java/org/opendevstack/component_provisioner/server/facade/ProvisionerActionsApiFacade.java @@ -58,7 +58,6 @@ public void notifyComponentCatalogProvisionStarts(ProvisionAction provisionActio var catalogItemId = getCatalogItemId(provisionAction); var componentUrl = getComponentUrl(provisionAction); var accessToken = getAccessToken(provisionAction); - var idToken = getIdToken(provisionAction); var parameters = provisionAction.getParameters().stream() .collect(java.util.stream.Collectors.toMap( @@ -75,7 +74,7 @@ public void notifyComponentCatalogProvisionStarts(ProvisionAction provisionActio } )); - componentCatalogService.notifyComponentCatalogProvisionStarts(projectKey, componentId, catalogItemId, componentUrl, idToken, accessToken, parameters); + componentCatalogService.notifyComponentCatalogProvisionStarts(projectKey, componentId, catalogItemId, componentUrl, accessToken, parameters); } private String getCatalogItemId(ProvisionAction provisionAction) { @@ -94,10 +93,6 @@ private String getAccessToken(ProvisionAction provisionAction) { return getParameterString(provisionAction, "access_token"); } - private String getIdToken(ProvisionAction provisionAction) { - return getParameterString(provisionAction, "id_token"); - } - private String getParameterString(ProvisionAction provisionAction, String parameterName) { return provisionAction.getParameters().stream() .filter(parameter -> parameterName.equals(parameter.getName())) @@ -110,7 +105,7 @@ private String getParameterString(ProvisionAction provisionAction, String parame public void addSystemParametersToAction(ProvisionAction provisionAction) { addClusterLocationToAction(provisionAction); addCallerToAction(provisionAction); - addIdTokenToActions(provisionAction); + addBearerTokenToActions(provisionAction); } private void addCallerToAction(ProvisionAction provisionAction) { @@ -126,15 +121,14 @@ private void addCallerToAction(ProvisionAction provisionAction) { private void addClusterLocationToAction(ProvisionAction provisionAction) { var projectKey = getParameterString(provisionAction, "project_key"); - var accessToken = getParameterString(provisionAction, "access_token"); - var idToken = authenticationProvider.getIdToken(); + var accessToken = authenticationProvider.getAccessToken(); log.debug("Fetching cluster location for project: {}", projectKey); - var clusters = projectsInfoService.getProjectClusters(idToken, accessToken, projectKey).getClusters(); + var clusters = projectsInfoService.getProjectClusters(accessToken, projectKey).getClusters(); if (clusters.isEmpty()) { throw new ProjectConfigurationException("Cannot retrieve the current project location for project: " + projectKey); } - var clusterLocation = clusters.get(0); + var clusterLocation = clusters.getFirst(); log.debug("Adding cluster_location parameter with value: {}", clusterLocation); provisionAction.addParametersItem(ProvisionActionParameter.builder() @@ -144,10 +138,10 @@ private void addClusterLocationToAction(ProvisionAction provisionAction) { .build()); } - private void addIdTokenToActions(ProvisionAction provisionAction) { + private void addBearerTokenToActions(ProvisionAction provisionAction) { provisionAction.addParametersItem(ProvisionActionParameter.builder() - .name("id_token") - .value(authenticationProvider.getIdToken()) + .name("access_token") + .value(authenticationProvider.getAccessToken()) .type(ParameterType.STRING.getValue()) .build() ); diff --git a/src/main/java/org/opendevstack/component_provisioner/server/services/ApiClientsBuilder.java b/src/main/java/org/opendevstack/component_provisioner/server/services/ApiClientsBuilder.java index 084d411..c7e17bf 100644 --- a/src/main/java/org/opendevstack/component_provisioner/server/services/ApiClientsBuilder.java +++ b/src/main/java/org/opendevstack/component_provisioner/server/services/ApiClientsBuilder.java @@ -17,24 +17,24 @@ public class ApiClientsBuilder { private final RestTemplate restTemplate; - public org.opendevstack.component_catalog.client.projects_info_service.v1_0_0.ApiClient projectsInfoServiceApiClient(String idToken, String baseRestUrl) { + public org.opendevstack.component_catalog.client.projects_info_service.v1_0_0.ApiClient projectsInfoServiceApiClient(String accessToken, String baseRestUrl) { var apiClient = new org.opendevstack.component_catalog.client.projects_info_service.v1_0_0.ApiClient(restTemplate); apiClient.setBasePath(baseRestUrl); var auth = (org.opendevstack.component_catalog.client.projects_info_service.v1_0_0.auth.HttpBearerAuth) apiClient.getAuthentication(BEARER_TOKEN); - auth.setBearerToken(idToken); + auth.setBearerToken(accessToken); return apiClient; } - public org.opendevstack.component_provisioner.client.component_catalog.v1.ApiClient componentCatalogApiClient(String idToken, String baseRestUrl) { + public org.opendevstack.component_provisioner.client.component_catalog.v1.ApiClient componentCatalogApiClient(String accessToken, String baseRestUrl) { var apiClient = new org.opendevstack.component_provisioner.client.component_catalog.v1.ApiClient(restTemplate); apiClient.setBasePath(baseRestUrl); var auth = (org.opendevstack.component_provisioner.client.component_catalog.v1.auth.HttpBearerAuth) apiClient.getAuthentication(BEARER_TOKEN); - auth.setBearerToken(idToken); + auth.setBearerToken(accessToken); return apiClient; } @@ -51,12 +51,12 @@ public CatalogItemsApi catalogItemsApi(org.opendevstack.component_provisioner.cl return new CatalogItemsApi(apiClient); } - public ProvisionerActionsApi provisionerActionsApi(String idToken, String baseRestUrl) { + public ProvisionerActionsApi provisionerActionsApi(String accessToken, String baseRestUrl) { var apiClient = new org.opendevstack.component_provisioner.client.component_catalog.v1.ApiClient(restTemplate); apiClient.setBasePath(baseRestUrl); var auth = (org.opendevstack.component_provisioner.client.component_catalog.v1.auth.HttpBearerAuth) apiClient.getAuthentication(BEARER_TOKEN); - auth.setBearerToken(idToken); + auth.setBearerToken(accessToken); return new ProvisionerActionsApi(apiClient); } diff --git a/src/main/java/org/opendevstack/component_provisioner/server/services/AuthenticationProvider.java b/src/main/java/org/opendevstack/component_provisioner/server/services/AuthenticationProvider.java index e59ab58..0ec0740 100644 --- a/src/main/java/org/opendevstack/component_provisioner/server/services/AuthenticationProvider.java +++ b/src/main/java/org/opendevstack/component_provisioner/server/services/AuthenticationProvider.java @@ -9,18 +9,18 @@ @Component @Slf4j public class AuthenticationProvider { - public String getIdToken() { + public String getAccessToken() { Authentication auth = SecurityContextHolder.getContext().getAuthentication(); log.debug("Authenticated user '{}'", auth.getName()); var principal = (UserPrincipal) auth.getPrincipal(); - var idToken = principal.getAadIssuedBearerToken(); + var accessToken = principal.getAadIssuedBearerToken(); - log.debug("Extracted idToken: {} from request.", idToken); + log.debug("Extracted accessToken: {} from request.", accessToken); - return idToken; + return accessToken; } public String getUserPrincipalName() { diff --git a/src/main/java/org/opendevstack/component_provisioner/server/services/ComponentCatalogService.java b/src/main/java/org/opendevstack/component_provisioner/server/services/ComponentCatalogService.java index ec57d81..f800143 100644 --- a/src/main/java/org/opendevstack/component_provisioner/server/services/ComponentCatalogService.java +++ b/src/main/java/org/opendevstack/component_provisioner/server/services/ComponentCatalogService.java @@ -102,7 +102,6 @@ public void notifyComponentCatalogProvisionStarts(String projectKey, String componentId, String catalogItemId, String componentUrl, - String idToken, String accessToken, Map> parameters) { log.debug("Notifying component catalog about starting provision for project {}, componentId: {}, catalogItemId: {}, componentUrl: {}", @@ -123,7 +122,7 @@ public void notifyComponentCatalogProvisionStarts(String projectKey, .parameters(obfuscatedParameters) .build(); - var provisionerActionsApi = apiClientsBuilder.provisionerActionsApi(idToken, componentCatalogServiceProps.getBaseRestUrl().toString()); + var provisionerActionsApi = apiClientsBuilder.provisionerActionsApi(accessToken, componentCatalogServiceProps.getBaseRestUrl().toString()); log.debug("Calling provisionerActionsApi.notifyProvisioningStatusUpdate. ProjectKey: {}, status: {}, notifyProvisioningCompletedRequest: {}", projectKey, "CREATING", provisioningStatusUpdateRequest); @@ -131,16 +130,16 @@ public void notifyComponentCatalogProvisionStarts(String projectKey, provisionerActionsApi.notifyProvisioningStatusUpdate(projectKey, "CREATING", provisioningStatusUpdateRequest); } - public List getProjectComponents(String projectKey, String idToken, String accessToken) { + public List getProjectComponents(String projectKey, String accessToken) { var auth = (HttpBearerAuth) componentCatalogApiClient.getAuthentication("bearerAuth"); - auth.setBearerToken(idToken); + auth.setBearerToken(accessToken); return projectComponentsApi.getProjectComponents(projectKey, accessToken); } @Cacheable - public CatalogItem getCatalogItem(String idToken, String accessToken, String catalogItemId, String projectKey) { - var apiClient = apiClientsBuilder.componentCatalogApiClient(idToken, componentCatalogServiceProps.getBaseRestUrl().toString()); + public CatalogItem getCatalogItem(String accessToken, String catalogItemId, String projectKey) { + var apiClient = apiClientsBuilder.componentCatalogApiClient(accessToken, componentCatalogServiceProps.getBaseRestUrl().toString()); var catalogItemsApi = apiClientsBuilder.catalogItemsApi(apiClient); var catalogItem = catalogItemsApi.getCatalogItemByIdForProjectKey(catalogItemId, projectKey, accessToken); diff --git a/src/main/java/org/opendevstack/component_provisioner/server/services/ProjectsInfoService.java b/src/main/java/org/opendevstack/component_provisioner/server/services/ProjectsInfoService.java index 5ff4650..6e88561 100644 --- a/src/main/java/org/opendevstack/component_provisioner/server/services/ProjectsInfoService.java +++ b/src/main/java/org/opendevstack/component_provisioner/server/services/ProjectsInfoService.java @@ -23,18 +23,18 @@ public class ProjectsInfoService { private ApiClientsBuilder apiClientsBuilder; @Cacheable - public List getProjectGroups(String idToken, String accessToken) { - var apiClient = apiClientsBuilder.projectsInfoServiceApiClient(idToken, projectsInfoServiceProps.getBaseRestUrl().toString()); + public List getProjectGroups(String accessToken) { + var apiClient = apiClientsBuilder.projectsInfoServiceApiClient(accessToken, projectsInfoServiceProps.getBaseRestUrl().toString()); var azureGroupsApi = apiClientsBuilder.azureGroupsApi(apiClient); - return azureGroupsApi.getAzureGroups(accessToken); + return azureGroupsApi.getAzureGroups(); } - public ProjectInfo getProjectClusters(String idToken, String accessToken, String projectKey) { - var apiClient = apiClientsBuilder.projectsInfoServiceApiClient(idToken, projectsInfoServiceProps.getBaseRestUrl().toString()); + public ProjectInfo getProjectClusters(String accessToken, String projectKey) { + var apiClient = apiClientsBuilder.projectsInfoServiceApiClient(accessToken, projectsInfoServiceProps.getBaseRestUrl().toString()); var projectsApi = apiClientsBuilder.projectsApi(apiClient); - return projectsApi.getProjectClusters(accessToken, projectKey); + return projectsApi.getProjectClusters(projectKey); } } diff --git a/src/main/java/org/opendevstack/component_provisioner/server/services/ProvisionService.java b/src/main/java/org/opendevstack/component_provisioner/server/services/ProvisionService.java index 518f811..11509a7 100644 --- a/src/main/java/org/opendevstack/component_provisioner/server/services/ProvisionService.java +++ b/src/main/java/org/opendevstack/component_provisioner/server/services/ProvisionService.java @@ -17,10 +17,10 @@ public class ProvisionService { private final ApplicationPropertiesConfiguration.ComponentCatalogServiceProps componentCatalogServiceProps; public void notifyProvisioningStatusUpdate(String projectKey, ProjectComponentStatus status, String componentId, - String catalogItemId, String componentUrl, String idToken, String accessToken) { + String catalogItemId, String componentUrl, String accessToken) { log.info("Notifying provisioning completed"); - var provisionerActionsApi = apiClientsBuilder.provisionerActionsApi(idToken, componentCatalogServiceProps.getBaseRestUrl().toString()); + var provisionerActionsApi = apiClientsBuilder.provisionerActionsApi(accessToken, componentCatalogServiceProps.getBaseRestUrl().toString()); var notifyProvisioningCompletedRequest = ProvisioningStatusUpdateRequest.builder() .componentId(componentId) @@ -35,14 +35,14 @@ public void notifyProvisioningStatusUpdate(String projectKey, ProjectComponentSt provisionerActionsApi.notifyProvisioningStatusUpdatePartially(projectKey, status.name(), notifyProvisioningCompletedRequest); } - public void deleteProvisioningStatus(String projectKey, String componentId, String idToken) { + public void deleteProvisioningStatus(String projectKey, String componentId, String accessToken) { log.info("Deleting provisioning completed. Project Key: {}, componentId: {}", projectKey, componentId); var provisioningDeleteRequest = ProvisioningDeleteRequest.builder() .componentId(componentId) .build(); - var provisionerActionsApi = apiClientsBuilder.provisionerActionsApi(idToken, componentCatalogServiceProps.getBaseRestUrl().toString()); + var provisionerActionsApi = apiClientsBuilder.provisionerActionsApi(accessToken, componentCatalogServiceProps.getBaseRestUrl().toString()); provisionerActionsApi.deleteProvisioningStatus(projectKey, provisioningDeleteRequest); } diff --git a/src/test/java/org/opendevstack/component_provisioner/server/controllers/ProvisionResultsApiControllerTest.java b/src/test/java/org/opendevstack/component_provisioner/server/controllers/ProvisionResultsApiControllerTest.java index 0bcdd55..ba61f88 100644 --- a/src/test/java/org/opendevstack/component_provisioner/server/controllers/ProvisionResultsApiControllerTest.java +++ b/src/test/java/org/opendevstack/component_provisioner/server/controllers/ProvisionResultsApiControllerTest.java @@ -13,6 +13,7 @@ import org.opendevstack.component_provisioner.server.model.NotifyProvisioningStatusUpdateRequest; import org.opendevstack.component_provisioner.server.model.ProvisionActionResponse; import org.opendevstack.component_provisioner.server.model.ProvisioningDeleteRequest; +import org.opendevstack.component_provisioner.server.services.AuthenticationProvider; import org.springframework.http.HttpStatus; import static org.assertj.core.api.Assertions.assertThat; @@ -26,6 +27,9 @@ class ProvisionResultsApiControllerTest { String exceptionMsg = "Status is not valid. It can only be CREATING, CREATED, FAILED, DELETING, UNKNOWN"; + @Mock + private AuthenticationProvider authenticationProvider; + @Mock private ProvisionResultsApiFacade provisionResultsApiFacade; @@ -40,23 +44,21 @@ void givenAProvisionService_whenNotifyProvisioningCompletedIsCalled_thenReturnsO var componentId = "componentId"; var catalogItemId = "catalogItemId"; var componentUrl = "componentUrl"; - var idToken = "idToken"; var accessToken = "accessToken"; var request = new NotifyProvisioningStatusUpdateRequest(); request.setComponentId(componentId); request.setCatalogItemId(catalogItemId); request.setComponentUrl(componentUrl); - request.setAccessToken(accessToken); - when(provisionResultsApiFacade.getIdToken()).thenReturn(idToken); + when(authenticationProvider.getAccessToken()).thenReturn(accessToken); // when var response = provisionResultsApiController.notifyProvisioningStatusUpdate(projectKey, status.name(), request); // then assertEquals(HttpStatus.OK, response.getStatusCode()); - verify(provisionResultsApiFacade).notifyProvisioningStatusUpdate(projectKey, status, componentId, catalogItemId, componentUrl, idToken, accessToken); + verify(provisionResultsApiFacade).notifyProvisioningStatusUpdate(projectKey, status, componentId, catalogItemId, componentUrl, accessToken); verify(provisionResultsApiFacade).validate(projectKey, status.name()); } @@ -65,18 +67,18 @@ void givenAProjectKey_AndAComponentId_whenDeleteProvisioningStatus_thenReturnsOk // given var projectKey = "project-key"; var componentId = "componentId"; - var idToken = "idToken"; + var accessToken = "accessToken"; var provisioningDeleteRequest = ProvisioningDeleteRequest.builder().componentId(componentId).build(); - when(provisionResultsApiFacade.getIdToken()).thenReturn(idToken); + when(authenticationProvider.getAccessToken()).thenReturn(accessToken); // when var response = provisionResultsApiController.deleteProvisioningStatus(projectKey, provisioningDeleteRequest); // then assertEquals(HttpStatus.OK, response.getStatusCode()); - verify(provisionResultsApiFacade).deleteProvisioningStatus(projectKey, componentId, idToken); + verify(provisionResultsApiFacade).deleteProvisioningStatus(projectKey, componentId, accessToken); } @Test @@ -84,10 +86,11 @@ void givenAProjectKey_AndAComponentId_AndCreateIncidentAction_whenCreateIncident // given var projectKey = "project-key"; var componentId = "componentId"; + var accessToken = "accessToken"; var createIncidentAction = CreateIncidentActionMother.of(); - when(provisionResultsApiFacade.getIdToken()).thenReturn("id-token"); - when(provisionResultsApiFacade.isInDeletingState(any(), any(), any(), any())).thenReturn(false); + when(authenticationProvider.getAccessToken()).thenReturn(accessToken); + when(provisionResultsApiFacade.isInDeletingState(any(), any(), any())).thenReturn(false); var actionResponse = new ProvisionActionResponse(); var awxResponse = AwxResponse.builder().httpStatusCode(HttpStatus.OK).awxResponseBody(actionResponse).build(); when(provisionResultsApiFacade.requestProvisionToAwx(any(), any(), any())).thenReturn(awxResponse); @@ -99,8 +102,9 @@ void givenAProjectKey_AndAComponentId_AndCreateIncidentAction_whenCreateIncident assertEquals(HttpStatus.OK, response.getStatusCode()); assertEquals(actionResponse, response.getBody()); verify(provisionResultsApiFacade).validate(projectKey, componentId, createIncidentAction); + verify(provisionResultsApiFacade).addSystemParametersToAction(projectKey, createIncidentAction); verify(provisionResultsApiFacade).requestProvisionToAwx(projectKey, componentId, createIncidentAction); - verify(provisionResultsApiFacade).notifyProvisioningStatusUpdate(eq(projectKey), eq(ProjectComponentStatus.DELETING), eq(componentId), isNull(), isNull(), anyString(), isNull()); + verify(provisionResultsApiFacade).notifyProvisioningStatusUpdate(eq(projectKey), eq(ProjectComponentStatus.DELETING), eq(componentId), isNull(), isNull(), anyString()); } @Test @@ -123,16 +127,18 @@ void givenAProjectKey_AndAComponentId_AndCreateIncidentAction_whenCreateIncident // given var projectKey = "project-key"; var componentId = "componentId"; + var accessToken = "accessToken"; var createIncidentAction = CreateIncidentActionMother.of(); - when(provisionResultsApiFacade.getIdToken()).thenReturn("id-token"); - when(provisionResultsApiFacade.isInDeletingState(any(), any(), any(), any())).thenReturn(true); + when(authenticationProvider.getAccessToken()).thenReturn(accessToken); + when(provisionResultsApiFacade.isInDeletingState(any(), any(), any())).thenReturn(true); // when var response = provisionResultsApiController.createIncident(projectKey, componentId, createIncidentAction); // then assertEquals(HttpStatus.OK, response.getStatusCode()); + verify(provisionResultsApiFacade).addSystemParametersToAction(projectKey, createIncidentAction); verify(provisionResultsApiFacade, never()).requestProvisionToAwx(any(), any(), any()); } diff --git a/src/test/java/org/opendevstack/component_provisioner/server/controllers/validators/MandatoryFieldsValidatorTest.java b/src/test/java/org/opendevstack/component_provisioner/server/controllers/validators/MandatoryFieldsValidatorTest.java index ddb51cc..0dd3b04 100644 --- a/src/test/java/org/opendevstack/component_provisioner/server/controllers/validators/MandatoryFieldsValidatorTest.java +++ b/src/test/java/org/opendevstack/component_provisioner/server/controllers/validators/MandatoryFieldsValidatorTest.java @@ -218,9 +218,10 @@ void givenCatalogItemWithoutUserActions_whenValidate_thenExceptionIsThrown() { // given CatalogItem catalogItem = CatalogItemMother.of(); catalogItem.setUserActions(null); + var bearerToken = "bearer-token"; - when(authenticationProvider.getIdToken()).thenReturn("id-token"); - when(componentCatalogService.getCatalogItem(any(), any(), any(), any())) + when(authenticationProvider.getAccessToken()).thenReturn(bearerToken); + when(componentCatalogService.getCatalogItem(any(), any(), any())) .thenReturn(catalogItem); ProvisionAction action = @@ -237,9 +238,10 @@ void givenCatalogItemWithoutProvisionAction_whenValidate_thenExceptionIsThrown() // given CatalogItem catalogItem = CatalogItemMother.of(); catalogItem.getUserActions().getFirst().setId("DELETE"); + var bearerToken = "bearer-token"; - when(authenticationProvider.getIdToken()).thenReturn("id-token"); - when(componentCatalogService.getCatalogItem(any(), any(), any(), any())) + when(authenticationProvider.getAccessToken()).thenReturn(bearerToken); + when(componentCatalogService.getCatalogItem(any(), any(), any())) .thenReturn(catalogItem); ProvisionAction action = @@ -288,6 +290,8 @@ void givenSingleListTypeAndDefaultValue_whenUpdateParam_thenDefaultApplied() { @Test void givenAValidProvisionAction_whenValidate_thenMandatoryFieldsAreProcessed() { // given + var bearerToken = "bearer-token"; + CatalogItem catalogItem = CatalogItemMother.of(); CatalogItemUserActionParameter mandatoryParam = CatalogItemUserActionParameterMother.of( "mandatoryParam", @@ -295,8 +299,8 @@ void givenAValidProvisionAction_whenValidate_thenMandatoryFieldsAreProcessed() { ); catalogItem.getUserActions().getFirst().setParameters(List.of(mandatoryParam)); - when(authenticationProvider.getIdToken()).thenReturn("id-token"); - when(componentCatalogService.getCatalogItem(any(), any(), any(), any())) + when(authenticationProvider.getAccessToken()).thenReturn(bearerToken); + when(componentCatalogService.getCatalogItem(any(), any(), any())) .thenReturn(catalogItem); ProvisionActionParameter actionParam = ProvisionActionParameterMother.of("mandatoryParam", null); diff --git a/src/test/java/org/opendevstack/component_provisioner/server/controllers/validators/ProvisionerActionsApiValidatorTest.java b/src/test/java/org/opendevstack/component_provisioner/server/controllers/validators/ProvisionerActionsApiValidatorTest.java index 85c37be..d34063e 100644 --- a/src/test/java/org/opendevstack/component_provisioner/server/controllers/validators/ProvisionerActionsApiValidatorTest.java +++ b/src/test/java/org/opendevstack/component_provisioner/server/controllers/validators/ProvisionerActionsApiValidatorTest.java @@ -67,7 +67,6 @@ void validate_throwsInvalidRestEntityException_whenRequiredParameterMissing(Stri void validate_throwsProjectComponentAlreadyProvisionedException_whenComponentAlreadyExistsInCatalog() { var projectKey = "pkey"; var componentId = "cid"; - var idToken = "idToken"; var accessToken = "accessToken"; var params = List.of( @@ -82,9 +81,9 @@ void validate_throwsProjectComponentAlreadyProvisionedException_whenComponentAlr var exists = new ProjectComponentInfo(); exists.setComponentId(componentId); - when(authenticationProvider.getIdToken()).thenReturn(idToken); + when(authenticationProvider.getAccessToken()).thenReturn(accessToken); - when(componentCatalogService.getProjectComponents(projectKey, idToken, accessToken)) + when(componentCatalogService.getProjectComponents(projectKey, accessToken)) .thenReturn(List.of(exists)); assertThrows(ProjectComponentAlreadyProvisionedException.class, @@ -97,7 +96,6 @@ void validate_throwsUserNotAllowedException_whenUserHasNoPermissions() { var projectKey = "pkey"; var componentId = "cid"; var accessToken = "accessToken"; - var idToken = "idToken"; var action = ProvisionActionMother.of(List.of( ProvisionActionParameterMother.of("project_key", projectKey), @@ -106,14 +104,14 @@ void validate_throwsUserNotAllowedException_whenUserHasNoPermissions() { ProvisionActionParameterMother.of("access_token", accessToken) )); - when(authenticationProvider.getIdToken()).thenReturn(idToken); + when(authenticationProvider.getAccessToken()).thenReturn(accessToken); // Component catalog empty → no conflict - when(componentCatalogService.getProjectComponents(projectKey, idToken, accessToken)) + when(componentCatalogService.getProjectComponents(projectKey, accessToken)) .thenReturn(List.of()); // User groups - when(projectsInfoService.getProjectGroups(idToken, accessToken)) + when(projectsInfoService.getProjectGroups(accessToken)) .thenReturn(List.of("group1")); // Configure restriction prefix/suffix @@ -135,7 +133,6 @@ void validate_allowsProvision_whenUserHasPermissions() { var projectKey = "pkey"; var componentId = "cid"; var accessToken = "accessToken"; - var idToken = "idToken"; var action = ProvisionActionMother.of(List.of( ProvisionActionParameterMother.of("project_key", projectKey), @@ -144,14 +141,14 @@ void validate_allowsProvision_whenUserHasPermissions() { ProvisionActionParameterMother.of("access_token", accessToken) )); - when(authenticationProvider.getIdToken()).thenReturn(idToken); + when(authenticationProvider.getAccessToken()).thenReturn(accessToken); // Component does NOT exist - when(componentCatalogService.getProjectComponents(projectKey, idToken, accessToken)) + when(componentCatalogService.getProjectComponents(projectKey, accessToken)) .thenReturn(List.of()); // User groups - when(projectsInfoService.getProjectGroups(idToken, accessToken)) + when(projectsInfoService.getProjectGroups(accessToken)) .thenReturn(List.of("allowed-group")); // Configure restriction prefix/suffix @@ -214,9 +211,9 @@ void validate_throwsInvalidRestEntityException_whenMandatoryFieldsValidatorThrow ProvisionActionParameterMother.of("access_token", "accessToken") )); - when(authenticationProvider.getIdToken()).thenReturn("idToken"); - when(componentCatalogService.getProjectComponents(any(), any(), any())).thenReturn(List.of()); - when(projectsInfoService.getProjectGroups(any(), any())).thenReturn(List.of("group")); + when(authenticationProvider.getAccessToken()).thenReturn("bearerToken"); + when(componentCatalogService.getProjectComponents(any(), any())).thenReturn(List.of()); + when(projectsInfoService.getProjectGroups(any())).thenReturn(List.of("group")); when(catalogItemUserActionGroupsRestrictionProps.getPrefix()).thenReturn(List.of("prefix-")); when(catalogItemUserActionGroupsRestrictionProps.getSuffix()).thenReturn(List.of("-suffix")); when(groupsRestrictionsEvaluator.evaluate(any(), any())).thenReturn(Pair.of(true, "")); @@ -237,8 +234,8 @@ void validate_throwsException_whenComponentCatalogServiceThrowsDuringProvisionCh ProvisionActionParameterMother.of("access_token", "accessToken") )); - when(authenticationProvider.getIdToken()).thenReturn("idToken"); - when(componentCatalogService.getProjectComponents(any(), any(), any())).thenThrow(new RuntimeException("Service error")); + when(authenticationProvider.getAccessToken()).thenReturn("bearerToken"); + when(componentCatalogService.getProjectComponents(any(), any())).thenThrow(new RuntimeException("Service error")); assertThrows(RuntimeException.class, () -> provisionerActionsApiValidator.validate(action)); @@ -253,9 +250,9 @@ void validate_throwsException_whenProjectsInfoServiceThrowsDuringPermissionsChec ProvisionActionParameterMother.of("access_token", "accessToken") )); - when(authenticationProvider.getIdToken()).thenReturn("idToken"); - when(componentCatalogService.getProjectComponents(any(), any(), any())).thenReturn(List.of()); - when(projectsInfoService.getProjectGroups(any(), any())).thenThrow(new RuntimeException("Service error")); + when(authenticationProvider.getAccessToken()).thenReturn("bearerToken"); + when(componentCatalogService.getProjectComponents(any(), any())).thenReturn(List.of()); + when(projectsInfoService.getProjectGroups(any())).thenThrow(new RuntimeException("Service error")); assertThrows(RuntimeException.class, () -> provisionerActionsApiValidator.validate(action)); @@ -270,9 +267,9 @@ void validate_throwsException_whenGroupsRestrictionsEvaluatorThrowsDuringPermiss ProvisionActionParameterMother.of("access_token", "accessToken") )); - when(authenticationProvider.getIdToken()).thenReturn("idToken"); - when(componentCatalogService.getProjectComponents(any(), any(), any())).thenReturn(List.of()); - when(projectsInfoService.getProjectGroups(any(), any())).thenReturn(List.of("group")); + when(authenticationProvider.getAccessToken()).thenReturn("bearerToken"); + when(componentCatalogService.getProjectComponents(any(), any())).thenReturn(List.of()); + when(projectsInfoService.getProjectGroups(any())).thenReturn(List.of("group")); when(groupsRestrictionsEvaluator.evaluate(any(), any())).thenThrow(new RuntimeException("Evaluator error")); assertThrows(RuntimeException.class, diff --git a/src/test/java/org/opendevstack/component_provisioner/server/facade/ProvisionResultsApiFacadeTest.java b/src/test/java/org/opendevstack/component_provisioner/server/facade/ProvisionResultsApiFacadeTest.java index 984634d..8cd1835 100644 --- a/src/test/java/org/opendevstack/component_provisioner/server/facade/ProvisionResultsApiFacadeTest.java +++ b/src/test/java/org/opendevstack/component_provisioner/server/facade/ProvisionResultsApiFacadeTest.java @@ -7,18 +7,22 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.opendevstack.component_catalog.client.projects_info_service.v1_0_0.model.ProjectInfo; import org.opendevstack.component_provisioner.client.component_catalog.v1.model.ProjectComponentInfo; import org.opendevstack.component_provisioner.client.component_catalog.v1.model.ProjectComponentInfoMother; import org.opendevstack.component_provisioner.server.controllers.exceptions.InvalidRestEntityException; +import org.opendevstack.component_provisioner.server.controllers.exceptions.ProjectConfigurationException; import org.opendevstack.component_provisioner.server.controllers.model.ProjectComponentStatus; import org.opendevstack.component_provisioner.server.mappers.EntitiesMapper; import org.opendevstack.component_provisioner.server.model.CreateIncidentAction; import org.opendevstack.component_provisioner.server.model.CreateIncidentActionMother; import org.opendevstack.component_provisioner.server.model.CreateIncidentParameter; -import org.opendevstack.component_provisioner.server.model.CreateIncidentParameterMother; import org.opendevstack.component_provisioner.server.model.ProvisionActionResponse; +import org.opendevstack.component_provisioner.server.services.AuthenticationProvider; import org.opendevstack.component_provisioner.server.services.AwxService; import org.opendevstack.component_provisioner.server.services.ComponentCatalogService; +import org.opendevstack.component_provisioner.server.services.ProjectsInfoService; +import org.opendevstack.component_provisioner.server.services.ProvisionService; import org.opendevstack.component_provisioner.server.services.awx.AwxWorkflowJob; import org.opendevstack.component_provisioner.server.services.awx.AwxWorkflowJobLaunch; import org.springframework.http.HttpStatus; @@ -30,8 +34,10 @@ import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) @@ -43,6 +49,12 @@ class ProvisionResultsApiFacadeTest { private ComponentCatalogService componentCatalogService; @Mock private EntitiesMapper entitiesMapper; + @Mock + private ProvisionService provisionService; + @Mock + private AuthenticationProvider authenticationProvider; + @Mock + private ProjectsInfoService projectsInfoService; @InjectMocks private ProvisionResultsApiFacade facade; @@ -74,9 +86,9 @@ void isInDeletingState_returnsTrueWhenMatchingComponentFound() { var action = CreateIncidentActionMother.of(); var accessToken = action.getParameters().stream().filter(p -> p.getName().equals("access_token")).map(CreateIncidentParameter::getValue).map(Object::toString).findFirst().orElseThrow(); ProjectComponentInfo pc = ProjectComponentInfoMother.of(ProjectComponentStatus.DELETING); - when(componentCatalogService.getProjectComponents("PRJ", "ID", accessToken)).thenReturn(List.of(pc)); + when(componentCatalogService.getProjectComponents("PRJ", accessToken)).thenReturn(List.of(pc)); - var result = facade.isInDeletingState("PRJ", "componentId", "ID", action); + var result = facade.isInDeletingState("PRJ", "componentId", accessToken); assertThat(result).isTrue(); } @@ -86,13 +98,6 @@ void validate_status_throwsOnInvalid() { assertThat(ex.getMessage()).contains("Status is not valid"); } - @Test - void validate_createIncident_throwsOnMissingFields() { - var invalid = CreateIncidentAction.builder().build(); - var ex = assertThrows(InvalidRestEntityException.class, () -> facade.validate("PRJ", "CID", invalid)); - assertThat(ex.getMessage()).contains("caller, cluster_location"); - } - @Test void validate_throwsOnMissingProjectKeyOrStatus() { assertThrows(InvalidRestEntityException.class, () -> facade.validate(null, "CREATED")); @@ -106,21 +111,6 @@ void validate_createIncident_throwsOnMissingMainParams() { assertThrows(InvalidRestEntityException.class, () -> facade.validate("PRJ", null, action)); } - @Test - void validate_createIncident_throwsOnMissingTokens() { - var action = CreateIncidentAction.builder() - .parameters(new ArrayList<>(List.of( - CreateIncidentParameterMother.of("caller"), - CreateIncidentParameterMother.of("cluster_location"), - CreateIncidentParameterMother.of("is_deployed"), - CreateIncidentParameterMother.of("change_number"), - CreateIncidentParameterMother.of("reason") - ))) - .build(); - var ex = assertThrows(InvalidRestEntityException.class, () -> facade.validate("PRJ", "CID", action)); - assertThat(ex.getMessage()).contains("access_token is required"); - } - @Test void getParameterString_returnsEmptyOnMissing() { var action = CreateIncidentAction.builder().parameters(new ArrayList<>()).build(); @@ -131,9 +121,9 @@ void getParameterString_returnsEmptyOnMissing() { void isInDeletingState_returnsFalseWhenComponentNotFound() { var action = CreateIncidentActionMother.of(); String accessToken = facade.getParameterString(action, "access_token"); - when(componentCatalogService.getProjectComponents("PRJ", "ID", accessToken)).thenReturn(Collections.emptyList()); + when(componentCatalogService.getProjectComponents("PRJ", accessToken)).thenReturn(Collections.emptyList()); - var result = facade.isInDeletingState("PRJ", "componentId", "ID", action); + var result = facade.isInDeletingState("PRJ", "componentId", accessToken); assertThat(result).isFalse(); } @@ -143,9 +133,119 @@ void isInDeletingState_returnsFalseWhenComponentNotDeleting() { String accessToken = facade.getParameterString(action, "access_token"); ProjectComponentInfo pc = ProjectComponentInfoMother.of(ProjectComponentStatus.CREATED); pc.setComponentId("componentId"); - when(componentCatalogService.getProjectComponents("PRJ", "ID", accessToken)).thenReturn(List.of(pc)); + when(componentCatalogService.getProjectComponents("PRJ", accessToken)).thenReturn(List.of(pc)); - var result = facade.isInDeletingState("PRJ", "componentId", "ID", action); + var result = facade.isInDeletingState("PRJ", "componentId", accessToken); assertThat(result).isFalse(); } + + @Test + void validate_status_doesNotThrowWhenValid() { + // given + var projectKey = "PRJ"; + var status = ProjectComponentStatus.CREATED.name(); + + // when / then + assertDoesNotThrow(() -> facade.validate(projectKey, status)); + } + + @Test + void validate_createIncident_throwsOnMissingExtraParams() { + // given + var action = CreateIncidentAction.builder().parameters(new ArrayList<>()).build(); + + // when / then + var ex = assertThrows(InvalidRestEntityException.class, () -> facade.validate("PRJ", "CID", action)); + assertThat(ex.getMessage()).contains("is_deployed, change_number and reason are required"); + } + + @Test + void requestProvisionToAwx_returnsNullBodyWhenAwxResponseIsEmpty() { + // given + var action = CreateIncidentActionMother.of(); + var launch = new AwxWorkflowJobLaunch(); + + when(entitiesMapper.asAwxWorkflowJobLaunch(action)).thenReturn(launch); + when(awxService.triggerWorkflowJob("CREATE_INCIDENT", launch)).thenReturn(Pair.of(HttpStatus.ACCEPTED, Optional.empty())); + + // when + var result = facade.requestProvisionToAwx("PRJ", "CID", action); + + // then + assertEquals(HttpStatus.ACCEPTED, result.httpStatusCode()); + assertThat(result.awxResponseBody()).isNull(); + } + + @Test + void notifyProvisioningStatusUpdate_delegatesToProvisionService() { + // given + var projectKey = "PRJ"; + var status = ProjectComponentStatus.CREATED; + var componentId = "CID"; + var catalogItemId = "CAT"; + var componentUrl = "http://example.com"; + var accessToken = "token"; + + // when + facade.notifyProvisioningStatusUpdate(projectKey, status, componentId, catalogItemId, componentUrl, accessToken); + + // then + verify(provisionService).notifyProvisioningStatusUpdate(projectKey, status, componentId, catalogItemId, componentUrl, accessToken); + } + + @Test + void deleteProvisioningStatus_delegatesToProvisionService() { + // given + var projectKey = "PRJ"; + var componentId = "CID"; + var accessToken = "token"; + + // when + facade.deleteProvisioningStatus(projectKey, componentId, accessToken); + + // then + verify(provisionService).deleteProvisioningStatus(projectKey, componentId, accessToken); + } + + @Test + void addSystemParametersToAction_addsClusterAndCallerToAction() { + // given + var projectKey = "PRJ"; + var accessToken = "token123"; + var clusterLocation = "cluster-a"; + var caller = "user@example.com"; + var action = CreateIncidentAction.builder().parameters(new ArrayList<>()).build(); + + var projectInfo = new ProjectInfo(); + projectInfo.setClusters(List.of(clusterLocation)); + + when(authenticationProvider.getAccessToken()).thenReturn(accessToken); + when(authenticationProvider.getUserPrincipalName()).thenReturn(caller); + when(projectsInfoService.getProjectClusters(accessToken, projectKey)).thenReturn(projectInfo); + + // when + facade.addSystemParametersToAction(projectKey, action); + + // then + assertThat(facade.getParameterString(action, "cluster_location")).isEqualTo(clusterLocation); + assertThat(facade.getParameterString(action, "caller")).isEqualTo(caller); + } + + @Test + void addSystemParametersToAction_throwsWhenClustersEmpty() { + // given + var projectKey = "PRJ"; + var accessToken = "token123"; + var action = CreateIncidentAction.builder().parameters(new ArrayList<>()).build(); + + var projectInfo = new ProjectInfo(); + projectInfo.setClusters(Collections.emptyList()); + + when(authenticationProvider.getAccessToken()).thenReturn(accessToken); + when(projectsInfoService.getProjectClusters(accessToken, projectKey)).thenReturn(projectInfo); + + // when / then + var ex = assertThrows(ProjectConfigurationException.class, () -> facade.addSystemParametersToAction(projectKey, action)); + assertThat(ex.getMessage()).contains("PRJ"); + } } diff --git a/src/test/java/org/opendevstack/component_provisioner/server/facade/ProvisionerActionsApiFacadeTest.java b/src/test/java/org/opendevstack/component_provisioner/server/facade/ProvisionerActionsApiFacadeTest.java index 3dc62bf..78e317c 100644 --- a/src/test/java/org/opendevstack/component_provisioner/server/facade/ProvisionerActionsApiFacadeTest.java +++ b/src/test/java/org/opendevstack/component_provisioner/server/facade/ProvisionerActionsApiFacadeTest.java @@ -78,12 +78,14 @@ void requestProvisionToAwx_mapsResponseCorrectly() { @Test void notifyComponentCatalogProvisionStarts_sendsParametersAsListOfStrings() { // given + var accessToken = "BEARER-TOKEN"; + var params = new ArrayList(); params.add(ProvisionActionParameterMother.of("project_key", "PRJ")); params.add(ProvisionActionParameterMother.of("component_id", "CID")); params.add(ProvisionActionParameterMother.of("catalog_item_id", "CAT")); params.add(ProvisionActionParameterMother.of("component_url", "http://comp")); - params.add(ProvisionActionParameterMother.of("access_token", "TOKEN")); + params.add(ProvisionActionParameterMother.of("access_token", accessToken)); params.add(ProvisionActionParameterMother.of("list_param", List.of("a", "b"))); params.add(ProvisionActionParameterMother.of("null_param", null)); var action = ProvisionActionMother.of(params); @@ -93,25 +95,27 @@ void notifyComponentCatalogProvisionStarts_sendsParametersAsListOfStrings() { // then ArgumentCaptor>> captor = ArgumentCaptor.forClass(Map.class); - verify(componentCatalogService).notifyComponentCatalogProvisionStarts(eq("PRJ"), eq("CID"), eq("CAT"), eq("http://comp"), eq(""), eq("TOKEN"), captor.capture()); + verify(componentCatalogService).notifyComponentCatalogProvisionStarts(eq("PRJ"), eq("CID"), eq("CAT"), eq("http://comp"), eq(accessToken), captor.capture()); var map = captor.getValue(); assertThat(map.get("list_param")).containsExactly("a", "b"); assertThat(map.get("null_param")).containsExactly(""); } @Test - void addSystemParametersToAction_addsClusterLocationCallerAndIdToken() { + void addSystemParametersToAction_addsClusterLocationCallerAndAccessToken() { // given + var accessToken = "BEARER-TOKEN"; + var params = new ArrayList(); params.add(ProvisionActionParameterMother.of("project_key", "PRJ")); - params.add(ProvisionActionParameterMother.of("access_token", "ACCESS")); + params.add(ProvisionActionParameterMother.of("access_token", accessToken)); var action = ProvisionActionMother.of(params); var projectInfo = new ProjectInfo(); projectInfo.setClusters(List.of("cluster-eu-west")); - when(authenticationProvider.getIdToken()).thenReturn("id-token-value"); - when(projectsInfoService.getProjectClusters("id-token-value", "ACCESS", "PRJ")).thenReturn(projectInfo); + when(projectsInfoService.getProjectClusters(accessToken, "PRJ")).thenReturn(projectInfo); when(authenticationProvider.getUserPrincipalName()).thenReturn("user@example.com"); + when(authenticationProvider.getAccessToken()).thenReturn(accessToken); // when facade.addSystemParametersToAction(action); @@ -120,7 +124,7 @@ void addSystemParametersToAction_addsClusterLocationCallerAndIdToken() { var paramNames = action.getParameters().stream() .map(ProvisionActionParameter::getName) .toList(); - assertThat(paramNames).contains("cluster_location", "caller", "id_token"); + assertThat(paramNames).contains("cluster_location", "caller", "access_token"); var clusterLocation = action.getParameters().stream() .filter(p -> "cluster_location".equals(p.getName())) @@ -134,25 +138,27 @@ void addSystemParametersToAction_addsClusterLocationCallerAndIdToken() { .findFirst().orElseThrow(); assertThat(caller).isEqualTo("user@example.com"); - var idToken = action.getParameters().stream() - .filter(p -> "id_token".equals(p.getName())) + var bearerToken = action.getParameters().stream() + .filter(p -> "access_token".equals(p.getName())) .map(p -> p.getValue().toString()) .findFirst().orElseThrow(); - assertThat(idToken).isEqualTo("id-token-value"); + assertThat(bearerToken).isEqualTo(accessToken); } @Test void addSystemParametersToAction_throwsIllegalStateException_whenClustersIsEmpty() { // given + var bearerToken = "BEARER"; + var params = new ArrayList(); params.add(ProvisionActionParameterMother.of("project_key", "PRJ")); - params.add(ProvisionActionParameterMother.of("access_token", "ACCESS")); + params.add(ProvisionActionParameterMother.of("access_token", bearerToken)); var action = ProvisionActionMother.of(params); var projectInfo = new ProjectInfo(); projectInfo.setClusters(List.of()); - when(authenticationProvider.getIdToken()).thenReturn("id-token-value"); - when(projectsInfoService.getProjectClusters("id-token-value", "ACCESS", "PRJ")).thenReturn(projectInfo); + when(authenticationProvider.getAccessToken()).thenReturn(bearerToken); + when(projectsInfoService.getProjectClusters(bearerToken, "PRJ")).thenReturn(projectInfo); // when / then assertThatThrownBy(() -> facade.addSystemParametersToAction(action)) @@ -163,6 +169,7 @@ void addSystemParametersToAction_throwsIllegalStateException_whenClustersIsEmpty @Test void addSystemParametersToAction_usesFirstCluster_whenMultipleClustersAreReturned() { // given + var bearerToken = "bearer-token"; var params = new ArrayList(); params.add(ProvisionActionParameterMother.of("project_key", "PRJ")); params.add(ProvisionActionParameterMother.of("access_token", "ACCESS")); @@ -170,9 +177,9 @@ void addSystemParametersToAction_usesFirstCluster_whenMultipleClustersAreReturne var projectInfo = new ProjectInfo(); projectInfo.setClusters(List.of("cluster-primary", "cluster-secondary")); - when(authenticationProvider.getIdToken()).thenReturn("id-token-value"); - when(projectsInfoService.getProjectClusters("id-token-value", "ACCESS", "PRJ")).thenReturn(projectInfo); + when(projectsInfoService.getProjectClusters(bearerToken, "PRJ")).thenReturn(projectInfo); when(authenticationProvider.getUserPrincipalName()).thenReturn("user@example.com"); + when(authenticationProvider.getAccessToken()).thenReturn(bearerToken); // when facade.addSystemParametersToAction(action); diff --git a/src/test/java/org/opendevstack/component_provisioner/server/services/ApiClientsBuilderTest.java b/src/test/java/org/opendevstack/component_provisioner/server/services/ApiClientsBuilderTest.java index 55e53c0..18d7724 100644 --- a/src/test/java/org/opendevstack/component_provisioner/server/services/ApiClientsBuilderTest.java +++ b/src/test/java/org/opendevstack/component_provisioner/server/services/ApiClientsBuilderTest.java @@ -24,37 +24,37 @@ class ApiClientsBuilderTest { private ApiClientsBuilder builder; @Test - void givenIdTokenAndBaseUrl_whenProjectsInfoServiceApiClient_thenClientConfiguredCorrectly() { + void givenAccessTokenAndBaseUrl_whenProjectsInfoServiceApiClient_thenClientConfiguredCorrectly() { // given - String idToken = "test-token"; + String accessToken = "test-token"; String baseUrl = "http://example.com"; // when - ApiClient client = builder.projectsInfoServiceApiClient(idToken, baseUrl); + ApiClient client = builder.projectsInfoServiceApiClient(accessToken, baseUrl); // then assertThat(client).isNotNull(); assertThat(client.getBasePath()).isEqualTo(baseUrl); var auth = (org.opendevstack.component_catalog.client.projects_info_service.v1_0_0.auth.HttpBearerAuth) client.getAuthentication("bearerAuth"); - assertThat(auth.getBearerToken()).isEqualTo(idToken); + assertThat(auth.getBearerToken()).isEqualTo(accessToken); } @Test - void givenIdTokenAndBaseUrl_whenComponentCatalogApiClient_thenClientConfiguredCorrectly() { + void givenBearerTokenAndBaseUrl_whenComponentCatalogApiClient_thenClientConfiguredCorrectly() { // given - String idToken = "test-token"; + String accessToken = "test-token"; String baseUrl = "http://component-catalog"; // when - var client = builder.componentCatalogApiClient(idToken, baseUrl); + var client = builder.componentCatalogApiClient(accessToken, baseUrl); // then assertThat(client).isNotNull(); assertThat(client.getBasePath()).isEqualTo(baseUrl); var auth = (org.opendevstack.component_provisioner.client.component_catalog.v1.auth.HttpBearerAuth) client.getAuthentication("bearerAuth"); - assertThat(auth.getBearerToken()).isEqualTo(idToken); + assertThat(auth.getBearerToken()).isEqualTo(accessToken); } @Test @@ -99,11 +99,11 @@ void givenApiClient_whenCatalogItemsApi_thenReturnCatalogItemsApiInstance() { @Test void givenApiClient_whenProvisionerActionsApi_thenReturnProvisionerActionsApiInstance() { // given - String idToken = "test-token"; + String accessToken = "test-token"; String baseUrl = "http://component-catalog"; // when - ProvisionerActionsApi api = builder.provisionerActionsApi(idToken, baseUrl); + ProvisionerActionsApi api = builder.provisionerActionsApi(accessToken, baseUrl); // then assertThat(api).isNotNull(); diff --git a/src/test/java/org/opendevstack/component_provisioner/server/services/AuthenticationProviderTest.java b/src/test/java/org/opendevstack/component_provisioner/server/services/AuthenticationProviderTest.java index 42aa1a4..fbe1e54 100644 --- a/src/test/java/org/opendevstack/component_provisioner/server/services/AuthenticationProviderTest.java +++ b/src/test/java/org/opendevstack/component_provisioner/server/services/AuthenticationProviderTest.java @@ -40,21 +40,21 @@ void tearDown() { } @Test - void shouldReturnIdTokenWhenAuthenticated() { + void shouldReturnAccessTokenWhenAuthenticated() { // given - String expectedIdToken = "test-id-token"; + String expectedBearerToken = "test-bearer-token"; String userName = "test-user"; when(securityContext.getAuthentication()).thenReturn(authentication); when(authentication.getName()).thenReturn(userName); when(authentication.getPrincipal()).thenReturn(userPrincipal); - when(userPrincipal.getAadIssuedBearerToken()).thenReturn(expectedIdToken); + when(userPrincipal.getAadIssuedBearerToken()).thenReturn(expectedBearerToken); // when - String actualIdToken = authenticationProvider.getIdToken(); + String actualBearerToken = authenticationProvider.getAccessToken(); // then - assertThat(actualIdToken).isEqualTo(expectedIdToken); + assertThat(actualBearerToken).isEqualTo(expectedBearerToken); } @Test diff --git a/src/test/java/org/opendevstack/component_provisioner/server/services/ComponentCatalogServiceTest.java b/src/test/java/org/opendevstack/component_provisioner/server/services/ComponentCatalogServiceTest.java index 8d19872..df02a82 100644 --- a/src/test/java/org/opendevstack/component_provisioner/server/services/ComponentCatalogServiceTest.java +++ b/src/test/java/org/opendevstack/component_provisioner/server/services/ComponentCatalogServiceTest.java @@ -180,7 +180,6 @@ void givenValidInput_whenNotifyComponentCatalogProvisionStarts_thenInvokesProvis String componentId = "CMP-001"; String catalogItemId = "CAT-001"; String componentUrl = "component-url"; - String idToken = "id-token"; String accessToken = "secret"; Map> parameters = Map.of( "access_token", List.of("secret"), @@ -189,7 +188,7 @@ void givenValidInput_whenNotifyComponentCatalogProvisionStarts_thenInvokesProvis when(componentCatalogServiceProps.getBaseRestUrl()).thenReturn(URI.create("http://component-catalog").toURL()); when(parametersProps.getBlacklist()).thenReturn(new String[]{"access_token"}); - when(apiClientsBuilder.provisionerActionsApi(eq(idToken), eq("http://component-catalog"))).thenReturn(provisionerActionsApi); + when(apiClientsBuilder.provisionerActionsApi(eq(accessToken), eq("http://component-catalog"))).thenReturn(provisionerActionsApi); ArgumentCaptor projectKeyCaptor = ArgumentCaptor.forClass(String.class); ArgumentCaptor statusCaptor = ArgumentCaptor.forClass(String.class); @@ -197,7 +196,7 @@ void givenValidInput_whenNotifyComponentCatalogProvisionStarts_thenInvokesProvis ArgumentCaptor.forClass(ProvisioningStatusUpdateRequest.class); //when - componentCatalogService.notifyComponentCatalogProvisionStarts(projectKey, componentId, catalogItemId, componentUrl, idToken, accessToken, parameters); + componentCatalogService.notifyComponentCatalogProvisionStarts(projectKey, componentId, catalogItemId, componentUrl, accessToken, parameters); //then verify(provisionerActionsApi).notifyProvisioningStatusUpdate( @@ -232,17 +231,16 @@ void givenNullParameters_whenNotifyComponentCatalogProvisionStarts_thenEmptyMapI String projectKey = "PRJ-KEY"; String componentId = "CMP-001"; String catalogItemId = "CAT-001"; - String idToken = "id-token"; String accessToken = "secret"; ArgumentCaptor requestCaptor = ArgumentCaptor.forClass(ProvisioningStatusUpdateRequest.class); when(componentCatalogServiceProps.getBaseRestUrl()).thenReturn(URI.create("http://component-catalog").toURL()); - when(apiClientsBuilder.provisionerActionsApi(eq(idToken), eq("http://component-catalog"))).thenReturn(provisionerActionsApi); + when(apiClientsBuilder.provisionerActionsApi(eq(accessToken), eq("http://component-catalog"))).thenReturn(provisionerActionsApi); //when - componentCatalogService.notifyComponentCatalogProvisionStarts(projectKey, componentId, catalogItemId, null, idToken, accessToken, null); + componentCatalogService.notifyComponentCatalogProvisionStarts(projectKey, componentId, catalogItemId, null, accessToken, null); //then verify(provisionerActionsApi).notifyProvisioningStatusUpdate(eq(projectKey), eq("CREATING"), requestCaptor.capture()); @@ -321,7 +319,6 @@ void givenParameters_whenMaskParameters_thenCorrectParametersAreMasked() { @Test void givenValidInput_whenGetCatalogItem_thenCatalogItemIsReturned() throws MalformedURLException { // given - String idToken = "id-token"; String accessToken = "access-token"; String catalogItemId = "CAT-123"; String projectKey = "PRJ-1"; @@ -331,7 +328,7 @@ void givenValidInput_whenGetCatalogItem_thenCatalogItemIsReturned() throws Malfo CatalogItem expectedCatalogItem = new CatalogItem(); when(componentCatalogServiceProps.getBaseRestUrl()).thenReturn(baseUrl); - when(apiClientsBuilder.componentCatalogApiClient(idToken, baseUrl.toString())) + when(apiClientsBuilder.componentCatalogApiClient(accessToken, baseUrl.toString())) .thenReturn(componentCatalogApiClient); when(apiClientsBuilder.catalogItemsApi(componentCatalogApiClient)) .thenReturn(catalogItemsApi); @@ -341,13 +338,13 @@ void givenValidInput_whenGetCatalogItem_thenCatalogItemIsReturned() throws Malfo // when CatalogItem result = componentCatalogService.getCatalogItem( - idToken, accessToken, catalogItemId, projectKey); + accessToken, catalogItemId, projectKey); // then assertThat(result).isSameAs(expectedCatalogItem); verify(apiClientsBuilder) - .componentCatalogApiClient(idToken, baseUrl.toString()); + .componentCatalogApiClient(accessToken, baseUrl.toString()); verify(apiClientsBuilder) .catalogItemsApi(componentCatalogApiClient); verify(catalogItemsApi) @@ -365,7 +362,6 @@ void givenValidInput_whenGetCatalogItem_thenCatalogItemIsReturned() throws Malfo void givenValidInput_whenGetProjectComponents_thenProjectComponentsAreReturned() { // given String projectKey = "PRJ-1"; - String idToken = "id-token"; String accessToken = "access-token"; HttpBearerAuth auth = mock(HttpBearerAuth.class); @@ -375,11 +371,11 @@ void givenValidInput_whenGetProjectComponents_thenProjectComponentsAreReturned() when(projectComponentsApi.getProjectComponents(projectKey, accessToken)).thenReturn(expectedComponents); // when - List result = componentCatalogService.getProjectComponents(projectKey, idToken, accessToken); + List result = componentCatalogService.getProjectComponents(projectKey, accessToken); // then assertThat(result).isSameAs(expectedComponents); - verify(auth).setBearerToken(idToken); + verify(auth).setBearerToken(accessToken); verify(projectComponentsApi).getProjectComponents(projectKey, accessToken); } } \ No newline at end of file diff --git a/src/test/java/org/opendevstack/component_provisioner/server/services/ProjectsInfoServiceTest.java b/src/test/java/org/opendevstack/component_provisioner/server/services/ProjectsInfoServiceTest.java index 01cf14b..b9ed9cc 100644 --- a/src/test/java/org/opendevstack/component_provisioner/server/services/ProjectsInfoServiceTest.java +++ b/src/test/java/org/opendevstack/component_provisioner/server/services/ProjectsInfoServiceTest.java @@ -45,32 +45,31 @@ class ProjectsInfoServiceTest { @Test void givenTokens_whenGetProjectGroups_thenAzureGroupsReturned() throws MalformedURLException { // given - String idToken = "id-token"; String accessToken = "access-token"; URL baseUrl = URI.create("http://projects-info").toURL(); List expectedGroups = List.of("group-a", "group-b"); when(projectsInfoServiceProps.getBaseRestUrl()).thenReturn(baseUrl); - when(apiClientsBuilder.projectsInfoServiceApiClient(idToken, baseUrl.toString())) + when(apiClientsBuilder.projectsInfoServiceApiClient(accessToken, baseUrl.toString())) .thenReturn(apiClient); when(apiClientsBuilder.azureGroupsApi(apiClient)) .thenReturn(azureGroupsApi); - when(azureGroupsApi.getAzureGroups(accessToken)) + when(azureGroupsApi.getAzureGroups()) .thenReturn(expectedGroups); // when - List result = projectsInfoService.getProjectGroups(idToken, accessToken); + List result = projectsInfoService.getProjectGroups(accessToken); // then assertThat(result).isEqualTo(expectedGroups); verify(apiClientsBuilder) - .projectsInfoServiceApiClient(idToken, baseUrl.toString()); + .projectsInfoServiceApiClient(accessToken, baseUrl.toString()); verify(apiClientsBuilder) .azureGroupsApi(apiClient); verify(azureGroupsApi) - .getAzureGroups(accessToken); + .getAzureGroups(); verifyNoMoreInteractions(apiClientsBuilder, azureGroupsApi); } @@ -78,7 +77,6 @@ void givenTokens_whenGetProjectGroups_thenAzureGroupsReturned() throws Malformed @Test void givenTokenAndProjectKey_whenGetProjectClusters_thenProjectInfoReturned() throws MalformedURLException { // given - String idToken = "id-token"; String accessToken = "access-token"; String projectKey = "MY-PROJECT"; URL baseUrl = URI.create("http://projects-info").toURL(); @@ -86,25 +84,25 @@ void givenTokenAndProjectKey_whenGetProjectClusters_thenProjectInfoReturned() th ProjectInfo expectedProjectInfo = new ProjectInfo(); when(projectsInfoServiceProps.getBaseRestUrl()).thenReturn(baseUrl); - when(apiClientsBuilder.projectsInfoServiceApiClient(idToken, baseUrl.toString())) + when(apiClientsBuilder.projectsInfoServiceApiClient(accessToken, baseUrl.toString())) .thenReturn(apiClient); when(apiClientsBuilder.projectsApi(apiClient)) .thenReturn(projectsApi); - when(projectsApi.getProjectClusters(accessToken, projectKey)) + when(projectsApi.getProjectClusters(projectKey)) .thenReturn(expectedProjectInfo); // when - ProjectInfo result = projectsInfoService.getProjectClusters(idToken, accessToken, projectKey); + ProjectInfo result = projectsInfoService.getProjectClusters(accessToken, projectKey); // then assertThat(result).isEqualTo(expectedProjectInfo); verify(apiClientsBuilder) - .projectsInfoServiceApiClient(idToken, baseUrl.toString()); + .projectsInfoServiceApiClient(accessToken, baseUrl.toString()); verify(apiClientsBuilder) .projectsApi(apiClient); verify(projectsApi) - .getProjectClusters(accessToken, projectKey); + .getProjectClusters(projectKey); verifyNoMoreInteractions(apiClientsBuilder, projectsApi); } diff --git a/src/test/java/org/opendevstack/component_provisioner/server/services/ProvisionerServiceTest.java b/src/test/java/org/opendevstack/component_provisioner/server/services/ProvisionerServiceTest.java index bf0fc77..8b76fe3 100644 --- a/src/test/java/org/opendevstack/component_provisioner/server/services/ProvisionerServiceTest.java +++ b/src/test/java/org/opendevstack/component_provisioner/server/services/ProvisionerServiceTest.java @@ -41,15 +41,14 @@ void givenAProvisionClient_WhenNotifyProvisioningCompleted_ThenProvisioningIsNot var componentId = "componentId"; var catalogItemId = "catalogItemId"; var componentUrl = "componentUrl"; - var idToken = "idToken"; var accessToken = "accessToken"; var baseUrl = "http://localhost"; when(componentCatalogServiceProps.getBaseRestUrl()).thenReturn(java.net.URI.create(baseUrl).toURL()); - when(apiClientsBuilder.provisionerActionsApi(eq(idToken), eq(baseUrl))).thenReturn(provisionerActionsApi); + when(apiClientsBuilder.provisionerActionsApi(eq(accessToken), eq(baseUrl))).thenReturn(provisionerActionsApi); // when - provisionService.notifyProvisioningStatusUpdate(projectKey, status, componentId, catalogItemId, componentUrl,idToken, accessToken); + provisionService.notifyProvisioningStatusUpdate(projectKey, status, componentId, catalogItemId, componentUrl, accessToken); // then verify(provisionerActionsApi).notifyProvisioningStatusUpdatePartially(projectKey, status.name(), ProvisioningStatusUpdateRequest.builder() @@ -65,18 +64,18 @@ void givenAProjectKey_andAComponentId_whenDeleteProvisioningStatus_thenProvision // given var projectKey = "projectKey"; var componentId = "componentId"; - var idToken = "idToken"; var baseUrl = "http://localhost"; + var accessToken = "accessToken"; var provisionDeleteRequest = ProvisioningDeleteRequest.builder() .componentId(componentId) .build(); when(componentCatalogServiceProps.getBaseRestUrl()).thenReturn(java.net.URI.create(baseUrl).toURL()); - when(apiClientsBuilder.provisionerActionsApi(eq(idToken), eq(baseUrl))).thenReturn(provisionerActionsApi); + when(apiClientsBuilder.provisionerActionsApi(eq(accessToken), eq(baseUrl))).thenReturn(provisionerActionsApi); // when - provisionService.deleteProvisioningStatus(projectKey, componentId, idToken); + provisionService.deleteProvisioningStatus(projectKey, componentId, accessToken); // then verify(provisionerActionsApi).deleteProvisioningStatus(projectKey, provisionDeleteRequest);