public UpdateStatusResponse updateTenantStatus()

in services/src/main/java/org/apache/custos/service/management/TenantManagementService.java [399:520]


    public UpdateStatusResponse updateTenantStatus(UpdateStatusRequest request) {
        try {

            GetCredentialRequest credentialRequest = GetCredentialRequest.newBuilder().
                    setId(request.getClientId())
                    .setType(Type.CUSTOS)
                    .build();

            CredentialMetadata metadata = credentialStoreService.getCustosCredentialFromClientId(credentialRequest);

            if (metadata != null) {

                if (request.getSuperTenant()) {
                    metadata = metadata.toBuilder().setSuperTenant(true).build();
                    credentialStoreService.putCredential(metadata);
                }

                request = request.toBuilder().setTenantId(metadata.getOwnerId()).build();
                UpdateStatusResponse response = tenantProfileService.updateTenantStatus(request);

                if (request.getStatus().equals(TenantStatus.ACTIVE)) {

                    Context ctx = Context.current().fork();
                    // Set ctx as the current context within the Runnable
                    UpdateStatusRequest finalRequest = request;
                    CredentialMetadata finalMetadata = metadata;
                    ctx.run(() -> {
                        ServiceCallback callback = new ServiceCallback() {
                            @Override
                            public void onCompleted(Object obj) {
                                org.apache.custos.core.tenant.profile.api.GetTenantRequest tenantRequest = org.apache.custos.core.tenant.profile.api.GetTenantRequest
                                        .newBuilder()
                                        .setTenantId(finalMetadata.getOwnerId())
                                        .build();

                                org.apache.custos.core.tenant.profile.api.GetTenantResponse tenantResponse = tenantProfileService.getTenant(tenantRequest);
                                Tenant savedTenant = tenantResponse.getTenant();

                                GetCredentialRequest credentialRequest = GetCredentialRequest.newBuilder()
                                        .setOwnerId(finalMetadata.getOwnerId())
                                        .setType(Type.IAM)
                                        .build();

                                CredentialMetadata iamMeta = credentialStoreService.getCredential(credentialRequest);

                                GetUserManagementSATokenRequest userManagementSATokenRequest = GetUserManagementSATokenRequest
                                        .newBuilder()
                                        .setClientId(iamMeta.getId())
                                        .setClientSecret(iamMeta.getSecret())
                                        .setTenantId(finalMetadata.getOwnerId())
                                        .build();
                                AuthToken token = identityService.getUserManagementServiceAccountAccessToken(userManagementSATokenRequest);

                                if (token != null && StringUtils.isNotBlank(token.getAccessToken())) {
                                    UserSearchMetadata userSearchMetadata = UserSearchMetadata.newBuilder()
                                            .setUsername(savedTenant.getAdminUsername())
                                            .build();

                                    UserSearchRequest searchRequest = UserSearchRequest.newBuilder()
                                            .setTenantId(savedTenant.getTenantId())
                                            .setPerformedBy(finalRequest.getUpdatedBy())
                                            .setAccessToken(token.getAccessToken())
                                            .setUser(userSearchMetadata)
                                            .build();

                                    UserRepresentation userRepresentation = iamAdminService.getUser(searchRequest);
                                    UserProfile profile = convertToProfile(userRepresentation);
                                    UserProfileRequest userProfileRequest = UserProfileRequest.newBuilder()
                                            .setProfile(profile)
                                            .setPerformedBy(finalRequest.getUpdatedBy())
                                            .setTenantId(finalRequest.getTenantId())
                                            .build();

                                    UserProfile userProfile = userProfileService.getUserProfile(userProfileRequest);

                                    if (userProfile == null || StringUtils.isBlank(userProfile.getUsername())) {
                                        userProfileService.createUserProfile(userProfileRequest);
                                    } else {
                                        userProfileService.updateUserProfile(userProfileRequest);
                                    }

                                } else {
                                    String msg = "Tenant Activation task failed, cannot find IAM server credentials";
                                    LOGGER.error(msg);
                                    throw new RuntimeException(msg);
                                }
                            }

                            @Override
                            public void onError(ServiceException ex) {
                                String msg = "Tenant Activation task failed " + ex;
                                LOGGER.error(msg);
                                org.apache.custos.core.tenant.profile.api.UpdateStatusRequest updateTenantRequest = org.apache.custos.core.tenant.profile.api.UpdateStatusRequest.newBuilder()
                                        .setTenantId(finalRequest.getTenantId())
                                        .setStatus(TenantStatus.CANCELLED)
                                        .setUpdatedBy(Constants.SYSTEM)
                                        .build();
                                tenantProfileService.updateTenantStatus(updateTenantRequest);
                                throw new RuntimeException(msg);
                            }
                        };

                        ServiceChain chain = ServiceChain.newBuilder(tenantActivationTask, callback).build();
                        chain.serve(response);
                    });
                    return response;

                } else {
                    return response;
                }
            } else {
                String msg = "Cannot find a Tenant with given client id " + request.getTenantId();
                LOGGER.error(msg);
                throw new EntityNotFoundException(msg);
            }

        } catch (Exception ex) {
            String msg = "Tenant update task failed for tenant " + request.getTenantId();
            LOGGER.error(msg, ex);
            throw new InternalServerException(msg, ex);
        }
    }