diff --git a/pkg/db/canary.go b/pkg/db/canary.go index dbd2b0642..792f22a5a 100644 --- a/pkg/db/canary.go +++ b/pkg/db/canary.go @@ -295,16 +295,9 @@ func CreateCheck(canary pkg.Canary, check *pkg.Check) error { return Gorm.Create(&check).Error } -func PersistCanary(canary v1.Canary, source string) (*pkg.Canary, map[string]string, bool, error) { +func PersistCanaryModel(model pkg.Canary) (*pkg.Canary, map[string]string, bool, error) { + var err error changed := false - model, err := pkg.CanaryFromV1(canary) - if err != nil { - return nil, nil, changed, err - } - if canary.GetPersistedID() != "" { - model.ID, _ = uuid.Parse(canary.GetPersistedID()) - } - model.Source = source tx := Gorm.Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "agent_id"}, {Name: "name"}, {Name: "namespace"}, {Name: "source"}}, UpdateAll: true, @@ -333,15 +326,15 @@ func PersistCanary(canary v1.Canary, source string) (*pkg.Canary, map[string]str return nil, nil, changed, err } + var spec v1.CanarySpec + if err = json.Unmarshal(model.Spec, &spec); err != nil { + return nil, nil, changed, err + } + var checks = make(map[string]string) var newCheckIDs []string - for _, config := range canary.Spec.GetAllChecks() { + for _, config := range spec.GetAllChecks() { check := pkg.FromExternalCheck(model, config) - // not creating the new check if already exists in the status - // status is not patched correctly with the status id - if checkID := canary.GetCheckID(check.Name); checkID != "" { - check.ID, _ = uuid.Parse(checkID) - } check.Spec, _ = json.Marshal(config) id, err := PersistCheck(check, model.ID) if err != nil { @@ -361,9 +354,25 @@ func PersistCanary(canary v1.Canary, source string) (*pkg.Canary, map[string]str } metrics.UnregisterGauge(checkIDsToRemove) } + + model.Checks = checks return &model, checks, changed, nil } +func PersistCanary(canary v1.Canary, source string) (*pkg.Canary, map[string]string, bool, error) { + changed := false + model, err := pkg.CanaryFromV1(canary) + if err != nil { + return nil, nil, changed, err + } + if canary.GetPersistedID() != "" { + model.ID, _ = uuid.Parse(canary.GetPersistedID()) + } + model.Source = source + + return PersistCanaryModel(model) +} + func RefreshCheckStatusSummary() { if err := duty.RefreshCheckStatusSummary(Pool); err != nil { logger.Errorf("error refreshing check_status_summary materialized view: %v", err) diff --git a/pkg/jobs/canary/canary_jobs.go b/pkg/jobs/canary/canary_jobs.go index c7ec7db0a..3bca946b6 100644 --- a/pkg/jobs/canary/canary_jobs.go +++ b/pkg/jobs/canary/canary_jobs.go @@ -344,6 +344,19 @@ func SyncCanaryJobs() { jobHistory := models.NewJobHistory("CanarySync", "canary", c.ID.String()).Start() _ = db.PersistJobHistory(jobHistory) + // A canary can exist whilst not having any checks in database + // We persist the canary again for those cases to populate the checks + if c.Checks == nil { + model, _, _, err := db.PersistCanaryModel(c) + if err != nil { + logger.Errorf("Error persisting canary[%s]: %v", c.ID, err.Error()) + _ = db.PersistJobHistory(jobHistory.AddError(err.Error()).End()) + continue + + } + c = *model + } + if err := SyncCanaryJob(c); err != nil { logger.Errorf("Error syncing canary[%s]: %v", c.ID, err.Error()) _ = db.PersistJobHistory(jobHistory.AddError(err.Error()).End())