diff --git a/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/client/model/JobDescription.java b/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/client/model/JobDescription.java index 92017d90e0f..aceeab8a21c 100644 --- a/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/client/model/JobDescription.java +++ b/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/client/model/JobDescription.java @@ -66,6 +66,7 @@ public class JobDescription { private DisruptionBudget disruptionBudget; private SubmitJobRequest.Constraints constraints; + private ServiceJobProcesses serviceJobProcesses; // Soft/Hard constraints @@ -120,6 +121,7 @@ public class JobDescription { disruptionBudget = request.getDisruptionBudget(); constraints = request.getContainerConstraints(); + serviceJobProcesses = request.getServiceJobProcesses(); } public String getName() { @@ -405,6 +407,14 @@ public void setDisruptionBudget(DisruptionBudget disruptionBudget) { this.disruptionBudget = disruptionBudget; } + public ServiceJobProcesses getServiceJobProcesses() { + return serviceJobProcesses; + } + + public void setServiceJobProcesses(ServiceJobProcesses serviceJobProcesses) { + this.serviceJobProcesses = serviceJobProcesses; + } + @JsonIgnore public SubmitJobRequest.Constraints getConstraints() { return constraints; @@ -566,12 +576,20 @@ public JobDescriptor getGrpcJobDescriptor() { .build()) .build(); } - + com.netflix.titus.grpc.protogen.ServiceJobSpec.ServiceJobProcesses.Builder + titusServiceJobProcesses = ServiceJobSpec.ServiceJobProcesses.newBuilder(); + if (serviceJobProcesses != null) { + titusServiceJobProcesses + .setDisableDecreaseDesired(serviceJobProcesses.isDisableDecreaseDesired()) + .setDisableIncreaseDesired(serviceJobProcesses.isDisableIncreaseDesired()) + .build(); + } jobDescriptorBuilder.setService( ServiceJobSpec.newBuilder() .setEnabled(inService) .setCapacity(jobCapacity) .setMigrationPolicy(serviceMigrationPolicy) + .setServiceJobProcesses(titusServiceJobProcesses) .setRetryPolicy( RetryPolicy.newBuilder() .setExponentialBackOff( diff --git a/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/client/model/SubmitJobRequest.java b/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/client/model/SubmitJobRequest.java index e4ef44732e1..45db5465dbb 100644 --- a/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/client/model/SubmitJobRequest.java +++ b/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/client/model/SubmitJobRequest.java @@ -100,6 +100,7 @@ public static class Constraints { private DisruptionBudget disruptionBudget = null; private Constraints containerConstraints = null; + private ServiceJobProcesses serviceJobProcesses = null; public DisruptionBudget getDisruptionBudget() { return disruptionBudget; @@ -285,6 +286,11 @@ public SubmitJobRequest withConstraints(Constraints constraints) { return this; } + public SubmitJobRequest withServiceJobProcesses(ServiceJobProcesses serviceJobProcesses) { + this.serviceJobProcesses = serviceJobProcesses; + return this; + } + // Getters public String getJobType() { @@ -426,4 +432,8 @@ public MigrationPolicy getMigrationPolicy() { public Constraints getContainerConstraints() { return containerConstraints; } + + public ServiceJobProcesses getServiceJobProcesses() { + return serviceJobProcesses; + } } diff --git a/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/deploy/description/TitusDeployDescription.groovy b/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/deploy/description/TitusDeployDescription.groovy index 712a1c0cdd5..fd8728c7df5 100644 --- a/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/deploy/description/TitusDeployDescription.groovy +++ b/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/deploy/description/TitusDeployDescription.groovy @@ -22,6 +22,7 @@ import com.netflix.spinnaker.clouddriver.security.resources.ApplicationNameable import com.netflix.spinnaker.clouddriver.titus.client.model.DisruptionBudget import com.netflix.spinnaker.clouddriver.titus.client.model.Efs import com.netflix.spinnaker.clouddriver.titus.client.model.MigrationPolicy +import com.netflix.spinnaker.clouddriver.titus.client.model.ServiceJobProcesses import com.netflix.spinnaker.clouddriver.titus.client.model.SubmitJobRequest import groovy.transform.Canonical @@ -56,6 +57,7 @@ class TitusDeployDescription extends AbstractTitusCredentialsDescription impleme Boolean copySourceScalingPoliciesAndActions = true Integer sequence DisruptionBudget disruptionBudget + ServiceJobProcesses serviceJobProcesses // constraints take precedence over list of soft / hard constraints when specified SubmitJobRequest.Constraints constraints = new SubmitJobRequest.Constraints() diff --git a/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/deploy/handlers/TitusDeployHandler.groovy b/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/deploy/handlers/TitusDeployHandler.groovy index 4f975f41f2e..d924088177b 100644 --- a/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/deploy/handlers/TitusDeployHandler.groovy +++ b/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/deploy/handlers/TitusDeployHandler.groovy @@ -306,6 +306,7 @@ class TitusDeployHandler implements DeployHandler { [(it.key): it.value?.toString()] }) .withDisruptionBudget(description.disruptionBudget) + .withServiceJobProcesses(description.serviceJobProcesses) if (dockerImage.imageDigest != null) { submitJobRequest = submitJobRequest.withDockerDigest(dockerImage.imageDigest) @@ -395,6 +396,11 @@ class TitusDeployHandler implements DeployHandler { description.capacity.desired = sourceJob.instancesDesired } + if(description.serviceJobProcesses) { + description.serviceJobProcesses.disableDecreaseDesired = sourceJob.serviceJobProcesses.disableDecreaseDesired + description.serviceJobProcesses.disableIncreaseDesired = sourceJob.serviceJobProcesses.disableIncreaseDesired + } + description.resources.cpu = description.resources.cpu ?: sourceJob.cpu description.resources.memory = description.resources.memory ?: sourceJob.memory description.resources.disk = description.resources.disk ?: sourceJob.disk diff --git a/clouddriver-titus/src/test/groovy/com/netflix/spinnaker/clouddriver/titus/deploy/handlers/TitusDeployHandlerSpec.groovy b/clouddriver-titus/src/test/groovy/com/netflix/spinnaker/clouddriver/titus/deploy/handlers/TitusDeployHandlerSpec.groovy index 04d5867ef7f..af8a3ff67db 100644 --- a/clouddriver-titus/src/test/groovy/com/netflix/spinnaker/clouddriver/titus/deploy/handlers/TitusDeployHandlerSpec.groovy +++ b/clouddriver-titus/src/test/groovy/com/netflix/spinnaker/clouddriver/titus/deploy/handlers/TitusDeployHandlerSpec.groovy @@ -84,6 +84,10 @@ class TitusDeployHandlerSpec extends Specification { 'k1': 'value1', 'k2': 123 ], + serviceJobProcesses: [ + "disableIncreaseDesired": true, + "disableDecreaseDesired": true + ], constraints: [ soft: [ "AvailabilityZone" : "us-east-1d", @@ -136,6 +140,7 @@ class TitusDeployHandlerSpec extends Specification { it.allocateIpAddress == titusDeployDescription.resources.allocateIpAddress && it.labels.get("interestingHealthProviderNames") == "Titus,Discovery" && it.containerConstraints == constraints + it.serviceJobProcesses == titusDeployDescription.serviceJobProcesses } as SubmitJobRequest) >> "123456" }