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 2015/05/20 21:13:31 UTC

stratos git commit: Introducing parameters to specify cpu and memory allocations for docker containers

Repository: stratos
Updated Branches:
  refs/heads/master c868c7af4 -> 7dc0c9a1f


Introducing parameters to specify cpu and memory allocations for docker containers


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/7dc0c9a1
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/7dc0c9a1
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/7dc0c9a1

Branch: refs/heads/master
Commit: 7dc0c9a1ff230e9e2b3b57072f6eed12e518848a
Parents: c868c7a
Author: Imesh Gunaratne <im...@apache.org>
Authored: Thu May 21 00:51:43 2015 +0530
Committer: Imesh Gunaratne <im...@apache.org>
Committed: Thu May 21 00:54:51 2015 +0530

----------------------------------------------------------------------
 .../controller/domain/InstanceMetadata.java     |  9 ++++++
 .../iaases/kubernetes/KubernetesIaas.java       | 31 ++++++++++++++++--
 .../kubernetes/client/KubernetesApiClient.java  | 13 ++++++--
 .../KubernetesAPIClientInterface.java           | 12 ++++---
 .../kubernetes/client/model/Container.java      | 33 ++++++++++++++++---
 .../client/live/AbstractLiveTest.java           |  4 +--
 .../live/KubernetesApiClientLiveTest.java       |  8 ++---
 .../autoscaling-policy-1.json                   |  6 ++--
 samples/cartridges/kubernetes/php.json          | 34 +++++++++++++-------
 9 files changed, 113 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/7dc0c9a1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/InstanceMetadata.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/InstanceMetadata.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/InstanceMetadata.java
