You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by me...@apache.org on 2014/06/26 22:31:54 UTC

[6/7] initial grouping code to develop cartridge grouping feature

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/RestCommandLineService.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/RestCommandLineService.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/RestCommandLineService.java
index 10c9d9e..8299d0d 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/RestCommandLineService.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/RestCommandLineService.java
@@ -723,7 +723,7 @@ public class RestCommandLineService {
     public void subscribe(String cartridgeType, String alias, String externalRepoURL, boolean privateRepo, String username,
                           String password,String asPolicy,
                           String depPolicy, String size, boolean remoOnTermination, boolean persistanceMapping,
-                          boolean enableCommits)
+                          boolean enableCommits, String volumeId)
             throws CommandException {
         DefaultHttpClient httpClient = new DefaultHttpClient();
 
@@ -737,6 +737,7 @@ public class RestCommandLineService {
         cartridgeInfoBean.setAutoscalePolicy(null);
         cartridgeInfoBean.setDeploymentPolicy(null);
         cartridgeInfoBean.setSize(size);
+
         cartridgeInfoBean.setRemoveOnTermination(remoOnTermination);
         cartridgeInfoBean.setPersistanceRequired(persistanceMapping);
         cartridgeInfoBean.setCommitsEnabled(enableCommits);
@@ -759,6 +760,7 @@ public class RestCommandLineService {
             cartridgeInfoBean.setRemoveOnTermination(remoOnTermination);
             cartridgeInfoBean.setPersistanceRequired(persistanceMapping);
             cartridgeInfoBean.setCommitsEnabled(enableCommits);
+            cartridgeInfoBean.setVolumeId(volumeId);
             
             jsonSubscribeString = gson.toJson(cartridgeInfoBean, CartridgeInfoBean.class);
 
@@ -781,7 +783,7 @@ public class RestCommandLineService {
                 return;
             }
 
-            String  subscriptionOutputJSON=  subscriptionOutput.substring(20, subscriptionOutput.length() -1);
+            String  subscriptionOutputJSON = subscriptionOutput.substring(20, subscriptionOutput.length() -1);
             SubscriptionInfo subcriptionInfo = gson.fromJson(subscriptionOutputJSON, SubscriptionInfo.class);
 
             System.out.format("You have successfully subscribed to %s cartridge with alias %s.%n", cartridgeType, alias);

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/StratosApplication.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/StratosApplication.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/StratosApplication.java
index 8a888ee..7450d79 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/StratosApplication.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/StratosApplication.java
@@ -246,6 +246,8 @@ public class StratosApplication extends CommandLineApplication<StratosCommandCon
 
 		// Command action
 		String action = null;
+		// Command action options
+		Option[] actionOptions = null;
 
 		String usernameInput = null;
 		String passwordInput = null;
@@ -263,6 +265,7 @@ public class StratosApplication extends CommandLineApplication<StratosCommandCon
 			CommandLine commandLine;
 			try {
 				// Must add all options. Otherwise actions cannot be performed directly by command line.
+				// This is because the parser trips over unrecognised options.
 				Options allCommandOptions = new Options();
 				for (Command<StratosCommandContext> command : commands.values()) {
 					Options commandOptions = command.getOptions();
@@ -281,6 +284,7 @@ public class StratosApplication extends CommandLineApplication<StratosCommandCon
 				
 				commandLine = parser.parse(allCommandOptions, args);
 				remainingArgs = commandLine.getArgs();
+				actionOptions = commandLine.getOptions();
 				if (remainingArgs != null && remainingArgs.length > 0) {
 					// Get command action
 					action = remainingArgs[0];
@@ -346,7 +350,7 @@ public class StratosApplication extends CommandLineApplication<StratosCommandCon
 				if (logger.isDebugEnabled()) {
 					logger.debug("Executing Action: {} {}", action, Arrays.asList(actionArgs));
 				}
-				int returnCode = command.execute(context, actionArgs);
+				int returnCode = command.execute(context, actionArgs, actionOptions);
 				if (logger.isDebugEnabled()) {
 					logger.debug("Exiting with error code {} after executing action {}", returnCode, action);
 				}
@@ -443,7 +447,7 @@ public class StratosApplication extends CommandLineApplication<StratosCommandCon
 			return CliConstants.BAD_ARGS_CODE;
 		}
 		try {
-			return command.execute(context, actionArgs);
+			return command.execute(context, actionArgs, new Option[0]);
 		} catch (CommandException e) {
 			if (logger.isErrorEnabled()) {
 				logger.error("Error executing command: " + action, e);

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/beans/cartridge/CartridgeInfoBean.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/beans/cartridge/CartridgeInfoBean.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/beans/cartridge/CartridgeInfoBean.java
index 58d6f66..9e23120 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/beans/cartridge/CartridgeInfoBean.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/beans/cartridge/CartridgeInfoBean.java
@@ -31,7 +31,7 @@ public class CartridgeInfoBean {
     private String autoscalePolicy;
     private String deploymentPolicy;
     private String size;
-
+    private String volumeId;
     boolean privateRepo;
     private boolean removeOnTermination;
     private boolean persistanceRequired;
@@ -140,6 +140,12 @@ public class CartridgeInfoBean {
 	public void setCommitsEnabled(boolean commitsEnabled) {
 		this.commitsEnabled = commitsEnabled;
 	}
-    
-    
+
+    public String getVolumeId() {
+        return volumeId;
+    }
+
+    public void setVolumeId(String volumeId) {
+        this.volumeId = volumeId;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ActivateTenantCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ActivateTenantCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ActivateTenantCommand.java
index 84acbc1..49054bb 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ActivateTenantCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ActivateTenantCommand.java
@@ -18,6 +18,7 @@
  */
 package org.apache.stratos.cli.commands;
 
+import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 import org.apache.stratos.cli.Command;
 import org.apache.stratos.cli.RestCommandLineService;
@@ -51,7 +52,7 @@ public class ActivateTenantCommand implements Command<StratosCommandContext> {
     }
 
     @Override
-    public int execute(StratosCommandContext context, String[] args) throws CommandException {
+    public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
         if (logger.isDebugEnabled()) {
 			logger.debug("Executing {} command...", getName());
 		}

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/AddDomainMappingCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/AddDomainMappingCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/AddDomainMappingCommand.java
index daafc61..bac6a3b 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/AddDomainMappingCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/AddDomainMappingCommand.java
@@ -18,6 +18,7 @@
  */
 package org.apache.stratos.cli.commands;
 
+import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -51,7 +52,7 @@ public class AddDomainMappingCommand implements Command<StratosCommandContext> {
 	}
 
 	@Override
-	public int execute(StratosCommandContext context, String[] args) throws CommandException {
+	public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
 		if (logger.isDebugEnabled()) {
 			logger.debug("Executing {} command...", getName());
 		}

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/AddTenantCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/AddTenantCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/AddTenantCommand.java
index b185f7d..a025f45 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/AddTenantCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/AddTenantCommand.java
@@ -29,6 +29,8 @@ import org.slf4j.LoggerFactory;
 import org.apache.commons.cli.Options;
 import org.apache.commons.cli.Option;
 
+import static org.apache.stratos.cli.utils.CommandLineUtils.mergeOptionArrays;
+
 public class AddTenantCommand implements Command<StratosCommandContext> {
 
     private static final Logger logger = LoggerFactory.getLogger(AddTenantCommand.class);
@@ -87,7 +89,7 @@ public class AddTenantCommand implements Command<StratosCommandContext> {
         return null;
     }
 
-    public int execute(StratosCommandContext context, String[] args) throws CommandException {
+    public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
         if (logger.isDebugEnabled()) {
             logger.debug("Executing {} command...", getName());
         }
@@ -105,46 +107,48 @@ public class AddTenantCommand implements Command<StratosCommandContext> {
 
             try {
                 commandLine = parser.parse(options, args);
+                //merge newly discovered options with previously discovered ones.
+                Options opts = mergeOptionArrays(already_parsed_opts, commandLine.getOptions());
 
                 if (logger.isDebugEnabled()) {
                     logger.debug("Add tenant");
                 }
 
-                if (commandLine.hasOption(CliConstants.USERNAME_OPTION)) {
+                if (opts.hasOption(CliConstants.USERNAME_OPTION)) {
                     if (logger.isTraceEnabled()) {
                         logger.trace("Username option is passed");
                     }
-                    admin = commandLine.getOptionValue(CliConstants.USERNAME_OPTION);
+                    admin = opts.getOption(CliConstants.USERNAME_OPTION).getValue();
                 }
-                if (commandLine.hasOption(CliConstants.FIRST_NAME_OPTION)) {
+                if (opts.hasOption(CliConstants.FIRST_NAME_OPTION)) {
                     if (logger.isTraceEnabled()) {
                         logger.trace("First name option is passed");
                     }
-                    firstName = commandLine.getOptionValue(CliConstants.FIRST_NAME_OPTION);
+                    firstName = opts.getOption(CliConstants.FIRST_NAME_OPTION).getValue();
                 }
-                if (commandLine.hasOption(CliConstants.LAST_NAME_OPTION)) {
+                if (opts.hasOption(CliConstants.LAST_NAME_OPTION)) {
                     if (logger.isTraceEnabled()) {
                         logger.trace("Last name option is passed");
                     }
-                    lastaName = commandLine.getOptionValue(CliConstants.LAST_NAME_OPTION);
+                    lastaName = opts.getOption(CliConstants.LAST_NAME_OPTION).getValue();
                 }
-                if (commandLine.hasOption(CliConstants.PASSWORD_OPTION)) {
+                if (opts.hasOption(CliConstants.PASSWORD_OPTION)) {
                     if (logger.isTraceEnabled()) {
                         logger.trace("Password option is passed");
                     }
-                    password = commandLine.getOptionValue(CliConstants.PASSWORD_OPTION);
+                    password = opts.getOption(CliConstants.PASSWORD_OPTION).getValue();
                 }
-                if (commandLine.hasOption(CliConstants.DOMAIN_NAME_OPTION)) {
+                if (opts.hasOption(CliConstants.DOMAIN_NAME_OPTION)) {
                     if (logger.isTraceEnabled()) {
                         logger.trace("Domain name option is passed");
                     }
-                    domain = commandLine.getOptionValue(CliConstants.DOMAIN_NAME_OPTION);
+                    domain = opts.getOption(CliConstants.DOMAIN_NAME_OPTION).getValue();
                 }
-                if (commandLine.hasOption(CliConstants.EMAIL_OPTION)) {
+                if (opts.hasOption(CliConstants.EMAIL_OPTION)) {
                     if (logger.isTraceEnabled()) {
                         logger.trace("Email option is passed");
                     }
-                    email = commandLine.getOptionValue(CliConstants.EMAIL_OPTION);
+                    email = opts.getOption(CliConstants.EMAIL_OPTION).getValue();
 
                 }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/AutoscalePolicyCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/AutoscalePolicyCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/AutoscalePolicyCommand.java
index 9c3b4ba..41c0cc1 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/AutoscalePolicyCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/AutoscalePolicyCommand.java
@@ -18,6 +18,7 @@
  */
 package org.apache.stratos.cli.commands;
 
+import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 import org.apache.stratos.cli.Command;
 import org.apache.stratos.cli.RestCommandLineService;
@@ -46,7 +47,7 @@ public class AutoscalePolicyCommand implements Command<StratosCommandContext> {
         return null;
     }
 
-    public int execute(StratosCommandContext context, String[] args) throws CommandException {
+    public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
         if (logger.isDebugEnabled()) {
             logger.debug("Executing {} command...", getName());
         }

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/AutoscalingPolicyDeploymentCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/AutoscalingPolicyDeploymentCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/AutoscalingPolicyDeploymentCommand.java
index ae44391..3dcefe7 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/AutoscalingPolicyDeploymentCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/AutoscalingPolicyDeploymentCommand.java
@@ -30,6 +30,8 @@ import java.io.BufferedReader;
 import java.io.FileReader;
 import java.io.IOException;
 
+import static org.apache.stratos.cli.utils.CommandLineUtils.mergeOptionArrays;
+
 public class AutoscalingPolicyDeploymentCommand implements Command<StratosCommandContext> {
 
     private static final Logger logger = LoggerFactory.getLogger(AutoscalingPolicyDeploymentCommand.class);
@@ -63,7 +65,7 @@ public class AutoscalingPolicyDeploymentCommand implements Command<StratosComman
         return null;
     }
 
-    public int execute(StratosCommandContext context, String[] args) throws CommandException {
+    public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
         if (logger.isDebugEnabled()) {
             logger.debug("Executing {} command...", getName());
         }
@@ -77,16 +79,18 @@ public class AutoscalingPolicyDeploymentCommand implements Command<StratosComman
 
             try {
                 commandLine = parser.parse(options, args);
+                //merge newly discovered options with previously discovered ones.
+                Options opts = mergeOptionArrays(already_parsed_opts, commandLine.getOptions());
 
                 if (logger.isDebugEnabled()) {
                     logger.debug("Autoscaling policy deployment");
                 }
 
-                if (commandLine.hasOption(CliConstants.RESOURCE_PATH)) {
+                if (opts.hasOption(CliConstants.RESOURCE_PATH)) {
                     if (logger.isTraceEnabled()) {
                         logger.trace("Resource path option is passed");
                     }
-                    resourcePath = commandLine.getOptionValue(CliConstants.RESOURCE_PATH);
+                    resourcePath = opts.getOption(CliConstants.RESOURCE_PATH).getValue();
                     autoscalingPolicyDeployment = readResource(resourcePath);
                 }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/CartridgeDeploymentCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/CartridgeDeploymentCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/CartridgeDeploymentCommand.java
index e60461c..474ddaf 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/CartridgeDeploymentCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/CartridgeDeploymentCommand.java
@@ -30,6 +30,8 @@ import java.io.BufferedReader;
 import java.io.FileReader;
 import java.io.IOException;
 
+import static org.apache.stratos.cli.utils.CommandLineUtils.mergeOptionArrays;
+
 public class CartridgeDeploymentCommand implements Command<StratosCommandContext> {
 
     private static final Logger logger = LoggerFactory.getLogger(CartridgeDeploymentCommand.class);
@@ -63,7 +65,7 @@ public class CartridgeDeploymentCommand implements Command<StratosCommandContext
         return null;
     }
 
-    public int execute(StratosCommandContext context, String[] args) throws CommandException {
+    public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
         if (logger.isDebugEnabled()) {
             logger.debug("Executing {} command...", getName());
         }
@@ -77,16 +79,18 @@ public class CartridgeDeploymentCommand implements Command<StratosCommandContext
 
             try {
                 commandLine = parser.parse(options, args);
+                //merge newly discovered options with previously discovered ones.
+                Options opts = mergeOptionArrays(already_parsed_opts, commandLine.getOptions());
 
                 if (logger.isDebugEnabled()) {
                     logger.debug("Cartridge deployment");
                 }
 
-                if (commandLine.hasOption(CliConstants.RESOURCE_PATH)) {
+                if (opts.hasOption(CliConstants.RESOURCE_PATH)) {
                     if (logger.isTraceEnabled()) {
                         logger.trace("Resource path option is passed");
                     }
-                    resourcePath = commandLine.getOptionValue(CliConstants.RESOURCE_PATH);
+                    resourcePath = opts.getOption(CliConstants.RESOURCE_PATH).getValue();
                     cartridgeDeploymentJSON = readResource(resourcePath);
                 }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DeactivateTenantCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DeactivateTenantCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DeactivateTenantCommand.java
index 83adf1f..19c9ba8 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DeactivateTenantCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DeactivateTenantCommand.java
@@ -18,6 +18,7 @@
  */
 package org.apache.stratos.cli.commands;
 
+import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 import org.apache.stratos.cli.Command;
 import org.apache.stratos.cli.RestCommandLineService;
@@ -51,7 +52,7 @@ public class DeactivateTenantCommand implements Command<StratosCommandContext> {
     }
 
     @Override
-    public int execute(StratosCommandContext context, String[] args) throws CommandException {
+    public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
         if (logger.isDebugEnabled()) {
 			logger.debug("Executing {} command...", getName());
 		}

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DeleteTenantCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DeleteTenantCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DeleteTenantCommand.java
index 50b4a85..5a5bc98 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DeleteTenantCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DeleteTenantCommand.java
@@ -18,6 +18,7 @@
  */
 package org.apache.stratos.cli.commands;
 
+import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 import org.apache.stratos.cli.Command;
 import org.apache.stratos.cli.RestCommandLineService;
@@ -51,7 +52,7 @@ public class DeleteTenantCommand implements Command<StratosCommandContext> {
     }
 
     @Override
-    public int execute(StratosCommandContext context, String[] args) throws CommandException {
+    public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
         if (logger.isDebugEnabled()) {
 			logger.debug("Executing {} command...", getName());
 		}

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DeployServiceDeploymentCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DeployServiceDeploymentCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DeployServiceDeploymentCommand.java
index 95d9647..e62c9c7 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DeployServiceDeploymentCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DeployServiceDeploymentCommand.java
@@ -31,6 +31,8 @@ import java.io.BufferedReader;
 import java.io.FileReader;
 import java.io.IOException;
 
+import static org.apache.stratos.cli.utils.CommandLineUtils.mergeOptionArrays;
+
 public class DeployServiceDeploymentCommand implements Command<StratosCommandContext> {
 
     private static final Logger logger = LoggerFactory.getLogger(DeployServiceDeploymentCommand.class);
@@ -64,7 +66,7 @@ public class DeployServiceDeploymentCommand implements Command<StratosCommandCon
         return null;
     }
 
-    public int execute(StratosCommandContext context, String[] args) throws CommandException {
+    public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
         if (logger.isDebugEnabled()) {
             logger.debug("Executing {} command...", getName());
         }
@@ -78,16 +80,18 @@ public class DeployServiceDeploymentCommand implements Command<StratosCommandCon
 
             try {
                 commandLine = parser.parse(options, args);
+                //merge newly discovered options with previously discovered ones.
+                Options opts = mergeOptionArrays(already_parsed_opts, commandLine.getOptions());
 
                 if (logger.isDebugEnabled()) {
                     logger.debug("Deploy Service Deployment");
                 }
 
-                if (commandLine.hasOption(CliConstants.RESOURCE_PATH)) {
+                if (opts.hasOption(CliConstants.RESOURCE_PATH)) {
                     if (logger.isTraceEnabled()) {
                         logger.trace("Resource path option is passed");
                     }
-                    resourcePath = commandLine.getOptionValue(CliConstants.RESOURCE_PATH);
+                    resourcePath = opts.getOption(CliConstants.RESOURCE_PATH).getValue();
                     deployServiceDeployment = readResource(resourcePath);
                 }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DeploymentPolicyCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DeploymentPolicyCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DeploymentPolicyCommand.java
index 1072029..a376ee4 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DeploymentPolicyCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DeploymentPolicyCommand.java
@@ -18,6 +18,7 @@
  */
 package org.apache.stratos.cli.commands;
 
+import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 import org.apache.stratos.cli.Command;
 import org.apache.stratos.cli.RestCommandLineService;
@@ -46,7 +47,7 @@ public class DeploymentPolicyCommand implements Command<StratosCommandContext> {
         return null;
     }
 
-    public int execute(StratosCommandContext context, String[] args) throws CommandException {
+    public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
         if (logger.isDebugEnabled()) {
             logger.debug("Executing {} command...", getName());
         }

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DeploymentPolicyDeploymentCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DeploymentPolicyDeploymentCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DeploymentPolicyDeploymentCommand.java
index 75fe52a..0183436 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DeploymentPolicyDeploymentCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DeploymentPolicyDeploymentCommand.java
@@ -30,6 +30,8 @@ import java.io.BufferedReader;
 import java.io.FileReader;
 import java.io.IOException;
 
+import static org.apache.stratos.cli.utils.CommandLineUtils.mergeOptionArrays;
+
 public class DeploymentPolicyDeploymentCommand implements Command<StratosCommandContext> {
 
     private static final Logger logger = LoggerFactory.getLogger(DeploymentPolicyDeploymentCommand.class);
@@ -63,7 +65,7 @@ public class DeploymentPolicyDeploymentCommand implements Command<StratosCommand
         return null;
     }
 
-    public int execute(StratosCommandContext context, String[] args) throws CommandException {
+    public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
         if (logger.isDebugEnabled()) {
             logger.debug("Executing {} command...", getName());
         }
@@ -77,16 +79,18 @@ public class DeploymentPolicyDeploymentCommand implements Command<StratosCommand
 
             try {
                 commandLine = parser.parse(options, args);
+                //merge newly discovered options with previously discovered ones.
+                Options opts = mergeOptionArrays(already_parsed_opts, commandLine.getOptions());
 
                 if (logger.isDebugEnabled()) {
                     logger.debug("Deployment policy deployment");
                 }
 
-                if (commandLine.hasOption(CliConstants.RESOURCE_PATH)) {
+                if (opts.hasOption(CliConstants.RESOURCE_PATH)) {
                     if (logger.isTraceEnabled()) {
                         logger.trace("Resource path option is passed");
                     }
-                    resourcePath = commandLine.getOptionValue(CliConstants.RESOURCE_PATH);
+                    resourcePath = opts.getOption(CliConstants.RESOURCE_PATH).getValue();
                     deploymentPolicyDeployment = readResource(resourcePath);
                 }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DescribeAutoScalingPolicyCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DescribeAutoScalingPolicyCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DescribeAutoScalingPolicyCommand.java
index 195b417..22173b3 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DescribeAutoScalingPolicyCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DescribeAutoScalingPolicyCommand.java
@@ -51,7 +51,7 @@ public class DescribeAutoScalingPolicyCommand implements Command<StratosCommandC
     }
 
     @Override
-    public int execute(StratosCommandContext context, String[] args) throws CommandException {
+    public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
         if (logger.isDebugEnabled()) {
 			logger.debug("Executing {} command...", getName());
 		}

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DescribeCartridgeCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DescribeCartridgeCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DescribeCartridgeCommand.java
index 3ae2b42..f6bbff5 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DescribeCartridgeCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DescribeCartridgeCommand.java
@@ -51,7 +51,7 @@ public class DescribeCartridgeCommand implements Command<StratosCommandContext>
     }
 
     @Override
-    public int execute(StratosCommandContext context, String[] args) throws CommandException {
+    public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
         if (logger.isDebugEnabled()) {
 			logger.debug("Executing {} command...", getName());
 		}

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DescribeDeploymentPolicyCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DescribeDeploymentPolicyCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DescribeDeploymentPolicyCommand.java
index ce31127..21c3370 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DescribeDeploymentPolicyCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DescribeDeploymentPolicyCommand.java
@@ -51,7 +51,7 @@ public class DescribeDeploymentPolicyCommand implements Command<StratosCommandCo
     }
 
     @Override
-    public int execute(StratosCommandContext context, String[] args) throws CommandException {
+    public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
         if (logger.isDebugEnabled()) {
 			logger.debug("Executing {} command...", getName());
 		}

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DescribePartitionCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DescribePartitionCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DescribePartitionCommand.java
index 950a957..ee79aec 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DescribePartitionCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/DescribePartitionCommand.java
@@ -18,6 +18,7 @@
  */
 package org.apache.stratos.cli.commands;
 
+import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 import org.apache.stratos.cli.Command;
 import org.apache.stratos.cli.RestCommandLineService;
@@ -51,7 +52,7 @@ public class DescribePartitionCommand implements Command<StratosCommandContext>
     }
 
     @Override
-    public int execute(StratosCommandContext context, String[] args) throws CommandException {
+    public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
         if (logger.isDebugEnabled()) {
 			logger.debug("Executing {} command...", getName());
 		}

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ExitCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ExitCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ExitCommand.java
index 1dbd7d4..65e91e5 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ExitCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ExitCommand.java
@@ -18,6 +18,7 @@
  */
 package org.apache.stratos.cli.commands;
 
+import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
     import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -26,11 +27,6 @@ import org.apache.stratos.cli.StratosCommandContext;
 import org.apache.stratos.cli.exception.CommandException;
 import org.apache.stratos.cli.utils.CliConstants;
 
-import java.io.File;
-
-import static org.apache.stratos.cli.utils.CliConstants.STRATOS_DIR;
-import static org.apache.stratos.cli.utils.CliConstants.STRATOS_HISTORY_DIR;
-
 public class ExitCommand implements Command<StratosCommandContext> {
 
 	private static final Logger logger = LoggerFactory.getLogger(ExitCommand.class);
@@ -54,7 +50,7 @@ public class ExitCommand implements Command<StratosCommandContext> {
 	}
 
 	@Override
-	public int execute(StratosCommandContext context, String[] args) throws CommandException {
+	public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
 		// Nothing to execute here. This is a special command.
 		if (logger.isDebugEnabled()) {
 			logger.debug("Executing {} command...", getName());

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/HelpCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/HelpCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/HelpCommand.java
index 0593b4e..17e135d 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/HelpCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/HelpCommand.java
@@ -18,6 +18,7 @@
  */
 package org.apache.stratos.cli.commands;
 
+import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -49,7 +50,7 @@ public class HelpCommand implements Command<StratosCommandContext> {
 	}
 
 	@Override
-	public int execute(StratosCommandContext context, String[] args) throws CommandException {
+	public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
 		if (logger.isDebugEnabled()) {
 			logger.debug("Executing {} command...", getName());
 		}

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/InfoCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/InfoCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/InfoCommand.java
index d3c071a..07cbfa4 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/InfoCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/InfoCommand.java
@@ -18,6 +18,7 @@
  */
 package org.apache.stratos.cli.commands;
 
+import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -50,7 +51,7 @@ public class InfoCommand implements Command<StratosCommandContext> {
 	}
 
 	@Override
-	public int execute(StratosCommandContext context, String[] args) throws CommandException {
+	public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
 		if (logger.isDebugEnabled()) {
 			logger.debug("Executing {} command...", getName());
 		}

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ListAllTenants.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ListAllTenants.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ListAllTenants.java
index f9f7e09..9a00357 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ListAllTenants.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ListAllTenants.java
@@ -18,6 +18,7 @@
  */
 package org.apache.stratos.cli.commands;
 
+import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 import org.apache.stratos.cli.Command;
 import org.apache.stratos.cli.RestCommandLineService;
@@ -46,7 +47,7 @@ public class ListAllTenants implements Command<StratosCommandContext> {
         return null;
     }
 
-    public int execute(StratosCommandContext context, String[] args) throws CommandException {
+    public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
         if (logger.isDebugEnabled()) {
             logger.debug("Executing {} command...", getName());
         }

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ListCartridgesCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ListCartridgesCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ListCartridgesCommand.java
index 3874d41..412bfa6 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ListCartridgesCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ListCartridgesCommand.java
@@ -18,6 +18,7 @@
  */
 package org.apache.stratos.cli.commands;
 
+import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 import org.apache.stratos.cli.RestCommandLineService;
 import org.slf4j.Logger;
@@ -46,7 +47,7 @@ public class ListCartridgesCommand implements Command<StratosCommandContext> {
 		return null;
 	}
 
-	public int execute(StratosCommandContext context, String[] args) throws CommandException {
+	public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
 		if (logger.isDebugEnabled()) {
 			logger.debug("Executing {} command...", getName());
 		}

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ListDeployServiceCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ListDeployServiceCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ListDeployServiceCommand.java
index 7580c56..af97c22 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ListDeployServiceCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ListDeployServiceCommand.java
@@ -18,6 +18,7 @@
  */
 package org.apache.stratos.cli.commands;
 
+import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 import org.apache.stratos.cli.Command;
 import org.apache.stratos.cli.RestCommandLineService;
@@ -46,7 +47,7 @@ public class ListDeployServiceCommand implements Command<StratosCommandContext>
         return null;
     }
 
-    public int execute(StratosCommandContext context, String[] args) throws CommandException {
+    public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
         if (logger.isDebugEnabled()) {
             logger.debug("Executing {} command...", getName());
         }

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ListMemberCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ListMemberCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ListMemberCommand.java
index 4ce5ac7..28cbf48 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ListMemberCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ListMemberCommand.java
@@ -27,6 +27,8 @@ import org.apache.stratos.cli.utils.CliConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static org.apache.stratos.cli.utils.CommandLineUtils.mergeOptionArrays;
+
 public class ListMemberCommand implements Command<StratosCommandContext> {
     private static final Logger logger = LoggerFactory.getLogger(ListMemberCommand.class);
 
@@ -78,7 +80,7 @@ public class ListMemberCommand implements Command<StratosCommandContext> {
     }
 
     @Override
-    public int execute(StratosCommandContext context, String[] args) throws CommandException {
+    public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
         if (logger.isDebugEnabled()) {
 			logger.debug("Executing {} command...", getName());
 		}
@@ -90,21 +92,23 @@ public class ListMemberCommand implements Command<StratosCommandContext> {
 			CommandLine commandLine;
 			try {
 				commandLine = parser.parse(options, args);
+				//merge newly discovered options with previously discovered ones.
+				Options opts = mergeOptionArrays(already_parsed_opts, commandLine.getOptions());
 				if (logger.isDebugEnabled()) {
 					logger.debug("Subscribing to {} cartridge with alias {}", type, alias);
 				}
 
-                if (commandLine.hasOption(CliConstants.CARTRIDGE_TYPE_OPTION)) {
+                if (opts.hasOption(CliConstants.CARTRIDGE_TYPE_OPTION)) {
                     if (logger.isTraceEnabled()) {
                         logger.trace("Autoscaling policy option is passed");
                     }
-                    type = commandLine.getOptionValue(CliConstants.CARTRIDGE_TYPE_OPTION);
+                    type = opts.getOption(CliConstants.CARTRIDGE_TYPE_OPTION).getValue();
                 }
-                if (commandLine.hasOption(CliConstants.ALIAS_OPTION)) {
+                if (opts.hasOption(CliConstants.ALIAS_OPTION)) {
                     if (logger.isTraceEnabled()) {
                         logger.trace("Deployment policy option is passed");
                     }
-                    alias = commandLine.getOptionValue(CliConstants.ALIAS_OPTION);
+                    alias = opts.getOption(CliConstants.ALIAS_OPTION).getValue();
                 }
 
                 if (type == null) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ListSubscribedCartridgesCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ListSubscribedCartridgesCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ListSubscribedCartridgesCommand.java
index 080a72c..57adcce 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ListSubscribedCartridgesCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/ListSubscribedCartridgesCommand.java
@@ -32,6 +32,8 @@ import org.apache.stratos.cli.StratosCommandContext;
 import org.apache.stratos.cli.exception.CommandException;
 import org.apache.stratos.cli.utils.CliConstants;
 
+import static org.apache.stratos.cli.utils.CommandLineUtils.mergeOptionArrays;
+
 public class ListSubscribedCartridgesCommand implements Command<StratosCommandContext> {
 
 	private static final Logger logger = LoggerFactory.getLogger(ListSubscribedCartridgesCommand.class);
@@ -67,7 +69,7 @@ public class ListSubscribedCartridgesCommand implements Command<StratosCommandCo
 		return null;
 	}
 
-	public int execute(StratosCommandContext context, String[] args) throws CommandException {
+	public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
 		if (logger.isDebugEnabled()) {
 			logger.debug("Executing {} command...", getName());
 		}
@@ -83,12 +85,15 @@ public class ListSubscribedCartridgesCommand implements Command<StratosCommandCo
 			try {
 				commandLine = parser.parse(options, args);
 				remainingArgs = commandLine.getArgs();
+				//merge newly discovered options with previously discovered ones.
+				Options opts = mergeOptionArrays(already_parsed_opts, commandLine.getOptions());
+
 				if (!(remainingArgs == null || remainingArgs.length == 0)) {
 					context.getStratosApplication().printUsage(getName());
 					return CliConstants.BAD_ARGS_CODE;
 				}
 
-				if (commandLine.hasOption(CliConstants.FULL_OPTION)) {
+				if (opts.hasOption(CliConstants.FULL_OPTION)) {
 					if (logger.isTraceEnabled()) {
 						logger.trace("Full option is passed");
 					}

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/PartitionCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/PartitionCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/PartitionCommand.java
index 4e5f4a8..ad856e2 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/PartitionCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/PartitionCommand.java
@@ -46,7 +46,7 @@ public class PartitionCommand implements Command<StratosCommandContext> {
         return null;
     }
 
-    public int execute(StratosCommandContext context, String[] args) throws CommandException {
+    public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
         if (logger.isDebugEnabled()) {
             logger.debug("Executing {} command...", getName());
         }

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/PartitionDeploymentCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/PartitionDeploymentCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/PartitionDeploymentCommand.java
index b1e5989..b973536 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/PartitionDeploymentCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/PartitionDeploymentCommand.java
@@ -30,6 +30,8 @@ import java.io.BufferedReader;
 import java.io.FileReader;
 import java.io.IOException;
 
+import static org.apache.stratos.cli.utils.CommandLineUtils.mergeOptionArrays;
+
 public class PartitionDeploymentCommand implements Command<StratosCommandContext> {
 
     private static final Logger logger = LoggerFactory.getLogger(PartitionDeploymentCommand.class);
@@ -63,7 +65,7 @@ public class PartitionDeploymentCommand implements Command<StratosCommandContext
         return null;
     }
 
-    public int execute(StratosCommandContext context, String[] args) throws CommandException {
+    public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
         if (logger.isDebugEnabled()) {
             logger.debug("Executing {} command...", getName());
         }
@@ -77,16 +79,18 @@ public class PartitionDeploymentCommand implements Command<StratosCommandContext
 
             try {
                 commandLine = parser.parse(options, args);
+                //merge newly discovered options with previously discovered ones.
+                Options opts = mergeOptionArrays(already_parsed_opts, commandLine.getOptions());
 
                 if (logger.isDebugEnabled()) {
                     logger.debug("Partition deployment");
                 }
 
-                if (commandLine.hasOption(CliConstants.RESOURCE_PATH)) {
+                if (opts.hasOption(CliConstants.RESOURCE_PATH)) {
                     if (logger.isTraceEnabled()) {
                         logger.trace("Resource path option is passed");
                     }
-                    resourcePath = commandLine.getOptionValue(CliConstants.RESOURCE_PATH);
+                    resourcePath = opts.getOption(CliConstants.RESOURCE_PATH).getValue();
                     partionDeployment = readResource(resourcePath);
                 }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/PoliciesCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/PoliciesCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/PoliciesCommand.java
index b63f400..305440e 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/PoliciesCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/PoliciesCommand.java
@@ -18,6 +18,7 @@
  */
 package org.apache.stratos.cli.commands;
 
+import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -50,7 +51,7 @@ public class PoliciesCommand implements Command<StratosCommandContext> {
 	}
 
 	@Override
-	public int execute(StratosCommandContext context, String[] args) throws CommandException {
+	public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
 		if (logger.isDebugEnabled()) {
 			logger.debug("Executing {} command...", getName());
 		}

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/RemoveDomainMappingCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/RemoveDomainMappingCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/RemoveDomainMappingCommand.java
index 06e6b11..74aed7d 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/RemoveDomainMappingCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/RemoveDomainMappingCommand.java
@@ -18,6 +18,7 @@
  */
 package org.apache.stratos.cli.commands;
 
+import org.apache.commons.cli.Option;
 import org.apache.stratos.cli.Command;
 import org.apache.stratos.cli.CommandLineService;
 import org.apache.stratos.cli.StratosCommandContext;
@@ -50,7 +51,7 @@ public class RemoveDomainMappingCommand implements Command<StratosCommandContext
 	}
 
 	@Override
-	public int execute(StratosCommandContext context, String[] args) throws CommandException {
+	public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
 		if (logger.isDebugEnabled()) {
 			logger.debug("Executing {} command...", getName());
 		}

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/SubscribeCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/SubscribeCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/SubscribeCommand.java
index 6479a06..6232893 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/SubscribeCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/SubscribeCommand.java
@@ -33,6 +33,8 @@ import org.apache.stratos.cli.StratosCommandContext;
 import org.apache.stratos.cli.exception.CommandException;
 import org.apache.stratos.cli.utils.CliConstants;
 
+import static org.apache.stratos.cli.utils.CommandLineUtils.mergeOptionArrays;
+
 public class SubscribeCommand implements Command<StratosCommandContext> {
 
 	private static final Logger logger = LoggerFactory.getLogger(ListSubscribedCartridgesCommand.class);
@@ -75,6 +77,10 @@ public class SubscribeCommand implements Command<StratosCommandContext> {
         size.setArgName("volume-size");
         options.addOption(size);
 
+        Option volumeId = new Option(CliConstants.VOLUME_ID_OPTION, CliConstants.VOLUME_ID_LONG_OPTION, true, "Volume-id");
+        volumeId.setArgName("volume-id");
+        options.addOption(volumeId);
+
         Option persistance = new Option(CliConstants.PERSISTANCE_VOLUME_OPTION, CliConstants.PERSISTANCE_VOLUME_LONG_OPTION,
                 true, "Persistance-volume");
         persistance.setArgName("persistance-volume");
@@ -120,7 +126,7 @@ public class SubscribeCommand implements Command<StratosCommandContext> {
 		return "[Cartridge type] [Cartridge alias]";
 	}
 
-	public int execute(StratosCommandContext context, String[] args) throws CommandException {
+	public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
 		if (logger.isDebugEnabled()) {
 			logger.debug("Executing {} command...", getName());
 		}
@@ -133,6 +139,7 @@ public class SubscribeCommand implements Command<StratosCommandContext> {
             String depPolicy = null;
 			String repoURL = null, username = "", password = "";
             String size = null;
+            String volumeID = null;
 
             boolean removeOnTermination = false;
 			boolean privateRepo = false;
@@ -144,6 +151,8 @@ public class SubscribeCommand implements Command<StratosCommandContext> {
 			try {
 				commandLine = parser.parse(options, args);
 				remainingArgs = commandLine.getArgs();
+				//merge newly discovered options with previously discovered ones.
+				Options opts = mergeOptionArrays(already_parsed_opts, commandLine.getOptions());
 				if (remainingArgs != null && remainingArgs.length == 2) {
 					// Get type
 					type = remainingArgs[0];
@@ -157,70 +166,80 @@ public class SubscribeCommand implements Command<StratosCommandContext> {
 					logger.debug("Subscribing to {} cartridge with alias {}", type, alias);
 				}
 
-				//if (commandLine.hasOption(CliConstants.POLICY_OPTION)) {
+				//if (opts.hasOption(CliConstants.POLICY_OPTION)) {
 				//	if (logger.isTraceEnabled()) {
 				//		logger.trace("Policy option is passed");
 				//	}
-				//	policy = commandLine.getOptionValue(CliConstants.POLICY_OPTION);
+				//	policy = opts.getOptionValue(CliConstants.POLICY_OPTION);
 				//}
-                if (commandLine.hasOption(CliConstants.AUTOSCALING_POLICY_OPTION)) {
+                if (opts.hasOption(CliConstants.AUTOSCALING_POLICY_OPTION)) {
                     if (logger.isTraceEnabled()) {
                         logger.trace("Autoscaling policy option is passed");
                     }
-                    asPolicy = commandLine.getOptionValue(CliConstants.AUTOSCALING_POLICY_OPTION);
+                    asPolicy = opts.getOption(CliConstants.AUTOSCALING_POLICY_OPTION).getValue();
                 }
-                if (commandLine.hasOption(CliConstants.DEPLOYMENT_POLICY_OPTION)) {
+                if (opts.hasOption(CliConstants.DEPLOYMENT_POLICY_OPTION)) {
                     if (logger.isTraceEnabled()) {
                         logger.trace("Deployment policy option is passed");
                     }
-                    depPolicy = commandLine.getOptionValue(CliConstants.DEPLOYMENT_POLICY_OPTION);
+                    depPolicy = opts.getOption(CliConstants.DEPLOYMENT_POLICY_OPTION).getValue();
                 }
-				if (commandLine.hasOption(CliConstants.REPO_URL_OPTION)) {
+				if (opts.hasOption(CliConstants.REPO_URL_OPTION)) {
 					if (logger.isTraceEnabled()) {
 						logger.trace("RepoURL option is passed");
 					}
-					repoURL = commandLine.getOptionValue(CliConstants.REPO_URL_OPTION);
+					repoURL = opts.getOption(CliConstants.REPO_URL_OPTION).getValue();
 				}
-				//if (commandLine.hasOption(CliConstants.PRIVATE_REPO_OPTION)) {
+				//if (opts.hasOption(CliConstants.PRIVATE_REPO_OPTION)) {
 				//	if (logger.isTraceEnabled()) {
 				//		logger.trace("privateRepo option is passed");
 				//	}
 				//	privateRepo = true;
 				//}
-                if (commandLine.hasOption(CliConstants.VOLUME_SIZE_OPTION)) {
+                if (opts.hasOption(CliConstants.VOLUME_SIZE_OPTION)) {
                     if (logger.isTraceEnabled()) {
                         logger.trace("Volume size option is passed");
 
                     }
-                    size = commandLine.getOptionValue(CliConstants.VOLUME_SIZE_OPTION);
+                    size = opts.getOption(CliConstants.VOLUME_SIZE_OPTION).getValue();
                 }
-                if (commandLine.hasOption(CliConstants.REMOVE_ON_TERMINATION_OPTION)) {
+
+                if (opts.hasOption(CliConstants.VOLUME_ID_OPTION)) {
+                    if (logger.isTraceEnabled()) {
+                        logger.trace("Volume id option is passed");
+
+                    }
+                    volumeID = opts.getOption(CliConstants.VOLUME_ID_OPTION).getValue();
+                }
+
+
+                if (opts.hasOption(CliConstants.REMOVE_ON_TERMINATION_OPTION)) {
                     if (logger.isTraceEnabled()) {
                         logger.trace("Remove on termination option is passed");
 
                     }
                     removeOnTermination = true;
                 }
-                if (commandLine.hasOption(CliConstants.PERSISTANCE_VOLUME_OPTION)) {
+                if (opts.hasOption(CliConstants.PERSISTANCE_VOLUME_OPTION)) {
                     if (logger.isTraceEnabled()) {
                         logger.trace("Persistance volume option is passed");
 
                     }
                     persistanceMapping = true;
                 }
-				if (commandLine.hasOption(CliConstants.USERNAME_OPTION)) {
+				if (opts.hasOption(CliConstants.USERNAME_OPTION)) {
 					if (logger.isTraceEnabled()) {
 						logger.trace("Username option is passed");
 					}
-					username = commandLine.getOptionValue(CliConstants.USERNAME_OPTION);
+					username = opts.getOption(CliConstants.USERNAME_OPTION).getValue();
 				}
-				if (commandLine.hasOption(CliConstants.PASSWORD_OPTION)) {
+				if (opts.hasOption(CliConstants.PASSWORD_OPTION)) {
 					if (logger.isTraceEnabled()) {
 						logger.trace("Password option is passed");
 					}
-					password = commandLine.getOptionValue(CliConstants.PASSWORD_OPTION);
+					password = opts.getOption(CliConstants.PASSWORD_OPTION).getValue();
 				}
-				if (commandLine.hasOption(CliConstants.ENABLE_COMMITS_OPTION)) {
+				if (opts.hasOption(CliConstants.ENABLE_COMMITS_OPTION)) {
 					if (logger.isTraceEnabled()) {
 						logger.trace("Upstream git commits are enabled");
 					}
@@ -251,7 +270,7 @@ public class SubscribeCommand implements Command<StratosCommandContext> {
 
                 RestCommandLineService.getInstance().subscribe(type, alias, repoURL, privateRepo, username,
                 		password, asPolicy, depPolicy, size, removeOnTermination,
-                        persistanceMapping, commitsEnabled);
+                        persistanceMapping, commitsEnabled, volumeID);
 
 				return CliConstants.SUCCESSFUL_CODE;
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/SubscribedCartridgeInfoCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/SubscribedCartridgeInfoCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/SubscribedCartridgeInfoCommand.java
index cc002a3..2762b25 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/SubscribedCartridgeInfoCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/SubscribedCartridgeInfoCommand.java
@@ -18,12 +18,8 @@
  */
 package org.apache.stratos.cli.commands;
 
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.CommandLineParser;
-import org.apache.commons.cli.GnuParser;
 import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
-import org.apache.commons.cli.ParseException;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.stratos.cli.Command;
 import org.apache.stratos.cli.RestCommandLineService;
@@ -76,7 +72,7 @@ public class SubscribedCartridgeInfoCommand implements Command<StratosCommandCon
 	}
 
 	@Override
-	public int execute(StratosCommandContext context, String[] args) throws CommandException {
+	public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
 		if (logger.isDebugEnabled()) {
 			logger.debug("Executing {} command...", getName());
 		}

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/SyncCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/SyncCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/SyncCommand.java
index f866813..29c146f 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/SyncCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/SyncCommand.java
@@ -18,6 +18,7 @@
  */
 package org.apache.stratos.cli.commands;
 
+import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 import org.apache.stratos.cli.Command;
 import org.apache.stratos.cli.RestCommandLineService;
@@ -50,7 +51,7 @@ public class SyncCommand implements Command<StratosCommandContext> {
 	}
 
 	@Override
-	public int execute(StratosCommandContext context, String[] args) throws CommandException {
+	public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
 		if (logger.isDebugEnabled()) {
 			logger.debug("Executing {} command...", getName());
 		}

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/UndeployCartridgeDefinitionCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/UndeployCartridgeDefinitionCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/UndeployCartridgeDefinitionCommand.java
index 52f2a9a..e69880b 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/UndeployCartridgeDefinitionCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/UndeployCartridgeDefinitionCommand.java
@@ -18,6 +18,7 @@
  */
 package org.apache.stratos.cli.commands;
 
+import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 import org.apache.stratos.cli.Command;
 import org.apache.stratos.cli.RestCommandLineService;
@@ -51,7 +52,7 @@ public class UndeployCartridgeDefinitionCommand implements Command<StratosComman
     }
 
     @Override
-    public int execute(StratosCommandContext context, String[] args) throws CommandException {
+    public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
         if (logger.isDebugEnabled()) {
 			logger.debug("Executing {} command...", getName());
 		}

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/UndeployServiceDefinitionCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/UndeployServiceDefinitionCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/UndeployServiceDefinitionCommand.java
index c830052..7c05a8f 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/UndeployServiceDefinitionCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/UndeployServiceDefinitionCommand.java
@@ -18,6 +18,7 @@
  */
 package org.apache.stratos.cli.commands;
 
+import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 import org.apache.stratos.cli.Command;
 import org.apache.stratos.cli.RestCommandLineService;
@@ -51,7 +52,7 @@ public class UndeployServiceDefinitionCommand implements Command<StratosCommandC
     }
 
     @Override
-    public int execute(StratosCommandContext context, String[] args) throws CommandException {
+    public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
         if (logger.isDebugEnabled()) {
 			logger.debug("Executing {} command...", getName());
 		}

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/UnsubscribeCommand.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/UnsubscribeCommand.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/UnsubscribeCommand.java
index e63c799..20f3676 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/UnsubscribeCommand.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/commands/UnsubscribeCommand.java
@@ -32,6 +32,8 @@ import org.apache.stratos.cli.StratosCommandContext;
 import org.apache.stratos.cli.exception.CommandException;
 import org.apache.stratos.cli.utils.CliConstants;
 
+import static org.apache.stratos.cli.utils.CommandLineUtils.mergeOptionArrays;
+
 public class UnsubscribeCommand implements Command<StratosCommandContext> {
 
 	private static final Logger logger = LoggerFactory.getLogger(UnsubscribeCommand.class);
@@ -71,7 +73,7 @@ public class UnsubscribeCommand implements Command<StratosCommandContext> {
 	}
 
 	@Override
-	public int execute(StratosCommandContext context, String[] args) throws CommandException {
+	public int execute(StratosCommandContext context, String[] args, Option[] already_parsed_opts) throws CommandException {
 		if (logger.isDebugEnabled()) {
 			logger.debug("Executing {} command...", getName());
 		}
@@ -84,6 +86,9 @@ public class UnsubscribeCommand implements Command<StratosCommandContext> {
 			try {
 				commandLine = parser.parse(options, args);
 				remainingArgs = commandLine.getArgs();
+				//merge newly discovered options with previously discovered ones.
+				Options opts = mergeOptionArrays(already_parsed_opts, commandLine.getOptions());
+
 				if (remainingArgs != null && remainingArgs.length == 1) {
 					// Get alias
 					alias = remainingArgs[0];
@@ -95,7 +100,7 @@ public class UnsubscribeCommand implements Command<StratosCommandContext> {
 					return CliConstants.BAD_ARGS_CODE;
 				}
 
-				if (commandLine.hasOption(CliConstants.FORCE_OPTION)) {
+				if (opts.hasOption(CliConstants.FORCE_OPTION)) {
 					if (logger.isTraceEnabled()) {
 						logger.trace("Force option is passed");
 					}

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/utils/CliConstants.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/utils/CliConstants.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/utils/CliConstants.java
index 0f6a901..2e898f4 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/utils/CliConstants.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/utils/CliConstants.java
@@ -224,6 +224,9 @@ public class CliConstants {
     public static final String VOLUME_SIZE_OPTION = "v";
     public static final String VOLUME_SIZE_LONG_OPTION = "volume-size";
 
+    public static final String VOLUME_ID_OPTION = "vi";
+    public static final String VOLUME_ID_LONG_OPTION = "volume-id";
+
     public static final String PERSISTANCE_VOLUME_OPTION = "pv";
     public static final String PERSISTANCE_VOLUME_LONG_OPTION = "persistance-volume";
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/utils/CommandLineUtils.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/utils/CommandLineUtils.java b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/utils/CommandLineUtils.java
index 91e2251..d9747df 100644
--- a/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/utils/CommandLineUtils.java
+++ b/components/org.apache.stratos.cli/src/main/java/org/apache/stratos/cli/utils/CommandLineUtils.java
@@ -18,6 +18,9 @@
  */
 package org.apache.stratos.cli.utils;
 
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+
 import java.text.MessageFormat;
 import java.util.ResourceBundle;
 
@@ -91,4 +94,15 @@ public class CommandLineUtils {
 		}
 		return message;
 	}
+
+    public static Options mergeOptionArrays(Option[] a, Option[] b) {
+        Options opts = new Options();
+        for (Option o: a) {
+            opts.addOption(o);
+        }
+        for (Option o: b) {
+            opts.addOption(o);
+        }
+        return opts;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cli/src/main/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cli/src/main/resources/log4j.properties b/components/org.apache.stratos.cli/src/main/resources/log4j.properties
index c5d2084..15304ee 100644
--- a/components/org.apache.stratos.cli/src/main/resources/log4j.properties
+++ b/components/org.apache.stratos.cli/src/main/resources/log4j.properties
@@ -33,4 +33,4 @@ log4j.appender.file.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %c
 
 #Loggers
 log4j.rootLogger=info, file
-log4j.logger.org.wso2.carbon.adc.mgt.cli=info
+log4j.logger.org.wso2.carbon.adc.mgt.cli=DEBUG

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/InvalidCompositeApplicationDefinitionException.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/InvalidCompositeApplicationDefinitionException.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/InvalidCompositeApplicationDefinitionException.java
new file mode 100644
index 0000000..a7c2bb6
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/InvalidCompositeApplicationDefinitionException.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one 
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
+ * KIND, either express or implied.  See the License for the 
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.stratos.cloud.controller.exception;
+
+public class InvalidCompositeApplicationDefinitionException extends Exception {
+    
+    private static final long serialVersionUID = -1L;
+    private String message;
+    
+    public InvalidCompositeApplicationDefinitionException(String msg) {
+        super(msg);
+        this.setMessage(msg);
+    }
+    
+    public InvalidCompositeApplicationDefinitionException(String msg, Exception ex) {
+        super(msg, ex);
+        this.setMessage(msg);
+    }
+
+	public String getMessage() {
+		return message;
+	}
+
+	public void setMessage(String message) {
+		this.message = message;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/AWSEC2Iaas.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/AWSEC2Iaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/AWSEC2Iaas.java
index eafbade..e4d5477 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/AWSEC2Iaas.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/AWSEC2Iaas.java
@@ -22,6 +22,7 @@ import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 
+import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.cloud.controller.exception.CloudControllerException;
@@ -457,7 +458,7 @@ public class AWSEC2Iaas extends Iaas {
     }
 
 	@Override
-	public String createVolume(int sizeGB) {
+	public String createVolume(int sizeGB, String snapshotId) {
 		IaasProvider iaasInfo = getIaasProvider();
 
 		ComputeServiceContext context = iaasInfo.getComputeService()
@@ -474,7 +475,19 @@ public class AWSEC2Iaas extends Iaas {
 		
 		ElasticBlockStoreApi blockStoreApi = context.unwrapApi(AWSEC2Api.class).getElasticBlockStoreApiForRegion(region).get();
 		
-		Volume volume = blockStoreApi.createVolumeInAvailabilityZone(zone, sizeGB);
+		Volume volume;
+		if(StringUtils.isEmpty(snapshotId)){
+			if(log.isDebugEnabled()){
+        		log.info("Creating a volume in the zone " + zone);
+        	}
+			volume = blockStoreApi.createVolumeInAvailabilityZone(zone, sizeGB);
+		}else{
+			if(log.isDebugEnabled()){
+        		log.info("Creating a volume in the zone " + zone + " from the shanpshot " + snapshotId);
+        	}
+			volume = blockStoreApi.createVolumeFromSnapshotInAvailabilityZone(zone, snapshotId);
+		}
+		 
 		
 		if (volume == null) {
 			log.fatal("Volume creation was unsuccessful. [region] : " + region