From 034f20916de29b318fa65eded531ed93ae2ffbe0 Mon Sep 17 00:00:00 2001 From: Miroslav Ivanov Date: Wed, 4 Oct 2023 14:58:15 +0300 Subject: [PATCH] control-service: user-initiated deployment notifications Why Currently, the new deployment mechanism sends notifications every time, lacking the ability to send them only when the user initiates the deployment. What We modified the method to send notifications exclusively when deployments are initiated by the User, by incorporating a check for DeploymentStatus.NONE which represents user-initiated deployments. Testing done: Unit tests. Signed-off-by: Miroslav Ivanov miroslavi@vmware.com --- .../service/deploy/DataJobsSynchronizer.java | 6 +--- .../service/deploy/DeploymentServiceV2.java | 7 +++-- .../model/DesiredDataJobDeployment.java | 4 +++ .../service/monitoring/DeploymentMonitor.java | 4 +-- .../DesiredJobDeploymentRepository.java | 7 +++-- ...d_to_desired_data_job_deployment_table.sql | 2 ++ .../deploy/DeploymentServiceV2TestIT.java | 28 +++++++++++++++++-- 7 files changed, 43 insertions(+), 15 deletions(-) create mode 100644 projects/control-service/projects/pipelines_control_service/src/main/resources/db/migration/V20231005163000__add_column_is_user_initiated_to_desired_data_job_deployment_table.sql diff --git a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/deploy/DataJobsSynchronizer.java b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/deploy/DataJobsSynchronizer.java index 94609f6fdb..324faad3cc 100644 --- a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/deploy/DataJobsSynchronizer.java +++ b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/deploy/DataJobsSynchronizer.java @@ -79,15 +79,11 @@ void synchronizeDataJob( ActualDataJobDeployment actualDataJobDeployment, boolean isDeploymentPresentInKubernetes) { if (desiredDataJobDeployment != null) { - boolean sendNotification = - true; // TODO [miroslavi] sends notification only when the deployment is initiated by the - // user. deploymentService.updateDeployment( dataJob, desiredDataJobDeployment, actualDataJobDeployment, - isDeploymentPresentInKubernetes, - sendNotification); + isDeploymentPresentInKubernetes); } } diff --git a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/deploy/DeploymentServiceV2.java b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/deploy/DeploymentServiceV2.java index 4a53635cb1..dbaf91d030 100644 --- a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/deploy/DeploymentServiceV2.java +++ b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/deploy/DeploymentServiceV2.java @@ -57,15 +57,13 @@ public class DeploymentServiceV2 { * @param actualJobDeployment the actual data job deployment has been deployed. * @param isJobDeploymentPresentInKubernetes if it is true the data job deployment is present in * Kubernetes. - * @param sendNotification if it is true the method will send a notification to the end user. */ @Measurable(includeArg = 0, argName = "data_job") public void updateDeployment( DataJob dataJob, DesiredDataJobDeployment desiredJobDeployment, ActualDataJobDeployment actualJobDeployment, - boolean isJobDeploymentPresentInKubernetes, - Boolean sendNotification) { + boolean isJobDeploymentPresentInKubernetes) { if (desiredJobDeployment == null) { log.warn( "Skipping the data job [job_name={}] deployment due to the missing deployment data", @@ -83,6 +81,9 @@ public void updateDeployment( return; } + // Sends notification only when the deployment is initiated by the user. + boolean sendNotification = Boolean.TRUE.equals(desiredJobDeployment.getUserInitiated()); + try { log.info("Starting deployment of job {}", desiredJobDeployment.getDataJobName()); deploymentProgress.started(dataJob.getJobConfig(), desiredJobDeployment); diff --git a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/model/DesiredDataJobDeployment.java b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/model/DesiredDataJobDeployment.java index f484bc17ff..6fa7067f52 100644 --- a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/model/DesiredDataJobDeployment.java +++ b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/model/DesiredDataJobDeployment.java @@ -10,6 +10,7 @@ import lombok.Setter; import lombok.ToString; +import javax.persistence.Column; import javax.persistence.Entity; @Getter @@ -20,4 +21,7 @@ public class DesiredDataJobDeployment extends BaseDataJobDeployment { private DeploymentStatus status; + + @Column(name = "is_user_initiated") + private Boolean userInitiated; } diff --git a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/monitoring/DeploymentMonitor.java b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/monitoring/DeploymentMonitor.java index bd4677081c..0c3354f436 100644 --- a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/monitoring/DeploymentMonitor.java +++ b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/monitoring/DeploymentMonitor.java @@ -107,8 +107,8 @@ private boolean saveDataJobStatus( actualJobDeploymentRepository.save(actualDataJobDeployment); } - desiredJobDeploymentRepository.updateDesiredDataJobDeploymentStatusByDataJobName( - dataJobName, deploymentStatus); + desiredJobDeploymentRepository.updateDesiredDataJobDeploymentStatusAndUserInitiatedByDataJobName( + dataJobName, deploymentStatus, false); return true; } log.debug("Data job: {} was deleted or hasn't been created", dataJobName); diff --git a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/repository/DesiredJobDeploymentRepository.java b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/repository/DesiredJobDeploymentRepository.java index 31ad1a3174..5da72ad081 100644 --- a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/repository/DesiredJobDeploymentRepository.java +++ b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/repository/DesiredJobDeploymentRepository.java @@ -41,9 +41,10 @@ int updateDesiredDataJobDeploymentEnabledByDataJobName( @Transactional @Modifying(clearAutomatically = true) @Query( - "update DesiredDataJobDeployment d set d.status = :status where d.dataJobName =" + "update DesiredDataJobDeployment d set d.status = :status, d.userInitiated = :userInitiated where d.dataJobName =" + " :dataJobName") - int updateDesiredDataJobDeploymentStatusByDataJobName( + int updateDesiredDataJobDeploymentStatusAndUserInitiatedByDataJobName( @Param(value = "dataJobName") String dataJobName, - @Param(value = "status") DeploymentStatus status); + @Param(value = "status") DeploymentStatus status, + @Param(value = "userInitiated") Boolean userInitiatedDeployment); } diff --git a/projects/control-service/projects/pipelines_control_service/src/main/resources/db/migration/V20231005163000__add_column_is_user_initiated_to_desired_data_job_deployment_table.sql b/projects/control-service/projects/pipelines_control_service/src/main/resources/db/migration/V20231005163000__add_column_is_user_initiated_to_desired_data_job_deployment_table.sql new file mode 100644 index 0000000000..919acd53f7 --- /dev/null +++ b/projects/control-service/projects/pipelines_control_service/src/main/resources/db/migration/V20231005163000__add_column_is_user_initiated_to_desired_data_job_deployment_table.sql @@ -0,0 +1,2 @@ +alter table if exists desired_data_job_deployment + add column if not exists is_user_initiated boolean; diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/DeploymentServiceV2TestIT.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/DeploymentServiceV2TestIT.java index 45c681cdd2..ac5b07ff30 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/DeploymentServiceV2TestIT.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/DeploymentServiceV2TestIT.java @@ -49,11 +49,35 @@ public void updateDeployment_withDesiredDeploymentStatusNone_shouldStartDeployme updateDeployment(DeploymentStatus.NONE, 1); } + @Test + public void updateDeployment_withDesiredDeploymentUserInitiatedDeploymentTrue_shouldSendNotification() + throws IOException, InterruptedException, ApiException { + updateDeployment(DeploymentStatus.NONE, 1, true); + + Mockito.verify(jobImageBuilder, Mockito.times(1)) + .buildImage(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.eq(true)); + } + + @Test + public void updateDeployment_withDesiredDeploymentUserInitiatedDeploymentFalse_shouldNotSendNotification() + throws IOException, InterruptedException, ApiException { + updateDeployment(DeploymentStatus.NONE, 1, false); + + Mockito.verify(jobImageBuilder, Mockito.times(1)) + .buildImage(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.eq(false)); + } + + private void updateDeployment( + DeploymentStatus deploymentStatus, int deploymentProgressStartedInvocations) throws IOException, InterruptedException, ApiException { + updateDeployment(deploymentStatus, deploymentProgressStartedInvocations, true); + } + private void updateDeployment( - DeploymentStatus deploymentStatus, int deploymentProgressStartedInvocations) + DeploymentStatus deploymentStatus, int deploymentProgressStartedInvocations, boolean sendNotification) throws IOException, InterruptedException, ApiException { DesiredDataJobDeployment desiredDataJobDeployment = new DesiredDataJobDeployment(); desiredDataJobDeployment.setStatus(deploymentStatus); + desiredDataJobDeployment.setUserInitiated(sendNotification); DataJob dataJob = new DataJob(); dataJob.setJobConfig(new JobConfig()); Mockito.when( @@ -61,7 +85,7 @@ private void updateDeployment( .thenReturn(false); deploymentService.updateDeployment( - dataJob, desiredDataJobDeployment, new ActualDataJobDeployment(), true, true); + dataJob, desiredDataJobDeployment, new ActualDataJobDeployment(), true); Mockito.verify(deploymentProgress, Mockito.times(deploymentProgressStartedInvocations)) .started(dataJob.getJobConfig(), desiredDataJobDeployment);