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);