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. > listeners.TenantMgtListener" > > * cardinality="1..n" policy="dynamic" > > * bind="setTenantMgtListenerService" > > * unbind="unsetTenantMgtListenerService" > > * @scr.reference name="default.tenant.billing.service" > > * interface="org.wso2.carbon.stratos.common. > TenantBillingService" > > * 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. > engine.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.wso2.carbon.core/src/main/java/org/wso2/carbon/core/internal/ > StartupFinalizerServiceComponent.java#L199 > > [3] http://eclipsesource.com/blogs/2013/01/23/how-to-track- > lifecycle-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>*
_______________________________________________ Dev mailing list Dev@wso2.org http://wso2.org/cgi-bin/mailman/listinfo/dev