index 4c0895b..02022af 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/InstanceMetadata.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/InstanceMetadata.java
@@ -30,6 +30,7 @@ public class InstanceMetadata implements Serializable {
 
     private String hostname;
     private String hypervisor;
+    private int cpu;
     private int ram;
     private String imageId;
     private int loginPort;
@@ -109,4 +110,12 @@ public class InstanceMetadata implements Serializable {
     public void setOperatingSystem64bit(boolean operatingSystem64bit) {
         this.operatingSystem64bit = operatingSystem64bit;
     }
+
+    public void setCpu(int cpu) {
+        this.cpu = cpu;
+    }
+
+    public int getCpu() {
+        return cpu;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7dc0c9a1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/kubernetes/KubernetesIaas.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/kubernetes/KubernetesIaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/kubernetes/KubernetesIaas.java
index b756121..4aa4c4c 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/kubernetes/KubernetesIaas.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/kubernetes/KubernetesIaas.java
@@ -62,6 +62,10 @@ public class KubernetesIaas extends Iaas {
     private static final String PAYLOAD_PARAMETER_NAME_VALUE_SEPARATOR = "=";
     private static final String PAYLOAD_PARAMETER_PREFIX = "payload_parameter.";
     private static final String PORT_MAPPINGS = "PORT_MAPPINGS";
+    private static final String KUBERNETES_CONTAINER_CPU = "KUBERNETES_CONTAINER_CPU";
+    private static final String KUBERNETES_CONTAINER_MEMORY = "KUBERNETES_CONTAINER_MEMORY";
+    private static final String KUBERNETES_CONTAINER_CPU_DEFAULT = "kubernetes.container.cpu.default";
+    private static final String KUBERNETES_CONTAINER_MEMORY_DEFAULT = "kubernetes.container.memory.default";
 
     private PartitionValidator partitionValidator;
     private List<NameValuePair> payload;
@@ -224,9 +228,11 @@ public class KubernetesIaas extends Iaas {
             // Update member context
             updateMemberContext(memberContext, pod, kubernetesCluster);
 
-            log.info(String.format("Container started successfully: [application] %s [cartridge] %s [member] %s [pod]",
+            log.info(String.format("Container started successfully: [application] %s [cartridge] %s [member] %s " +
+                            "[pod] %s [cpu] %d [memory] %d MB",
                     memberContext.getApplicationId(), memberContext.getCartridgeType(),
-                    memberContext.getMemberId(), memberContext.getKubernetesPodId()));
+                    memberContext.getMemberId(), memberContext.getKubernetesPodId(),
+                    memberContext.getInstanceMetadata().getCpu(), memberContext.getInstanceMetadata().getRam()));
             return memberContext;
         } catch (Exception e) {
             String msg = String.format("Could not start container: [application] %s [cartridge] %s [member] %s",
@@ -373,6 +379,17 @@ public class KubernetesIaas extends Iaas {
             throw new RuntimeException(message);
         }
 
+        int cpu = Integer.getInteger(KUBERNETES_CONTAINER_CPU_DEFAULT, 1);
+        int memory = Integer.getInteger(KUBERNETES_CONTAINER_MEMORY_DEFAULT, 1024);
+        Property cpuProperty = cartridge.getProperties().getProperty(KUBERNETES_CONTAINER_CPU);
+        if(cpuProperty != null) {
+            cpu = Integer.parseInt(cpuProperty.getValue());
+        }
+        Property memoryProperty = cartridge.getProperties().getProperty(KUBERNETES_CONTAINER_MEMORY);
+        if(memoryProperty != null) {
+            memory = Integer.parseInt(memoryProperty.getValue());
+        }
+
         IaasProvider iaasProvider = CloudControllerContext.getInstance().getIaasProviderOfPartition(cartridge.getType(), partition.getId());
         if (iaasProvider == null) {
             String message = "Could not find iaas provider: [partition] " + partition.getId();
@@ -392,11 +409,19 @@ public class KubernetesIaas extends Iaas {
                 clusterContext, memberContext);
 
         List<Port> ports = KubernetesIaasUtil.convertPortMappings(Arrays.asList(cartridge.getPortMappings()));
-        kubernetesApi.createPod(podId, podLabel, dockerImage, ports, environmentVariables);
+        kubernetesApi.createPod(podId, podLabel, dockerImage, cpu, memory, ports, environmentVariables);
 
         // Add pod id to member context
         memberContext.setKubernetesPodId(podId);
         memberContext.setKubernetesPodLabel(podLabel);
+
+        // Create instance metadata
+        InstanceMetadata instanceMetadata = new InstanceMetadata();
+        instanceMetadata.setImageId(dockerImage);
+        instanceMetadata.setCpu(cpu);
+        instanceMetadata.setRam(memory);
+        memberContext.setInstanceMetadata(instanceMetadata);
+
         // Persist cloud controller context
         CloudControllerContext.getInstance().persist();
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/7dc0c9a1/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/KubernetesApiClient.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/KubernetesApiClient.java b/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/KubernetesApiClient.java
index aec99eb..99f156f 100644
--- a/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/KubernetesApiClient.java
+++ b/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/KubernetesApiClient.java
@@ -54,17 +54,22 @@ public class KubernetesApiClient implements KubernetesAPIClientInterface {
      * @param podId                Identifier of the pod
      * @param podLabel             Pod name to be used by the pod label
      * @param dockerImage          Docker image to be used by the pod
+     * @param cpu                  Number of cpu cores
+     * @param memory               Memory allocation in megabytes
      * @param ports                Ports exposed by the pod
      * @param environmentVariables Environment variables to be passed to the pod
      * @throws KubernetesClientException
      */
     @Override
-    public void createPod(String podId, String podLabel, String dockerImage, List<Port> ports,
+    public void createPod(String podId, String podLabel, String dockerImage, int cpu, int memory, List<Port> ports,
                           EnvironmentVariable[] environmentVariables)
             throws KubernetesClientException {
+
+        int memoryInMB = 1024 * 1024 * memory;
         if (log.isDebugEnabled()) {
-            log.debug(String.format("Creating kubernetes pod: [pod-id] %s [pod-name] %s [docker-image] %s [ports] %s",
-                    podId, podLabel, dockerImage, ports));
+            log.debug(String.format("Creating kubernetes pod: [pod-id] %s [pod-name] %s [docker-image] %s " +
+                            "[cpu] %d [memory] %d MB [ports] %s",
+                    podId, podLabel, dockerImage, cpu, memoryInMB, ports));
         }
 
         // Create pod definition
@@ -87,6 +92,8 @@ public class KubernetesApiClient implements KubernetesAPIClientInterface {
         Container containerTemplate = new Container();
         containerTemplate.setName(podLabel);
         containerTemplate.setImage(dockerImage);
+        containerTemplate.setCpu(cpu);
+        containerTemplate.setMemory(memoryInMB);
         containerTemplate.setPorts(ports);
         containerTemplate.setImagePullPolicy(KubernetesConstants.POLICY_PULL_IF_NOT_PRESENT);
         if (environmentVariables != null) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/7dc0c9a1/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/interfaces/KubernetesAPIClientInterface.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/interfaces/KubernetesAPIClientInterface.java b/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/interfaces/KubernetesAPIClientInterface.java
index 739677e..df9f3de 100644
--- a/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/interfaces/KubernetesAPIClientInterface.java
+++ b/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/interfaces/KubernetesAPIClientInterface.java
@@ -31,13 +31,15 @@ public interface KubernetesAPIClientInterface {
     /**
      * Create pod.
      *
-     * @param podId
-     * @param podLabel
-     * @param dockerImage
-     * @param ports
+     * @param podId id of the pod
+     * @param podLabel pod label
+     * @param dockerImage docker image name
+     * @param cpu number of cpu cores
+     * @param memory memory allocation in mega bytes
+     * @param ports ports to be opened
      * @throws KubernetesClientException
      */
-    public void createPod(String podId, String podLabel, String dockerImage, List<Port> ports,
+    public void createPod(String podId, String podLabel, String dockerImage, int cpu, int memory, List<Port> ports,
                           EnvironmentVariable[] environmentVariables)
             throws KubernetesClientException;
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/7dc0c9a1/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/model/Container.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/model/Container.java b/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/model/Container.java
index 45e4bca..fd8d591 100644
--- a/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/model/Container.java
+++ b/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/model/Container.java
@@ -30,6 +30,8 @@ public class Container {
 
     private String name;
     private String image;
+    private int cpu;
+    private int memory;
     private String workingDir;
     private String[] command;
     private VolumeMount[] volumeMounts;
@@ -57,6 +59,23 @@ public class Container {
         this.image = image;
     }
 
+
+    public int getCpu() {
+        return cpu;
+    }
+
+    public void setCpu(int cpu) {
+        this.cpu = cpu;
+    }
+
+    public int getMemory() {
+        return memory;
+    }
+
+    public void setMemory(int memory) {
+        this.memory = memory;
+    }
+
     public String getWorkingDir() {
         return workingDir;
     }
@@ -103,11 +122,15 @@ public class Container {
 
     @Override
     public String toString() {
-        return "Container [name=" + name + ", image=" + image + ", workingDir="
-                + workingDir + ", command=" + Arrays.toString(command)
-                + ", volumeMounts=" + Arrays.toString(volumeMounts)
-                + ", ports=" + ports + ", env="
-                + Arrays.toString(env) + "]";
+        return "Container [name=" + name +
+                ", image=" + image +
+                ", cpu=" + cpu +
+                ", memory=" + memory +
+                ", workingDir=" + workingDir +
+                ", command=" + Arrays.toString(command) +
+                ", volumeMounts=" + Arrays.toString(volumeMounts) +
+                ", ports=" + ports +
+                ", env=" + Arrays.toString(env) + "]";
     }
 
     public String getImagePullPolicy() {

http://git-wip-us.apache.org/repos/asf/stratos/blob/7dc0c9a1/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/live/AbstractLiveTest.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/live/AbstractLiveTest.java b/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/live/AbstractLiveTest.java
index faab5ab..0ab978e 100644
--- a/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/live/AbstractLiveTest.java
+++ b/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/live/AbstractLiveTest.java
@@ -123,10 +123,10 @@ public class AbstractLiveTest extends TestCase {
         log.info("Kubernetes resources cleaned");
     }
 
-    protected void createPod(String podId, String podName, String containerPortName) throws KubernetesClientException {
+    protected void createPod(String podId, String podName, String containerPortName, int cpu, int memory) throws KubernetesClientException {
         log.info("Creating pod: [pod] " + podId);
         List<Port> ports = createPorts(containerPortName);
-        client.createPod(podId, podName, dockerImage, ports, null);
+        client.createPod(podId, podName, dockerImage, cpu, memory, ports, null);
         podIdList.add(podId);
 
         sleep(2000);

http://git-wip-us.apache.org/repos/asf/stratos/blob/7dc0c9a1/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/live/KubernetesApiClientLiveTest.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/live/KubernetesApiClientLiveTest.java b/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/live/KubernetesApiClientLiveTest.java
index 5c425aa..7983194 100644
--- a/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/live/KubernetesApiClientLiveTest.java
+++ b/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/live/KubernetesApiClientLiveTest.java
@@ -47,8 +47,8 @@ public class KubernetesApiClientLiveTest extends AbstractLiveTest {
     public void testPodCreation() throws Exception {
         log.info("Testing pod creation...");
 
-        createPod("stratos-test-pod-1", "stratos-test-pod", "http-1");
-        createPod("stratos-test-pod-2", "stratos-test-pod", "http-1");
+        createPod("stratos-test-pod-2", "stratos-test-pod", "http-1", 1, 512);
+        createPod("stratos-test-pod-2", "stratos-test-pod", "http-1", 2, 512);
 
         deletePod("stratos-test-pod-1");
         deletePod("stratos-test-pod-2");
@@ -73,8 +73,8 @@ public class KubernetesApiClientLiveTest extends AbstractLiveTest {
 
         createService(serviceId, serviceName, SERVICE_PORT, containerPortName, minionPublicIPs);
 
-        createPod("stratos-test-pod-1", serviceName, containerPortName);
-        createPod("stratos-test-pod-2", serviceName, containerPortName);
+        createPod("stratos-test-pod-1", serviceName, containerPortName, 1, 512);
+        createPod("stratos-test-pod-2", serviceName, containerPortName, 2, 512);
 
         if (testServiceSocket) {
             // test service accessibility

http://git-wip-us.apache.org/repos/asf/stratos/blob/7dc0c9a1/samples/autoscaling-policies/autoscaling-policy-1.json
----------------------------------------------------------------------
diff --git a/samples/autoscaling-policies/autoscaling-policy-1.json b/samples/autoscaling-policies/autoscaling-policy-1.json
index 9f6a370..495ed7b 100644
--- a/samples/autoscaling-policies/autoscaling-policy-1.json
+++ b/samples/autoscaling-policies/autoscaling-policy-1.json
@@ -2,13 +2,13 @@
   "id": "autoscaling-policy-1",
   "loadThresholds": {
     "requestsInFlight": {
-      "threshold": 50
+      "threshold": 20
     },
     "memoryConsumption": {
-      "threshold": 40
+      "threshold": 70
     },
     "loadAverage": {
-      "threshold": 40
+      "threshold": 70
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7dc0c9a1/samples/cartridges/kubernetes/php.json
----------------------------------------------------------------------
diff --git a/samples/cartridges/kubernetes/php.json b/samples/cartridges/kubernetes/php.json
index fd3905f..8d2c9a0 100755
--- a/samples/cartridges/kubernetes/php.json
+++ b/samples/cartridges/kubernetes/php.json
@@ -7,7 +7,7 @@
     "description": "php Cartridge",
     "version": "7",
     "multiTenant": "false",
-    "loadBalancingIPType" : "public",
+    "loadBalancingIPType": "public",
     "portMapping": [
         {
             "protocol": "http",
@@ -15,17 +15,27 @@
             "proxyPort": "8281"
         }
     ],
-    "deployment":{
-        "baseDir":"/var/www"
+    "deployment": {
+        "baseDir": "/var/www"
     },
-    "iaasProvider":[
-       {
-          "type":"kubernetes",
-          "imageId":"stratos/php:4.1.0-beta",
-          "networkInterfaces":[
-          ],
-          "property":[
-          ]
-       }
+    "iaasProvider": [
+        {
+            "type": "kubernetes",
+            "imageId": "stratos/php:4.1.0-beta",
+            "networkInterfaces": [
+            ],
+            "property": [
+            ]
+        }
+    ],
+    "property": [
+        {
+            "name": "KUBERNETES_CONTAINER_CPU",
+            "value": "1"
+        },
+        {
+            "name": "KUBERNETES_CONTAINER_MEMORY",
+            "value": "512"
+        }
     ]
 }