Porting container APIs with grouping changes.
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/2e9edf45 Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/2e9edf45 Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/2e9edf45 Branch: refs/heads/master Commit: 2e9edf4579418e831b3a6e0e8b28e62ca6265530 Parents: 1821ee0 Author: Nirmal Fernando <[email protected]> Authored: Sun Dec 7 12:50:24 2014 +0530 Committer: Nirmal Fernando <[email protected]> Committed: Sun Dec 7 18:00:49 2014 +0530 ---------------------------------------------------------------------- .../client/CloudControllerClient.java | 4 +- .../domain/KubernetesClusterContext.java | 160 +++++++++---------- .../impl/CloudControllerServiceImpl.java | 81 +++++++--- .../impl/CloudControllerServiceUtil.java | 2 + .../controller/util/CloudControllerUtil.java | 43 +++-- .../common/constants/StratosConstants.java | 2 + 6 files changed, 171 insertions(+), 121 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/2e9edf45/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/CloudControllerClient.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/CloudControllerClient.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/CloudControllerClient.java index bf68913..e902dfb 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/CloudControllerClient.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/CloudControllerClient.java @@ -197,7 +197,7 @@ public class CloudControllerClient { isPrimaryProp.setValue(String.valueOf(isPrimary)); Property minCountProp = new Property(); - minCountProp.setName("MIN_COUNT"); + minCountProp.setName(StratosConstants.MIN_COUNT); minCountProp.setValue(String.valueOf(minMemberCount)); memberContextProps.addProperty(isPrimaryProp); @@ -381,7 +381,7 @@ public class CloudControllerClient { isPrimaryProp.setValue(String.valueOf(isPrimary)); Property minCountProp = new Property(); - minCountProp.setName("MIN_COUNT"); + minCountProp.setName(StratosConstants.MIN_COUNT); minCountProp.setValue(String.valueOf(minMemberCount)); memberContextProps.addProperty(isPrimaryProp); http://git-wip-us.apache.org/repos/asf/stratos/blob/2e9edf45/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 index 1f19271..a92db26 100644 --- 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 @@ -38,26 +38,31 @@ public class KubernetesClusterContext implements Serializable { // id of the Kubernetes cluster private String kubernetesClusterId; - // available host port range, delimited by a hyphen - private String hostPortRange; + private int upperPort; + private int lowerPort; // kubernetes master ip private String masterIp; + private String masterPort; // available list of ports private List<Integer> availableHostPorts; // kubernetes client API instance private transient KubernetesApiClient kubApi; - public KubernetesClusterContext(String id, String portRange, String masterIp) { + public KubernetesClusterContext(String id, String masterIp, String masterPort, int upperPort, int lowerPort) { availableHostPorts = new ArrayList<Integer>(); + this.upperPort = upperPort; + this.lowerPort = lowerPort; + // populate the ports + populatePorts(lowerPort, upperPort); this.kubernetesClusterId = id; - this.hostPortRange = portRange; this.masterIp = masterIp; - this.setKubApi(new KubernetesApiClient(getEndpoint(masterIp))); + this.masterPort = masterPort; + this.setKubApi(new KubernetesApiClient(getEndpoint(masterIp, masterPort))); } - private String getEndpoint(String ip) { - return "http://"+ip+":8080/api/v1beta1/"; + private String getEndpoint(String ip, String port) { + return "http://"+ip+":"+port+"/api/v1beta1/"; } public String getKubernetesClusterId() { @@ -67,14 +72,6 @@ public class KubernetesClusterContext implements Serializable { this.kubernetesClusterId = kubernetesClusterId; } - public String getHostPortRange() { - return hostPortRange; - } - - public void setHostPortRange(String hostPortRange) { - this.hostPortRange = hostPortRange; - } - public List<Integer> getAvailableHostPorts() { return availableHostPorts; } @@ -83,30 +80,10 @@ public class KubernetesClusterContext implements Serializable { 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]); - } - + if (availableHostPorts.isEmpty()) { + return -1; + } return availableHostPorts.remove(0); } @@ -133,7 +110,7 @@ public class KubernetesClusterContext implements Serializable { public KubernetesApiClient getKubApi() { if (kubApi == null) { - kubApi = new KubernetesApiClient(getEndpoint(masterIp)); + kubApi = new KubernetesApiClient(getEndpoint(masterIp, masterPort)); } return kubApi; } @@ -142,46 +119,69 @@ public class KubernetesClusterContext implements Serializable { 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; - } + public int getUpperPort() { + return upperPort; + } + + public void setUpperPort(int upperPort) { + this.upperPort = upperPort; + } + + public int getLowerPort() { + return lowerPort; + } + + public void setLowerPort(int lowerPort) { + this.lowerPort = lowerPort; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((availableHostPorts == null) ? 0 : availableHostPorts.hashCode()); + result = prime * result + ((kubernetesClusterId == null) ? 0 : kubernetesClusterId.hashCode()); + result = prime * result + lowerPort; + result = prime * result + ((masterIp == null) ? 0 : masterIp.hashCode()); + result = prime * result + ((masterPort == null) ? 0 : masterPort.hashCode()); + result = prime * result + upperPort; + 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 (availableHostPorts == null) { + if (other.availableHostPorts != null) + return false; + } else if (!availableHostPorts.equals(other.availableHostPorts)) + return false; + if (kubernetesClusterId == null) { + if (other.kubernetesClusterId != null) + return false; + } else if (!kubernetesClusterId.equals(other.kubernetesClusterId)) + return false; + if (lowerPort != other.lowerPort) + return false; + if (masterIp == null) { + if (other.masterIp != null) + return false; + } else if (!masterIp.equals(other.masterIp)) + return false; + if (masterPort == null) { + if (other.masterPort != null) + return false; + } else if (!masterPort.equals(other.masterPort)) + return false; + if (upperPort != other.upperPort) + return false; + return true; + } } http://git-wip-us.apache.org/repos/asf/stratos/blob/2e9edf45/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java index b8fd6c5..1679e3f 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java @@ -51,6 +51,7 @@ import org.apache.stratos.common.constants.StratosConstants; import org.apache.stratos.common.kubernetes.KubernetesGroup; import org.apache.stratos.common.kubernetes.KubernetesHost; import org.apache.stratos.common.kubernetes.KubernetesMaster; +import org.apache.stratos.common.kubernetes.PortRange; import org.apache.stratos.kubernetes.client.KubernetesApiClient; import org.apache.stratos.kubernetes.client.exceptions.KubernetesClientException; import org.apache.stratos.kubernetes.client.model.Label; @@ -1082,6 +1083,9 @@ public class CloudControllerServiceImpl implements CloudControllerService { String clusterId = containerClusterContext.getClusterId(); handleNullObject(clusterId, "Container start-up failed. Cluster id is null."); + + Partition partition = containerClusterContext.getPartition(); + handleNullObject(partition, "Container start-up failed. Null partition found in ContainerClusterContext."); if (log.isDebugEnabled()) { log.debug("Received a container spawn request : " + containerClusterContext.toString()); @@ -1102,13 +1106,28 @@ public class CloudControllerServiceImpl implements CloudControllerService { } try { - String minReplicas = validateProperty(StratosConstants.KUBERNETES_MIN_REPLICAS, ctxt); - String kubernetesClusterId = validateProperty(StratosConstants.KUBERNETES_CLUSTER_ID, ctxt); - String kubernetesMasterIp = validateProperty(StratosConstants.KUBERNETES_MASTER_IP, containerClusterContext); - String kubernetesPortRange = validateProperty(StratosConstants.KUBERNETES_PORT_RANGE, containerClusterContext); + String minReplicas = + validateProperty(StratosConstants.MIN_COUNT, containerClusterContext.getProperties(), + containerClusterContext.toString()); + String kubernetesClusterId = + validateProperty(StratosConstants.KUBERNETES_CLUSTER_ID, partition.getProperties(), + partition.toString()); + + KubernetesGroup kubernetesGroup = + CloudControllerContext.getInstance().getKubernetesGroup(kubernetesClusterId); + handleNullObject(kubernetesGroup, "Container start-up failed. Kubernetes group not found for id: " + + kubernetesClusterId); + + String kubernetesMasterIp = kubernetesGroup.getKubernetesMaster().getHostIpAddress(); + PortRange kubernetesPortRange = kubernetesGroup.getPortRange(); + // optional + String kubernetesMasterPort = + CloudControllerUtil.getProperty(kubernetesGroup.getKubernetesMaster().getProperties(), + StratosConstants.KUBERNETES_MASTER_PORT, + StratosConstants.KUBERNETES_MASTER_DEFAULT_PORT); KubernetesClusterContext kubClusterContext = getKubernetesClusterContext(kubernetesClusterId, - kubernetesMasterIp, kubernetesPortRange); + kubernetesMasterIp, kubernetesMasterPort, kubernetesPortRange.getLower(), kubernetesPortRange.getUpper()); KubernetesApiClient kubApi = kubClusterContext.getKubApi(); // first let's create a replication controller. @@ -1227,27 +1246,45 @@ public class CloudControllerServiceImpl implements CloudControllerService { } } - private String validateProperty(String property, ClusterContext ctxt) { - - String propVal = CloudControllerUtil.getProperty(ctxt.getProperties(), property); - handleNullObject(propVal, "Property validation failed. Cannot find '" + property + "' in " + ctxt); - return propVal; - } - - private String validateProperty(String property, ContainerClusterContext ctxt) { +// private String validateProperty(String property, ClusterContext ctxt) { +// +// String propVal = CloudControllerUtil.getProperty(ctxt.getProperties(), property); +// handleNullObject(propVal, "Property validation failed. Cannot find '" + property + "' in " + ctxt); +// return propVal; +// } +// +// private String validateProperty(String property, ContainerClusterContext ctxt) { +// +// String propVal = CloudControllerUtil.getProperty(ctxt.getProperties(), property); +// handleNullObject(propVal, "Property validation failed. Cannot find '" + property + "' in " + ctxt); +// return propVal; +// +// } +// +// private String validateProperty(String property, Partition partition) { +// +// String propVal = CloudControllerUtil.getProperty(partition.getProperties(), property); +// handleNullObject(propVal, "Property validation failed. Cannot find property: '" + property); +// return propVal; +// +// } + + private String validateProperty(String property, org.apache.stratos.common.Properties properties, String object) { - String propVal = CloudControllerUtil.getProperty(ctxt.getProperties(), property); - handleNullObject(propVal, "Property validation failed. '" + property + "' in " + ctxt); + String propVal = CloudControllerUtil.getProperty(properties, property); + handleNullObject(propVal, "Property validation failed. Cannot find property: '" + property+ " in "+object); return propVal; } - private KubernetesClusterContext getKubernetesClusterContext( - String kubernetesClusterId, String kubernetesMasterIp, - String kubernetesPortRange) { + private KubernetesClusterContext getKubernetesClusterContext(String kubernetesClusterId, String kubernetesMasterIp, + String kubernetesMasterPort, int upperPort, int lowerPort) { - KubernetesClusterContext origCtxt = CloudControllerContext.getInstance().getKubernetesClusterContext(kubernetesClusterId); - KubernetesClusterContext newCtxt = new KubernetesClusterContext(kubernetesClusterId, kubernetesPortRange, kubernetesMasterIp); + KubernetesClusterContext origCtxt = + CloudControllerContext.getInstance().getKubernetesClusterContext(kubernetesClusterId); + KubernetesClusterContext newCtxt = + new KubernetesClusterContext(kubernetesClusterId, kubernetesMasterIp, + kubernetesMasterPort, upperPort, lowerPort); if (origCtxt == null) { CloudControllerContext.getInstance().addKubernetesClusterContext(newCtxt); @@ -1385,7 +1422,7 @@ public class CloudControllerServiceImpl implements CloudControllerService { } try { - String kubernetesClusterId = validateProperty(StratosConstants.KUBERNETES_CLUSTER_ID, ctxt); + String kubernetesClusterId = validateProperty(StratosConstants.KUBERNETES_CLUSTER_ID, ctxt.getProperties(), ctxt.toString()); KubernetesClusterContext kubClusterContext = CloudControllerContext.getInstance().getKubernetesClusterContext(kubernetesClusterId); @@ -1555,7 +1592,7 @@ public class CloudControllerServiceImpl implements CloudControllerService { } } } - + private void handleNullObject(Object obj, String errorMsg) { if (obj == null) { log.error(errorMsg); http://git-wip-us.apache.org/repos/asf/stratos/blob/2e9edf45/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceUtil.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceUtil.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceUtil.java index 4fbf294..b992643 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceUtil.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceUtil.java @@ -27,6 +27,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.stratos.cloud.controller.context.CloudControllerContext; import org.apache.stratos.cloud.controller.domain.ClusterContext; +import org.apache.stratos.cloud.controller.domain.ContainerClusterContext; import org.apache.stratos.cloud.controller.domain.IaasProvider; import org.apache.stratos.cloud.controller.domain.MemberContext; import org.apache.stratos.cloud.controller.domain.Partition; @@ -197,4 +198,5 @@ public class CloudControllerServiceUtil { validatePartitionAndGetIaasProvider(partition, iaasProvider); return true; } + } http://git-wip-us.apache.org/repos/asf/stratos/blob/2e9edf45/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java index 2e4e505..82baef8 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java @@ -295,9 +295,15 @@ public class CloudControllerUtil { } - public static String getProperty(Properties properties, String key) { - if (key != null && properties != null) { - for (Iterator<Entry<Object, Object>> iterator = properties.entrySet().iterator(); iterator.hasNext();) { + public static String getProperty(org.apache.stratos.common.Properties properties, String key, String defaultValue) { + Properties props = toJavaUtilProperties(properties); + + return getProperty(props, key, defaultValue); + } + + public static String getProperty(Properties properties, String key, String defaultValue) { + if (key != null && properties != null) { + for (Iterator<Entry<Object, Object>> iterator = properties.entrySet().iterator(); iterator.hasNext();) { Entry<Object, Object> type = (Entry<Object, Object>) iterator.next(); String propName = type.getKey().toString(); String propValue = type.getValue().toString(); @@ -305,25 +311,28 @@ public class CloudControllerUtil { return propValue; } } - } - - return null; + } + + return defaultValue; } - - public static String getProperty(org.apache.stratos.common.Properties properties, String key) { - Properties props = toJavaUtilProperties(properties); - - return getProperty(props, key); - } - - public static org.apache.stratos.common.Properties addProperty( - org.apache.stratos.common.Properties properties, String key, String value) { + + public static String getProperty(Properties properties, String key) { + return getProperty(properties, key, null); + } + + public static String getProperty(org.apache.stratos.common.Properties properties, String key) { + Properties props = toJavaUtilProperties(properties); + + return getProperty(props, key); + } + + public static org.apache.stratos.common.Properties addProperty(org.apache.stratos.common.Properties properties, + String key, String value) { Property property = new Property(); property.setName(key); property.setValue(value); - org.apache.stratos.common.Properties newProperties = - new org.apache.stratos.common.Properties(); + org.apache.stratos.common.Properties newProperties = new org.apache.stratos.common.Properties(); newProperties.setProperties(ArrayUtils.add(properties.getProperties(), property)); return newProperties; } http://git-wip-us.apache.org/repos/asf/stratos/blob/2e9edf45/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/constants/StratosConstants.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/constants/StratosConstants.java b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/constants/StratosConstants.java index df9dec2..d6bf002 100644 --- a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/constants/StratosConstants.java +++ b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/constants/StratosConstants.java @@ -149,6 +149,8 @@ public class StratosConstants { public static final String KUBERNETES_CLUSTER_ID = "KUBERNETES_CLUSTER_ID"; public static final String KUBERNETES_DEPLOYER_TYPE = "kubernetes"; public static final String KUBERNETES_MASTER_IP = "KUBERNETES_MASTER_IP"; + public static final String KUBERNETES_MASTER_PORT = "KUBERNETES_MASTER_PORT"; + public static final String KUBERNETES_MASTER_DEFAULT_PORT = "8080"; public static final String KUBERNETES_MIN_REPLICAS = "KUBERNETES_REPLICAS_MIN"; public static final String KUBERNETES_MAX_REPLICAS = "KUBERNETES_REPLICAS_MAX"; public static final String KUBERNETES_PORT_RANGE = "KUBERNETES_PORT_RANGE";
