Hi Kishanthan,

Yes I tested by providing a random TenantID which were not available in the
ESB pack earlier (screenshot attached). We are building the docker image
from a vanilla ESB pack and hence there won't be any other tenants in the
pack.

​
 Screen Shot 2016-08-11 at 11.42.29 AM.png
<https://drive.google.com/a/wso2.com/file/d/0B_Ml_gi-3jYrbHpobXM3NFhsQlk/view?usp=drive_web>
​

Thanks,
Maheeka

Maheeka Jayasuriya
Senior Software Engineer
Mobile : +94777750661

On Thu, Aug 11, 2016 at 11:36 AM, Kishanthan Thangarajah <
kishant...@wso2.com> wrote:

> No, I may be wrong. This approach will work if the given tenant-id is not
> taken already at the table level.
>
> On Thu, Aug 11, 2016 at 11:32 AM, Kishanthan Thangarajah <
> kishant...@wso2.com> wrote:
>
>>
>>
>> On Thu, Aug 11, 2016 at 7:56 AM, Maheeka Jayasuriya <mahe...@wso2.com>
>> wrote:
>>
>>> Hi Devs,
>>>
>>>
>>> We need to start an ESB in a docker container, with a capp deployed in
>>> tenant space. So in order to have the tenant space already created and to
>>> get the tenant initialized when the container is serving requests, we have
>>> tried out the following approach manually which works.
>>>
>>>
>>>    1.
>>>
>>>    Have the capp copied to [ESB_HOME]/repository/tenants/[tenantId]/
>>>    when building the docker image. This tenantId may not be incremental and
>>>    could be any number
>>>    2.
>>>
>>>    Run the docker and wait for ESB to start
>>>    3.
>>>
>>>    Invoke the TenantMgtAdminService’s addTenant method specifying the
>>>    ‘tenantId’ and  other tenant details (username, password, etc)
>>>    4.
>>>
>>>    Invoke an API that is available in the copied capp (1) to initialize
>>>    the tenant
>>>
>>>
>>> Basically, we need to have the tenant space created during ESB server
>>> startup. Tenant could be initialized later for the first request. Therefore
>>> we started writing an OSGI declarative component which waits for
>>> TenantMgtServiceComponent and calls the TenantMgtAdminService to create the
>>> tenant. The capps will be already copied to the tenant space when building
>>> the docker image. Following is what we have tried so far.
>>>
>>>
>>>    1.
>>>
>>>    When trying to write a new OSGI component, say
>>>    TenantInitializerComponent, we wanted to add a TenantMgtServiceComponent
>>>    registered OSGI service as dependency. But there were no OSGI services
>>>    available in either of any tenant management components. Due to this we
>>>    were not able to get the TenantInitializerComponent activated.
>>>    2.
>>>
>>>    Since there were no OSGI services of TenantMgtServiceComponent
>>>    available, we tried by adding the dependencies of 
>>> TenantMgtServiceComponent
>>>    to TenantInitializerComponent as below.
>>>
>>> * @scr.reference name="org.wso2.carbon.tenant.mgt.listener.service"
>>>
>>> *                interface="org.wso2.carbon.stratos.common.lis
>>> teners.TenantMgtListener"
>>>
>>> *                cardinality="1..n" policy="dynamic"
>>>
>>> *                bind="setTenantMgtListenerService"
>>>
>>> *                unbind="unsetTenantMgtListenerService"
>>>
>>> * @scr.reference name="default.tenant.billing.service"
>>>
>>> *                interface="org.wso2.carbon.stratos.common.Ten
>>> antBillingService"
>>>
>>> *                cardinality="0..1" policy="dynamic"
>>>
>>> *                bind="setTenantBillingService"
>>>
>>> *                unbind="unsetTenantBillingService"
>>>
>>> TenantMgtListener is available in ESB and therefore set the cardinality
>>> to 1..n. TenantBillingService is not available in ESB and hence cardinality
>>> is 0..1.
>>>
>>> Following is the implementation in the TenantInitializerComponent’s
>>> activate method.
>>>
>>> TenantMgtAdminService tenantMgtAdminService = new
>>> TenantMgtAdminService();
>>>
>>> TenantInfoBean tenantInfoBean = new TenantInfoBean();
>>>
>>> tenantInfoBean.setActive(true);
>>>
>>> tenantInfoBean.setAdmin("admin");
>>>
>>> tenantInfoBean.setAdminPassword("admin123");
>>>
>>> tenantInfoBean.setFirstname("Maheeka");
>>>
>>> tenantInfoBean.setLastname("Maheeka");
>>>
>>> tenantInfoBean.setEmail("ad...@maheeka.com");
>>>
>>> tenantInfoBean.setTenantDomain("maheeka.com");
>>>
>>> tenantInfoBean.setSuccessKey("");
>>>
>>> tenantInfoBean.setTenantId(250);
>>>
>>
>> This may not work because, the tenant id is generated and returned by the
>> tenant persister once a new tenant is persisted properly in DB. The tenant
>> id is basically the row id in the table.
>>
>> Did you test this?
>>
>>
>> tenantInfoBean.setUsagePlan("Demo");
>>>
>>> try {
>>>
>>>   tenantMgtAdminService.addTenant(tenantInfoBean);
>>>
>>>   log.info("Tenant added successfully");
>>>
>>> } catch (Exception e) {
>>>
>>>   log.error(“Error adding tenant", e);
>>>
>>> }
>>>
>>>
>>> However, “tenantMgtAdminService.addTenant(tenantInfoBean)” will invoke 
>>> TenantMgtServiceComponent
>>> which is not activated by this time and thus throws a NPE.
>>>
>>>
>>>    1.
>>>
>>>    Next thing we tried was using the ServerStartupObserver as
>>>    dependency to TenantInitializerComponent. However even this time
>>>    TenantMgtServiceComponent is not activated by the time
>>>    TenantInitializerComponent tries to activate. According to [1], seems 
>>> like
>>>    ServerStartupObserver only waits till the transports are started.
>>>    2.
>>>
>>>    If we write a BundleListener [3], we could wait for the
>>>    TenantMgtServiceComponent to be active and perform addTenant. Since this
>>>    captures all bundle statuses this might not be an effective approach.
>>>    3.
>>>
>>>    Finally, took a look at StartupFinalizerServiceComponent. This seems
>>>    to register a service after all the components are initialized as
>>>    org.apache.axis2.engine.ListenerManager. I was able to successfully
>>>    create the tenant by adding a reference to this service as below.
>>>
>>> * @scr.reference name="listener.manager"
>>>
>>> *                            interface="org.apache.axis2.engin
>>> e.ListenerManager"
>>>
>>> *                            cardinality="1..1" policy="dynamic"
>>>
>>> *                            bind="setListenerManager"
>>>
>>> *                            unbind="unsetListenerManager"
>>>
>>>
>>> Adding reference to org.apache.axis2.engine.ListenerManager seems to
>>> solve the problem. However, need to verify whether there are any other
>>> better ways to solve this problem. Or shall we proceed with this approach?
>>> Appreciate your feedback on this.
>>>
>>>
>>> Thanks Kalpa and Jayanga for helping out on the details.
>>>
>>> [1] https://docs.wso2.com/display/Carbon447/Server+Startup+Observer
>>>
>>> [2] https://github.com/wso2/carbon-kernel/blob/4.4.x/core/org.ws
>>> o2.carbon.core/src/main/java/org/wso2/carbon/core/internal/
>>> StartupFinalizerServiceComponent.java#L199
>>>
>>> [3] http://eclipsesource.com/blogs/2013/01/23/how-to-track-lifec
>>> ycle-changes-of-osgi-bundles/
>>>
>>> Thanks,
>>>
>>> Maheeka Jayasuriya
>>> Senior Software Engineer
>>> Mobile : +94777750661
>>>
>>
>>
>>
>> --
>> *Kishanthan Thangarajah*
>> Technical Lead,
>> Platform Technologies Team,
>> WSO2, Inc.
>> lean.enterprise.middleware
>>
>> Mobile - +94773426635
>> Blog - *http://kishanthan.wordpress.com
>> <http://kishanthan.wordpress.com>*
>> Twitter - *http://twitter.com/kishanthan <http://twitter.com/kishanthan>*
>>
>
>
>
> --
> *Kishanthan Thangarajah*
> Technical Lead,
> Platform Technologies Team,
> WSO2, Inc.
> lean.enterprise.middleware
>
> Mobile - +94773426635
> Blog - *http://kishanthan.wordpress.com <http://kishanthan.wordpress.com>*
> Twitter - *http://twitter.com/kishanthan <http://twitter.com/kishanthan>*
>
_______________________________________________
Dev mailing list
Dev@wso2.org
http://wso2.org/cgi-bin/mailman/listinfo/dev

Reply via email to