Wednesday, September 19, 2012

Creating a JMeter test plan for an API invocation through WSO2 API Manager

The use-case :
  • Create an API for a REST endpoint and publish it from API-Publisher app
  • Then subscribe to it from API-Store app and generate a key
  • Finally create a test-paln from jmeter to this API invocation with using OAuth access token.
Pre-Requesties :


Steps :
  1. Deploy the backend JAX-RS Endpoint    
  • First download and extract above two servers and to run both servers simultaneously,change one server's port offset to 1 by navigating to {Product_Home}/repository/conf/carbon.xml .
  • Then download the sample JAX-RS war file from checking out it from here and deploy it to WSO2 AS -4.1.2  
  • This sample JAX-RS contains three REST endpoints and here I'm going to use its endpoint of getting menu list as '/pizzashack-api-1.0.0/api/menu/'.Once you deployed the war file,you can check accessing   'http://yourip:port/pizzashack-api-1.0.0/api/menu/'  from browser whether you get a successful json response or not.

     2.  Create the API for backend JAX-RS endpoint
  • Browse api-publisher web UI from browser and create a new API with setting its endpoint as  'http://yourip:port/pizzashack-api-1.0.0/api/menu/
Add API
       
  • Publish it to API-Store.
Publish API
     
  • From API-Store,subscribe the created API to an application and generate an access token.So now you are ready to invoke the API.


Subscribe to API
User Subscriptions

     3.  Create JMeter Test Plan
  • Start jmeter with jmeter.sh script and browse jmeter UI. Add a new test-pan.
  • First add a new thread group by navigate to Add->Threads (Users) ->Thread Group  
         


  • Since we are going to send a RESTful[HTTP] request to the create API,click on thread group ,select the   sampler as HTTP Request and add the ip address,port and path accordingly as shown in below image.
          From this example we are doing a GET request.So no need of request parameters.
Add HTTP Request
After setting REST URL for the request
                              
  • Then we need to add the access token for request header.That can be done by adding the config element called 'HTTP Header Manager' to the thread group as below.
Add HTTP Header Manager



  • Then click on 'add' button of the  'HTTP Header Manager' UI and add ;
         header name -"Authorization"
         value            - "Bearer "+accessToken
        
After adding the authorization header

  • Now we have finished configuring test-plan,save all of them and now remaining is running the test-plan.To collect test running results you can add a Listener for thread group as 'View Results Tree' or 'View Results Table' or either graph.Just change number of threads/iterations and see how the average time,other performance values varying on each.
                                        


  • You can find the above created JMeter test plan by checking out it from here.

Monday, September 17, 2012

Connecting WSO2 API Manager with different databases

With WSO2 API Manager GA 1.0.0 release,we have tested it with H2 ,My SQL and Oracle databases.The default database used by API Manager is embedded H2 database.
But in-case if you want to change the database to either other database,following steps have to be followed.

With Carbon 4.0.0 release,it's introduced an unified place to store  all the database data sources related configurations called master-datasources.xml which can be found from {API_Manager_Home}/repository/conf/datasources directory.

Open the 'master-datasources.xml' file and you'll notice there are already defined three datasources as; 

  • WSO2_CARBON_DB-The datasource used for registry and user manager
  • WSO2AM_STATS_DB-The datasource used for getting statistics to API Manager
  • WSO2AM_DB-The datasource used for API Manager database

If you are going to;
  1. Change the database for API Manager 
  • First create a database and run the relevant script which can be found from here,to generate database tables.You can find same scripts under the below location of your extracted APIManager pack.
         {API_Manager_Home}/dbscripts/apimgt
  • Navigate to 'WSO2AM_DB' section of master-datasources.xml file and edit url,username,password and driverClassName accordingly.
  • You can ignore 'validationQuery' entry by removing,if you don't need to validate each query running from the created data-source as it'll effect performance.
  • Remarks:
          If you are going to point 'WSO2AM_DB'  in master-datasources.xml to a mysql database,you  
          need to add its jdbc url configuration as below.         
           
         <url>jdbc:mysql://localhost:3306/APIMANAGERDB?
   
         Note that, you must specify ?autoReconnect=true&relaxAutoCommit=true in the jdbc url.
  • Download the related driver and copy it to {API_Manager_Home}/repository/components/lib folder.
  • Start the server with the parameter -Dsetup as below;
          ./wso2server.sh -Dsetup [or wso2server.bat -Dsetup]
     
    2.  Additionally if you want to change the JNDI lookup datasource name of the datasource used for 
         API Manager
  • Change the entry  <name> under <jndiConfig>  section for the API Manager database in master-datasources.xml file.
  • Then open api-manager.xml and change the  <DataSourceName>  under root entry  <APIManager> as similar value to the above edited jndiConfig name value of master-datasources.xml file.

Wednesday, September 5, 2012

Dealing with SVN Externals

When you are trying to cut a versioned branch from the working trunk directory,an important point that you have to keep on mind is to change the svn externals according to the newly created branch.

SVN Externals

An SVN externals definition is a mapping of a local directory to the URL—and possibly a particular revision—of a versioned resource.In Subversion, you declare externals definitions in groups using the svn:externals property. 

Command to view existing svn externals 

svn propget -R svn:externals .

Command to modify a svn external 

  • If you having one entry as a svn extern property to set on a directory,type below command and then commit it.

svn propset svn:externals 'directory  http://external_url' . property 'svn:externals' set on '.'

  • If you having multiple directory/url pairs as svn externs to set on a directory
Create a file [svnExterns.txt] with putting the individual directory/url pairs.

Then type the below command and commit it.

svn propset svn:externals -F svnExterns.txt .

Command to edit/delete an existing svn externals 

svn propedit svn:externals .

You should see the directory/url pairs will listed after above command.If you want to delete such an extern just remove the specific line and run svn commit command.