diff --git a/cmd/operator.go b/cmd/operator.go index e805894eb..97c0fc5ea 100644 --- a/cmd/operator.go +++ b/cmd/operator.go @@ -110,6 +110,7 @@ func run(cmd *cobra.Command, args []string) { includeNamespaces := []string{} if operatorNamespace != "" { includeNamespaces = strings.Split(operatorNamespace, ",") + canaryJobs.CanaryNamespaces = includeNamespaces } runner.RunnerLabels = labels.LoadFromFile("/etc/podinfo/labels") diff --git a/pkg/db/canary.go b/pkg/db/canary.go index b0014b253..2f6cdd0cf 100644 --- a/pkg/db/canary.go +++ b/pkg/db/canary.go @@ -18,11 +18,12 @@ import ( "github.com/flanksource/duty/models" dutyTypes "github.com/flanksource/duty/types" "github.com/google/uuid" + "github.com/jackc/pgx/v5" "gorm.io/gorm" "gorm.io/gorm/clause" ) -func GetAllCanariesForSync() ([]pkg.Canary, error) { +func GetAllCanariesForSync(namespaces ...string) ([]pkg.Canary, error) { query := ` SELECT json_agg( jsonb_set_lax(to_jsonb(canaries),'{checks}', ( @@ -41,7 +42,14 @@ func GetAllCanariesForSync() ([]pkg.Canary, error) { agent_id = '00000000-0000-0000-0000-000000000000' ` - rows, err := Pool.Query(context.Background(), query) + args := make(pgx.NamedArgs) + + if namespaces != nil { + query += " AND namespace = ANY(@namespaces)" + args["namespaces"] = namespaces + } + + rows, err := Pool.Query(context.Background(), query, args) if err != nil { return nil, err } @@ -56,6 +64,7 @@ func GetAllCanariesForSync() ([]pkg.Canary, error) { return nil, fmt.Errorf("failed to unmarshal canaries:%w for %s", err, rows.RawValues()[0]) } } + return _canaries, nil } diff --git a/pkg/jobs/canary/canary_jobs.go b/pkg/jobs/canary/canary_jobs.go index a7555b182..38bb99c49 100644 --- a/pkg/jobs/canary/canary_jobs.go +++ b/pkg/jobs/canary/canary_jobs.go @@ -30,6 +30,10 @@ var DataFile string var Executor bool var LogPass, LogFail bool +// CanaryNamespaces is a list of namespaces whose canary specs should be synced. +// If empty, all namespaces will be synced +var CanaryNamespaces []string + var Kommons *kommons.Client var Kubernetes kubernetes.Interface var FuncScheduler = cron.New() @@ -346,7 +350,7 @@ func SyncCanaryJob(dbCanary pkg.Canary) error { func SyncCanaryJobs() { logger.Debugf("Syncing canary jobs") - canaries, err := db.GetAllCanariesForSync() + canaries, err := db.GetAllCanariesForSync(CanaryNamespaces...) if err != nil { logger.Errorf("Failed to get canaries: %v", err)