You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myriad.apache.org by sm...@apache.org on 2015/10/15 23:00:14 UTC

[02/10] incubator-myriad git commit: Added "constraints" parameter in flexup/flexdown APIs

Added "constraints" parameter in flexup/flexdown APIs


Project: http://git-wip-us.apache.org/repos/asf/incubator-myriad/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-myriad/commit/10b9e6a6
Tree: http://git-wip-us.apache.org/repos/asf/incubator-myriad/tree/10b9e6a6
Diff: http://git-wip-us.apache.org/repos/asf/incubator-myriad/diff/10b9e6a6

Branch: refs/heads/master
Commit: 10b9e6a6dd1af8a1721f438901d2a631da51a8b6
Parents: 72f2f3f
Author: Santosh Marella <sm...@maprtech.com>
Authored: Tue Sep 15 10:32:47 2015 -0700
Committer: Santosh Marella <ma...@gmail.com>
Committed: Thu Oct 15 12:56:45 2015 -0700

----------------------------------------------------------------------
 .../com/ebay/myriad/api/ClustersResource.java   | 62 +++++++++++++++++---
 .../api/model/FlexDownClusterRequest.java       | 14 ++++-
 .../myriad/api/model/FlexUpClusterRequest.java  | 14 ++++-
 3 files changed, 81 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/10b9e6a6/myriad-scheduler/src/main/java/com/ebay/myriad/api/ClustersResource.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/com/ebay/myriad/api/ClustersResource.java b/myriad-scheduler/src/main/java/com/ebay/myriad/api/ClustersResource.java
index 05ba7e3..2b8fe0e 100644
--- a/myriad-scheduler/src/main/java/com/ebay/myriad/api/ClustersResource.java
+++ b/myriad-scheduler/src/main/java/com/ebay/myriad/api/ClustersResource.java
@@ -22,10 +22,7 @@ import com.ebay.myriad.scheduler.MyriadOperations;
 import com.ebay.myriad.scheduler.NMProfileManager;
 import com.ebay.myriad.state.SchedulerState;
 import com.google.common.base.Preconditions;
-import javax.ws.rs.core.Response.ResponseBuilder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
+import java.util.List;
 import javax.inject.Inject;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.PUT;
