Thursday, September 26, 2013

Useful Linux commands

De/Compress


If you want to compress all the content in your current directory use:

zip -r  <zip_file_name>   .

If you want to decompress all the content in your zip file to given directory use:

unzip <zip_file_name>  -d <directory_name>


SCP

If you want to copy a file from your machine to remote machine specific directoy

scp <path_to_the_file_to_be_copied> <remote_machine_username>@<remote_machine_ip>:<full_path_to_destination>

If you want to copy a file from remote machine to your machine

scp <full_path_to_destination_in_local_machine> <remote_machine_username>@<remote_machine_ip>:<path_to_the_file_to_be_copied>


Share local files with others via simple HTTP Server with python

Go to directory where there is the file to be shared from terminal and type:

python -m SimpleHTTPServer

Now share local ip with others and they can download the file you shared with below link:

http://<ip>:8000/

Tuesday, September 10, 2013

How to setup clustered environment in a single machine with 2 WSO2 ESB nodes and 2 WSO2 MB with external zookeeper and Cassendra

Env: ESB 4.7.0 MB 2.1.0

Cassandra Setup
---------------

Cassandra.yaml:
    - seeds: "127.0.0.1"
    listen_address: localhost
    rpc_address: localhost


WSO2 MB Cluster Setup
---------------------

Server 1: localhost
Server 2: localhost


Server 1:
---------

carbon.xml:
    <HostName>localhost</HostName>
    <offset>5</offset>

zoo.cfg:

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
dataDir=./../data
# the port at which the clients will connect
clientPort=2181
clientPortAddress=localhost

authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider

#requireClientAuthScheme=sasl

# renew server-side ticket once an hour. 1000*60*60 = 3600000 milliseconds

jaasLoginRenew=3600000

conf/advanced/qpid-config.xml:

<enabled>true</enabled>     
<OnceInOrderSupportEnabled>false</OnceInOrderSupportEnabled>
<externalCassandraServerRequired>true</externalCassandraServerRequired>
 <externalZookeeperServerRequired>true</externalZookeeperServerRequired>
<coordination>
    <ZooKeeperConnection>127.0.0.1:2181</ZooKeeperConnection>
    <ReferenceTime>2012-02-29 08:08:08</ReferenceTime>
</coordination>



conf/advanced/qpid-virtualhosts.xml:

<class>org.wso2.andes.server.store.CassandraMessageStore</class>
<username>admin</username>
<password>admin</password>
<cluster>ClusterOne</cluster>
<idGenerator>org.wso2.andes.server.cluster.coordination.TimeStampBasedMessageIdGenerator</idGenerator>
<connectionString>localhost:9160</connectionString>


Server 2:
---------

carbon.xml:
    <HostName>localhost</HostName>
    <offset>6</offset>

zoo.cfg:

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
dataDir=./../data
# the port at which the clients will connect
clientPort=2181
clientPortAddress=localhost

authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider

#requireClientAuthScheme=sasl

# renew server-side ticket once an hour. 1000*60*60 = 3600000 milliseconds

jaasLoginRenew=3600000


conf/advanced/qpid-config.xml:

<enabled>true</enabled>     
<OnceInOrderSupportEnabled>false</OnceInOrderSupportEnabled>
<externalCassandraServerRequired>true</externalCassandraServerRequired>
 <externalZookeeperServerRequired>true</externalZookeeperServerRequired>
<coordination>
    <ZooKeeperConnection>127.0.0.1:2181</ZooKeeperConnection>
    <ReferenceTime>2012-02-29 08:08:08</ReferenceTime>
</coordination>

conf/advanced/qpid-virtualhosts.xml:

<class>org.wso2.andes.server.store.CassandraMessageStore</class>
<username>admin</username>
<password>admin</password>
<cluster>ClusterOne</cluster>
<idGenerator>org.wso2.andes.server.cluster.coordination.TimeStampBasedMessageIdGenerator</idGenerator>
<connectionString>localhost:9160</connectionString>
              
              
WSO2 ESB 4.7 Setup
------------------
Node 1:
-------
carbon.xml:
    <offset>0</offset>

