public void updateTenantStatus()

in custos-services/custos-integration-services/tenant-management-service/src/main/java/org/apache/custos/tenant/management/service/TenantManagementService.java [632:766]


    public void updateTenantStatus(UpdateStatusRequest request, StreamObserver<UpdateStatusResponse> responseObserver) {
        try {

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

            CredentialMetadata metadata = credentialStoreServiceClient.getCustosCredentialFromClientId(credentialRequest);

            if (metadata != null) {

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

                request = request.toBuilder().setTenantId(metadata.getOwnerId()).build();
                UpdateStatusResponse response = profileClient.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.tenant.profile.service.GetTenantRequest tenantRequest =
                                        org.apache.custos.tenant.profile.service.GetTenantRequest
                                                .newBuilder()
                                                .setTenantId(finalMetadata.getOwnerId())
                                                .build();

                                org.apache.custos.tenant.profile.service.GetTenantResponse tenantResponse =
                                        profileClient.getTenant(tenantRequest);
                                Tenant savedTenant = tenantResponse.getTenant();

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

                                CredentialMetadata iamMeta = credentialStoreServiceClient.getCredential(credentialRequest);

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

                                if (token != null && token.getAccessToken() != null) {


                                    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 = iamAdminServiceClient.getUser(searchRequest);

                                    UserProfile profile = convertToProfile(userRepresentation);

                                    UserProfileRequest userProfileRequest = UserProfileRequest
                                            .newBuilder()
                                            .setProfile(profile)
                                            .setPerformedBy(finalRequest.getUpdatedBy())
                                            .setTenantId(finalRequest.getTenantId())
                                            .build();


                                    UserProfile userProfile = userProfileClient.getUser(userProfileRequest);

                                    if (userProfile == null || userProfile.getUsername().equals("")) {
                                        userProfileClient.createUserProfile(userProfileRequest);
                                    } else {
                                        userProfileClient.updateUserProfile(userProfileRequest);
                                    }

                                    responseObserver.onNext(response);
                                    responseObserver.onCompleted();
                                } else {
                                    String msg = "Tenant Activation task failed, cannot find IAM server credentials";
                                    LOGGER.error(msg);
                                    responseObserver.onError(Status.CANCELLED.withDescription(msg).asRuntimeException());

                                }
                            }

                            @Override
                            public void onError(ServiceException ex) {
                                String msg = "Tenant Activation task failed " + ex;
                                LOGGER.error(msg);
                                org.apache.custos.tenant.profile.service.UpdateStatusRequest updateTenantRequest =
                                        org.apache.custos.tenant.profile.service.UpdateStatusRequest.newBuilder()
                                                .setTenantId(finalRequest.getTenantId())
                                                .setStatus(TenantStatus.CANCELLED)
                                                .setUpdatedBy(Constants.SYSTEM)
                                                .build();
                                profileClient.updateTenantStatus(updateTenantRequest);
                                responseObserver.onError(Status.CANCELLED.withDescription(msg).asRuntimeException());
                            }
                        };

                        ServiceChain chain = ServiceChain.newBuilder(tenantActivationTask, callback).build();

                        chain.serve(response);
                    });
                } else {
                    responseObserver.onNext(response);
                    responseObserver.onCompleted();
                }
            } else {
                String msg = "Cannot find a Tenant with given client id " + request.getTenantId();
                LOGGER.error(msg);
                responseObserver.onError(Status.NOT_FOUND.withDescription(msg).asRuntimeException());
            }

        } catch (Exception ex) {
            String msg = "Tenant update task failed for tenant " + request.getTenantId();
            LOGGER.error(msg,ex);
            responseObserver.onError(Status.INTERNAL.withDescription(msg).withCause(ex).asRuntimeException());
        }
    }