You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by im...@apache.org on 2014/11/28 16:33:45 UTC

[14/15] stratos git commit: Refactoring cloud controller component to simplify the package structure

http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/deployment/partition/Partition.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/deployment/partition/Partition.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/deployment/partition/Partition.java
deleted file mode 100644
index 940bdea..0000000
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/deployment/partition/Partition.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * 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.deployment.partition;
-
-import org.apache.stratos.common.Properties;
-
-import java.io.Serializable;
-
-/**
- * The model class for Partition definition.
- */
-public class Partition implements Serializable{
-
-    private static final long serialVersionUID = 3725971214092010720L;
-    private int partitionMax;
-	private int partitionMin;
-	/**
-	 * provider should match with an IaasProvider type.
-	 */
-    private String provider;
-    private Properties properties = new Properties();
-    private String id;
-    private String description;
-    private boolean isPublic;
-
-
-    /**
-     * Gets the value of the partitionMax property.
-     * 
-     */
-    public int getPartitionMax() {
-        return partitionMax;
-    }
-
-    /**
-     * Sets the value of the partitionMax property.
-     * 
-     */
-    public void setPartitionMax(int value) {
-        this.partitionMax = value;
-    }
-
-    /**
-     * Gets the value of the partitionMin property.
-     * 
-     */
-    public int getPartitionMin() {
-        return partitionMin;
-    }
-
-    /**
-     * Sets the value of the partitionMin property.
-     * 
-     */
-    public void setPartitionMin(int value) {
-        this.partitionMin = value;
-    }
-
-    /**
-     * Gets the value of the id property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-	public String getId() {
-		return id;
-	}
-
-    /**
-     * Sets the value of the id property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-	public void setId(String id) {
-		this.id = id;
-	}
-	
-	/**
-     * Gets the value of the description property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-	public String getDescription() {
-		return description;
-	}
-	
-    /**
-     * Sets the value of the description property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-	public void setDescription(String description) {
-		this.description = description;
-	}
-	
-	/**
-     * Sets the value of the isPublic property.
-     * 
-     * @param value
-     *     allowed object is boolean
-     *     
-     */
-	public void setIsPublic(boolean isPublic) {
-		this.isPublic = isPublic;
-	}
-	
-	/**
-     * Gets the value of the isPublic property.
-     *          
-     */
-	public boolean getIsPublic() {
-		return isPublic;
-	}
-		
-	public Properties getProperties() {
-        return properties;
-    }
-
-    public void setProperties(Properties properties) {
-        this.properties = properties;
-    }
-
-    public String getProvider() {
-        return provider;
-    }
-
-	public void setProvider(String provider) {
-        this.provider = provider;
-    }
-	
-	@Override
-	public String toString() {
-		return "Partition [id=" + id + ", description=" + description + ", isPublic=" + isPublic 
-				+ ", provider=" + provider + ", partitionMin=" + partitionMin + ", partitionMax="
-				+ partitionMax + ", properties=" + properties + "]";
-	}
-    
-    public boolean equals(Object obj) {
-        if(obj != null && obj instanceof Partition) {
-            return this.id.equals(((Partition) obj).getId());
-        }
-        return false;
-        
-    }
-    
-    @Override
-    public int hashCode() {
-        return this.id.hashCode();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/AppType.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/AppType.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/AppType.java
new file mode 100644
index 0000000..7a8bb2d
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/AppType.java
@@ -0,0 +1,62 @@
+/*
+ * 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.domain;
+
+import java.io.Serializable;
+
+/**
+ * domain mapping related data.
+ *
+ */
+public class AppType implements Serializable{
+	
+    private static final long serialVersionUID = 3550489774139807168L;
+	private String name;
+	private boolean appSpecificMapping = true;
+	
+	public AppType(){
+		
+	}
+	
+	public AppType(String name){
+		this.setName(name);
+	}
+	
+	public AppType(String name, boolean appSpecificMapping){
+		this.setName(name);
+		this.setAppSpecificMapping(appSpecificMapping);
+	}
+
+	public String getName() {
+	    return name;
+    }
+
+	public void setName(String name) {
+	    this.name = name;
+    }
+
+	public boolean isAppSpecificMapping() {
+	    return appSpecificMapping;
+    }
+
+	public void setAppSpecificMapping(boolean appSpecificMapping) {
+	    this.appSpecificMapping = appSpecificMapping;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ApplicationClusterContextDTO.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ApplicationClusterContextDTO.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ApplicationClusterContextDTO.java
new file mode 100644
index 0000000..4258739
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ApplicationClusterContextDTO.java
@@ -0,0 +1,143 @@
+/*
+ * 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.domain;
+
+
+import org.apache.stratos.common.Properties;
+
+public class ApplicationClusterContextDTO {
+
+    // cluster id
+    private String clusterId;
+    // cartridge type
+    private String cartridgeType;
+    // payload as a String
+    private String textPayload;
+    // host name
+    private String hostName;
+    // flag to indicate LB cluster
+    private boolean isLbCluster;
+    // autoscaling policy
+    private String autoscalePolicyName;
+    // deployment policy
+    private String deploymentPolicyName;
+    // tenant rance
+    private String tenantRange;
+    // propertis
+    private Properties properties;
+
+
+    public ApplicationClusterContextDTO () {
+    }
+
+
+    public String getClusterId() {
+        return clusterId;
+    }
+
+    public void setClusterId(String clusterId) {
+        this.clusterId = clusterId;
+    }
+
+    public String getCartridgeType() {
+        return cartridgeType;
+    }
+
+    public void setCartridgeType(String cartridgeType) {
+        this.cartridgeType = cartridgeType;
+    }
+
+    public String getTextPayload() {
+        return textPayload;
+    }
+
+    public void setTextPayload(String textPayload) {
+        this.textPayload = textPayload;
+    }
+
+    public String getHostName() {
+        return hostName;
+    }
+
+    public void setHostName(String hostName) {
+        this.hostName = hostName;
+    }
+
+    public boolean isLbCluster() {
+        return isLbCluster;
+    }
+
+    public void setLbCluster(boolean lbCluster) {
+        isLbCluster = lbCluster;
+    }
+
+    public String getAutoscalePolicyName() {
+        return autoscalePolicyName;
+    }
+
+    public void setAutoscalePolicyName(String autoscalePolicyName) {
+        this.autoscalePolicyName = autoscalePolicyName;
+    }
+
+    public String getDeploymentPolicyName() {
+        return deploymentPolicyName;
+    }
+
+    public void setDeploymentPolicyName(String deploymentPolicyName) {
+        this.deploymentPolicyName = deploymentPolicyName;
+    }
+
+    public String getTenantRange() {
+        return tenantRange;
+    }
+
+    public void setTenantRange(String tenantRange) {
+        this.tenantRange = tenantRange;
+    }
+
+    public boolean equals(Object other) {
+
+        if(other == null || !(other instanceof ApplicationClusterContextDTO)) {
+            return false;
+        }
+
+        if (this == other) {
+            return true;
+        }
+
+        ApplicationClusterContextDTO that = (ApplicationClusterContextDTO)other;
+
+        return this.cartridgeType.equals(that.cartridgeType) &&
+                this.clusterId.equals(that.clusterId);
+    }
+
+    public int hashCode() {
+        return this.cartridgeType.hashCode() + this.clusterId.hashCode();
+    }
+
+    public Properties getProperties() {
+        return properties;
+    }
+
+    public void setProperties(Properties properties) {
+        this.properties = properties;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/Cartridge.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/Cartridge.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/Cartridge.java
new file mode 100644
index 0000000..da92b12
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/Cartridge.java
@@ -0,0 +1,404 @@
+/*
+ * 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.domain;
+
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.io.Serializable;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Holds information regarding a Cartridge.
+ */
+public class Cartridge implements Serializable{
+
+	private transient static final Log log = LogFactory.getLog(Cartridge.class);
+    private static final long serialVersionUID = 6637409027085059072L;
+
+	private String type;
+    
+    private String hostName;
+    
+    private String provider;
+    
+    private String displayName;
+    
+    private String description;
+    
+    private String baseDir;
+    
+    private String version;
+    
+    private boolean multiTenant;
+    
+    private String defaultAutoscalingPolicy;
+
+    private String defaultDeploymentPolicy;
+    
+    private LoadbalancerConfig lbConfig;
+    
+    private List<PortMapping> portMappings;
+    
+    private Persistence persistence;
+    
+    private List<AppType> appTypeMappings;
+    
+    private String serviceGroup;
+    
+    private String deployerType;
+    
+    /**
+     * Property map of this Cartridge.
+     */
+    private Map<String, String> properties;
+    
+    /**
+     * A Cartridge can have 1..n {@link IaasProvider}s
+     */
+    private List<IaasProvider> iaases;
+    
+    private List<String> deploymentDirs;
+    
+    private IaasProvider lastlyUsedIaas;
+
+    private String[] exportingProperties;
+
+    /**
+     * Key - partition id
+     * Value - Corresponding IaasProvider.
+     */
+    private Map<String, IaasProvider> partitionToIaasProvider;
+    
+    private Container container;
+    
+    public Cartridge(){
+    	init();
+    }
+    
+    public Cartridge(String type, String host, String provider, String version, boolean multiTenant) {
+        this.type = type;
+        this.hostName = host;
+        this.provider = provider;
+        this.version = version;
+        this.multiTenant = multiTenant;
+        init();
+    }
+    
+    private void init() {
+    	partitionToIaasProvider = new ConcurrentHashMap<String, IaasProvider>();
+    	portMappings = new ArrayList<PortMapping>();
+    	portMappings = new ArrayList<PortMapping>();
+    	appTypeMappings = new ArrayList<AppType>();
+    	properties = new HashMap<String, String>();
+    	iaases = new ArrayList<IaasProvider>();
+    	deploymentDirs = new ArrayList<String>();
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+    
+    public void addIaasProvider(String partitionId, IaasProvider iaasProvider) {
+        partitionToIaasProvider.put(partitionId, iaasProvider);
+    }
+    
+    public void addIaasProviders(Map<String, IaasProvider> map) {
+        for (Iterator<String> iterator = map.keySet().iterator(); iterator.hasNext();) {
+            String key = (String) iterator.next();
+            IaasProvider value = map.get(key);
+            
+            partitionToIaasProvider.put(key, value);
+            if(log.isDebugEnabled()) {
+            	log.debug("Partition map updated for the Cartridge: "+this.hashCode()+". "
+            			+ "Current Partition List: "+partitionToIaasProvider.keySet().toString());
+            }
+        }
+    }
+    
+    public IaasProvider getIaasProviderOfPartition(String partitionId) {
+    	if(log.isDebugEnabled()) {
+        	log.debug("Retrieving partition: "+partitionId+" for the Cartridge: "+this.hashCode()+". "
+        			+ "Current Partition List: "+partitionToIaasProvider.keySet().toString());
+        }
+        return partitionToIaasProvider.get(partitionId);
+    }
+    
+    public void addProperty(String key, String val) {
+        if (key != null && val != null) {
+            properties.put(key, val);
+        }
+    }
+
+    public Map<String, String> getProperties() {
+        return properties;
+    }
+    
+    public String getProperty(String key) {
+        return properties.get(key);
+    }
+
+    public void setProperties(Map<String, String> properties) {
+        this.properties = properties;
+    }
+    
+    public void addIaasProvider(IaasProvider iaas) {
+        for (IaasProvider anIaas : iaases) {
+            if(anIaas.equals(iaas)){
+                int idx = iaases.indexOf(anIaas);
+                iaases.remove(idx);
+                iaases.add(idx, iaas);
+                return;
+            }
+        }
+        this.iaases.add(iaas);
+    }
+    
+    public IaasProvider getIaasProvider(String iaasType){
+    	for (IaasProvider iaas : iaases) {
+	        if(iaas.getType().equals(iaasType)){
+	        	return iaas;
+	        }
+        }
+    	
+    	return null;
+    }
+
+    public List<IaasProvider> getIaases() {
+        return iaases;
+    }
+
+    @Override
+	public String toString() {
+		return "Cartridge [type=" + type + ", hostName=" + hostName
+				+ ", provider=" + provider + ", version=" + version
+				+ ", multiTenant=" + multiTenant
+				+ ", defaultAutoscalingPolicy=" + defaultAutoscalingPolicy
+				+ ", defaultDeploymentPolicy=" + defaultDeploymentPolicy
+				+ ", serviceGroup=" + serviceGroup + ", properties="
+				+ properties + ", partitionToIaasProvider="
+				+ partitionToIaasProvider + "]";
+	}
+
+	public void setIaases(List<IaasProvider> iaases) {
+        this.iaases = iaases;
+    }
+    
+	public boolean equals(Object obj) {
+		if (obj instanceof Cartridge) {
+			return this.type.equals(((Cartridge)obj).getType());
+		}
+		return false;
+	}
+    
+    public int hashCode() {
+        return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers
+            append(type).
+            toHashCode();
+    }
+
+    public IaasProvider getLastlyUsedIaas() {
+        return lastlyUsedIaas;
+    }
+
+    public void setLastlyUsedIaas(IaasProvider lastlyUsedIaas) {
+        this.lastlyUsedIaas = lastlyUsedIaas;
+    }
+
+	public String getDisplayName() {
+		return displayName;
+	}
+
+	public void setDisplayName(String displayName) {
+		this.displayName = displayName;
+	}
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+	public String getHostName() {
+	    return hostName;
+    }
+
+	public void setHostName(String hostName) {
+	    this.hostName = hostName;
+    }
+	
+	public void reset(){
+	}
+
+	public List<String> getDeploymentDirs() {
+	    return deploymentDirs;
+    }
+
+	public void setDeploymentDirs(List<String> deploymentDirs) {
+	    this.deploymentDirs = deploymentDirs;
+    }
+	
+	public void addDeploymentDir(String dir){
+		deploymentDirs.add(dir);
+	}
+	
+	public void addPortMapping(PortMapping mapping){
+		portMappings.add(mapping);
+	}
+	
+	public void addAppType(AppType type){
+		appTypeMappings.add(type);
+	}
+
+	public String getProvider() {
+	    return provider;
+    }
+
+	public void setProvider(String provider) {
+	    this.provider = provider;
+    }
+
+	public String getVersion() {
+		return version;
+	}
+
+	public void setVersion(String version) {
+		this.version = version;
+	}
+
+	public boolean isMultiTenant() {
+		return multiTenant;
+	}
+
+	public void setMultiTenant(boolean multiTenant) {
+		this.multiTenant = multiTenant;
+	}
+
+	public String getBaseDir() {
+	    return baseDir;
+    }
+
+	public void setBaseDir(String baseDir) {
+	    this.baseDir = baseDir;
+    }
+
+	public List<PortMapping> getPortMappings() {
+	    return portMappings;
+    }
+
+	public void setPortMappings(List<PortMapping> portMappings) {
+	    this.portMappings = portMappings;
+    }
+
+	public List<AppType> getAppTypeMappings() {
+    	return appTypeMappings;
+    }
+
+	public void setAppTypeMappings(List<AppType> appTypeMappings) {
+    	this.appTypeMappings = appTypeMappings;
+    }
+
+    public Map<String, IaasProvider> getPartitionToIaasProvider() {
+        return partitionToIaasProvider;
+    }
+
+    public void setPartitionToIaasProvider(Map<String, IaasProvider> partitionToIaasProvider) {
+        this.partitionToIaasProvider = partitionToIaasProvider;
+    }
+
+    public LoadbalancerConfig getLbConfig() {
+        return lbConfig;
+    }
+
+    public void setLbConfig(LoadbalancerConfig lbConfig) {
+        this.lbConfig = lbConfig;
+    }
+
+    public String getDefaultAutoscalingPolicy() {
+        return defaultAutoscalingPolicy;
+    }
+
+    public void setDefaultAutoscalingPolicy(String defaultAutoscalingPolicy) {
+        this.defaultAutoscalingPolicy = defaultAutoscalingPolicy;
+    }
+
+    /**
+	 * @return the persistence
+	 */
+    public Persistence getPersistence() {
+        return persistence;
+    }
+
+    /**
+	 * @param persistence the peristanceMappings to set
+	 */
+    public void setPersistence(Persistence persistence) {
+        this.persistence = persistence;
+    }
+
+    public String getDefaultDeploymentPolicy() {
+        return defaultDeploymentPolicy;
+    }
+
+    public void setDefaultDeploymentPolicy(String defaultDeploymentPolicy) {
+        this.defaultDeploymentPolicy = defaultDeploymentPolicy;
+    }
+
+	public String getServiceGroup() {
+		return serviceGroup;
+	}
+
+	public void setServiceGroup(String serviceGroup) {
+		this.serviceGroup = serviceGroup;
+	}
+
+	public Container getContainer() {
+		return container;
+	}
+
+	public void setContainer(Container container) {
+		this.container = container;
+	}
+
+	public String getDeployerType() {
+		return deployerType;
+	}
+
+	public void setDeployerType(String deployerType) {
+		this.deployerType = deployerType;
+	}
+
+
+    public String[] getExportingProperties() {
+        return exportingProperties;
+    }
+
+    public void setExportingProperties(String[] exportingProperties) {
+        this.exportingProperties = exportingProperties;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/CartridgeConfig.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/CartridgeConfig.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/CartridgeConfig.java
new file mode 100644
index 0000000..2513350
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/CartridgeConfig.java
@@ -0,0 +1,317 @@
+/*
+ * 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.domain;
+
+import java.io.Serializable;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.stratos.common.Properties;
+import org.apache.stratos.common.Property;
+
+/**
+ * This class is used as the pojo for supporting the service at CC,
+ * which is called by the Rest API in SM to deploy a cartridge definition
+ */
+public class CartridgeConfig implements Serializable {
+
+    private static final long serialVersionUID = 3455721779991902731L;
+
+    private String type;
+
+    private String hostName;
+
+    private String provider;
+
+    private String displayName;
+
+    private String description;
+
+    private String version;
+
+    private boolean multiTenant;
+    
+    private boolean isPublic;
+
+    private String baseDir;
+
+    private String[] deploymentDirs;
+
+    private PortMapping[] portMappings;
+    
+    private Persistence persistence;
+    
+    private String defaultAutoscalingPolicy;
+
+    private String defaultDeploymentPolicy;
+
+    private Properties properties;
+
+    private IaasConfig[] iaasConfigs;    
+    
+    private LoadbalancerConfig lbConfig;
+    
+    private String serviceGroup;
+    
+    private Container container;
+    private String[] exportingProperties;
+
+    private String deployerType;
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getHostName() {
+        return hostName;
+    }
+
+    public void setHostName(String hostName) {
+        this.hostName = hostName;
+    }
+
+    public String getProvider() {
+        return provider;
+    }
+
+    public void setProvider(String provider) {
+        this.provider = provider;
+    }
+
+    public String getDisplayName() {
+        return displayName;
+    }
+
+    public void setDisplayName(String displayName) {
+        this.displayName = displayName;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    public boolean isMultiTenant() {
+        return multiTenant;
+    }
+
+    public void setMultiTenant(boolean multiTenant) {
+        this.multiTenant = multiTenant;
+    }
+    
+    public boolean getIsPublic() {
+        return isPublic;
+    }
+
+    public void setisPublic(boolean isPublic) {
+        this.isPublic = isPublic;
+    }
+
+    public String getBaseDir() {
+        return baseDir;
+    }
+
+    public void setBaseDir(String baseDir) {
+        this.baseDir = baseDir;
+    }
+
+    public String[] getDeploymentDirs() {
+        return deploymentDirs;
+    }
+
+    public void setDeploymentDirs(String[] deploymentDirs) {
+        this.deploymentDirs = ArrayUtils.clone(deploymentDirs);
+    }
+
+    public PortMapping[] getPortMappings() {
+        return portMappings;
+    }
+
+    public void setPortMappings(PortMapping[] portMappings) {
+        this.portMappings = ArrayUtils.clone(portMappings);
+    }
+
+    public Properties getProperties() {
+        return properties;
+    }
+
+    public void setProperties(Properties properties) {
+        this.properties = properties;
+    }
+
+    public IaasConfig[] getIaasConfigs() {
+        return iaasConfigs;
+    }
+
+    public void setIaasConfigs(IaasConfig[] iaasConfigs) {
+        this.iaasConfigs = ArrayUtils.clone(iaasConfigs);
+    }
+
+    public String toString () {
+
+        return "Type: " + type + ", Provider: " + provider + ", Host: " + hostName + ", Display Name: " + displayName +
+                ", Description: " + description +  ", Version: " + version + ", Multitenant " + multiTenant + ", IsPublic " + isPublic +
+                "\n Deployment: " + getDeploymentDetails() + "\n PortMapping: " + getPortMappingDetails() +
+                "\n IaaS: " +  getIaasConfigDetails() + "\n Properties: " + getPropertyDetails();
+    }
+
+    private String getDeploymentDetails () {
+
+        StringBuilder deploymentDetailBuilder = new StringBuilder();
+        deploymentDetailBuilder.append("Base direcotry: " + getBaseDir());
+        if(deploymentDirs != null) {
+            if(deploymentDirs.length > 0) {
+                deploymentDetailBuilder.append(" Direcotries: ");
+                for (String directory : deploymentDirs) {
+                    deploymentDetailBuilder.append(directory + " | ");
+                }
+            }
+        }
+
+        return  deploymentDetailBuilder.toString();
+    }
+
+    private String getPortMappingDetails () {
+
+        StringBuilder portMappingDetailBuilder = new StringBuilder();
+        if(portMappings != null) {
+            if(portMappings.length > 0) {
+                for (PortMapping portMapping : portMappings) {
+                    portMappingDetailBuilder.append(portMapping.toString() + " | ");
+                }
+            }
+        }
+        return portMappingDetailBuilder.toString();
+    }
+
+    private String getIaasConfigDetails () {
+
+        StringBuilder iaasConfigDetailBuilder = new StringBuilder();
+        if(iaasConfigs != null) {
+            if(iaasConfigs.length > 0) {
+                for (IaasConfig iaasConfig : iaasConfigs) {
+                    iaasConfigDetailBuilder.append(iaasConfig.toString() + " | ");
+                }
+            }
+        }
+        return iaasConfigDetailBuilder.toString();
+    }
+
+    private String getPropertyDetails () {
+
+        StringBuilder propertyDetailBuilder = new StringBuilder();
+        if(properties != null) {
+            Property[] propertyArray = properties.getProperties();
+            if (propertyArray.length > 0) {
+                for (Property property : propertyArray) {
+                    propertyDetailBuilder.append(property.toString() + " | ");
+                }
+            }
+        }
+        return propertyDetailBuilder.toString();
+    }
+
+    public LoadbalancerConfig getLbConfig() {
+        return lbConfig;
+    }
+
+    public void setLbConfig(LoadbalancerConfig lbConfig) {
+        this.lbConfig = lbConfig;
+    }
+
+    public String getDefaultAutoscalingPolicy() {
+        return defaultAutoscalingPolicy;
+    }
+
+    public void setDefaultAutoscalingPolicy(String defaultAutoscalingPolicy) {
+        this.defaultAutoscalingPolicy = defaultAutoscalingPolicy;
+    }
+
+    public String getDefaultDeploymentPolicy() {
+        return defaultDeploymentPolicy;
+    }
+
+    public void setDefaultDeploymentPolicy(String defaultDeploymentPolicy) {
+        this.defaultDeploymentPolicy = defaultDeploymentPolicy;
+    }
+
+    /**
+	 * @return the persistence
+	 */
+    public Persistence getPersistence() {
+        return persistence;
+    }
+
+    /**
+	 * @param persistence the persistanceMappings to set
+	 */
+    public void setPersistence(Persistence persistence) {
+        this.persistence = persistence;
+    }
+
+	public String getServiceGroup() {
+		return serviceGroup;
+	}
+
+	public void setServiceGroup(String serviceGroup) {
+		this.serviceGroup = serviceGroup;
+	}
+
+
+    public String[] getExportingProperties() {
+        return exportingProperties;
+    }
+
+    public void setExportingProperties(String[] exportingProperties) {
+        this.exportingProperties = exportingProperties;
+    }
+
+	public Container getContainer() {
+		return container;
+	}
+
+	public void setContainer(Container container) {
+		this.container = container;
+	}
+
+	public String getDeployerType() {
+		return deployerType;
+	}
+
+	public void setDeployerType(String deployerType) {
+		this.deployerType = deployerType;
+	}	
+	
+    
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/CartridgeInfo.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/CartridgeInfo.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/CartridgeInfo.java
new file mode 100644
index 0000000..e35f357
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/CartridgeInfo.java
@@ -0,0 +1,232 @@
+/*
+ * 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.domain;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.stratos.common.Property;
+
+/**
+ * Holds useful information for externals, regarding a Cartridge.
+ */
+public class CartridgeInfo {
+
+    private String type;
+    
+    private String hostName;
+    
+    private String displayName;
+    
+    private String description;
+    
+    private String[] deploymentDirs;
+    
+    private PortMapping[] portMappings;
+    
+    private AppType[] appTypes;
+    
+    private String provider;
+    
+    private String version;
+    
+    private boolean multiTenant;
+    
+    private boolean isPublic;
+    
+    private String baseDir;
+    
+    private Property[] properties;
+    
+    private String defaultAutoscalingPolicy;
+
+    private String defaultDeploymentPolicy;
+    
+    private LoadbalancerConfig lbConfig;
+
+    private Persistence persistence;
+
+    private String serviceGroup;
+
+    public CartridgeInfo(){
+    	
+    }
+    
+    public CartridgeInfo(String type, String host, String desc, List<String> deploymentDirs, String provider) {
+        this.type = type;
+        this.hostName = host;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getDisplayName() {
+		return displayName;
+	}
+
+	public void setDisplayName(String displayName) {
+		this.displayName = displayName;
+	}
+
+	public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+	public String getHostName() {
+	    return hostName;
+    }
+
+	public void setHostName(String hostName) {
+	    this.hostName = hostName;
+    }
+
+	public String[] getDeploymentDirs() {
+	    return deploymentDirs;
+    }
+
+	public void setDeploymentDirs(List<String> deploymentDirsList) {
+		if(deploymentDirsList == null){
+			deploymentDirsList = new ArrayList<String>();
+		}
+	    this.deploymentDirs = new String[deploymentDirsList.size()];
+	    
+	    deploymentDirsList.toArray(deploymentDirs);
+	    
+    }
+	
+    public String getProvider() {
+	    return provider;
+    }
+
+	public void setProvider(String provider) {
+	    this.provider = provider;
+    }
+
+	public String getVersion() {
+		return version;
+	}
+
+	public void setVersion(String version) {
+		this.version = version;
+	}
+
+	public boolean isMultiTenant() {
+		return multiTenant;
+	}
+
+	public void setMultiTenant(boolean multiTenant) {
+		this.multiTenant = multiTenant;
+	}
+	
+	public boolean getIsPublic() {
+		return isPublic;
+	}
+
+	public void setIsPublic(boolean isPublic) {
+		this.isPublic = isPublic;
+	}
+
+	public String getBaseDir() {
+	    return baseDir;
+    }
+
+	public void setBaseDir(String baseDir) {
+	    this.baseDir = baseDir;
+    }
+
+	public PortMapping[] getPortMappings() {
+	    return portMappings;
+    }
+
+	public void setPortMappings(PortMapping[] portMappings) {
+	    this.portMappings = ArrayUtils.clone(portMappings);
+    }
+
+	public AppType[] getAppTypes() {
+	    return appTypes;
+    }
+
+	public void setAppTypes(AppType[] appTypes) {
+	    this.appTypes = ArrayUtils.clone(appTypes);
+    }
+
+	public Property[] getProperties() {
+	    return properties;
+    }
+
+	public void setProperties(Property[] properties) {
+	    this.properties = ArrayUtils.clone(properties);
+    }
+
+    public String getDefaultAutoscalingPolicy() {
+        return defaultAutoscalingPolicy;
+    }
+
+    public void setDefaultAutoscalingPolicy(String defaultAutoscalingPolicy) {
+        this.defaultAutoscalingPolicy = defaultAutoscalingPolicy;
+    }
+
+    public LoadbalancerConfig getLbConfig() {
+        return lbConfig;
+    }
+
+    public void setLbConfig(LoadbalancerConfig lbConfig) {
+        this.lbConfig = lbConfig;
+    }
+
+    public String getDefaultDeploymentPolicy() {
+        return defaultDeploymentPolicy;
+    }
+
+    public void setDefaultDeploymentPolicy(String defaultDeploymentPolicy) {
+        this.defaultDeploymentPolicy = defaultDeploymentPolicy;
+    }
+
+     /**
+	 * @return the persistence
+	 */
+    public Persistence getPersistence() {
+        return persistence;
+    }
+
+    /**
+	 * @param persistence the persistanceMappings to set
+	 */
+    public void setPersistence(Persistence persistence) {
+        this.persistence = persistence;
+    }
+
+    public String getServiceGroup() {
+        return serviceGroup;
+    }
+
+    public void setServiceGroup(String serviceGroup) {
+        this.serviceGroup = serviceGroup;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/CartridgeInstanceData.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/CartridgeInstanceData.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/CartridgeInstanceData.java
new file mode 100644
index 0000000..695d4bd
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/CartridgeInstanceData.java
@@ -0,0 +1,120 @@
+/*
+ * 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.domain;
+
+import org.jclouds.compute.domain.NodeMetadata;
+
+/**
+ * This class holds the data to be published to BAM.
+ */
+public class CartridgeInstanceData {
+
+    // Cartridge type
+    private String type;
+    
+    private String nodeId;
+    
+    private String domain;
+    
+    private String iaas;
+    
+    private String status;
+    
+    private String tenantRange;
+    
+    private String alias;
+    
+    private boolean isMultiTenant;
+    
+    private NodeMetadata metaData;
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getNodeId() {
+        return nodeId;
+    }
+
+    public void setNodeId(String nodeId) {
+        this.nodeId = nodeId;
+    }
+
+    public String getDomain() {
+        return domain;
+    }
+
+    public void setDomain(String domain) {
+        this.domain = domain;
+    }
+
+    public String getIaas() {
+        return iaas;
+    }
+
+    public void setIaas(String iaas) {
+        this.iaas = iaas;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public NodeMetadata getMetaData() {
+        return metaData;
+    }
+
+    public void setMetaData(NodeMetadata metaData) {
+        this.metaData = metaData;
+    }
+
+    public String getTenantRange() {
+        return tenantRange;
+    }
+
+    public void setTenantRange(String tenantRange) {
+        this.tenantRange = tenantRange;
+    }
+
+    public boolean isMultiTenant() {
+        return isMultiTenant;
+    }
+
+    public void setMultiTenant(boolean isMultiTenant) {
+        this.isMultiTenant = isMultiTenant;
+    }
+
+    public String getAlias() {
+        return alias;
+    }
+
+    public void setAlias(String alias) {
+        this.alias = alias;
+    }
+    
+    
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ClusterContext.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ClusterContext.java
new file mode 100644
index 0000000..06e48cc
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ClusterContext.java
@@ -0,0 +1,132 @@
+/*
+ * 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.domain;
+
+import java.io.Serializable;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.stratos.common.Properties;
+
+/**
+ * Holds runtime data of a Cluster.
+ *
+ *
+ */
+public class ClusterContext implements Serializable{
+
+    private static final long serialVersionUID = 4830667953031229223L;
+    // cluster id
+    private String clusterId;
+    // cartridge type
+    private String cartridgeType;
+    // payload as a String
+    private String payload;
+    private String hostName;
+    private boolean isLbCluster;
+    private boolean isVolumeRequired;
+    private Volume[] volumes;
+    // timeout in milliseconds - this would be the per member time that CC waits before forcefully terminate instances on an unregistration.
+    private long timeoutInMillis;
+    private Properties properties;
+
+    public ClusterContext(String clusterId, String cartridgeType, String payload, String hostName, 
+    		boolean isLbCluster, Properties properties) {
+        this.clusterId = clusterId;
+        this.cartridgeType = cartridgeType;
+        this.payload = payload;
+        this.setHostName(hostName);
+        this.isLbCluster = isLbCluster;
+        this.setProperties(properties);
+    }
+    
+    public String getClusterId() {
+        return clusterId;
+    }
+    public void setClusterId(String clusterId) {
+        this.clusterId = clusterId;
+    }
+    public String getCartridgeType() {
+        return cartridgeType;
+    }
+    public void setCartridgeType(String cartridgeType) {
+        this.cartridgeType = cartridgeType;
+    }
+    public String getPayload() {
+        return payload;
+    }
+    public void setPayload(String payload) {
+        this.payload = payload;
+    }
+
+    public String getHostName() {
+        return hostName;
+    }
+
+    public void setHostName(String hostName) {
+        this.hostName = hostName;
+    }
+
+	public boolean isLbCluster() {
+		return isLbCluster;
+	}
+
+	public void setLbCluster(boolean isLbCluster) {
+		this.isLbCluster = isLbCluster;
+	}
+	
+	public boolean isVolumeRequired() {
+		return isVolumeRequired;
+	}
+
+	public void setVolumeRequired(boolean isVolumeRequired) {
+		this.isVolumeRequired = isVolumeRequired;
+	}
+
+	public long getTimeoutInMillis() {
+		return timeoutInMillis;
+	}
+
+	public void setTimeoutInMillis(long timeoutInMillis) {
+		this.timeoutInMillis = timeoutInMillis;
+	}
+
+	public Volume[] getVolumes() {
+		return volumes;
+	}
+
+	public void setVolumes(Volume[] volumes) {
+		this.volumes = ArrayUtils.clone(volumes);
+	}
+
+	public Properties getProperties() {
+		return properties;
+	}
+
+	public void setProperties(Properties properties) {
+		this.properties = properties;
+	}
+	
+	/*public void addProperty(String key, int value) {
+		this.properties.put(key, value);
+	}
+	
+	public void addProperty(String key, String value) {
+		this.properties.put(key, value);
+	}*/
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/CompositeApplicationDefinition.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/CompositeApplicationDefinition.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/CompositeApplicationDefinition.java
new file mode 100644
index 0000000..62d46ce
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/CompositeApplicationDefinition.java
@@ -0,0 +1,38 @@
+package org.apache.stratos.cloud.controller.domain;
+
+import java.io.Serializable;
+
+public class CompositeApplicationDefinition  implements Serializable {
+	
+	private static final long serialVersionUID = 1L;
+	private String applicationId;
+	private String alias;
+	private ConfigGroup[] components;
+	private ConfigCartridge [] cartridges;
+	public ConfigCartridge[] getCartridges() {
+		return cartridges;
+	}
+	public void setCartridges(ConfigCartridge[] cartridges) {
+		this.cartridges = cartridges;
+	}
+	public String getApplicationId() {
+		return applicationId;
+	}
+	public void setApplicationId(String applicationId) {
+		this.applicationId = applicationId;
+	}
+	public String getAlias() {
+		return alias;
+	}
+	public void setAlias(String alias) {
+		this.alias = alias;
+	}
+	public ConfigGroup[]  getComponents() {
+		return components;
+	}
+	public void setComponents(ConfigGroup[]  components) {
+		this.components = components;
+	}
+	
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ConfigCartridge.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ConfigCartridge.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ConfigCartridge.java
new file mode 100644
index 0000000..d69b90b
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ConfigCartridge.java
@@ -0,0 +1,17 @@
+package org.apache.stratos.cloud.controller.domain;
+
+import java.io.Serializable;
+
+
+public class ConfigCartridge  implements Serializable {
+	private String alias;
+	private static final long serialVersionUID = 1L;
+
+	public String getAlias() {
+		return alias;
+	}
+
+	public void setAlias(String alias) {
+		this.alias = alias;
+	}
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ConfigDependencies.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ConfigDependencies.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ConfigDependencies.java
new file mode 100644
index 0000000..e3abad4
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ConfigDependencies.java
@@ -0,0 +1,26 @@
+package org.apache.stratos.cloud.controller.domain;
+
+import java.io.Serializable;
+
+
+public class ConfigDependencies  implements Serializable  {
+	private ConfigDependencyPair[] startup_order;
+	private String kill_behavior;
+	private static final long serialVersionUID = 1L;
+	
+	public ConfigDependencyPair[]  getStartup_order() {
+		return startup_order;
+	}
+	public void setStartup_order(ConfigDependencyPair[]  startup_order) {
+		this.startup_order = startup_order;
+	}
+	public String getKill_behavior() {
+		return kill_behavior;
+	}
+	public void setKill_behavior(String kill_behavior) {
+		this.kill_behavior = kill_behavior;
+	}
+
+
+	
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ConfigDependencyPair.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ConfigDependencyPair.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ConfigDependencyPair.java
new file mode 100644
index 0000000..6a8c1d0
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ConfigDependencyPair.java
@@ -0,0 +1,29 @@
+package org.apache.stratos.cloud.controller.domain;
+
+import java.io.Serializable;
+
+public class ConfigDependencyPair  implements Serializable {
+	private String key;
+	private String value;
+	private static final long serialVersionUID = 1L;
+	
+	public ConfigDependencyPair() {}
+	
+	public ConfigDependencyPair(String key, String value) {
+		this.key = key;
+		this.value = value;
+	}
+	
+	public String getKey() {
+		return key;
+	}
+	public void setKey(String key) {
+		this.key = key;
+	}
+	public String getValue() {
+		return value;
+	}
+	public void setValue(String value) {
+		this.value = value;
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ConfigGroup.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ConfigGroup.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ConfigGroup.java
new file mode 100644
index 0000000..3d827f7
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ConfigGroup.java
@@ -0,0 +1,33 @@
+package org.apache.stratos.cloud.controller.domain;
+
+import java.io.Serializable;
+
+
+public class ConfigGroup  implements Serializable {
+	private  String alias;
+	private  String[] subscribables;
+	private ConfigDependencies dependencies;
+	private static final long serialVersionUID = 1L;
+	
+	public String getAlias() {
+		return alias;
+	}
+	public void setAlias(String alias) {
+		this.alias = alias;
+	}
+	public String[] getSubscribables() {
+		return subscribables;
+	}
+	public void setSubscribables(String[] subscribables) {
+		this.subscribables = subscribables;
+	}
+	public ConfigDependencies getDependencies() {
+		return dependencies;
+	}
+	public void setDependencies(ConfigDependencies dependencies) {
+		this.dependencies = dependencies;
+	}
+
+
+	
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/Container.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/Container.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/Container.java
new file mode 100644
index 0000000..5cb8708
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/Container.java
@@ -0,0 +1,59 @@
+/*
+ * 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.domain;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Container implements Serializable {
+
+	private static final long serialVersionUID = 2232204459987683768L;
+
+	private String imageName;
+	
+	private String dockerFileRepo;
+	
+	private Map<String, String> properties = new HashMap<String, String>();
+
+	public String getImageName() {
+		return imageName;
+	}
+
+	public void setImageName(String imageName) {
+		this.imageName = imageName;
+	}
+
+	public String getDockerFileRepo() {
+		return dockerFileRepo;
+	}
+
+	public void setDockerFileRepo(String dockerFileRepo) {
+		this.dockerFileRepo = dockerFileRepo;
+	}
+
+	public Map<String, String> getProperties() {
+		return properties;
+	}
+
+	public void setProperties(Map<String, String> properties) {
+		this.properties = properties;
+	}
+	
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ContainerClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ContainerClusterContext.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ContainerClusterContext.java
new file mode 100644
index 0000000..de7dd84
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ContainerClusterContext.java
@@ -0,0 +1,89 @@
+/*
+ * 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.domain;
+
+import org.apache.stratos.common.Properties;
+
+import java.io.Serializable;
+
+/**
+ * Holds information about a container cluster to be started.
+ *
+ */
+public class ContainerClusterContext implements Serializable {
+
+    private static final long serialVersionUID = -388327475844701869L;
+    // cluster id this Pod belongs to
+    private String clusterId;
+    // properties
+    private Properties properties;
+    
+    public ContainerClusterContext() {
+    }
+    
+    public ContainerClusterContext(String clusterId) {
+        this.clusterId = clusterId;
+    }
+    
+    public String getClusterId() {
+        return clusterId;
+    }
+    public void setClusterId(String clusterId) {
+        this.clusterId = clusterId;
+    }
+    public Properties getProperties() {
+        return properties;
+    }
+
+    public void setProperties(Properties properties) {
+        this.properties = properties;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((clusterId == null) ? 0 : clusterId.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        ContainerClusterContext other = (ContainerClusterContext) obj;
+        if (clusterId == null) {
+            if (other.clusterId != null)
+                return false;
+        } else if (!clusterId.equals(other.clusterId))
+            return false;
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "ContainerClusterContext [clusterId=" + clusterId + ", properties=" + properties
+                + "]";
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/DataPublisherConfig.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/DataPublisherConfig.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/DataPublisherConfig.java
new file mode 100644
index 0000000..735dbdc
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/DataPublisherConfig.java
@@ -0,0 +1,85 @@
+/*
+ * 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.domain;
+
+import java.io.Serializable;
+
+import org.apache.stratos.cloud.controller.util.CloudControllerConstants;
+
+/**
+ *
+ *
+ */
+public class DataPublisherConfig implements Serializable{
+
+    private static final long serialVersionUID = -2097472019584151205L;
+    private String bamUsername = CloudControllerConstants.DEFAULT_BAM_SERVER_USER_NAME;
+    private String bamPassword = CloudControllerConstants.DEFAULT_BAM_SERVER_PASSWORD;
+    private String dataPublisherCron = CloudControllerConstants.PUB_CRON_EXPRESSION;
+    private String cassandraConnUrl = CloudControllerConstants.DEFAULT_CASSANDRA_URL;
+    private String cassandraUser = CloudControllerConstants.DEFAULT_CASSANDRA_USER;
+    private String cassandraPassword = CloudControllerConstants.DEFAULT_CASSANDRA_PASSWORD;
+    
+    public String getBamUsername() {
+        return bamUsername;
+    }
+
+    public void setBamUsername(String bamUsername) {
+        this.bamUsername = bamUsername;
+    }
+
+    public String getBamPassword() {
+        return bamPassword;
+    }
+
+    public void setBamPassword(String bamPassword) {
+        this.bamPassword = bamPassword;
+    }
+
+    public String getDataPublisherCron() {
+        return dataPublisherCron;
+    }
+
+    public void setDataPublisherCron(String dataPublisherCron) {
+        this.dataPublisherCron = dataPublisherCron;
+    }
+    public String getCassandraConnUrl() {
+        return cassandraConnUrl;
+    }
+
+    public void setCassandraConnUrl(String cassandraHostAddr) {
+        this.cassandraConnUrl = cassandraHostAddr;
+    }
+
+    public String getCassandraUser() {
+        return cassandraUser;
+    }
+
+    public void setCassandraUser(String cassandraUser) {
+        this.cassandraUser = cassandraUser;
+    }
+
+    public String getCassandraPassword() {
+        return cassandraPassword;
+    }
+
+    public void setCassandraPassword(String cassandraPassword) {
+        this.cassandraPassword = cassandraPassword;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/Dependencies.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/Dependencies.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/Dependencies.java
new file mode 100644
index 0000000..a04fb91
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/Dependencies.java
@@ -0,0 +1,48 @@
+/*
+ * 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.domain;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class Dependencies implements Serializable {
+
+	private static final long serialVersionUID = 4187267350546153680L;
+	
+	private String [] startupOrders;
+
+    private String killBehaviour;
+
+    public String getKillBehaviour() {
+        return killBehaviour;
+    }
+
+    public void setKillBehaviour(String killBehaviour) {
+        this.killBehaviour = killBehaviour;
+    }
+
+	public String[] getStartupOrders() {
+		return startupOrders;
+	}
+
+	public void setStartupOrders(String[] startupOrders) {
+		this.startupOrders = startupOrders;
+	}
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/IaasConfig.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/IaasConfig.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/IaasConfig.java
new file mode 100644
index 0000000..6725f29
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/IaasConfig.java
@@ -0,0 +1,174 @@
+/*
+ * 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.domain;
+
+import java.io.Serializable;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.stratos.common.Properties;
+import org.apache.stratos.common.Property;
+
+/**
+ * This class is used to support <link>CartridgeConfig</link>
+ * class for the Rest API
+ */
+public class IaasConfig implements Serializable {
+
+
+    private static final long serialVersionUID = 3329046207651171707L;
+
+    private String type;
+   
+    private String className;
+   
+    private String name;
+   
+    private String provider, identity, credential;
+   
+    private String imageId;
+
+    private int maxInstanceLimit;
+
+    private Properties properties;
+    
+    private NetworkInterfaces networkInterfaces;
+    
+    private byte[] payload;
+
+    public String getClassName() {
+        return className;
+    }
+    
+    public void setClassName(String className) {
+        this.className = className;
+    }
+    
+    public String getName() {
+        return name;
+    }
+    
+    public void setName(String name) {
+        this.name = name;
+    }
+    
+    public String getProvider() {
+        return provider;
+    }
+    
+    public void setProvider(String provider) {
+        this.provider = provider;
+    }
+    
+    public String getIdentity() {
+        return identity;
+    }
+    
+    public void setIdentity(String identity) {
+        this.identity = identity;
+    }
+    
+    public String getCredential() {
+        return credential;
+    }
+    
+    public void setCredential(String credential) {
+        this.credential = credential;
+    }
+    
+    public byte[] getPayload() {
+        return payload;
+    }
+    
+    public void setPayload(byte[] payload) {
+        this.payload = ArrayUtils.clone(payload);
+    }
+    
+    public static long getSerialversionuid() {
+        return serialVersionUID;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getImageId() {
+        return imageId;
+    }
+
+    public void setImageId(String imageId) {
+        this.imageId = imageId;
+    }
+
+    public int getMaxInstanceLimit() {
+        return maxInstanceLimit;
+    }
+
+    public void setMaxInstanceLimit(int maxInstanceLimit) {
+        this.maxInstanceLimit = maxInstanceLimit;
+    }
+
+    public Properties getProperties() {
+        return properties;
+    }
+
+    public void setProperties(Properties properties) {
+        this.properties = properties;
+    }
+
+    public String toString () {
+
+        return " [ Type: " + type + ", Name: " + name + ", Class Name: " + className + ", Image Id: " + imageId +
+                ", Max Instance Limit: " + maxInstanceLimit + ", Provider: " + provider + ", Identity: " + identity +
+                ", Credentials: " + credential + ", Properties: " + getIaasProperties() + " ] ";
+    }
+
+    private String getIaasProperties () {
+
+        StringBuilder iaasPropertyBuilder = new StringBuilder();
+        if (properties != null) {
+            Property[] propertyArray = properties.getProperties();
+            if(propertyArray.length > 0) {
+                for (Property property : propertyArray) {
+                    iaasPropertyBuilder.append(property.toString() + " | ");
+                }
+            }
+        }
+        return iaasPropertyBuilder.toString();
+    }
+
+    /**
+     * @return the networkInterfaces
+     */
+    public NetworkInterfaces getNetworkInterfaces() {
+        return networkInterfaces;
+    }
+
+    /**
+     * @param networkInterfaces the networkInterfaces to set
+     */
+    public void setNetworkInterfaces(NetworkInterfaces networkInterfaces) {
+        this.networkInterfaces = networkInterfaces;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/IaasProvider.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/IaasProvider.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/IaasProvider.java
new file mode 100644
index 0000000..3cf25fb
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/IaasProvider.java
@@ -0,0 +1,265 @@
+/*
+ * 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.domain;
+
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.stratos.cloud.controller.exception.InvalidIaasProviderException;
+import org.apache.stratos.cloud.controller.iaas.Iaas;
+import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
+import org.jclouds.compute.ComputeService;
+import org.jclouds.compute.domain.Template;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * This is the basic data structure which holds an IaaS specific details.
+ * NOTE: If you add a new attribute, please assign it in the constructor too.
+ */
+public class IaasProvider implements Serializable{
+   
+    private static final long serialVersionUID = -940288190885166118L;
+
+	/**
+     * Type of the IaasProvider.
+     */
+    private String type;
+
+
+    /**
+     * Fully qualified class name of an implementation of {@link org.apache.stratos.cloud.controller.iaas.Iaas}
+     */
+    private String className;
+    
+    /**
+     * human description of this IaaS provider
+     */
+    private String name;
+    
+    /**
+     * Property map of this IaaS provider.
+     */
+    private Map<String, String> properties = new HashMap<String, String>();
+    
+    /**
+     * Network Interfaces Configuration
+     */
+    private NetworkInterface[] networkInterfaces;
+    
+    /**
+     * Image identifier.
+     */
+    private String image;
+    
+    private String provider, identity, credential;
+    
+    private transient ComputeService computeService;
+    
+    private transient Template template;
+    
+    private byte[] payload;
+    
+    /** 
+     * Corresponding {@link org.apache.stratos.cloud.controller.iaas.Iaas} implementation
+     */
+    private transient Iaas iaas;
+    
+    public IaasProvider(){}
+    
+    public IaasProvider(IaasProvider anIaasProvider){
+    	this.type = anIaasProvider.getType();
+    	this.name = anIaasProvider.getName();
+    	this.className = anIaasProvider.getClassName();
+    	this.properties = new HashMap<String,String>(anIaasProvider.getProperties());
+    	this.networkInterfaces = anIaasProvider.getNetworkInterfaces();
+    	this.image = anIaasProvider.getImage();
+    	this.provider = anIaasProvider.getProvider();
+    	this.identity = anIaasProvider.getIdentity();
+    	this.credential = anIaasProvider.getCredential();
+    	this.payload = anIaasProvider.getPayload();
+    }
+    
+    public String getType() {
+        return type;
+    }
+    
+    public void setType(String id) {
+        this.type = id;
+    }
+    
+    public String getProperty(String key) {
+        return properties.get(key);
+    }
+
+    public Map<String, String> getProperties() {
+        return properties;
+    }
+    
+    public void addProperty(String key, String val) {
+        if (key != null && val != null) {
+            properties.put(key, val);
+        }
+    }
+    
+    public void setProperty(String key, String value) {
+        
+        if(key != null && value != null){
+            properties.put(key, value);
+        }
+    }
+
+    public void setProperties(Map<String, String> properties) {
+        this.properties = properties;
+    }
+
+    public String getImage() {
+        return image;
+    }
+
+    public void setImage(String image) {
+        this.image = image;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getProvider() {
+        return provider;
+    }
+
+    public void setProvider(String provider) {
+        this.provider = provider;
+    }
+
+    public String getIdentity() {
+        return identity;
+    }
+
+    public void setIdentity(String identity) {
+        this.identity = identity;
+    }
+
+    public String getCredential() {
+        return credential;
+    }
+
+    public void setCredential(String credential) {
+        this.credential = credential;
+    }
+
+    public ComputeService getComputeService() {
+        return computeService;
+    }
+
+    public void setComputeService(ComputeService computeService) {
+        this.computeService = computeService;
+    }
+
+    public Template getTemplate() {
+        return template;
+    }
+
+    public void setTemplate(Template template) {
+        this.template = template;
+    }
+    
+    
+
+    public boolean equals(Object o) {
+        if(o instanceof IaasProvider){
+            return ((IaasProvider) o).getType().equals(this.getType());
+        }
+        
+        return false;
+    }
+    
+    public int hashCode() {
+        return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers
+            append(type).
+            toHashCode();
+    }
+    
+    public IaasProvider copy(){
+		return new IaasProvider(this);
+	}
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public Iaas getIaas() {
+    	if (iaas == null) {
+    		try {
+				iaas = CloudControllerUtil.getIaas(this);
+			} catch (InvalidIaasProviderException e) {
+				return null;
+			}
+    	}
+        return iaas;
+    }
+
+    public void setIaas(Iaas iaas) {
+        this.iaas = iaas;
+    }
+    
+    public void reset(){
+//    	nodeIds = new ArrayList<String>();
+//    	nodes = new HashMap<String, NodeMetadata>();
+//    	toBeRemovedNodeIds = new ArrayList<String>();
+    }
+
+    public byte[] getPayload() {
+        return payload;
+    }
+
+    public void setPayload(byte[] payload) {
+        this.payload = ArrayUtils.clone(payload);
+    }
+
+    /**
+     * @return the networkInterfaces
+     */
+    public NetworkInterface[] getNetworkInterfaces() {
+        return networkInterfaces;
+    }
+
+    /**
+     * @param networkInterfaces the networkInterfaces to set
+     */
+    public void setNetworkInterfaces(NetworkInterface[] networkInterfaces) {
+        this.networkInterfaces = ArrayUtils.clone(networkInterfaces);
+    }
+
+    @Override
+    public String toString() {
+        return "IaasProvider [type=" + type + ", name=" + name + ", image=" + image +
+                ", provider=" + provider + "]";
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/KubernetesClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/KubernetesClusterContext.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/KubernetesClusterContext.java
new file mode 100644
index 0000000..1f19271
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/KubernetesClusterContext.java
@@ -0,0 +1,187 @@
+/*
+ * 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.domain;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.kubernetes.client.KubernetesApiClient;
+
+/**
+ * Holds information about a Kubernetes Cluster.
+ *
+ *
+ */
+public class KubernetesClusterContext implements Serializable {
+
+	private static final long serialVersionUID = -802025758806195791L;
+	private static final Log log = LogFactory.getLog(KubernetesClusterContext.class);
+	
+	// id of the Kubernetes cluster
+    private String kubernetesClusterId;
+    // available host port range, delimited by a hyphen
+    private String hostPortRange;
+    // kubernetes master ip
+    private String masterIp;
+    // available list of ports
+    private List<Integer> availableHostPorts;
+    // kubernetes client API instance
+    private transient KubernetesApiClient kubApi;
+    
+    public KubernetesClusterContext(String id, String portRange, String masterIp) {
+    	availableHostPorts = new ArrayList<Integer>();
+    	this.kubernetesClusterId = id;
+    	this.hostPortRange = portRange;
+    	this.masterIp = masterIp;
+    	this.setKubApi(new KubernetesApiClient(getEndpoint(masterIp)));
+    	
+	}
+    
+	private String getEndpoint(String ip) {
+		return "http://"+ip+":8080/api/v1beta1/";
+	}
+
+	public String getKubernetesClusterId() {
+		return kubernetesClusterId;
+	}
+	public void setKubernetesClusterId(String kubernetesClusterId) {
+		this.kubernetesClusterId = kubernetesClusterId;
+	}
+
+	public String getHostPortRange() {
+		return hostPortRange;
+	}
+
+	public void setHostPortRange(String hostPortRange) {
+		this.hostPortRange = hostPortRange;
+	}
+
+	public List<Integer> getAvailableHostPorts() {
+		return availableHostPorts;
+	}
+
+	public void setAvailableHostPorts(List<Integer> availableHostPorts) {
+		this.availableHostPorts = availableHostPorts;
+	}
+	
+	private int[] portBoundaries() {
+		String[] portStrings = hostPortRange.split("-");
+		int[] portInts = new int[2];
+		portInts[0] = Integer.parseInt(portStrings[0]);
+		portInts[1] = Integer.parseInt(portStrings[1]);
+		return portInts;
+	}
+	
+	public int getAnAvailableHostPort() {
+		int[] ports = {4000, 5000};
+		if (availableHostPorts.isEmpty()) {
+			try {
+
+				ports = portBoundaries();
+			} catch (Exception ignore) {
+				// on an exception, we use the default range
+				log.warn("Unable to find a port range, hence using the default. [4000-5000]"
+						+ " Exception");
+			}
+
+			// populate the ports
+			populatePorts(ports[0], ports[1]);
+		}
+		
+		return availableHostPorts.remove(0);
+	}
+	
+	public void deallocateHostPort (int port) {
+		if (!availableHostPorts.contains(port)) {
+			availableHostPorts.add(port);
+		}
+	}
+
+	private void populatePorts(int i, int j) {
+
+		for (int x = i; x < j; x++) {
+			availableHostPorts.add(x);
+		}
+	}
+
+	public String getMasterIp() {
+		return masterIp;
+	}
+
+	public void setMasterIp(String masterIp) {
+		this.masterIp = masterIp;
+	}
+
+	public KubernetesApiClient getKubApi() {
+		if (kubApi == null) {
+			kubApi = new KubernetesApiClient(getEndpoint(masterIp));
+		}
+		return kubApi;
+	}
+
+	public void setKubApi(KubernetesApiClient kubApi) {
+		this.kubApi = kubApi;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result
+				+ ((hostPortRange == null) ? 0 : hostPortRange.hashCode());
+		result = prime
+				* result
+				+ ((kubernetesClusterId == null) ? 0 : kubernetesClusterId
+						.hashCode());
+		result = prime * result
+				+ ((masterIp == null) ? 0 : masterIp.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		KubernetesClusterContext other = (KubernetesClusterContext) obj;
+		if (hostPortRange == null) {
+			if (other.hostPortRange != null)
+				return false;
+		} else if (!hostPortRange.equals(other.hostPortRange))
+			return false;
+		if (kubernetesClusterId == null) {
+			if (other.kubernetesClusterId != null)
+				return false;
+		} else if (!kubernetesClusterId.equals(other.kubernetesClusterId))
+			return false;
+		if (masterIp == null) {
+			if (other.masterIp != null)
+				return false;
+		} else if (!masterIp.equals(other.masterIp))
+			return false;
+		return true;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/LoadbalancerConfig.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/LoadbalancerConfig.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/LoadbalancerConfig.java
new file mode 100644
index 0000000..1e780cf
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/LoadbalancerConfig.java
@@ -0,0 +1,73 @@
+/*
+ * 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.domain;
+
+import org.apache.stratos.common.Properties;
+import org.apache.stratos.common.Property;
+
+import java.io.Serializable;
+
+/**
+ * This class is used to support <link>CartridgeConfig</link>
+ * class for the Rest API
+ */
+public class LoadbalancerConfig implements Serializable {
+
+    private static final long serialVersionUID = 289225330995632449L;
+
+    private String type;
+   
+    private Properties properties;
+    
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public Properties getProperties() {
+        return properties;
+    }
+
+    public void setProperties(Properties properties) {
+        this.properties = properties;
+    }
+
+    public String toString () {
+
+        return " [ Type: " + type + ", Properties: " + getIaasProperties() + " ] ";
+    }
+
+    private String getIaasProperties () {
+
+        StringBuilder iaasPropertyBuilder = new StringBuilder();
+        if (properties != null) {
+            Property[] propertyArray = properties.getProperties();
+            if(propertyArray.length > 0) {
+                for (Property property : propertyArray) {
+                    iaasPropertyBuilder.append(property.toString() + " | ");
+                }
+            }
+        }
+        return iaasPropertyBuilder.toString();
+    }
+}