From 98110fac91703ba752656cc74cde3a9c168f6d3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20S=C4=99k?= Date: Tue, 18 Jun 2019 20:04:15 +0200 Subject: [PATCH] #4 Make backup before pod deletion --- pkg/apis/jenkins/v1alpha1/jenkins_types.go | 2 +- pkg/apis/jenkins/v1alpha2/jenkins_types.go | 8 +++++--- .../jenkins/configuration/base/reconcile.go | 14 +++++++++++++- test/e2e/restorebackup_test.go | 2 +- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/pkg/apis/jenkins/v1alpha1/jenkins_types.go b/pkg/apis/jenkins/v1alpha1/jenkins_types.go index 4c5d905e..55540b1f 100644 --- a/pkg/apis/jenkins/v1alpha1/jenkins_types.go +++ b/pkg/apis/jenkins/v1alpha1/jenkins_types.go @@ -41,7 +41,7 @@ type Container struct { // JenkinsMaster defines the Jenkins master pod attributes and plugins, // every single change requires Jenkins master pod restart type JenkinsMaster struct { - Container //TODO move to containers + Container // pod properties Annotations map[string]string `json:"masterAnnotations,omitempty"` diff --git a/pkg/apis/jenkins/v1alpha2/jenkins_types.go b/pkg/apis/jenkins/v1alpha2/jenkins_types.go index 612f4cff..9c5bd055 100644 --- a/pkg/apis/jenkins/v1alpha2/jenkins_types.go +++ b/pkg/apis/jenkins/v1alpha2/jenkins_types.go @@ -85,6 +85,7 @@ type JenkinsStatus struct { RestoredBackup uint64 `json:"restoredBackup,omitempty"` LastBackup uint64 `json:"lastBackup,omitempty"` PendingBackup uint64 `json:"pendingBackup,omitempty"` + BackupDoneBeforePodDeletion bool `json:"backupDoneBeforePodDeletion,omitempty"` } // BuildStatus defines type of Jenkins build job status @@ -178,9 +179,10 @@ type Handler struct { // Backup defines configuration of Jenkins backup type Backup struct { - ContainerName string `json:"containerName"` - Action Handler `json:"action"` - Interval uint64 `json:"interval"` + ContainerName string `json:"containerName"` + Action Handler `json:"action"` + Interval uint64 `json:"interval"` + MakeBackupBeforePodDeletion bool `json:"makeBackupBeforePodDeletion"` } // Restore defines configuration of Jenkins backup restore diff --git a/pkg/controller/jenkins/configuration/base/reconcile.go b/pkg/controller/jenkins/configuration/base/reconcile.go index ed0bf0e6..5be3e62f 100644 --- a/pkg/controller/jenkins/configuration/base/reconcile.go +++ b/pkg/controller/jenkins/configuration/base/reconcile.go @@ -404,7 +404,19 @@ func (r *ReconcileJenkinsBaseConfiguration) ensureJenkinsMasterPod(meta metav1.O if currentJenkinsMasterPod != nil && isPodTerminating(*currentJenkinsMasterPod) { backupAndRestore := backuprestore.New(r.k8sClient, *r.clientSet, r.logger, r.jenkins, *r.config) backupAndRestore.StopBackupTrigger() - //TODO backup before pod deletion? + if r.jenkins.Spec.Backup.MakeBackupBeforePodDeletion { + if r.jenkins.Status.LastBackup == r.jenkins.Status.PendingBackup && !r.jenkins.Status.BackupDoneBeforePodDeletion { + r.jenkins.Status.PendingBackup = r.jenkins.Status.PendingBackup + 1 + r.jenkins.Status.BackupDoneBeforePodDeletion = true + err = r.k8sClient.Update(context.TODO(), r.jenkins) + if err != nil { + return reconcile.Result{}, err + } + } + if err = backupAndRestore.Backup(); err != nil { + return reconcile.Result{}, err + } + } return reconcile.Result{Requeue: true}, nil } if currentJenkinsMasterPod != nil && r.isRecreatePodNeeded(*currentJenkinsMasterPod) { diff --git a/test/e2e/restorebackup_test.go b/test/e2e/restorebackup_test.go index 15c76b76..190b80b3 100644 --- a/test/e2e/restorebackup_test.go +++ b/test/e2e/restorebackup_test.go @@ -100,7 +100,7 @@ func createJenkinsWithBackupAndRestoreConfigured(t *testing.T, name, namespace s }, { Name: containerName, - Image: "virtuslab/jenkins-operator-backup-pvc:v0.0.1", + Image: "virtuslab/jenkins-operator-backup-pvc:v0.0.2", ImagePullPolicy: corev1.PullIfNotPresent, Env: []corev1.EnvVar{ {