Hi all,

@Marcus,

Thanks for your input. It answered some issues I had.

Tenant Registration, User Registration, and Authentication Flow is as
follows.

Tenant Registration

POST https://custos.scigap.org:32036/tenant-management/v1.0.0/tenant

{
    "tenantName": "sampletenant",
    "requesterEmail": "[email protected]",
    "requesterUsername": "isjarana",
    "adminFirstName": "Janith",
    "adminLastName": "Ranawaka",
    "adminEmail": "[email protected]",
    "contacts": [
        "+1812345386"
    ],
    "redirectURIs": [
        "http://tenantsample.com/callback";
    ],
    "tenantURI": "http://tenantsample.com";,
    "scope": "email",
    "domain": "tenantsample.com",
    "adminPassword": "1234",
    "adminUsername": "[email protected]"
}

Response {
{
    "tenantId": "10000001",
    "clientId": "custos/HUGxHVZbFgY8fPiM5QeJ/10000001",
    "clientSecret": "403Rhpy4Z0LKoFa6Nt3uk1EsQ93h6kJy51JCZ9Ra",
    "msg":
"Use Base64 encoded clientId:clientSecret as auth token for
authorization, Credentials are activated after admin approval"
}
}

Tenant Approval

POST https://custos.scigap.org:32036/tenant-management/v1.0.0/status

{
"tenantId":10000001,
"status":"APPROVED",
"updatedBy":"Custosadmin"
}

{
    "tenantId": "10000001",
    "status": "APPROVED"
}

Add User to Tenant

POST https://custos.scigap.org:32036/user-management/v1.0.0/user

Header :- authorization base64Encode(custosClientId:CustosClientSec)

{
    "username": "janith123",
    "firstName": "Janith",
    "lastName": "Ranawaka",
    "password": "janith123",
    "email": "[email protected]"
}

{
    "isRegistered": true
}

Enable User

POST https://custos.scigap.org:32036//user-management/v1.0.0/user/activation

Header :- authorization base64Encode(custosClientId:CustosClientSec)

{
    "username": "janith123"
}


{
    "internalUserId": "janith123@10000002",
    "username": "janith123",
    "tenantId": "10000002",
    "firstName": "Janith",
    "lastName": "Ranawaka",
    "email": "[email protected]",
    "creationTime": 1.5790367e+12,
    "state": "ACTIVE"
}


Authenticate

POST https://custos.scigap.org:32036/identity-management/v1.0.0/authenticate

Header :- authorization base64Encode(custosClientId:CustosClientSec)


{
"username":"janith123",
"password":"janith123"
}

{
    "accessToken":
"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlOHY0cVpYWVVMbWNsZDQ0OGplUW9EMzE0NUppSVREYm45TTJ1bHVnSlFRIn0.eyJqdGkiOiI4OWRhNjc4Ny1iZjBmLTQ4OGYtYTJhNy01YWVhZjBmOWE3NmQiLCJleHAiOjE1NzkwMzg3NTAsIm5iZiI6MCwiaWF0IjoxNTc5MDM2OTUwLCJpc3MiOiJodHRwczovL2tleWNsb2FrLmN1c3Rvcy5zY2lnYXAub3JnOjMxMDAwL2F1dGgvcmVhbG1zLzEwMDAwMDAyIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6ImQxZmVkMTQxLTAzMjktNDFiMy1hZWFkLTJmNGZlYmI0ZjQ3YyIsInR5cCI6IkJlYXJlciIsImF6cCI6InBnYSIsImF1dGhfdGltZSI6MCwic2Vzc2lvbl9zdGF0ZSI6IjAyYTkxMjUxLTQxMDEtNGU2Yi1iN2UxLTU2ZmIxMjFlNTllZiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovL3RlbmFudHNhbXBsZS5jb20iXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwibmFtZSI6Ikphbml0aCBSYW5hd2FrYSIsInByZWZlcnJlZF91c2VybmFtZSI6Imphbml0aDEyMyIsImdpdmVuX25hbWUiOiJKYW5pdGgiLCJmYW1pbHlfbmFtZSI6IlJhbmF3YWthIiwiZW1haWwiOiJmZXJuYWRvQGl1LmVkdSJ9.c6NwgtzMeG33_K-JQo9ijOBPkOc-el-DB4aSSuKi_V7on8FttTvfzoYrnnwoxGXFocUVeJMdSsOVsriXu_YtPzUgYueVf0bYpPgoNQWltzGPC3jmaq1OLKlydDYbojwCoN8IhqlXjTPvKB_0L3lycaTLKFFssaZXBa0C2_cs2hnZGcE8li8Pu8FyWGB6oJMsny4sv1z_KuAYmRwou-dGPeVzTKFFiywqXRGxRqvSv_Nqc_ol54q1baS8HJWHvz98DGrhShr4EV0XUQJgo3iULQdRWvo_hmVxYJhWMBAZwmuwfJY1E2Sr_fc_IxOeHwSaPkTfdZ2fx4u-3HEHJvTNkg"
,
    "claims": [
        {
            "key": "username",
            "value": "janith123"
        },
        {
            "key": "tenantId",
            "value": "10000002"
        }
    ]
}