axis2.xml:
   <!--Uncomment this and configure as appropriate for JMS transport support with WSO2 MB 2.x.x -->              
    <transportReceiver name="jms" class="org.apache.axis2.transport.jms.JMSListener">
        <parameter name="myTopicConnectionFactory" locked="false">
           <parameter name="java.naming.factory.initial" locked="false">org.wso2.andes.jndi.PropertiesFileInitialContextFactory</parameter>
            <parameter name="java.naming.provider.url" locked="false">repository/conf/jndi.properties</parameter>
            <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">TopicConnectionFactory</parameter>
            <parameter name="transport.jms.ConnectionFactoryType" locked="false">topic</parameter>
        <parameter name="transport.jms.SessionAcknowledgement" locked="false">CLIENT_ACKNOWLEDGE</parameter>                      
        </parameter>

        <parameter name="myQueueConnectionFactory" locked="false">
            <parameter name="java.naming.factory.initial" locked="false">org.wso2.andes.jndi.PropertiesFileInitialContextFactory</parameter>
            <parameter name="java.naming.provider.url" locked="false">repository/conf/jndi.properties</parameter>
            <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">QueueConnectionFactory</parameter>
        <parameter name="transport.jms.SessionTransacted">true</parameter>                      
            <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
        <parameter name="transport.jms.SessionAcknowledgement" locked="false">CLIENT_ACKNOWLEDGE</parameter>                    
        </parameter>

        <parameter name="default" locked="false">
            <parameter name="java.naming.factory.initial" locked="false">org.wso2.andes.jndi.PropertiesFileInitialContextFactory</parameter>
            <parameter name="java.naming.provider.url" locked="false">repository/conf/jndi.properties</parameter>
            <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">QueueConnectionFactory</parameter>
            <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
        <parameter name="transport.jms.SessionTransacted">true</parameter>                      
        <parameter name="transport.jms.SessionAcknowledgement" locked="false">CLIENT_ACKNOWLEDGE</parameter>                      
        </parameter>
    </transportReceiver>
      
   <!-- uncomment this and configure to use connection pools for sending messages-->      

    
repository/conf/jndi.properties:

# register some connection factories
# connectionfactory.[jndiname] = [ConnectionURL]
connectionfactory.QueueConnectionFactory = amqp://admin:admin@clientID/carbon?brokerlist='tcp://localhost:5677'
connectionfactory.TopicConnectionFactory = amqp://admin:admin@clientID/carbon?brokerlist='tcp://localhost:5677'

# register some queues in JNDI using the form
# queue.[jndiName] = [physicalName]
queue.MyQueue = example.MyQueue

# register some topics in JNDI using the form
# topic.[jndiName] = [physicalName]
topic.MyTopic = example.MyTopic
     

Copy Lib from MB_HOME/client-lib to  ESB_HOME/repository/components/lib
andes-client-0.13.wso2v8
geronimo-jms_1.1_spec-1.1.0.wso2v1

Node 2:
-------

carbon.xml:
    <offset>1</offset>

axis2.xml:
   <!--Uncomment this and configure as appropriate for JMS transport support with WSO2 MB 2.x.x -->              
    <transportReceiver name="jms" class="org.apache.axis2.transport.jms.JMSListener">
        <parameter name="myTopicConnectionFactory" locked="false">
           <parameter name="java.naming.factory.initial" locked="false">org.wso2.andes.jndi.PropertiesFileInitialContextFactory</parameter>
            <parameter name="java.naming.provider.url" locked="false">repository/conf/jndi.properties</parameter>
            <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">TopicConnectionFactory</parameter>
            <parameter name="transport.jms.ConnectionFactoryType" locked="false">topic</parameter>
        <parameter name="transport.jms.SessionAcknowledgement" locked="false">CLIENT_ACKNOWLEDGE</parameter>                      
        </parameter>

        <parameter name="myQueueConnectionFactory" locked="false">
            <parameter name="java.naming.factory.initial" locked="false">org.wso2.andes.jndi.PropertiesFileInitialContextFactory</parameter>
            <parameter name="java.naming.provider.url" locked="false">repository/conf/jndi.properties</parameter>
            <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">QueueConnectionFactory</parameter>
        <parameter name="transport.jms.SessionTransacted">true</parameter>                      
            <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
        <parameter name="transport.jms.SessionAcknowledgement" locked="false">CLIENT_ACKNOWLEDGE</parameter>                    
        </parameter>

        <parameter name="default" locked="false">
            <parameter name="java.naming.factory.initial" locked="false">org.wso2.andes.jndi.PropertiesFileInitialContextFactory</parameter>
            <parameter name="java.naming.provider.url" locked="false">repository/conf/jndi.properties</parameter>
            <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">QueueConnectionFactory</parameter>
            <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
        <parameter name="transport.jms.SessionTransacted">true</parameter>                      
        <parameter name="transport.jms.SessionAcknowledgement" locked="false">CLIENT_ACKNOWLEDGE</parameter>                      
        </parameter>
    </transportReceiver>
      
   <!-- uncomment this and configure to use connection pools for sending messages-->      
  