@@ -33,6 +30,10 @@ import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.ResponseBuilder;
+import javax.ws.rs.core.Response.Status;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * RESTful API to resource manager
@@ -40,12 +41,14 @@ import javax.ws.rs.core.Response;
 @Path("/cluster")
 public class ClustersResource {
     private static final Logger LOGGER = LoggerFactory.getLogger(ClustersResource.class);
+    private static final String CONSTRAINT_FORMAT =
+        "'<mesos_slave_attribute|hostname> LIKE <value_regex>'";
 
     private final SchedulerState schedulerState;
     private final NMProfileManager profileManager;
     private final MyriadOperations myriadOperations;
 
-    @Inject
+  @Inject
     public ClustersResource(SchedulerState state,
                             NMProfileManager profileManager,
                             MyriadOperations myriadOperations) {
@@ -64,11 +67,14 @@ public class ClustersResource {
 
         Integer instances = request.getInstances();
         String profile = request.getProfile();
-        LOGGER.info("Received flexup request. Profile: {}, Instances: {}", profile, instances);
+        List<String> constraints = request.getConstraints();
+        LOGGER.info("Received flexup request. Profile: {}, Instances: {}, Constraints: {}",
+            profile, instances, constraints);
 
         Response.ResponseBuilder response = Response.status(Response.Status.ACCEPTED);
         boolean isValidRequest = validateProfile(profile, response);
         isValidRequest = isValidRequest && validateInstances(instances, response);
+        isValidRequest = isValidRequest && validateConstraints(constraints, response);
 
         Response returnResponse = response.build();
         if (returnResponse.getStatus() == Response.Status.ACCEPTED.getStatusCode()) {
@@ -88,11 +94,14 @@ public class ClustersResource {
 
         Integer instances = request.getInstances();
         String profile = request.getProfile();
-        LOGGER.info("Received flex down request. Profile: {}, Instances: {}", profile, instances);
+        List<String> constraints = request.getConstraints();
+        LOGGER.info("Received flex down request. Profile: {}, Instances: {}, Constraints: {}",
+            profile, instances, constraints);
 
         Response.ResponseBuilder response = Response.status(Response.Status.ACCEPTED);
         boolean isValidRequest = validateProfile(profile, response);
         isValidRequest = isValidRequest && validateInstances(instances, response);
+        isValidRequest = isValidRequest && validateConstraints(constraints, response);
 
         Integer numFlexedUp = this.getNumFlexedupNMs();
         if (isValidRequest && numFlexedUp < instances)  {
@@ -139,6 +148,45 @@ public class ClustersResource {
       return true;
     }
 
+    private boolean validateConstraints(List<String> constraints, ResponseBuilder response) {
+      if (constraints != null && !constraints.isEmpty()) {
+        boolean valid = validateConstraintsSize(constraints, response);
+        valid = valid && validateLIKEConstraint(constraints.get(0), response);
+        return valid;
+      }
+      return true;
+    }
+
+    private boolean validateConstraintsSize(List<String> constraints, ResponseBuilder response) {
+      if (constraints.size() > 1) {
+        String message = String.format("Only 1 constraint is currently supported. Received: %s", constraints.toString());
+        response.status(Status.BAD_REQUEST).entity(message);
+        LOGGER.error(message);
+        return false;
+      }
+      return true;
+    }
+
+    private boolean validateLIKEConstraint(String constraint, ResponseBuilder response) {
+      if (constraint.isEmpty()) {
+        String message = String.format("The value provided for 'constraints' is empty. Format: %s", CONSTRAINT_FORMAT);
+        response.status(Status.BAD_REQUEST).entity(message);
+        LOGGER.error(message);
+        return false;
+      }
+
+      String[] splits = constraint.split(" LIKE "); // "<key> LIKE <val_regex>"
+      if (splits.length != 2) {
+        String message = String.format("Invalid regex for LIKE operator in constraint: %s. Format: %s",
+            constraint, CONSTRAINT_FORMAT);
+        response.status(Status.BAD_REQUEST).entity(message);
+        LOGGER.error(message);
+        return false;
+      }
+      return true;
+    }
+
+
     private Integer getNumFlexedupNMs() {
         return this.schedulerState.getActiveTaskIds().size()
                 + this.schedulerState.getStagingTaskIds().size()

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/10b9e6a6/myriad-scheduler/src/main/java/com/ebay/myriad/api/model/FlexDownClusterRequest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/com/ebay/myriad/api/model/FlexDownClusterRequest.java b/myriad-scheduler/src/main/java/com/ebay/myriad/api/model/FlexDownClusterRequest.java
index e801e65..47583b4 100644
--- a/myriad-scheduler/src/main/java/com/ebay/myriad/api/model/FlexDownClusterRequest.java
+++ b/myriad-scheduler/src/main/java/com/ebay/myriad/api/model/FlexDownClusterRequest.java
@@ -16,6 +16,7 @@
 package com.ebay.myriad.api.model;
 
 import com.google.gson.Gson;
+import java.util.List;
 import org.hibernate.validator.constraints.NotEmpty;
 
 /**
@@ -29,12 +30,15 @@ public class FlexDownClusterRequest {
     @NotEmpty
     public Integer instances;
 
+    public List<String> constraints;
+
     public FlexDownClusterRequest() {
     }
 
-    public FlexDownClusterRequest(String profile, Integer instances) {
+    public FlexDownClusterRequest(String profile, Integer instances, List<String> constraints) {
         this.instances = instances;
         this.profile = profile;
+        this.constraints = constraints;
     }
 
     public Integer getInstances() {
@@ -53,6 +57,14 @@ public class FlexDownClusterRequest {
       this.profile = profile;
     }
 
+    public List<String> getConstraints() {
+      return constraints;
+    }
+
+    public void setConstraints(List<String> constraints) {
+      this.constraints = constraints;
+    }
+
     public String toString() {
         Gson gson = new Gson();
         return gson.toJson(this);

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/10b9e6a6/myriad-scheduler/src/main/java/com/ebay/myriad/api/model/FlexUpClusterRequest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/com/ebay/myriad/api/model/FlexUpClusterRequest.java b/myriad-scheduler/src/main/java/com/ebay/myriad/api/model/FlexUpClusterRequest.java
index 74406cd..7c10d4b 100644
--- a/myriad-scheduler/src/main/java/com/ebay/myriad/api/model/FlexUpClusterRequest.java
+++ b/myriad-scheduler/src/main/java/com/ebay/myriad/api/model/FlexUpClusterRequest.java
@@ -16,6 +16,7 @@
 package com.ebay.myriad.api.model;
 
 import com.google.gson.Gson;
+import java.util.List;
 import org.hibernate.validator.constraints.NotEmpty;
 
 /**
@@ -28,12 +29,15 @@ public class FlexUpClusterRequest {
     @NotEmpty
     public String profile;
 
+    public List<String> constraints;
+
     public FlexUpClusterRequest() {
     }
     
-    public FlexUpClusterRequest(Integer instances, String profile) {
+    public FlexUpClusterRequest(Integer instances, String profile, List<String> constraints) {
         this.instances = instances;
         this.profile = profile;
+        this.constraints = constraints;
     }
 
     public Integer getInstances() {
@@ -52,6 +56,14 @@ public class FlexUpClusterRequest {
         this.profile = profile;
     }
 
+    public List<String> getConstraints() {
+      return constraints;
+    }
+
+    public void setConstraints(List<String> constraints) {
+      this.constraints = constraints;
+    }
+
     public String toString() {
         Gson gson = new Gson();
         return gson.toJson(this);