|
|
|
@ -3,6 +3,7 @@ package checktyperegisterer |
|
|
|
|
import ( |
|
|
|
|
"context" |
|
|
|
|
"fmt" |
|
|
|
|
"time" |
|
|
|
|
|
|
|
|
|
"github.com/grafana/grafana-app-sdk/app" |
|
|
|
|
"github.com/grafana/grafana-app-sdk/k8s" |
|
|
|
@ -10,6 +11,7 @@ import ( |
|
|
|
|
advisorv0alpha1 "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1" |
|
|
|
|
"github.com/grafana/grafana/apps/advisor/pkg/app/checkregistry" |
|
|
|
|
"github.com/grafana/grafana/apps/advisor/pkg/app/checks" |
|
|
|
|
"github.com/grafana/grafana/pkg/infra/log" |
|
|
|
|
"k8s.io/apimachinery/pkg/api/errors" |
|
|
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" |
|
|
|
|
) |
|
|
|
@ -21,6 +23,9 @@ type Runner struct { |
|
|
|
|
checkRegistry checkregistry.CheckService |
|
|
|
|
client resource.Client |
|
|
|
|
namespace string |
|
|
|
|
log log.Logger |
|
|
|
|
retryAttempts int |
|
|
|
|
retryDelay time.Duration |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// NewRunner creates a new Runner.
|
|
|
|
@ -47,9 +52,32 @@ func New(cfg app.Config) (app.Runnable, error) { |
|
|
|
|
checkRegistry: checkRegistry, |
|
|
|
|
client: client, |
|
|
|
|
namespace: namespace, |
|
|
|
|
log: log.New("advisor.checktyperegisterer"), |
|
|
|
|
retryAttempts: 3, |
|
|
|
|
retryDelay: time.Second * 5, |
|
|
|
|
}, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (r *Runner) createOrUpdate(ctx context.Context, obj resource.Object) error { |
|
|
|
|
id := obj.GetStaticMetadata().Identifier() |
|
|
|
|
_, err := r.client.Create(ctx, id, obj, resource.CreateOptions{}) |
|
|
|
|
if err != nil { |
|
|
|
|
if errors.IsAlreadyExists(err) { |
|
|
|
|
// Already exists, update
|
|
|
|
|
r.log.Debug("Check type already exists, updating", "identifier", id) |
|
|
|
|
_, err = r.client.Update(ctx, id, obj, resource.UpdateOptions{}) |
|
|
|
|
if err != nil { |
|
|
|
|
// Ignore the error, it's probably due to a race condition
|
|
|
|
|
r.log.Error("Error updating check type", "error", err) |
|
|
|
|
} |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
r.log.Debug("Check type registered successfully", "identifier", id) |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (r *Runner) Run(ctx context.Context) error { |
|
|
|
|
for _, t := range r.checkRegistry.Checks() { |
|
|
|
|
steps := t.Steps() |
|
|
|
@ -72,19 +100,19 @@ func (r *Runner) Run(ctx context.Context) error { |
|
|
|
|
Steps: stepTypes, |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
id := obj.GetStaticMetadata().Identifier() |
|
|
|
|
_, err := r.client.Create(ctx, id, obj, resource.CreateOptions{}) |
|
|
|
|
if err != nil { |
|
|
|
|
if errors.IsAlreadyExists(err) { |
|
|
|
|
// Already exists, update
|
|
|
|
|
_, err = r.client.Update(ctx, id, obj, resource.UpdateOptions{}) |
|
|
|
|
for i := 0; i < r.retryAttempts; i++ { |
|
|
|
|
err := r.createOrUpdate(ctx, obj) |
|
|
|
|
if err != nil { |
|
|
|
|
return err |
|
|
|
|
r.log.Error("Error creating check type, retrying", "error", err, "attempt", i+1) |
|
|
|
|
if i == r.retryAttempts-1 { |
|
|
|
|
r.log.Error("Unable to register check type") |
|
|
|
|
} else { |
|
|
|
|
continue |
|
|
|
|
time.Sleep(r.retryDelay) |
|
|
|
|
} |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
return err |
|
|
|
|
r.log.Debug("Check type registered successfully", "check_type", t.ID()) |
|
|
|
|
break |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return nil |
|
|
|
|