repository/conf/jndi.properties:

# register some connection factories
# connectionfactory.[jndiname] = [ConnectionURL]
connectionfactory.QueueConnectionFactory = amqp://admin:admin@clientID/carbon?brokerlist='tcp://localhost:5678'
connectionfactory.TopicConnectionFactory = amqp://admin:admin@clientID/carbon?brokerlist='tcp://localhost:5678'

# register some queues in JNDI using the form
# queue.[jndiName] = [physicalName]
queue.MyQueue = example.MyQueue

# register some topics in JNDI using the form
# topic.[jndiName] = [physicalName]
topic.MyTopic = example.MyTopic


Copy Lib from MB_HOME/client-lib to  ESB_HOME/repository/components/lib
andes-client-0.13.wso2v8
geronimo-jms_1.1_spec-1.1.0.wso2v1

How to configure Oracle database with WSO2 ESB, BAM and CEP clustered nodes




As depicted in the above diagram you need to create 5 new databases in Oracle (You can give any meaningful name).

For each database you need to run the oracle.sql file found under $ESB_HOME/dbscripts/ directory. This file has all the tables required by the usr_mgt and gov_registry databases (Both gov_registry and config_registry_<product> databases should have the same table structures.).Please note that all three ESB,CEP and BAM  packs has same content in the oracle.sql file found under dbscripts directory.

You can point to same database without having two databases for usr_mgt and gov_registry. But the recommended way is to have two different databases as depicted in the above diagram.


Note: I will follow the names i have mentioned in the diagram for convenience.


usr_mgt DB

1. create the database in Oracle.
# Modify below configurations by adding the new datasource:
    1. ESB
    $ESB_HOME/repository/conf/datasources/master-datasources.xml

    2. CEP
    $CEP_HOME/repository/conf/datasources/master-datasources.xml

    3. BAM
    $BAM_HOME/repository/conf/datasources/master-datasources.xml

# user-mgt.xml  refer this data source. Therefore modify the below configurations accordingly.
    1. EBS
    $ESB_HOME/repository/conf/user-mgt.xml

    2. CEP
    $CEP_HOME/repository/conf/user-mgt.xml

    3. BAM
    $BAM_HOME/repository/conf/user-mgt.xml

E.g:
Say the database name you have given is "usr_mgt" in Oracle.
1Modify each master-datasources.xml file by adding new datasource.

       <datasource>
            <name>WSO2_USR_MGT_DB</name>
            <description>The datasource used for user manager</description>
            <jndiConfig>
                <name>jdbc/WSO2UsrMgtDB</name>
            </jndiConfig>
            <definition type="RDBMS">
                <configuration>
                    <url>jdbc:oracle:thin:@localhost:1521:usr_mgt</url>
                    <username>user</username>
                    <password>user123</password>
                    <driverClassName>oracle.jdbc.driver.OracleDriver</driverClassName>
                    <maxActive>80</maxActive>
                    <maxWait>60000</maxWait>
                    <minIdle>5</minIdle>
                    <testOnBorrow>true</testOnBorrow>
                    <validationQuery>SELECT 1</validationQuery>
                    <validationInterval>30000</validationInterval>
                </configuration>
            </definition>
        </datasource>

Modify the user-mgt.xml by pointing to the above created database.

<Property name="dataSource">jdbc/WSO2UsrMgtDB</Property>

gov_registry DB

1. create the database in Oracle.
# Modify below configurations by adding the new datasource:
    1. ESB
    $ESB_HOME/repository/conf/datasources/master-datasources.xml

    2. CEP
    $CEP_HOME/repository/conf/datasources/master-datasources.xml

    3. BAM
    $BAM_HOME/repository/conf/datasources/master-datasources.xml