On Mon, Jan 6, 2020 at 4:51 PM Christie, Marcus Aaron <[email protected]>
wrote:

> Hi Isuru,
>
> Sorry for the late reply. Answers inline.
>
> > On Dec 16, 2019, at 5:17 PM, Isuru Ranawaka <[email protected]> wrote:
> >
> > Hi Aarushi, Suresh
> >
> > I am trying to bring back the functionalities of  Tenant Profile Service,
> > IAM Service , User Profile Service and Group\ Sharing Service into
> Custos.
> > Once I am going through the existing code in airavata, I came across few
> > unclear parts. I have created some ER diagrams and sequence diagrams to
> > further realize the design. See DB Layer Design Part of [1].
> >
> >
> > 1.  In tenant creation flow,  tenant creation function of the
> > IAMAdminService creates an admin user at keycloak and enable the user,
> but
> > that user is not saved in UserProfileRespository, where all keycloak
> > enabled users are saved. Is this a bug ?
>
> In Airavata the user profile is typically created when the user first logs
> in. For Custos though, it is perhaps a bug to not create the user profile
> for the admin user.
>
> >
> > 2. How do we get tenant admin password in above case ?
> >
>
> Not quite sure what you are asking for. The tenant admin password
> shouldn't be stored in plain text, but maybe you are asking for something
> else. Why do you want to get the tenant admin password?
>
> > 3. Does tenant requester need to be  registered with custos before
> > requesting a tenant.  (Otherwise how to access custos API without access
> > token)
> >
>
> In Airavata, a tenant requester effectively has a user account with the
> super-tenant. I think something similar could be done for Custos.
>
> > 3. The users in UserProfileRepository (Keycloak enabled users) are not
> sync
> > with UserRepository and they are only synced when creating a group  for a
> > particular domain. Is this ok ?
> >
>
> In Airavata, user profile is synced via event-based replication.  When you
> say they are only synced when creating a group, I'm not familiar with that,
> so I'm not sure.
>
> > 4. What is the relationship between domainId and tenantId ? According to
> > the current code tenantId is treated as domainId. See
> > (GroupManagerServiceHandler -> createGroup)
> >
>
> Yeah they are the same thing. Historically these identifiers are called
> gatewayId or domainId or tenantId in Airavata. In Custos they should
> probably be standardized to just "tenantId".
>
> >
> >
> > thanks
> > Isuru
> >
> > [1]
> >
> https://docs.google.com/document/d/1QtUKTfAnIrErvtYnKo3FizCRL2GUiWikEzvBnHPXfWw/edit?usp=sharing
> >
> >
> >
> >
> >
> > On Sat, Nov 30, 2019 at 8:13 PM Isuru Ranawaka <[email protected]>
> wrote:
> >
> >>
> >> Hi Amila,
> >>
> >> Thank you very much for your comments and really helpful for further
> >> enhancements. please check my inline comments. Let me know your
> thoughts.
> >>
> >> On Sat, Nov 30, 2019 at 4:33 PM Thejaka Amila J Kanewala <
> >> [email protected]> wrote:
> >>
> >>> Hi Isuru,
> >>>
> >>> First, sorry for my lack of understanding about some of the bus-words
> used
> >>> in this design/discussion (e.g., gRPC, Saga, Axon, Camunda etc.)
> >>> Few questions and comments.
> >>>
> >>> 1. As per the design, we have two services (integration and atomic) and
> >>> atomic services have their own database. My assumption is you will have
> >>> all
> >>> tenant information in the tenant db and all user information in the iam
> >>> db.
> >>> When you say two dbs, did you mean two MySQL instances or two
> databases in
> >>> a single MySQL instance? Why we need two databases (even if it is
> running
> >>> in a single MySQL instance)?
> >>>
> >>
> >> The atomic services represents a set of  functions which can be grouped
> >> together to do some independent work . Tenant related functions are
> >> grouped to
> >> tenant service and IAM related functions are grouped to IAM service.
> Data
> >> related to tenant service are located in tenant db and all the db
> >> operations of tenant db is only done through tenant service.
> >> If tenant services requires an information related to a tenant which
> >> resides in iam db, should call to IAM service and fetch. Tenant service
> is
> >> not allowed to call to iam db directly. The main reasons  for this kind
> of
> >> decoupling   is for independent development, deployment and release of
> each
> >> versions of services.  For instance, if tenant schema is changed and
> want
> >> to do some change in tenant db, data migration or rollback it should
> only
> >> affect tenant db. it should not affect iam db. I think we can use single
> >> MySQL instance. Moreover, we can use different database technologies for
> >> different services, for e.g  if tenant service only has direct
> insertions
> >> and retrievals of data with less interdependencies among data we can use
> >> mongoDB over mySQL. If iam service deal with data having
> interdependencies
> >> and transactions we can use MySQL over mongoDB. This may help agile
> >> development as well like adding new services and removing services
> easily.
> >>
> >>
> >>
> >>
> >>> 2. Can you conceptually explain how transaction management works (Saga,
> >>> Axon, Camunda) in this solution? Preferably using some examples (e.g.,
> >>> tenant registration, user registration, use deletion, etc.)
> >>>
> >>
> >> Let's consider tenant registration message flow, firstly, tenant
> >> registration integration service will talk to tenant registration core
> >> service to create tenant id and save tenant profile  information in
> tenant
> >> db and subsequently  tenant registration integration service will call
> to
> >> iam service  with tenant id to create keycloak realm and save
> credentials.
> >> Let's  say call to iam service is failed. Then we have two options to do
> >> roll back tenant info from tenant db or updated tenant info with tenant
> >> creation failed status. As in monolithic architecture we cannot perform
> two
> >> phase commits here. We can only achieved  eventual consistency. Saga is
> >> architectural pattern which keeps track of all passed service calls and
> >> failed service calls. So we can rollback passed service calls using saga
> >> logs. Axon is a framework which supports saga pattern.
> >>
> >>
> >>> 3. At first, I thought "API gateway" refers to "Science Gateway" in
> your
> >>> document, apparently that is not the case (as per description API
> gateway
> >>> is for API management capabilities....). In that case, what is
> "Consumer"
> >>> in your diagram? Is that the actual "science gateway" (e.g., SeaGrid)
> or
> >>> "science gateway middleware" (e.g., Airavata)?
> >>>
> >>> Actual consumers would be integration services. API gateway is not
> doing
> >> any data related operation. It is just for handle SSL termination,
> >> service discovery, throttling, ..etc.
> >>
> >> 4. Is this design only for provisioning? In the sense, are users also
> >>> authenticated/authorized through this architecture?
> >>>
> >>
> >> Users are authenticated and authorized. Actually, issuing access tokens
> or
> >> client credentials are done through custos services.
> >>
> >>
> >>> 5. Regarding the asynchronous model: You probably need to consider a
> way
> >>> to
> >>> avoid duplicate requests and should have an API call to check the
> status
> >>> of
> >>> an asynchronous request.
> >>>
> >>
> >> Yes we need to handle it. May be we may need some background tasks to
> >> retry for failure and scenarios and update status for each task.
> >>
> >>
> >>> I have a few more questions but let me wait for answers to the above
> >>> questions.
> >>>
> >>> Thank you.
> >>> Best Regards,
> >>> Thejaka Amila Kanewala, PhD
> >>> https://github.com/thejkane/agm
> >>>
> >>> On Wed, Nov 27, 2019 at 4:36 PM Isuru Ranawaka <[email protected]>
> >>> wrote:
> >>>
> >>>> Hi Dimuthu,
> >>>>
> >>>> For instance, in tenant registration when client requests to register
> a
> >>>> tenant, the api should return with 200 OK saying tenant requested and
> >>>> subsequently calling to keycloak, vault and iam services should be run
> >>> in
> >>>> background and update the status.
> >>>>
> >>>> thanks
> >>>>
> >>>>
> >>>> On Wed, Nov 27, 2019 at 4:07 PM DImuthu Upeksha <
> >>>> [email protected]>
> >>>> wrote:
> >>>>
> >>>>> Hi Isuru,
> >>>>>
> >>>>> What are the use cases for asynchronous communication?
> >>>>>
> >>>>> Thanks
> >>>>> Dimuthu
> >>>>>
> >>>>> On Wed, Nov 27, 2019 at 3:39 PM Isuru Ranawaka <[email protected]>
> >>>> wrote:
> >>>>>
> >>>>>> Hi all,
> >>>>>>
> >>>>>> Just to give an update on the project,
> >>>>>>
> >>>>>> As per the discussion had with Suresh, Custos has synchronous
> >>>>> communication
> >>>>>> as well as asynchronous communication. For synchronous, there is
> >>> one to
> >>>>> one
> >>>>>> mapping between integration service endpoint to core service
> >>> endpoint.
> >>>>> For
> >>>>>> asynchronous communication there are many services communicate
> >>>>>> asynchronously and get work done.
> >>>>>>
> >>>>>> I have modeled and implemented asynchronous communication as  a
> >>> service
> >>>>>> chain and each core service is invoked via service task and
> >>> integration
> >>>>>> service builds a service task pipeline which is modeled as service
> >>>> chain.
> >>>>>> Responses are communicated back via callbacks.
> >>>>>>
> >>>>>> Moreover, gRPC zipkin interceptors for tracing and Prometheus
> >>> related
> >>>>>> configurations for metrics are added. Docker images for each
> >>> service is
> >>>>>> built and published using docker maven plugin and helm charts are
> >>>>> packaged
> >>>>>> using helm maven plugin.
> >>>>>>
> >>>>>> thanks
> >>>>>>
> >>>>>> Isuru
> >>>>>>
> >>>>>>
> >>>>>> On Wed, Nov 20, 2019 at 3:12 PM Isuru Ranawaka <[email protected]>
> >>>>> wrote:
> >>>>>>
> >>>>>>> Hi all,
> >>>>>>>
> >>>>>>> I have implemented a basic prototype [1]  according to the
> >>>> architecture
> >>>>>>> mentioned above.
> >>>>>>>
> >>>>>>>    custos
> >>>>>>>       |
> >>>>>>>       |_ custos-core-services
> >>>>>>>       |           |
> >>>>>>>       |           |  _ tenant-profile-core-service
> >>>>>>>                                 |
> >>>>>>>                                 |_ java
> >>>>>>>                                 |_proto
> >>>>>>>                                 |_ resources
> >>>>>>>       |
> >>>>>>>       |_custos-core-services-client-stubs
> >>>>>>>                  |
> >>>>>>>                  |_  tenant-profile-core-service-client-stub
> >>>>>>>       |
> >>>>>>>       |_custos-integration-services
> >>>>>>>                   |
> >>>>>>>                   | _ tenant-registration-service
> >>>>>>>
> >>>>>>>
> >>>>>>> Basically core services are gRPC services and their stubs and
> >>> clients
> >>>>> are
> >>>>>>> generated in client-stubs module. Integration services use those
> >>>> stubs
> >>>>> to
> >>>>>>> talk to core services. This is currently working locally and as
> >>> next
> >>>>>> step,
> >>>>>>> need to develop docker images, k8s artifacts and run on K8s
> >>> cluster
> >>>> to
> >>>>>>> check whether  integration services resolves core services
> >>> addresses
> >>>>>>> seamlessly.
> >>>>>>>
> >>>>>>> [1]https://github.com/apache/airavata-custos/pull/14
> >>>>>>>
> >>>>>>> thanks
> >>>>>>> Isuru
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>> On Mon, Nov 18, 2019 at 9:49 PM Isuru Ranawaka <
> >>> [email protected]>
> >>>>>> wrote:
> >>>>>>>
> >>>>>>>> Hi Suresh,
> >>>>>>>>
> >>>>>>>> Thanks for your feedback. I have updated  the doc [1]. For
> >>>>> observability
> >>>>>>>> purposes we can use spring-cloud-sleuth and servers such as
> >>> Zipkin
> >>>> and
> >>>>>>>> those are capable of distributed tracing. For vault operations we
> >>>> have
> >>>>>>>> separate audit feature.
> >>>>>>>>
> >>>>>>>> [1]
> >>>>>>>>
> >>>>>>
> >>>>>
> >>>>
> >>>
> https://docs.google.com/document/d/1QtUKTfAnIrErvtYnKo3FizCRL2GUiWikEzvBnHPXfWw/edit?usp=sharing
> >>>>>>>>
> >>>>>>>> thanks
> >>>>>>>>
> >>>>>>>> On Mon, Nov 18, 2019 at 6:47 PM Suresh Marru <[email protected]>
> >>>>> wrote:
> >>>>>>>>
> >>>>>>>>> Hi Isuru,
> >>>>>>>>>
> >>>>>>>>> Looks like your embedded architecture diagram did not make it
> >>> with
> >>>>> the
> >>>>>>>>> email. I will request a wiki space for Custos so you can upload
> >>>> there
> >>>>>> for
> >>>>>>>>> future discussions. For now, can you add it to the google doc?
> >>>>>>>>>
> >>>>>>>>> Your overall architecture proposal seems to be good. Can you
> >>> also
> >>>>>>>>> consider adding logging and detailed instrumentation as part of
> >>> the
> >>>>>> core
> >>>>>>>>> architecture? This will help to have a detailed  audit of each
> >>> and
> >>>>>> every
> >>>>>>>>> action on who did what and when.
> >>>>>>>>>
> >>>>>>>>> Cheers,
> >>>>>>>>> Suresh
> >>>>>>>>>
> >>>>>>>>>> On Nov 18, 2019, at 3:41 PM, Isuru Ranawaka <
> >>> [email protected]>
> >>>>>>>>> wrote:
> >>>>>>>>>>
> >>>>>>>>>> Hi all,
> >>>>>>>>>>
> >>>>>>>>>> I am initiating this thread to provide Custos initial version
> >>>>>>>>>> implementation details. Since we are moving into cloud native
> >>>>>>>>> development
> >>>>>>>>>> of Custos. I have come up with the following structure for
> >>> micro
> >>>>>>>>> services
> >>>>>>>>>> based development of Custos.
> >>>>>>>>>>
> >>>>>>>>>> Mainly codebase composed of  the atomic services and
> >>> integration
> >>>>>>>>> services.
> >>>>>>>>>>
> >>>>>>>>>> Atomic services are independent services with minimal network
> >>>>>>>>> communication
> >>>>>>>>>> and they have their own database with local data.
> >>>>>>>>>>
> >>>>>>>>>> Integration services represents the actual business use case
> >>> and
> >>>> it
> >>>>>>>>> acts as
> >>>>>>>>>> an orchestrator between core services and external services.
> >>> This
> >>>>> is
> >>>>>>>>>> exposed as a rest api via API Gateway. Integration services
> >>> talk
> >>>> to
> >>>>>>>>> atomic
> >>>>>>>>>> services via gRPC protocol. Integration services includes gRPC
> >>>> stub
> >>>>>> of
> >>>>>>>>>> core services. Each integration service and core service is
> >>>>> deployed
> >>>>>> to
> >>>>>>>>>> Kubernetes cluster as services and have their own service
> >>>>> addresses.
> >>>>>>>>>>
> >>>>>>>>>> Main problem  with this architecture is transaction management
> >>>> and
> >>>>> it
> >>>>>>>>> is
> >>>>>>>>>> planned to handle with Saga using Axon Server or Camunda like
> >>>>>>>>> framework.
> >>>>>>>>>> All the services are written using Spring Boot and Spring
> >>> Cloud.
> >>>>>>>>>>
> >>>>>>>>>> All the Integration services are registered with the service
> >>>>> registry
> >>>>>>>>> such
> >>>>>>>>>> as Consul. API Gateway is used for API Management capabilities
> >>>> such
> >>>>>> as
> >>>>>>>>> SSL
> >>>>>>>>>> Termination, throttling..etc. There are Open Source API
> >>> Gateways
> >>>>> such
> >>>>>>>>> as
> >>>>>>>>>> Ambassador, Envoy which are compatible with Kubernetes and
> >>>> service
> >>>>>>>>>> registries. API Gateway is responsible for service discovery.
> >>>>>>>>>>
> >>>>>>>>>> Vault and Keycloak are deployed in Kubernetes with HA[1].
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>> Let me know your thoughts.
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>> [1]
> >>>>>>>>>>
> >>>>>>>>>
> >>>>>>
> >>>>>
> >>>>
> >>>
> https://docs.google.com/document/d/1zGXlstt9w1ge8oRWjiUv3LdQETcSYtwDngm9grB5sbk/edit?usp=sharing
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>> Thanks
> >>>>>>>>>>
> >>>>>>>>>> Isuru
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>
> >>>>>>>> --
> >>>>>>>> Senior Engineer
> >>>>>>>> WSO2 Lanka (pvt) Ltd
> >>>>>>>> Blog:- http://isurur.blogspot.com/
> >>>>>>>> Phone:- +94714629880
> >>>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>> --
> >>>>>>> Senior Engineer
> >>>>>>> WSO2 Lanka (pvt) Ltd
> >>>>>>> Blog:- http://isurur.blogspot.com/
> >>>>>>> Phone:- +94714629880
> >>>>>>>
> >>>>>>
> >>>>>>
> >>>>>> --
> >>>>>> Senior Engineer
> >>>>>> WSO2 Lanka (pvt) Ltd
> >>>>>> Blog:- http://isurur.blogspot.com/
> >>>>>> Phone:- +94714629880
> >>>>>>
> >>>>>
> >>>>
> >>>>
> >>>> --
> >>>> Senior Engineer
> >>>> WSO2 Lanka (pvt) Ltd
> >>>> Blog:- http://isurur.blogspot.com/
> >>>> Phone:- +94714629880
> >>>>
> >>>
> >>>
> >>> --
> >>> <https://github.com/thejkane/agm>
> >>>
> >>
> >>
> >> --
> >> Senior Engineer
> >> WSO2 Lanka (pvt) Ltd
> >> Blog:- http://isurur.blogspot.com/
> >> Phone:- +94714629880
> >>
> >
> >
> > --
> > Senior Engineer
> > WSO2 Lanka (pvt) Ltd
> > Blog:- http://isurur.blogspot.com/
> > Phone:- +94714629880
>
>

-- 
Senior Engineer
WSO2 Lanka (pvt) Ltd
Blog:- http://isurur.blogspot.com/
Phone:- +94714629880

Reply via email to