diff --git a/pkg/apis/flagger/v1alpha3/types.go b/pkg/apis/flagger/v1alpha3/types.go index c356d8a04..e2138e453 100755 --- a/pkg/apis/flagger/v1alpha3/types.go +++ b/pkg/apis/flagger/v1alpha3/types.go @@ -136,7 +136,7 @@ type CanaryWebhook struct { type CanaryWebhookPayload struct { Name string `json:"name"` Namespace string `json:"namespace"` - Metadata *map[string]string `json:"metadata,omitempty"` + Metadata map[string]string `json:"metadata,omitempty"` } // GetProgressDeadlineSeconds returns the progress deadline (default 600s) diff --git a/pkg/apis/flagger/v1alpha3/zz_generated.deepcopy.go b/pkg/apis/flagger/v1alpha3/zz_generated.deepcopy.go index 34b134d7a..f3e090fe8 100644 --- a/pkg/apis/flagger/v1alpha3/zz_generated.deepcopy.go +++ b/pkg/apis/flagger/v1alpha3/zz_generated.deepcopy.go @@ -234,13 +234,9 @@ func (in *CanaryWebhookPayload) DeepCopyInto(out *CanaryWebhookPayload) { *out = *in if in.Metadata != nil { in, out := &in.Metadata, &out.Metadata - *out = new(map[string]string) - if **in != nil { - in, out := *in, *out - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val } } return diff --git a/pkg/controller/scheduler.go b/pkg/controller/scheduler.go index 0fd9f1c42..b13da42e6 100644 --- a/pkg/controller/scheduler.go +++ b/pkg/controller/scheduler.go @@ -2,6 +2,7 @@ package controller import ( "fmt" + "strings" "time" flaggerv1 "github.com/stefanprodan/flagger/pkg/apis/flagger/v1alpha3" @@ -336,12 +337,27 @@ func (c *Controller) hasCanaryRevisionChanged(cd *flaggerv1.Canary) bool { } func (c *Controller) analyseCanary(r *flaggerv1.Canary) bool { + // run external checks + for _, webhook := range r.Spec.CanaryAnalysis.Webhooks { + err := CallWebhook(r.Name, r.Namespace, webhook) + if err != nil { + c.recordEventWarningf(r, "Halt %s.%s advancement external check %s failed %v", + r.Name, r.Namespace, webhook.Name, err) + return false + } + } + // run metrics checks for _, metric := range r.Spec.CanaryAnalysis.Metrics { if metric.Name == "istio_requests_total" { val, err := c.observer.GetDeploymentCounter(r.Spec.TargetRef.Name, r.Namespace, metric.Name, metric.Interval) if err != nil { - c.recordEventErrorf(r, "Metrics server %s query failed: %v", c.observer.metricsServer, err) + if strings.Contains(err.Error(), "no values found"){ + c.recordEventWarningf(r, "Halt advancement no values found for metric %s probably %s.%s is not receiving traffic", + metric.Name, r.Spec.TargetRef.Name, r.Namespace) + }else { + c.recordEventErrorf(r, "Metrics server %s query failed: %v", c.observer.metricsServer, err) + } return false } if float64(metric.Threshold) > val { @@ -366,15 +382,5 @@ func (c *Controller) analyseCanary(r *flaggerv1.Canary) bool { } } - // run external checks - for _, webhook := range r.Spec.CanaryAnalysis.Webhooks { - err := CallWebhook(r.Name, r.Namespace, webhook) - if err != nil { - c.recordEventWarningf(r, "Halt %s.%s advancement external check %s failed %v", - r.Name, r.Namespace, webhook.Name, err) - return false - } - } - return true } diff --git a/pkg/controller/webhook.go b/pkg/controller/webhook.go index f9c99ef0e..7c0322b4d 100644 --- a/pkg/controller/webhook.go +++ b/pkg/controller/webhook.go @@ -19,7 +19,10 @@ func CallWebhook(name string, namepace string, w flaggerv1.CanaryWebhook) error payload := flaggerv1.CanaryWebhookPayload{ Name: name, Namespace: namepace, - Metadata: w.Metadata, + } + + if w.Metadata != nil { + payload.Metadata = *w.Metadata } payloadBin, err := json.Marshal(payload)