# Registry.xml should refer this datasource. Therefore modify the below configurations accordingly.
Modify the mount path aswell.
    1. EBS
    $ESB_HOME/repository/conf/registry.xml

    2. CEP
    $CEP_HOME/repository/conf/registry.xml

    3. BAM
    $BAM_HOME/repository/conf/registry.xml

E.g:
Say the database name you have given is "gov_registry" in Oracle.
Modify each master-datasources.xml file by adding new datasource.

        <datasource>
            <name>WSO2_GOV_REGISTRY_DB</name>
            <description>The datasource used for governance registry</description>
            <jndiConfig>
                <name>jdbc/WSO2GovRegistryDB</name>
            </jndiConfig>
            <definition type="RDBMS">
                <configuration>
                    <url>jdbc:oracle:thin:@localhost:1521:gov_registry</url>
                    <username>user</username>
                    <password>user123</password>
                    <driverClassName>oracle.jdbc.driver.OracleDriver</driverClassName>
                    <maxActive>80</maxActive>
                    <maxWait>60000</maxWait>
                    <minIdle>5</minIdle>
                    <testOnBorrow>true</testOnBorrow>
                    <validationQuery>SELECT 1</validationQuery>
                    <validationInterval>30000</validationInterval>
                </configuration>
            </definition>
        </datasource>

Modify the registry.xml by pointing to the above created database.

<dbConfig name="governanceRegistry">
        <dataSource>jdbc/WSO2GovRegistryDB</dataSource>
</dbConfig>

<remoteInstance url="https://10.20.30.41:9443/registry">
    <id>governanceRegistryInstance</id>
    <dbConfig>governanceRegistry</dbConfig>
    <readOnly>true</readOnly>
    <registryRoot>/</registryRoot>
</remoteInstance>

<mount path="/_system/governance" overwrite="true">
    <instanceId>governanceRegistryInstance</instanceId>
    <targetPath>/_system/governance</targetPath>
</mount>

Config_registry DB

Each 2 ESB,CEP and BAM Instances should have one Config database as depicted in the diagram.
# Modify below configurations by adding the new datasource:
    1. ESB
    $ESB_HOME/repository/conf/datasources/master-datasources.xml

    2. CEP
    $CEP_HOME/repository/conf/datasources/master-datasources.xml

    3. BAM
    $BAM_HOME/repository/conf/datasources/master-datasources.xml

# Registry.xml should refer this data source. Therefore modify the below configurations accordingly.
Modify the mount paths aswell.
    1. EBS
    $ESB_HOME/repository/conf/registry.xml

    2. CEP
    $CEP_HOME/repository/conf/registry.xml

    3. BAM
    $BAM_HOME/repository/conf/registry.xml

E.g:
Consider 2 ESB instances.
Say the database name you have given is "config_registry_esb" in Oracle.
Modify each master-datasources.xml file by adding new datasource.

        <datasource>
            <name>WSO2_CONFIG_REG_ESB</name>
            <description>The datasource used for config registry</description>
            <jndiConfig>
                <name>jdbc/WSO2ConfigRegESB</name>
            </jndiConfig>
            <definition type="RDBMS">
                <configuration>
                    <url>jdbc:oracle:thin:@localhost:1521:config_registry_esb/url>
                    <username>user</username>
                    <password>user123</password>
                    <driverClassName>oracle.jdbc.driver.OracleDriver</driverClassName>
                    <maxActive>80</maxActive>
                    <maxWait>60000</maxWait>
                    <minIdle>5</minIdle>
                    <testOnBorrow>true</testOnBorrow>
                    <validationQuery>SELECT 1</validationQuery>
                    <validationInterval>30000</validationInterval>
                </configuration>
            </definition>
        </datasource>

Modify each registry.xml by pointing to the above created database.

<dbConfig name="configRegistry">
        <dataSource>jdbc/WSO2ConfigRegESB</dataSource>
</dbConfig>

<remoteInstance url="https://10.20.30.41:9443/registry">
    <id>configRegistryInstance</id>
    <dbConfig>configRegistry</dbConfig>
    <readOnly>true</readOnly>
    <registryRoot>/</registryRoot>
</remoteInstance>

<mount path="/_system/config" overwrite="true">
    <instanceId>configRegistryInstance</instanceId>
    <targetPath>/_system/nodes</targetPath>
</mount>

Note: You need to do the same for 2 CEP and 2 BAM instances.