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"
|
||||
// AnnNextCronTime is the next time stamp which satisfies the cron expression
|
||||
AnnNextCronTime = AnnAPIGroup + "/storage.import.nextCronTime"
|
||||
// AnnLastCronTime is the cron last execution time stamp
|
||||
AnnLastCronTime = AnnAPIGroup + "/storage.import.lastCronTime"
|
||||
|
||||
dataImportControllerName = "dataimportcron-controller"
|
||||
digestPrefix = "sha256:"
|
||||
@ -247,9 +249,7 @@ func (r *DataImportCronReconciler) update(ctx context.Context, dataImportCron *c
|
||||
log := r.log.WithName("update")
|
||||
res := reconcile.Result{}
|
||||
|
||||
now := metav1.Now()
|
||||
dataImportCron.Status.LastExecutionTimestamp = &now
|
||||
|
||||
dataImportCronCopy := dataImportCron.DeepCopy()
|
||||
importSucceeded := false
|
||||
imports := dataImportCron.Status.CurrentImports
|
||||
dataVolume := &cdiv1.DataVolume{}
|
||||
@ -270,7 +270,7 @@ func (r *DataImportCronReconciler) update(ctx context.Context, dataImportCron *c
|
||||
switch dataVolume.Status.Phase {
|
||||
case cdiv1.Succeeded:
|
||||
importSucceeded = true
|
||||
if err := r.updateDataImportCronOnSuccess(ctx, dataImportCron); err != nil {
|
||||
if err := updateDataImportCronOnSuccess(dataImportCron); err != nil {
|
||||
return res, err
|
||||
}
|
||||
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)
|
||||
}
|
||||
|
||||
if err := updateLastExecutionTimestamp(dataImportCron); err != nil {
|
||||
return res, err
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(dataImportCron, dataImportCronCopy) {
|
||||
if err := r.client.Update(ctx, dataImportCron); err != nil {
|
||||
return res, err
|
||||
}
|
||||
}
|
||||
return res, nil
|
||||
}
|
||||
|
||||
@ -366,6 +372,7 @@ func (r *DataImportCronReconciler) updateImageStreamDesiredDigest(ctx context.Co
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
AddAnnotation(dataImportCron, AnnLastCronTime, time.Now().Format(time.RFC3339))
|
||||
if digest != "" && dataImportCron.Annotations[AnnSourceDesiredDigest] != digest {
|
||||
log.Info("Updating DataImportCron", "digest", digest)
|
||||
AddAnnotation(dataImportCron, AnnSourceDesiredDigest, digest)
|
||||
@ -408,7 +415,7 @@ func (r *DataImportCronReconciler) updateDataSource(ctx context.Context, dataImp
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *DataImportCronReconciler) updateDataImportCronOnSuccess(ctx context.Context, dataImportCron *cdiv1.DataImportCron) error {
|
||||
func updateDataImportCronOnSuccess(dataImportCron *cdiv1.DataImportCron) error {
|
||||
if dataImportCron.Status.CurrentImports == nil {
|
||||
return errors.Errorf("No CurrentImports in cron %s", dataImportCron.Name)
|
||||
}
|
||||
@ -424,6 +431,21 @@ func (r *DataImportCronReconciler) updateDataImportCronOnSuccess(ctx context.Con
|
||||
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 {
|
||||
log := r.log.WithName("createImportDataVolume")
|
||||
dataSourceName := dataImportCron.Spec.ManagedDataSource
|
||||
|
@ -241,7 +241,6 @@ var _ = Describe("All DataImportCron Tests", func() {
|
||||
err = reconciler.client.Update(context.TODO(), dv)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
verifyConditions("Import in progress", true, false, false, inProgress, inProgress, noPvc)
|
||||
Expect(cron.Status.LastExecutionTimestamp).ToNot(BeNil())
|
||||
|
||||
dv.Status.Phase = cdiv1.Succeeded
|
||||
err = reconciler.client.Update(context.TODO(), dv)
|
||||
|
@ -7,6 +7,7 @@ import (
|
||||
"log"
|
||||
"os"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/client-go/tools/clientcmd"
|
||||
@ -64,21 +65,21 @@ func main() {
|
||||
|
||||
dataImportCron, err := cdiClient.CdiV1beta1().DataImportCrons(cronNamespace).Get(context.TODO(), cronName, metav1.GetOptions{})
|
||||
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
|
||||
if digest != "" && (imports == nil || digest != imports[0].Digest) &&
|
||||
digest != dataImportCron.Annotations[controller.AnnSourceDesiredDigest] {
|
||||
if dataImportCron.Annotations == nil {
|
||||
dataImportCron.Annotations = make(map[string]string)
|
||||
}
|
||||
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)
|
||||
controller.AddAnnotation(dataImportCron, controller.AnnSourceDesiredDigest, digest)
|
||||
fmt.Println("Digest updated")
|
||||
} 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