mirror of
https://github.com/kubevirt/containerized-data-importer.git
synced 2025-06-03 06:30:22 +00:00
Get rid of unnecessary DIC reconcile updates (#2294)
* Get rid of unnecessary DIC reconcile updates Also fixed status.lastExecutionTimestamp to be the last polling time as intended in the design, and not the last reconcile update time. Signed-off-by: Arnon Gilboa <agilboa@redhat.com> * Pass DIC last execution time by annotation Signed-off-by: Arnon Gilboa <agilboa@redhat.com>
This commit is contained in:
parent
8db48708fc
commit
50467a68be
@ -95,6 +95,8 @@ const (
|
|||||||
AnnImageStreamDockerRef = AnnAPIGroup + "/storage.import.imageStreamDockerRef"
|
AnnImageStreamDockerRef = AnnAPIGroup + "/storage.import.imageStreamDockerRef"
|
||||||
// AnnNextCronTime is the next time stamp which satisfies the cron expression
|
// AnnNextCronTime is the next time stamp which satisfies the cron expression
|
||||||
AnnNextCronTime = AnnAPIGroup + "/storage.import.nextCronTime"
|
AnnNextCronTime = AnnAPIGroup + "/storage.import.nextCronTime"
|
||||||
|
// AnnLastCronTime is the cron last execution time stamp
|
||||||
|
AnnLastCronTime = AnnAPIGroup + "/storage.import.lastCronTime"
|
||||||
|
|
||||||
dataImportControllerName = "dataimportcron-controller"
|
dataImportControllerName = "dataimportcron-controller"
|
||||||
digestPrefix = "sha256:"
|
digestPrefix = "sha256:"
|
||||||
@ -247,9 +249,7 @@ func (r *DataImportCronReconciler) update(ctx context.Context, dataImportCron *c
|
|||||||
log := r.log.WithName("update")
|
log := r.log.WithName("update")
|
||||||
res := reconcile.Result{}
|
res := reconcile.Result{}
|
||||||
|
|
||||||
now := metav1.Now()
|
dataImportCronCopy := dataImportCron.DeepCopy()
|
||||||
dataImportCron.Status.LastExecutionTimestamp = &now
|
|
||||||
|
|
||||||
importSucceeded := false
|
importSucceeded := false
|
||||||
imports := dataImportCron.Status.CurrentImports
|
imports := dataImportCron.Status.CurrentImports
|
||||||
dataVolume := &cdiv1.DataVolume{}
|
dataVolume := &cdiv1.DataVolume{}
|
||||||
@ -270,7 +270,7 @@ func (r *DataImportCronReconciler) update(ctx context.Context, dataImportCron *c
|
|||||||
switch dataVolume.Status.Phase {
|
switch dataVolume.Status.Phase {
|
||||||
case cdiv1.Succeeded:
|
case cdiv1.Succeeded:
|
||||||
importSucceeded = true
|
importSucceeded = true
|
||||||
if err := r.updateDataImportCronOnSuccess(ctx, dataImportCron); err != nil {
|
if err := updateDataImportCronOnSuccess(dataImportCron); err != nil {
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
updateDataImportCronCondition(dataImportCron, cdiv1.DataImportCronProgressing, corev1.ConditionFalse, "No current import", noImport)
|
updateDataImportCronCondition(dataImportCron, cdiv1.DataImportCronProgressing, corev1.ConditionFalse, "No current import", noImport)
|
||||||
@ -324,9 +324,15 @@ func (r *DataImportCronReconciler) update(ctx context.Context, dataImportCron *c
|
|||||||
updateDataImportCronCondition(dataImportCron, cdiv1.DataImportCronUpToDate, corev1.ConditionFalse, "No source digest", noDigest)
|
updateDataImportCronCondition(dataImportCron, cdiv1.DataImportCronUpToDate, corev1.ConditionFalse, "No source digest", noDigest)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := r.client.Update(ctx, dataImportCron); err != nil {
|
if err := updateLastExecutionTimestamp(dataImportCron); err != nil {
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !reflect.DeepEqual(dataImportCron, dataImportCronCopy) {
|
||||||
|
if err := r.client.Update(ctx, dataImportCron); err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
}
|
||||||
return res, nil
|
return res, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -366,6 +372,7 @@ func (r *DataImportCronReconciler) updateImageStreamDesiredDigest(ctx context.Co
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
AddAnnotation(dataImportCron, AnnLastCronTime, time.Now().Format(time.RFC3339))
|
||||||
if digest != "" && dataImportCron.Annotations[AnnSourceDesiredDigest] != digest {
|
if digest != "" && dataImportCron.Annotations[AnnSourceDesiredDigest] != digest {
|
||||||
log.Info("Updating DataImportCron", "digest", digest)
|
log.Info("Updating DataImportCron", "digest", digest)
|
||||||
AddAnnotation(dataImportCron, AnnSourceDesiredDigest, digest)
|
AddAnnotation(dataImportCron, AnnSourceDesiredDigest, digest)
|
||||||
@ -408,7 +415,7 @@ func (r *DataImportCronReconciler) updateDataSource(ctx context.Context, dataImp
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *DataImportCronReconciler) updateDataImportCronOnSuccess(ctx context.Context, dataImportCron *cdiv1.DataImportCron) error {
|
func updateDataImportCronOnSuccess(dataImportCron *cdiv1.DataImportCron) error {
|
||||||
if dataImportCron.Status.CurrentImports == nil {
|
if dataImportCron.Status.CurrentImports == nil {
|
||||||
return errors.Errorf("No CurrentImports in cron %s", dataImportCron.Name)
|
return errors.Errorf("No CurrentImports in cron %s", dataImportCron.Name)
|
||||||
}
|
}
|
||||||
@ -424,6 +431,21 @@ func (r *DataImportCronReconciler) updateDataImportCronOnSuccess(ctx context.Con
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func updateLastExecutionTimestamp(cron *cdiv1.DataImportCron) error {
|
||||||
|
lastTimeStr := cron.Annotations[AnnLastCronTime]
|
||||||
|
if lastTimeStr == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
lastTime, err := time.Parse(time.RFC3339, lastTimeStr)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if ts := cron.Status.LastExecutionTimestamp; ts == nil || ts.Time != lastTime {
|
||||||
|
cron.Status.LastExecutionTimestamp = &metav1.Time{lastTime}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (r *DataImportCronReconciler) createImportDataVolume(ctx context.Context, dataImportCron *cdiv1.DataImportCron) error {
|
func (r *DataImportCronReconciler) createImportDataVolume(ctx context.Context, dataImportCron *cdiv1.DataImportCron) error {
|
||||||
log := r.log.WithName("createImportDataVolume")
|
log := r.log.WithName("createImportDataVolume")
|
||||||
dataSourceName := dataImportCron.Spec.ManagedDataSource
|
dataSourceName := dataImportCron.Spec.ManagedDataSource
|
||||||
|
@ -241,7 +241,6 @@ var _ = Describe("All DataImportCron Tests", func() {
|
|||||||
err = reconciler.client.Update(context.TODO(), dv)
|
err = reconciler.client.Update(context.TODO(), dv)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
verifyConditions("Import in progress", true, false, false, inProgress, inProgress, noPvc)
|
verifyConditions("Import in progress", true, false, false, inProgress, inProgress, noPvc)
|
||||||
Expect(cron.Status.LastExecutionTimestamp).ToNot(BeNil())
|
|
||||||
|
|
||||||
dv.Status.Phase = cdiv1.Succeeded
|
dv.Status.Phase = cdiv1.Succeeded
|
||||||
err = reconciler.client.Update(context.TODO(), dv)
|
err = reconciler.client.Update(context.TODO(), dv)
|
||||||
|
@ -7,6 +7,7 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"time"
|
||||||
|
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/client-go/tools/clientcmd"
|
"k8s.io/client-go/tools/clientcmd"
|
||||||
@ -64,21 +65,21 @@ func main() {
|
|||||||
|
|
||||||
dataImportCron, err := cdiClient.CdiV1beta1().DataImportCrons(cronNamespace).Get(context.TODO(), cronName, metav1.GetOptions{})
|
dataImportCron, err := cdiClient.CdiV1beta1().DataImportCrons(cronNamespace).Get(context.TODO(), cronName, metav1.GetOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Failed getting DataImportCron, cronNamespace %s cronName %s: %v", cronNamespace, cronName, err)
|
log.Fatalf("Failed getting DataImportCron %s/%s: %v", cronNamespace, cronName, err)
|
||||||
}
|
}
|
||||||
|
controller.AddAnnotation(dataImportCron, controller.AnnLastCronTime, time.Now().Format(time.RFC3339))
|
||||||
|
|
||||||
imports := dataImportCron.Status.CurrentImports
|
imports := dataImportCron.Status.CurrentImports
|
||||||
if digest != "" && (imports == nil || digest != imports[0].Digest) &&
|
if digest != "" && (imports == nil || digest != imports[0].Digest) &&
|
||||||
digest != dataImportCron.Annotations[controller.AnnSourceDesiredDigest] {
|
digest != dataImportCron.Annotations[controller.AnnSourceDesiredDigest] {
|
||||||
if dataImportCron.Annotations == nil {
|
controller.AddAnnotation(dataImportCron, controller.AnnSourceDesiredDigest, digest)
|
||||||
dataImportCron.Annotations = make(map[string]string)
|
fmt.Println("Digest updated")
|
||||||
}
|
|
||||||
dataImportCron.Annotations[controller.AnnSourceDesiredDigest] = digest
|
|
||||||
dataImportCron, err = cdiClient.CdiV1beta1().DataImportCrons(cronNamespace).Update(context.TODO(), dataImportCron, metav1.UpdateOptions{})
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Failed updating DataImportCron, cronNamespace %s cronName %s: %v", cronNamespace, cronName, err)
|
|
||||||
}
|
|
||||||
fmt.Println("Updated DataImportCron", dataImportCron.Name)
|
|
||||||
} else {
|
} else {
|
||||||
fmt.Println("No update to DataImportCron", dataImportCron.Name)
|
fmt.Println("No digest update")
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = cdiClient.CdiV1beta1().DataImportCrons(cronNamespace).Update(context.TODO(), dataImportCron, metav1.UpdateOptions{})
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Failed updating DataImportCron %s/%s: %v", cronNamespace, cronName, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user