From 0823610a8bcf78a093153de8dacad347c25d6299 Mon Sep 17 00:00:00 2001 From: Miroslav Ivanov <40535952+mivanov1988@users.noreply.github.com> Date: Mon, 9 Oct 2023 11:14:18 +0300 Subject: [PATCH] control-service: user-initiated deployment notifications (#2757) # 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 --------- Signed-off-by: Miroslav Ivanov miroslavi@vmware.com Co-authored-by: github-actions <> --- .../service/deploy/DataJobsSynchronizer.java | 6 +--- .../service/deploy/DeploymentServiceV2.java | 7 +++-- .../model/DesiredDataJobDeployment.java | 4 +++ .../service/monitoring/DeploymentMonitor.java | 5 +-- .../DesiredJobDeploymentRepository.java | 9 +++--- ...d_to_desired_data_job_deployment_table.sql | 2 ++ .../deploy/DeploymentServiceV2TestIT.java | 31 ++++++++++++++++++- 7 files changed, 49 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 5b737a9f40..f083734149 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 @@ -91,15 +91,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..32e1b868de 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,9 @@ 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..a112feb889 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 =" - + " :dataJobName") - int updateDesiredDataJobDeploymentStatusByDataJobName( + "update DesiredDataJobDeployment d set d.status = :status, d.userInitiated = :userInitiated" + + " where d.dataJobName = :dataJobName") + 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..784f80aa9f 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,40 @@ 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, + 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 +90,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);