From 2550bad216f43c2af82693f1105c49e7c9e7cda7 Mon Sep 17 00:00:00 2001 From: Aditya Date: Mon, 8 May 2023 13:50:26 +0545 Subject: [PATCH 01/20] setup dynatrace API [skip ci] --- api/v1/canary_types.go | 4 +++ api/v1/checks.go | 18 ++++++++++ checks/checker.go | 1 + checks/dynatrace.go | 54 +++++++++++++++++++++++++++++ fixtures/datasources/dynatrace.yaml | 15 ++++++++ go.mod | 1 + go.sum | 2 ++ 7 files changed, 95 insertions(+) create mode 100644 checks/dynatrace.go create mode 100644 fixtures/datasources/dynatrace.yaml diff --git a/api/v1/canary_types.go b/api/v1/canary_types.go index f66c043a9..b11d18be1 100644 --- a/api/v1/canary_types.go +++ b/api/v1/canary_types.go @@ -70,6 +70,7 @@ type CanarySpec struct { ConfigDB []ConfigDBCheck `yaml:"configDB,omitempty" json:"configDB,omitempty"` Elasticsearch []ElasticsearchCheck `yaml:"elasticsearch,omitempty" json:"elasticsearch,omitempty"` AlertManager []AlertManagerCheck `yaml:"alertmanager,omitempty" json:"alertmanager,omitempty"` + Dynatrace []DynatraceCheck `yaml:"dynatrace,omitempty" json:"dynatrace,omitempty"` AzureDevops []AzureDevopsCheck `yaml:"azureDevops,omitempty" json:"azureDevops,omitempty"` // interval (in seconds) to run checks on Deprecated in favor of Schedule Interval uint64 `yaml:"interval,omitempty" json:"interval,omitempty"` @@ -189,6 +190,9 @@ func (spec CanarySpec) GetAllChecks() []external.Check { for _, check := range spec.AzureDevops { checks = append(checks, check) } + for _, check := range spec.Dynatrace { + checks = append(checks, check) + } return checks } diff --git a/api/v1/checks.go b/api/v1/checks.go index 561adaae3..c2e82697a 100644 --- a/api/v1/checks.go +++ b/api/v1/checks.go @@ -416,6 +416,23 @@ func (c ElasticsearchCheck) GetEndpoint() string { return c.URL } +type DynatraceCheck struct { + Description `yaml:",inline" json:",inline"` + Templatable `yaml:",inline" json:",inline"` + Host string `yaml:"host" json:"host,omitempty" template:"true"` + Scheme string `yaml:"scheme" json:"scheme,omitempty"` + APIKey kommons.EnvVar `yaml:"apiKey" json:"apiKey,omitempty"` + Namespace string `yaml:"namespace" json:"namespace,omitempty" template:"true"` +} + +func (t DynatraceCheck) GetType() string { + return "dynatrace" +} + +func (t DynatraceCheck) GetEndpoint() string { + return fmt.Sprintf("%s://%s", t.Scheme, t.Host) +} + /* [include:datasources/alertmanager_pass.yaml] */ @@ -1181,6 +1198,7 @@ var AllChecks = []external.Check{ ResticCheck{}, NamespaceCheck{}, DNSCheck{}, + DynatraceCheck{}, HelmCheck{}, JmeterCheck{}, JunitCheck{}, diff --git a/checks/checker.go b/checks/checker.go index 240f937c4..5dc66cc7c 100644 --- a/checks/checker.go +++ b/checks/checker.go @@ -50,6 +50,7 @@ var All = []Checker{ &ElasticsearchChecker{}, &AlertManagerChecker{}, &AzureDevopsChecker{}, + &DynatraceChecker{}, NewPodChecker(), NewNamespaceChecker(), NewTCPChecker(), diff --git a/checks/dynatrace.go b/checks/dynatrace.go new file mode 100644 index 000000000..39eb27e6f --- /dev/null +++ b/checks/dynatrace.go @@ -0,0 +1,54 @@ +package checks + +import ( + "github.com/dynatrace-ace/dynatrace-go-api-client/api/v2/environment/dynatrace" + "github.com/flanksource/canary-checker/api/context" + "github.com/flanksource/canary-checker/api/external" + v1 "github.com/flanksource/canary-checker/api/v1" + "github.com/flanksource/canary-checker/pkg" + "github.com/flanksource/commons/logger" +) + +type DynatraceChecker struct{} + +func (t *DynatraceChecker) Type() string { + return "dynatrace" +} + +func (t *DynatraceChecker) Run(ctx *context.Context) pkg.Results { + var results pkg.Results + for _, conf := range ctx.Canary.Spec.Dynatrace { + results = append(results, t.Check(ctx, conf)...) + } + return results +} + +func (t *DynatraceChecker) Check(ctx *context.Context, extConfig external.Check) pkg.Results { + check := extConfig.(v1.DynatraceCheck) + + var results pkg.Results + result := pkg.Success(check, ctx.Canary) + results = append(results, result) + + apiKey, _, err := ctx.Kommons.GetEnvValue(check.APIKey, check.Namespace) + if err != nil { + return results.Failf("error getting Dynatrace API key: %v", err) + } + + config := dynatrace.NewConfiguration() + config.Host = check.Host + config.Scheme = check.Scheme + config.DefaultHeader = map[string]string{ + "Authorization": "Api-Token " + apiKey, + } + + apiClient := dynatrace.NewAPIClient(config) + problems, _, err := apiClient.ProblemsApi.GetProblems(ctx).Execute() + if err != nil { + return results.Failf("error getting Dynatrace problems: %s", err.Error()) + } + + logger.Infof("Found %d problems and %d warnings", len(*problems.Problems), len(*problems.Warnings)) + + return results +} diff --git a/fixtures/datasources/dynatrace.yaml b/fixtures/datasources/dynatrace.yaml new file mode 100644 index 000000000..2177f8de7 --- /dev/null +++ b/fixtures/datasources/dynatrace.yaml @@ -0,0 +1,15 @@ +apiVersion: canaries.flanksource.com/v1 +kind: Canary +metadata: + name: dynatrace + labels: + "Expected-Fail": "true" +spec: + interval: 120 + owner: DBAdmin + severity: high + dynatrace: + - name: dynatrace + scheme: https + host: + apiKey: '' # https://www.dynatrace.com/support/help/manage/access-control/access-tokens/personal-access-token diff --git a/go.mod b/go.mod index b3273042a..4edb697d5 100644 --- a/go.mod +++ b/go.mod @@ -18,6 +18,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/s3 v1.33.0 github.com/aws/aws-sdk-go-v2/service/ssm v1.35.2 github.com/c2h5oh/datasize v0.0.0-20200825124411-48ed595a09d2 + github.com/dynatrace-ace/dynatrace-go-api-client/api/v2/environment/dynatrace v0.0.0-20210816162345-de2eacc8ac9a github.com/eko/gocache v1.2.1-0.20210528165708-4914d74fed3d github.com/elastic/go-elasticsearch/v8 v8.1.0 github.com/fergusstrange/embedded-postgres v1.21.0 diff --git a/go.sum b/go.sum index 2fa3bf8af..c8456d305 100644 --- a/go.sum +++ b/go.sum @@ -1025,6 +1025,8 @@ github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+m github.com/dustin/gojson v0.0.0-20160307161227-2e71ec9dd5ad h1:Qk76DOWdOp+GlyDKBAG3Klr9cn7N+LcYc82AZ2S7+cA= github.com/dustin/gojson v0.0.0-20160307161227-2e71ec9dd5ad/go.mod h1:mPKfmRa823oBIgl2r20LeMSpTAteW5j7FLkc0vjmzyQ= github.com/dvyukov/go-fuzz v0.0.0-20210103155950-6a8e9d1f2415/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= +github.com/dynatrace-ace/dynatrace-go-api-client/api/v2/environment/dynatrace v0.0.0-20210816162345-de2eacc8ac9a h1:XQme4bwFwXWbuzJGqnG2i8+T6UoVe0F3YWJ0FWkXtF8= +github.com/dynatrace-ace/dynatrace-go-api-client/api/v2/environment/dynatrace v0.0.0-20210816162345-de2eacc8ac9a/go.mod h1:V6ElVCgOSmxV2IXrRjQVCCZZw8g0E1mW+ql+9E4V4aQ= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= From ed3248beeec54d8908b83892c32608a38f069cfa Mon Sep 17 00:00:00 2001 From: Aditya Date: Mon, 8 May 2023 16:06:38 +0545 Subject: [PATCH 02/20] fix lint error and added details Need actual problems now to test this [skip ci] --- checks/dynatrace.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/checks/dynatrace.go b/checks/dynatrace.go index 39eb27e6f..8bad00751 100644 --- a/checks/dynatrace.go +++ b/checks/dynatrace.go @@ -43,12 +43,24 @@ func (t *DynatraceChecker) Check(ctx *context.Context, extConfig external.Check) } apiClient := dynatrace.NewAPIClient(config) - problems, _, err := apiClient.ProblemsApi.GetProblems(ctx).Execute() + problems, apiResponse, err := apiClient.ProblemsApi.GetProblems(ctx).Execute() if err != nil { return results.Failf("error getting Dynatrace problems: %s", err.Error()) } + defer apiResponse.Body.Close() logger.Infof("Found %d problems and %d warnings", len(*problems.Problems), len(*problems.Warnings)) + var problemDetails []map[string]any + for _, problem := range *problems.Problems { + problemDetails = append(problemDetails, map[string]any{ + "name": problem.Title, + // "message": problem. + "labels": problem.EntityTags, + "severity": problem.SeverityLevel, + }) + } + + result.AddDetails(problemDetails) return results } From 6eec77e0262a350a07aa289564d7525c4544772b Mon Sep 17 00:00:00 2001 From: Aditya Date: Wed, 10 May 2023 17:39:09 +0545 Subject: [PATCH 03/20] fix: api key extraction and fixture [skip ci] --- checks/dynatrace.go | 2 +- fixtures/datasources/dynatrace.yaml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/checks/dynatrace.go b/checks/dynatrace.go index 8bad00751..463aad182 100644 --- a/checks/dynatrace.go +++ b/checks/dynatrace.go @@ -30,7 +30,7 @@ func (t *DynatraceChecker) Check(ctx *context.Context, extConfig external.Check) result := pkg.Success(check, ctx.Canary) results = append(results, result) - apiKey, _, err := ctx.Kommons.GetEnvValue(check.APIKey, check.Namespace) + _, apiKey, err := ctx.Kommons.GetEnvValue(check.APIKey, check.Namespace) if err != nil { return results.Failf("error getting Dynatrace API key: %v", err) } diff --git a/fixtures/datasources/dynatrace.yaml b/fixtures/datasources/dynatrace.yaml index 2177f8de7..f01fdd5b5 100644 --- a/fixtures/datasources/dynatrace.yaml +++ b/fixtures/datasources/dynatrace.yaml @@ -12,4 +12,5 @@ spec: - name: dynatrace scheme: https host: - apiKey: '' # https://www.dynatrace.com/support/help/manage/access-control/access-tokens/personal-access-token + apiKey: + value: '' # https://www.dynatrace.com/support/help/manage/access-control/access-tokens/personal-access-token From c003d4f5220da0d0d563aea6b37a3e5f1fd3a86d Mon Sep 17 00:00:00 2001 From: Aditya Date: Thu, 11 May 2023 10:56:23 +0545 Subject: [PATCH 04/20] added more details to the template view data --- checks/dynatrace.go | 38 ++++++++++++++++++++++------- fixtures/datasources/dynatrace.yaml | 11 +++++++++ 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/checks/dynatrace.go b/checks/dynatrace.go index 463aad182..e1bac2ee5 100644 --- a/checks/dynatrace.go +++ b/checks/dynatrace.go @@ -6,7 +6,6 @@ import ( "github.com/flanksource/canary-checker/api/external" v1 "github.com/flanksource/canary-checker/api/v1" "github.com/flanksource/canary-checker/pkg" - "github.com/flanksource/commons/logger" ) type DynatraceChecker struct{} @@ -49,16 +48,37 @@ func (t *DynatraceChecker) Check(ctx *context.Context, extConfig external.Check) } defer apiResponse.Body.Close() - logger.Infof("Found %d problems and %d warnings", len(*problems.Problems), len(*problems.Warnings)) - var problemDetails []map[string]any for _, problem := range *problems.Problems { - problemDetails = append(problemDetails, map[string]any{ - "name": problem.Title, - // "message": problem. - "labels": problem.EntityTags, - "severity": problem.SeverityLevel, - }) + data := map[string]any{ + "title": problem.Title, + "status": problem.Status, + "impactLevel": problem.ImpactLevel, + "severity": problem.SeverityLevel, + "impactedEntities": problem.ImpactedEntities, + "affectedEntities": problem.AffectedEntities, + } + + if problem.EntityTags != nil && len(*problem.EntityTags) != 0 { + var labels = make(map[string]string, len(*problem.EntityTags)) + for _, entity := range *problem.EntityTags { + if entity.Key == nil { + continue + } + + labels[*entity.Key] = *entity.Value + } + + data["labels"] = labels + data["entityTags"] = problem.EntityTags + } + + if problem.EvidenceDetails != nil { + data["totalEvidences"] = problem.EvidenceDetails.TotalCount + data["evidences"] = problem.EvidenceDetails.Details + } + + problemDetails = append(problemDetails, data) } result.AddDetails(problemDetails) diff --git a/fixtures/datasources/dynatrace.yaml b/fixtures/datasources/dynatrace.yaml index f01fdd5b5..1b0b150d3 100644 --- a/fixtures/datasources/dynatrace.yaml +++ b/fixtures/datasources/dynatrace.yaml @@ -14,3 +14,14 @@ spec: host: apiKey: value: '' # https://www.dynatrace.com/support/help/manage/access-control/access-tokens/personal-access-token + javascript: | + var out = _.map(results, function(r) { + return { + name: r.title, + description: r.title, + labels: r.labels, + icon: 'alert', + severity: r.severity, + } + }) + JSON.stringify(out); From e861de72afeddb7931858a3afe90050b4171eda6 Mon Sep 17 00:00:00 2001 From: Aditya Date: Thu, 11 May 2023 11:30:35 +0545 Subject: [PATCH 05/20] add problem ID to the name for unique check name --- checks/dynatrace.go | 4 +++- fixtures/datasources/dynatrace.yaml | 3 +-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/checks/dynatrace.go b/checks/dynatrace.go index e1bac2ee5..2d10fea9b 100644 --- a/checks/dynatrace.go +++ b/checks/dynatrace.go @@ -1,6 +1,8 @@ package checks import ( + "fmt" + "github.com/dynatrace-ace/dynatrace-go-api-client/api/v2/environment/dynatrace" "github.com/flanksource/canary-checker/api/context" "github.com/flanksource/canary-checker/api/external" @@ -51,7 +53,7 @@ func (t *DynatraceChecker) Check(ctx *context.Context, extConfig external.Check) var problemDetails []map[string]any for _, problem := range *problems.Problems { data := map[string]any{ - "title": problem.Title, + "title": fmt.Sprintf("%s %s", problem.Title, problem.ProblemId), // For uniqueness "status": problem.Status, "impactLevel": problem.ImpactLevel, "severity": problem.SeverityLevel, diff --git a/fixtures/datasources/dynatrace.yaml b/fixtures/datasources/dynatrace.yaml index 1b0b150d3..f09fb12e3 100644 --- a/fixtures/datasources/dynatrace.yaml +++ b/fixtures/datasources/dynatrace.yaml @@ -5,7 +5,7 @@ metadata: labels: "Expected-Fail": "true" spec: - interval: 120 + schedule: "@every 1m" owner: DBAdmin severity: high dynatrace: @@ -20,7 +20,6 @@ spec: name: r.title, description: r.title, labels: r.labels, - icon: 'alert', severity: r.severity, } }) From 55fbdb71994fd72161c925bce9d9652bc18c3cb8 Mon Sep 17 00:00:00 2001 From: Aditya Date: Thu, 11 May 2023 11:32:20 +0545 Subject: [PATCH 06/20] chore: make test & make resources --- api/v1/zz_generated.deepcopy.go | 25 ++++++++ config/deploy/crd.yaml | 92 ++++++++++++++++++++++++++++ config/deploy/manifests.yaml | 92 ++++++++++++++++++++++++++++ config/schemas/canary.schema.json | 2 +- config/schemas/component.schema.json | 2 +- config/schemas/topology.schema.json | 2 +- 6 files changed, 212 insertions(+), 3 deletions(-) diff --git a/api/v1/zz_generated.deepcopy.go b/api/v1/zz_generated.deepcopy.go index 66981b58f..9c1b00217 100644 --- a/api/v1/zz_generated.deepcopy.go +++ b/api/v1/zz_generated.deepcopy.go @@ -571,6 +571,13 @@ func (in *CanarySpec) DeepCopyInto(out *CanarySpec) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.Dynatrace != nil { + in, out := &in.Dynatrace, &out.Dynatrace + *out = make([]DynatraceCheck, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } if in.AzureDevops != nil { in, out := &in.AzureDevops, &out.AzureDevops *out = make([]AzureDevopsCheck, len(*in)) @@ -1424,6 +1431,24 @@ func (in *DockerPushCheck) DeepCopy() *DockerPushCheck { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DynatraceCheck) DeepCopyInto(out *DynatraceCheck) { + *out = *in + in.Description.DeepCopyInto(&out.Description) + out.Templatable = in.Templatable + in.APIKey.DeepCopyInto(&out.APIKey) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DynatraceCheck. +func (in *DynatraceCheck) DeepCopy() *DynatraceCheck { + if in == nil { + return nil + } + out := new(DynatraceCheck) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *EC2) DeepCopyInto(out *EC2) { *out = *in diff --git a/config/deploy/crd.yaml b/config/deploy/crd.yaml index 48a7707ae..41cb2c169 100644 --- a/config/deploy/crd.yaml +++ b/config/deploy/crd.yaml @@ -1254,6 +1254,98 @@ spec: - name type: object type: array + dynatrace: + items: + properties: + apiKey: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + secretKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + type: object + type: object + description: + description: Description for the check + type: string + display: + properties: + expr: + type: string + javascript: + type: string + jsonPath: + type: string + template: + type: string + type: object + host: + type: string + icon: + description: Icon for overwriting default icon on the dashboard + type: string + labels: + additionalProperties: + type: string + description: Labels for the check + type: object + name: + description: Name of the check + type: string + namespace: + type: string + scheme: + type: string + test: + properties: + expr: + type: string + javascript: + type: string + jsonPath: + type: string + template: + type: string + type: object + transform: + properties: + expr: + type: string + javascript: + type: string + jsonPath: + type: string + template: + type: string + type: object + required: + - name + type: object + type: array ec2: items: properties: diff --git a/config/deploy/manifests.yaml b/config/deploy/manifests.yaml index 8fe570d34..2523ca614 100644 --- a/config/deploy/manifests.yaml +++ b/config/deploy/manifests.yaml @@ -1254,6 +1254,98 @@ spec: - name type: object type: array + dynatrace: + items: + properties: + apiKey: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + secretKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + type: object + type: object + description: + description: Description for the check + type: string + display: + properties: + expr: + type: string + javascript: + type: string + jsonPath: + type: string + template: + type: string + type: object + host: + type: string + icon: + description: Icon for overwriting default icon on the dashboard + type: string + labels: + additionalProperties: + type: string + description: Labels for the check + type: object + name: + description: Name of the check + type: string + namespace: + type: string + scheme: + type: string + test: + properties: + expr: + type: string + javascript: + type: string + jsonPath: + type: string + template: + type: string + type: object + transform: + properties: + expr: + type: string + javascript: + type: string + jsonPath: + type: string + template: + type: string + type: object + required: + - name + type: object + type: array ec2: items: properties: diff --git a/config/schemas/canary.schema.json b/config/schemas/canary.schema.json index 6422eb010..fe9f33fe8 100644 --- a/config/schemas/canary.schema.json +++ b/config/schemas/canary.schema.json @@ -1 +1 @@ -{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Canary","definitions":{"AWSConnection":{"properties":{"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"AlertManagerCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"alerts":{"items":{"type":"string"},"type":"array"},"filters":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"ignore":{"items":{"type":"string"},"type":"array"}},"additionalProperties":false,"type":"object"},"Authentication":{"required":["username","password"],"properties":{"username":{"$ref":"#/definitions/EnvVar"},"password":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"AwsConfigCheck":{"required":["name","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"query":{"type":"string"},"awsConnection":{"$ref":"#/definitions/AWSConnection"},"aggregatorName":{"type":"string"}},"additionalProperties":false,"type":"object"},"AwsConfigRuleCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"ignoreRules":{"items":{"type":"string"},"type":"array"},"rules":{"items":{"type":"string"},"type":"array"},"complianceTypes":{"items":{"type":"string"},"type":"array"},"awsConnection":{"$ref":"#/definitions/AWSConnection"}},"additionalProperties":false,"type":"object"},"AzureDevopsCheck":{"required":["name","organization","personalAccessToken","project","pipeline","variables","branch","thresholdMillis"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"organization":{"type":"string"},"personalAccessToken":{"$ref":"#/definitions/EnvVar"},"project":{"type":"string"},"pipeline":{"type":"string"},"variables":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"branch":{"items":{"type":"string"},"type":"array"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"Bucket":{"properties":{"name":{"type":"string"},"region":{"type":"string"},"endpoint":{"type":"string"}},"additionalProperties":false,"type":"object"},"Canary":{"required":["TypeMeta"],"properties":{"TypeMeta":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TypeMeta"},"metadata":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ObjectMeta"},"spec":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CanarySpec"},"status":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CanaryStatus"}},"additionalProperties":false,"type":"object"},"CanarySpec":{"properties":{"env":{"patternProperties":{".*":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/VarSource"}},"type":"object"},"http":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/HTTPCheck"},"type":"array"},"dns":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DNSCheck"},"type":"array"},"docker":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DockerPullCheck"},"type":"array"},"dockerPush":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DockerPushCheck"},"type":"array"},"containerd":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ContainerdPullCheck"},"type":"array"},"containerdPush":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ContainerdPushCheck"},"type":"array"},"s3":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/S3Check"},"type":"array"},"tcp":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TCPCheck"},"type":"array"},"pod":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PodCheck"},"type":"array"},"ldap":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LDAPCheck"},"type":"array"},"icmp":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ICMPCheck"},"type":"array"},"postgres":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PostgresCheck"},"type":"array"},"mssql":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MssqlCheck"},"type":"array"},"mysql":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MysqlCheck"},"type":"array"},"restic":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ResticCheck"},"type":"array"},"jmeter":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JmeterCheck"},"type":"array"},"junit":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JunitCheck"},"type":"array"},"helm":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/HelmCheck"},"type":"array"},"namespace":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/NamespaceCheck"},"type":"array"},"redis":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/RedisCheck"},"type":"array"},"ec2":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EC2Check"},"type":"array"},"prometheus":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PrometheusCheck"},"type":"array"},"mongodb":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MongoDBCheck"},"type":"array"},"cloudwatch":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CloudWatchCheck"},"type":"array"},"github":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GitHubCheck"},"type":"array"},"kubernetes":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/KubernetesCheck"},"type":"array"},"folder":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FolderCheck"},"type":"array"},"exec":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ExecCheck"},"type":"array"},"awsConfig":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AwsConfigCheck"},"type":"array"},"awsConfigRule":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AwsConfigRuleCheck"},"type":"array"},"databaseBackup":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DatabaseBackupCheck"},"type":"array"},"configDB":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigDBCheck"},"type":"array"},"elasticsearch":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ElasticsearchCheck"},"type":"array"},"alertmanager":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AlertManagerCheck"},"type":"array"},"azureDevops":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AzureDevopsCheck"},"type":"array"},"interval":{"type":"integer"},"schedule":{"type":"string"},"icon":{"type":"string"},"severity":{"type":"string"},"owner":{"type":"string"},"resultMode":{"type":"string"}},"additionalProperties":false,"type":"object"},"CanaryStatus":{"properties":{"persistedID":{"type":"string"},"lastTransitionedTime":{"$ref":"#/definitions/Time"},"lastCheck":{"$ref":"#/definitions/Time"},"message":{"type":"string"},"errorMessage":{"type":"string"},"status":{"type":"string"},"checks":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"observedGeneration":{"type":"integer"},"checkStatus":{"patternProperties":{".*":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CheckStatus"}},"type":"object"},"uptime1h":{"type":"string"},"latency1h":{"type":"string"}},"additionalProperties":false,"type":"object"},"CheckStatus":{"properties":{"lastTransitionedTime":{"$ref":"#/definitions/Time"},"lastCheck":{"$ref":"#/definitions/Time"},"message":{"type":"string"},"errorMessage":{"type":"string"},"uptime1h":{"type":"string"},"latency1h":{"type":"string"}},"additionalProperties":false,"type":"object"},"CloudWatchCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"filter":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CloudWatchFilter"}},"additionalProperties":false,"type":"object"},"CloudWatchFilter":{"properties":{"actionPrefix":{"type":"string"},"alarmPrefix":{"type":"string"},"alarms":{"items":{"type":"string"},"type":"array"},"state":{"type":"string"}},"additionalProperties":false,"type":"object"},"ConfigDBCheck":{"required":["name","query"],"properties":{"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"query":{"type":"string"}},"additionalProperties":false,"type":"object"},"ConfigMapKeySelector":{"required":["LocalObjectReference","key"],"properties":{"LocalObjectReference":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LocalObjectReference"},"key":{"type":"string"},"optional":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"ContainerdPullCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"expectedDigest":{"type":"string"},"expectedSize":{"type":"integer"}},"additionalProperties":false,"type":"object"},"ContainerdPushCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"}},"additionalProperties":false,"type":"object"},"DNSCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"server":{"type":"string"},"port":{"type":"integer"},"query":{"type":"string"},"querytype":{"type":"string"},"minrecords":{"type":"integer"},"exactreply":{"items":{"type":"string"},"type":"array"},"timeout":{"type":"integer"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"DatabaseBackupCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"gcp":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GCPDatabase"},"maxAge":{"type":"string"}},"additionalProperties":false,"type":"object"},"DockerPullCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"expectedDigest":{"type":"string"},"expectedSize":{"type":"integer"}},"additionalProperties":false,"type":"object"},"DockerPushCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"EC2Check":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"ami":{"type":"string"},"userData":{"type":"string"},"securityGroup":{"type":"string"},"keepAlive":{"type":"boolean"},"waitTime":{"type":"integer"},"timeOut":{"type":"integer"},"canaryRef":{"items":{"$ref":"#/definitions/LocalObjectReference"},"type":"array"}},"additionalProperties":false,"type":"object"},"ElasticsearchCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"url":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"index":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"EnvVar":{"properties":{"name":{"type":"string"},"value":{"type":"string"},"valueFrom":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EnvVarSource"}},"additionalProperties":false,"type":"object"},"EnvVarSource":{"properties":{"configMapKeyRef":{"$ref":"#/definitions/ConfigMapKeySelector"},"secretKeyRef":{"$ref":"#/definitions/SecretKeySelector"}},"additionalProperties":false,"type":"object"},"ExecCheck":{"required":["name","script"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"script":{"type":"string"}},"additionalProperties":false,"type":"object"},"FieldsV1":{"properties":{},"additionalProperties":false,"type":"object"},"FolderCheck":{"required":["name","path"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"path":{"type":"string"},"filter":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FolderFilter"},"minAge":{"type":"string"},"maxAge":{"type":"string"},"minCount":{"type":"integer"},"maxCount":{"type":"integer"},"minSize":{"type":"string"},"maxSize":{"type":"string"},"availableSize":{"type":"string"},"totalSize":{"type":"string"},"awsConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AWSConnection"},"gcpConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GCPConnection"},"smbConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SMBConnection"},"sftpConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SFTPConnection"}},"additionalProperties":false,"type":"object"},"FolderFilter":{"properties":{"minAge":{"type":"string"},"maxAge":{"type":"string"},"minSize":{"type":"string"},"maxSize":{"type":"string"},"regex":{"type":"string"}},"additionalProperties":false,"type":"object"},"GCPConnection":{"properties":{"endpoint":{"type":"string"},"credentials":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"GCPDatabase":{"required":["project","instance"],"properties":{"project":{"type":"string"},"instance":{"type":"string"},"gcpConnection":{"$ref":"#/definitions/GCPConnection"}},"additionalProperties":false,"type":"object"},"GitHubCheck":{"required":["name","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"query":{"type":"string"},"githubToken":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"HTTPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"endpoint":{"type":"string"},"namespace":{"type":"string"},"thresholdMillis":{"type":"integer"},"responseCodes":{"items":{"type":"integer"},"type":"array"},"responseContent":{"type":"string"},"responseJSONContent":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JSONCheck"},"maxSSLExpiry":{"type":"integer"},"method":{"type":"string"},"ntlm":{"type":"boolean"},"ntlmv2":{"type":"boolean"},"body":{"type":"string"},"headers":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EnvVar"},"type":"array"},"authentication":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Authentication"},"templateBody":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"HelmCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"chartmuseum":{"type":"string"},"project":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"cafile":{"type":"string"}},"additionalProperties":false,"type":"object"},"ICMPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"endpoint":{"type":"string"},"thresholdMillis":{"type":"integer"},"packetLossThreshold":{"type":"integer"},"packetCount":{"type":"integer"}},"additionalProperties":false,"type":"object"},"JSONCheck":{"required":["path","value"],"properties":{"path":{"type":"string"},"value":{"type":"string"}},"additionalProperties":false,"type":"object"},"JmeterCheck":{"required":["name","jmx"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"jmx":{"$ref":"#/definitions/EnvVar"},"host":{"type":"string"},"port":{"type":"integer"},"properties":{"items":{"type":"string"},"type":"array"},"systemProperties":{"items":{"type":"string"},"type":"array"},"responseDuration":{"type":"string"}},"additionalProperties":false,"type":"object"},"JunitCheck":{"required":["name","testResults","spec"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"testResults":{"type":"string"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"timeout":{"type":"integer"},"spec":{"additionalProperties":true}},"additionalProperties":false,"type":"object"},"KubernetesCheck":{"required":["name","kind"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"namespace":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ResourceSelector"},"resource":{"$ref":"#/definitions/ResourceSelector"},"ignore":{"items":{"type":"string"},"type":"array"},"kind":{"type":"string"},"ready":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"LDAPCheck":{"required":["name","host","auth","bindDN"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"bindDN":{"type":"string"},"userSearch":{"type":"string"},"skipTLSVerify":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"LocalObjectReference":{"properties":{"name":{"type":"string"}},"additionalProperties":false,"type":"object"},"ManagedFieldsEntry":{"properties":{"manager":{"type":"string"},"operation":{"type":"string"},"apiVersion":{"type":"string"},"time":{"$ref":"#/definitions/Time"},"fieldsType":{"type":"string"},"fieldsV1":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FieldsV1"},"subresource":{"type":"string"}},"additionalProperties":false,"type":"object"},"MongoDBCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"MssqlCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"MysqlCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"NamespaceCheck":{"required":["name","podSpec"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespaceNamePrefix":{"type":"string"},"namespaceLabels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespaceAnnotations":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"podSpec":{"type":"string"},"schedule_timeout":{"type":"integer"},"readyTimeout":{"type":"integer"},"httpTimeout":{"type":"integer"},"deleteTimeout":{"type":"integer"},"ingressTimeout":{"type":"integer"},"httpRetryInterval":{"type":"integer"},"deadline":{"type":"integer"},"port":{"type":"integer"},"path":{"type":"string"},"ingressName":{"type":"string"},"ingressHost":{"type":"string"},"expectedContent":{"type":"string"},"expectedHttpStatuses":{"items":{"type":"integer"},"type":"array"},"priorityClass":{"type":"string"}},"additionalProperties":false,"type":"object"},"ObjectFieldSelector":{"required":["fieldPath"],"properties":{"apiVersion":{"type":"string"},"fieldPath":{"type":"string"}},"additionalProperties":false,"type":"object"},"ObjectMeta":{"properties":{"name":{"type":"string"},"generateName":{"type":"string"},"namespace":{"type":"string"},"selfLink":{"type":"string"},"uid":{"type":"string"},"resourceVersion":{"type":"string"},"generation":{"type":"integer"},"creationTimestamp":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Time"},"deletionTimestamp":{"$ref":"#/definitions/Time"},"deletionGracePeriodSeconds":{"type":"integer"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"annotations":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"ownerReferences":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/OwnerReference"},"type":"array"},"finalizers":{"items":{"type":"string"},"type":"array"},"managedFields":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ManagedFieldsEntry"},"type":"array"}},"additionalProperties":false,"type":"object"},"OwnerReference":{"required":["apiVersion","kind","name","uid"],"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"},"controller":{"type":"boolean"},"blockOwnerDeletion":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"PodCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespace":{"type":"string"},"spec":{"type":"string"},"scheduleTimeout":{"type":"integer"},"readyTimeout":{"type":"integer"},"httpTimeout":{"type":"integer"},"deleteTimeout":{"type":"integer"},"ingressTimeout":{"type":"integer"},"httpRetryInterval":{"type":"integer"},"deadline":{"type":"integer"},"port":{"type":"integer"},"path":{"type":"string"},"ingressName":{"type":"string"},"ingressHost":{"type":"string"},"ingressClass":{"type":"string"},"expectedContent":{"type":"string"},"expectedHttpStatuses":{"items":{"type":"integer"},"type":"array"},"priorityClass":{"type":"string"}},"additionalProperties":false,"type":"object"},"PostgresCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"PrometheusCheck":{"required":["name","host","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"query":{"type":"string"}},"additionalProperties":false,"type":"object"},"RedisCheck":{"required":["name","addr","db"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"addr":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"db":{"type":"integer"}},"additionalProperties":false,"type":"object"},"ResourceSelector":{"properties":{"name":{"type":"string"},"labelSelector":{"type":"string"},"fieldSelector":{"type":"string"}},"additionalProperties":false,"type":"object"},"ResticCheck":{"required":["name","repository","password","maxAge"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"repository":{"type":"string"},"password":{"$ref":"#/definitions/EnvVar"},"maxAge":{"type":"string"},"checkIntegrity":{"type":"boolean"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"caCert":{"type":"string"}},"additionalProperties":false,"type":"object"},"S3Check":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"bucket":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Bucket"},"accessKey":{"type":"string"},"secretKey":{"type":"string"},"objectPath":{"type":"string"},"skipTLSVerify":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"SFTPConnection":{"required":["host","auth"],"properties":{"port":{"type":"integer"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"SMBConnection":{"required":["auth"],"properties":{"port":{"type":"integer"},"auth":{"$ref":"#/definitions/Authentication"},"domain":{"type":"string"},"workstation":{"type":"string"},"sharename":{"type":"string"},"searchPath":{"type":"string"}},"additionalProperties":false,"type":"object"},"SecretKeySelector":{"required":["LocalObjectReference","key"],"properties":{"LocalObjectReference":{"$ref":"#/definitions/LocalObjectReference"},"key":{"type":"string"},"optional":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"TCPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"endpoint":{"type":"string"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"Template":{"properties":{"template":{"type":"string"},"jsonPath":{"type":"string"},"expr":{"type":"string"},"javascript":{"type":"string"}},"additionalProperties":false,"type":"object"},"Time":{"properties":{},"additionalProperties":false,"type":"object"},"TypeMeta":{"properties":{"kind":{"type":"string"},"apiVersion":{"type":"string"}},"additionalProperties":false,"type":"object"},"VarSource":{"properties":{"fieldRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ObjectFieldSelector"},"value":{"type":"string"},"configMapKeyRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigMapKeySelector"},"secretKeyRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SecretKeySelector"}},"additionalProperties":false,"type":"object"}}} \ No newline at end of file +{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Canary","definitions":{"AWSConnection":{"properties":{"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"AlertManagerCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"alerts":{"items":{"type":"string"},"type":"array"},"filters":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"ignore":{"items":{"type":"string"},"type":"array"}},"additionalProperties":false,"type":"object"},"Authentication":{"required":["username","password"],"properties":{"username":{"$ref":"#/definitions/EnvVar"},"password":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"AwsConfigCheck":{"required":["name","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"query":{"type":"string"},"awsConnection":{"$ref":"#/definitions/AWSConnection"},"aggregatorName":{"type":"string"}},"additionalProperties":false,"type":"object"},"AwsConfigRuleCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"ignoreRules":{"items":{"type":"string"},"type":"array"},"rules":{"items":{"type":"string"},"type":"array"},"complianceTypes":{"items":{"type":"string"},"type":"array"},"awsConnection":{"$ref":"#/definitions/AWSConnection"}},"additionalProperties":false,"type":"object"},"AzureDevopsCheck":{"required":["name","organization","personalAccessToken","project","pipeline","variables","branch","thresholdMillis"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"organization":{"type":"string"},"personalAccessToken":{"$ref":"#/definitions/EnvVar"},"project":{"type":"string"},"pipeline":{"type":"string"},"variables":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"branch":{"items":{"type":"string"},"type":"array"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"Bucket":{"properties":{"name":{"type":"string"},"region":{"type":"string"},"endpoint":{"type":"string"}},"additionalProperties":false,"type":"object"},"Canary":{"required":["TypeMeta"],"properties":{"TypeMeta":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TypeMeta"},"metadata":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ObjectMeta"},"spec":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CanarySpec"},"status":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CanaryStatus"}},"additionalProperties":false,"type":"object"},"CanarySpec":{"properties":{"env":{"patternProperties":{".*":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/VarSource"}},"type":"object"},"http":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/HTTPCheck"},"type":"array"},"dns":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DNSCheck"},"type":"array"},"docker":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DockerPullCheck"},"type":"array"},"dockerPush":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DockerPushCheck"},"type":"array"},"containerd":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ContainerdPullCheck"},"type":"array"},"containerdPush":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ContainerdPushCheck"},"type":"array"},"s3":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/S3Check"},"type":"array"},"tcp":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TCPCheck"},"type":"array"},"pod":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PodCheck"},"type":"array"},"ldap":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LDAPCheck"},"type":"array"},"icmp":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ICMPCheck"},"type":"array"},"postgres":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PostgresCheck"},"type":"array"},"mssql":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MssqlCheck"},"type":"array"},"mysql":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MysqlCheck"},"type":"array"},"restic":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ResticCheck"},"type":"array"},"jmeter":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JmeterCheck"},"type":"array"},"junit":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JunitCheck"},"type":"array"},"helm":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/HelmCheck"},"type":"array"},"namespace":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/NamespaceCheck"},"type":"array"},"redis":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/RedisCheck"},"type":"array"},"ec2":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EC2Check"},"type":"array"},"prometheus":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PrometheusCheck"},"type":"array"},"mongodb":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MongoDBCheck"},"type":"array"},"cloudwatch":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CloudWatchCheck"},"type":"array"},"github":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GitHubCheck"},"type":"array"},"kubernetes":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/KubernetesCheck"},"type":"array"},"folder":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FolderCheck"},"type":"array"},"exec":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ExecCheck"},"type":"array"},"awsConfig":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AwsConfigCheck"},"type":"array"},"awsConfigRule":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AwsConfigRuleCheck"},"type":"array"},"databaseBackup":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DatabaseBackupCheck"},"type":"array"},"configDB":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigDBCheck"},"type":"array"},"elasticsearch":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ElasticsearchCheck"},"type":"array"},"alertmanager":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AlertManagerCheck"},"type":"array"},"dynatrace":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DynatraceCheck"},"type":"array"},"azureDevops":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AzureDevopsCheck"},"type":"array"},"interval":{"type":"integer"},"schedule":{"type":"string"},"icon":{"type":"string"},"severity":{"type":"string"},"owner":{"type":"string"},"resultMode":{"type":"string"}},"additionalProperties":false,"type":"object"},"CanaryStatus":{"properties":{"persistedID":{"type":"string"},"lastTransitionedTime":{"$ref":"#/definitions/Time"},"lastCheck":{"$ref":"#/definitions/Time"},"message":{"type":"string"},"errorMessage":{"type":"string"},"status":{"type":"string"},"checks":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"observedGeneration":{"type":"integer"},"checkStatus":{"patternProperties":{".*":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CheckStatus"}},"type":"object"},"uptime1h":{"type":"string"},"latency1h":{"type":"string"}},"additionalProperties":false,"type":"object"},"CheckStatus":{"properties":{"lastTransitionedTime":{"$ref":"#/definitions/Time"},"lastCheck":{"$ref":"#/definitions/Time"},"message":{"type":"string"},"errorMessage":{"type":"string"},"uptime1h":{"type":"string"},"latency1h":{"type":"string"}},"additionalProperties":false,"type":"object"},"CloudWatchCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"filter":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CloudWatchFilter"}},"additionalProperties":false,"type":"object"},"CloudWatchFilter":{"properties":{"actionPrefix":{"type":"string"},"alarmPrefix":{"type":"string"},"alarms":{"items":{"type":"string"},"type":"array"},"state":{"type":"string"}},"additionalProperties":false,"type":"object"},"ConfigDBCheck":{"required":["name","query"],"properties":{"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"query":{"type":"string"}},"additionalProperties":false,"type":"object"},"ConfigMapKeySelector":{"required":["LocalObjectReference","key"],"properties":{"LocalObjectReference":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LocalObjectReference"},"key":{"type":"string"},"optional":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"ContainerdPullCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"expectedDigest":{"type":"string"},"expectedSize":{"type":"integer"}},"additionalProperties":false,"type":"object"},"ContainerdPushCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"}},"additionalProperties":false,"type":"object"},"DNSCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"server":{"type":"string"},"port":{"type":"integer"},"query":{"type":"string"},"querytype":{"type":"string"},"minrecords":{"type":"integer"},"exactreply":{"items":{"type":"string"},"type":"array"},"timeout":{"type":"integer"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"DatabaseBackupCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"gcp":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GCPDatabase"},"maxAge":{"type":"string"}},"additionalProperties":false,"type":"object"},"DockerPullCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"expectedDigest":{"type":"string"},"expectedSize":{"type":"integer"}},"additionalProperties":false,"type":"object"},"DockerPushCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"DynatraceCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"scheme":{"type":"string"},"apiKey":{"$ref":"#/definitions/EnvVar"},"namespace":{"type":"string"}},"additionalProperties":false,"type":"object"},"EC2Check":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"ami":{"type":"string"},"userData":{"type":"string"},"securityGroup":{"type":"string"},"keepAlive":{"type":"boolean"},"waitTime":{"type":"integer"},"timeOut":{"type":"integer"},"canaryRef":{"items":{"$ref":"#/definitions/LocalObjectReference"},"type":"array"}},"additionalProperties":false,"type":"object"},"ElasticsearchCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"url":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"index":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"EnvVar":{"properties":{"name":{"type":"string"},"value":{"type":"string"},"valueFrom":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EnvVarSource"}},"additionalProperties":false,"type":"object"},"EnvVarSource":{"properties":{"configMapKeyRef":{"$ref":"#/definitions/ConfigMapKeySelector"},"secretKeyRef":{"$ref":"#/definitions/SecretKeySelector"}},"additionalProperties":false,"type":"object"},"ExecCheck":{"required":["name","script"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"script":{"type":"string"}},"additionalProperties":false,"type":"object"},"FieldsV1":{"properties":{},"additionalProperties":false,"type":"object"},"FolderCheck":{"required":["name","path"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"path":{"type":"string"},"filter":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FolderFilter"},"minAge":{"type":"string"},"maxAge":{"type":"string"},"minCount":{"type":"integer"},"maxCount":{"type":"integer"},"minSize":{"type":"string"},"maxSize":{"type":"string"},"availableSize":{"type":"string"},"totalSize":{"type":"string"},"awsConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AWSConnection"},"gcpConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GCPConnection"},"smbConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SMBConnection"},"sftpConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SFTPConnection"}},"additionalProperties":false,"type":"object"},"FolderFilter":{"properties":{"minAge":{"type":"string"},"maxAge":{"type":"string"},"minSize":{"type":"string"},"maxSize":{"type":"string"},"regex":{"type":"string"}},"additionalProperties":false,"type":"object"},"GCPConnection":{"properties":{"endpoint":{"type":"string"},"credentials":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"GCPDatabase":{"required":["project","instance"],"properties":{"project":{"type":"string"},"instance":{"type":"string"},"gcpConnection":{"$ref":"#/definitions/GCPConnection"}},"additionalProperties":false,"type":"object"},"GitHubCheck":{"required":["name","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"query":{"type":"string"},"githubToken":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"HTTPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"endpoint":{"type":"string"},"namespace":{"type":"string"},"thresholdMillis":{"type":"integer"},"responseCodes":{"items":{"type":"integer"},"type":"array"},"responseContent":{"type":"string"},"responseJSONContent":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JSONCheck"},"maxSSLExpiry":{"type":"integer"},"method":{"type":"string"},"ntlm":{"type":"boolean"},"ntlmv2":{"type":"boolean"},"body":{"type":"string"},"headers":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EnvVar"},"type":"array"},"authentication":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Authentication"},"templateBody":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"HelmCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"chartmuseum":{"type":"string"},"project":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"cafile":{"type":"string"}},"additionalProperties":false,"type":"object"},"ICMPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"endpoint":{"type":"string"},"thresholdMillis":{"type":"integer"},"packetLossThreshold":{"type":"integer"},"packetCount":{"type":"integer"}},"additionalProperties":false,"type":"object"},"JSONCheck":{"required":["path","value"],"properties":{"path":{"type":"string"},"value":{"type":"string"}},"additionalProperties":false,"type":"object"},"JmeterCheck":{"required":["name","jmx"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"jmx":{"$ref":"#/definitions/EnvVar"},"host":{"type":"string"},"port":{"type":"integer"},"properties":{"items":{"type":"string"},"type":"array"},"systemProperties":{"items":{"type":"string"},"type":"array"},"responseDuration":{"type":"string"}},"additionalProperties":false,"type":"object"},"JunitCheck":{"required":["name","testResults","spec"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"testResults":{"type":"string"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"timeout":{"type":"integer"},"spec":{"additionalProperties":true}},"additionalProperties":false,"type":"object"},"KubernetesCheck":{"required":["name","kind"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"namespace":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ResourceSelector"},"resource":{"$ref":"#/definitions/ResourceSelector"},"ignore":{"items":{"type":"string"},"type":"array"},"kind":{"type":"string"},"ready":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"LDAPCheck":{"required":["name","host","auth","bindDN"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"bindDN":{"type":"string"},"userSearch":{"type":"string"},"skipTLSVerify":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"LocalObjectReference":{"properties":{"name":{"type":"string"}},"additionalProperties":false,"type":"object"},"ManagedFieldsEntry":{"properties":{"manager":{"type":"string"},"operation":{"type":"string"},"apiVersion":{"type":"string"},"time":{"$ref":"#/definitions/Time"},"fieldsType":{"type":"string"},"fieldsV1":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FieldsV1"},"subresource":{"type":"string"}},"additionalProperties":false,"type":"object"},"MongoDBCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"MssqlCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"MysqlCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"NamespaceCheck":{"required":["name","podSpec"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespaceNamePrefix":{"type":"string"},"namespaceLabels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespaceAnnotations":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"podSpec":{"type":"string"},"schedule_timeout":{"type":"integer"},"readyTimeout":{"type":"integer"},"httpTimeout":{"type":"integer"},"deleteTimeout":{"type":"integer"},"ingressTimeout":{"type":"integer"},"httpRetryInterval":{"type":"integer"},"deadline":{"type":"integer"},"port":{"type":"integer"},"path":{"type":"string"},"ingressName":{"type":"string"},"ingressHost":{"type":"string"},"expectedContent":{"type":"string"},"expectedHttpStatuses":{"items":{"type":"integer"},"type":"array"},"priorityClass":{"type":"string"}},"additionalProperties":false,"type":"object"},"ObjectFieldSelector":{"required":["fieldPath"],"properties":{"apiVersion":{"type":"string"},"fieldPath":{"type":"string"}},"additionalProperties":false,"type":"object"},"ObjectMeta":{"properties":{"name":{"type":"string"},"generateName":{"type":"string"},"namespace":{"type":"string"},"selfLink":{"type":"string"},"uid":{"type":"string"},"resourceVersion":{"type":"string"},"generation":{"type":"integer"},"creationTimestamp":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Time"},"deletionTimestamp":{"$ref":"#/definitions/Time"},"deletionGracePeriodSeconds":{"type":"integer"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"annotations":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"ownerReferences":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/OwnerReference"},"type":"array"},"finalizers":{"items":{"type":"string"},"type":"array"},"managedFields":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ManagedFieldsEntry"},"type":"array"}},"additionalProperties":false,"type":"object"},"OwnerReference":{"required":["apiVersion","kind","name","uid"],"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"},"controller":{"type":"boolean"},"blockOwnerDeletion":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"PodCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespace":{"type":"string"},"spec":{"type":"string"},"scheduleTimeout":{"type":"integer"},"readyTimeout":{"type":"integer"},"httpTimeout":{"type":"integer"},"deleteTimeout":{"type":"integer"},"ingressTimeout":{"type":"integer"},"httpRetryInterval":{"type":"integer"},"deadline":{"type":"integer"},"port":{"type":"integer"},"path":{"type":"string"},"ingressName":{"type":"string"},"ingressHost":{"type":"string"},"ingressClass":{"type":"string"},"expectedContent":{"type":"string"},"expectedHttpStatuses":{"items":{"type":"integer"},"type":"array"},"priorityClass":{"type":"string"}},"additionalProperties":false,"type":"object"},"PostgresCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"PrometheusCheck":{"required":["name","host","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"query":{"type":"string"}},"additionalProperties":false,"type":"object"},"RedisCheck":{"required":["name","addr","db"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"addr":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"db":{"type":"integer"}},"additionalProperties":false,"type":"object"},"ResourceSelector":{"properties":{"name":{"type":"string"},"labelSelector":{"type":"string"},"fieldSelector":{"type":"string"}},"additionalProperties":false,"type":"object"},"ResticCheck":{"required":["name","repository","password","maxAge"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"repository":{"type":"string"},"password":{"$ref":"#/definitions/EnvVar"},"maxAge":{"type":"string"},"checkIntegrity":{"type":"boolean"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"caCert":{"type":"string"}},"additionalProperties":false,"type":"object"},"S3Check":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"bucket":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Bucket"},"accessKey":{"type":"string"},"secretKey":{"type":"string"},"objectPath":{"type":"string"},"skipTLSVerify":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"SFTPConnection":{"required":["host","auth"],"properties":{"port":{"type":"integer"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"SMBConnection":{"required":["auth"],"properties":{"port":{"type":"integer"},"auth":{"$ref":"#/definitions/Authentication"},"domain":{"type":"string"},"workstation":{"type":"string"},"sharename":{"type":"string"},"searchPath":{"type":"string"}},"additionalProperties":false,"type":"object"},"SecretKeySelector":{"required":["LocalObjectReference","key"],"properties":{"LocalObjectReference":{"$ref":"#/definitions/LocalObjectReference"},"key":{"type":"string"},"optional":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"TCPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"endpoint":{"type":"string"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"Template":{"properties":{"template":{"type":"string"},"jsonPath":{"type":"string"},"expr":{"type":"string"},"javascript":{"type":"string"}},"additionalProperties":false,"type":"object"},"Time":{"properties":{},"additionalProperties":false,"type":"object"},"TypeMeta":{"properties":{"kind":{"type":"string"},"apiVersion":{"type":"string"}},"additionalProperties":false,"type":"object"},"VarSource":{"properties":{"fieldRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ObjectFieldSelector"},"value":{"type":"string"},"configMapKeyRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigMapKeySelector"},"secretKeyRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SecretKeySelector"}},"additionalProperties":false,"type":"object"}}} \ No newline at end of file diff --git a/config/schemas/component.schema.json b/config/schemas/component.schema.json index ed3427fe9..e39a6d87f 100644 --- a/config/schemas/component.schema.json +++ b/config/schemas/component.schema.json @@ -1 +1 @@ -{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Component","definitions":{"AWSConnection":{"properties":{"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"AlertManagerCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"alerts":{"items":{"type":"string"},"type":"array"},"filters":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"ignore":{"items":{"type":"string"},"type":"array"}},"additionalProperties":false,"type":"object"},"Authentication":{"required":["username","password"],"properties":{"username":{"$ref":"#/definitions/EnvVar"},"password":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"AwsConfigCheck":{"required":["name","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"query":{"type":"string"},"awsConnection":{"$ref":"#/definitions/AWSConnection"},"aggregatorName":{"type":"string"}},"additionalProperties":false,"type":"object"},"AwsConfigRuleCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"ignoreRules":{"items":{"type":"string"},"type":"array"},"rules":{"items":{"type":"string"},"type":"array"},"complianceTypes":{"items":{"type":"string"},"type":"array"},"awsConnection":{"$ref":"#/definitions/AWSConnection"}},"additionalProperties":false,"type":"object"},"AzureDevopsCheck":{"required":["name","organization","personalAccessToken","project","pipeline","variables","branch","thresholdMillis"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"organization":{"type":"string"},"personalAccessToken":{"$ref":"#/definitions/EnvVar"},"project":{"type":"string"},"pipeline":{"type":"string"},"variables":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"branch":{"items":{"type":"string"},"type":"array"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"Bucket":{"properties":{"name":{"type":"string"},"region":{"type":"string"},"endpoint":{"type":"string"}},"additionalProperties":false,"type":"object"},"CanarySpec":{"properties":{"env":{"patternProperties":{".*":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/VarSource"}},"type":"object"},"http":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/HTTPCheck"},"type":"array"},"dns":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DNSCheck"},"type":"array"},"docker":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DockerPullCheck"},"type":"array"},"dockerPush":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DockerPushCheck"},"type":"array"},"containerd":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ContainerdPullCheck"},"type":"array"},"containerdPush":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ContainerdPushCheck"},"type":"array"},"s3":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/S3Check"},"type":"array"},"tcp":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TCPCheck"},"type":"array"},"pod":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PodCheck"},"type":"array"},"ldap":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LDAPCheck"},"type":"array"},"icmp":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ICMPCheck"},"type":"array"},"postgres":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PostgresCheck"},"type":"array"},"mssql":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MssqlCheck"},"type":"array"},"mysql":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MysqlCheck"},"type":"array"},"restic":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ResticCheck"},"type":"array"},"jmeter":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JmeterCheck"},"type":"array"},"junit":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JunitCheck"},"type":"array"},"helm":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/HelmCheck"},"type":"array"},"namespace":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/NamespaceCheck"},"type":"array"},"redis":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/RedisCheck"},"type":"array"},"ec2":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EC2Check"},"type":"array"},"prometheus":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PrometheusCheck"},"type":"array"},"mongodb":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MongoDBCheck"},"type":"array"},"cloudwatch":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CloudWatchCheck"},"type":"array"},"github":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GitHubCheck"},"type":"array"},"kubernetes":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/KubernetesCheck"},"type":"array"},"folder":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FolderCheck"},"type":"array"},"exec":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ExecCheck"},"type":"array"},"awsConfig":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AwsConfigCheck"},"type":"array"},"awsConfigRule":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AwsConfigRuleCheck"},"type":"array"},"databaseBackup":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DatabaseBackupCheck"},"type":"array"},"configDB":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigDBCheck"},"type":"array"},"elasticsearch":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ElasticsearchCheck"},"type":"array"},"alertmanager":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AlertManagerCheck"},"type":"array"},"azureDevops":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AzureDevopsCheck"},"type":"array"},"interval":{"type":"integer"},"schedule":{"type":"string"},"icon":{"type":"string"},"severity":{"type":"string"},"owner":{"type":"string"},"resultMode":{"type":"string"}},"additionalProperties":false,"type":"object"},"CloudWatchCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"filter":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CloudWatchFilter"}},"additionalProperties":false,"type":"object"},"CloudWatchFilter":{"properties":{"actionPrefix":{"type":"string"},"alarmPrefix":{"type":"string"},"alarms":{"items":{"type":"string"},"type":"array"},"state":{"type":"string"}},"additionalProperties":false,"type":"object"},"Component":{"required":["TypeMeta"],"properties":{"TypeMeta":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TypeMeta"},"metadata":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ObjectMeta"},"spec":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentSpec"},"status":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentStatus"}},"additionalProperties":false,"type":"object"},"ComponentCheck":{"properties":{"selector":{"$ref":"#/definitions/ResourceSelector"},"inline":{"$ref":"#/definitions/CanarySpec"}},"additionalProperties":false,"type":"object"},"ComponentSpec":{"properties":{"name":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"owner":{"type":"string"},"id":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Template"},"order":{"type":"integer"},"type":{"type":"string"},"lifecycle":{"type":"string"},"relationships":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/RelationshipSpec"},"type":"array"},"properties":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Property"},"type":"array"},"lookup":{"$ref":"#/definitions/CanarySpec"},"components":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentSpecObject"},"type":"array"},"selectors":{"items":{"$ref":"#/definitions/ResourceSelector"},"type":"array"},"checks":{"items":{"$ref":"#/definitions/ComponentCheck"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"},"summary":{"$ref":"#/definitions/Summary"},"forEach":{"$ref":"#/definitions/ForEach"},"logs":{"items":{"$ref":"#/definitions/LogSelector"},"type":"array"}},"additionalProperties":false,"type":"object"},"ComponentSpecObject":{"properties":{"name":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"owner":{"type":"string"},"id":{"$ref":"#/definitions/Template"},"order":{"type":"integer"},"type":{"type":"string"},"lifecycle":{"type":"string"},"relationships":{"items":{"$ref":"#/definitions/RelationshipSpec"},"type":"array"},"properties":{"items":{"$ref":"#/definitions/Property"},"type":"array"},"lookup":{"$ref":"#/definitions/CanarySpec"},"components":{"items":{"$ref":"#/definitions/ComponentSpecObject"},"type":"array"},"selectors":{"items":{"$ref":"#/definitions/ResourceSelector"},"type":"array"},"checks":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentCheck"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"},"summary":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Summary"},"forEach":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ForEach"},"logs":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LogSelector"},"type":"array"}},"additionalProperties":false,"type":"object"},"ComponentStatus":{"properties":{"status":{"type":"string"}},"additionalProperties":false,"type":"object"},"Config":{"properties":{"id":{"items":{"type":"string"},"type":"array"},"type":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"tags":{"patternProperties":{".*":{"type":"string"}},"type":"object"}},"additionalProperties":false,"type":"object"},"ConfigDBCheck":{"required":["name","query"],"properties":{"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"query":{"type":"string"}},"additionalProperties":false,"type":"object"},"ConfigLookup":{"properties":{"id":{"type":"string"},"config":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Config"},"field":{"type":"string"},"display":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Display"}},"additionalProperties":false,"type":"object"},"ConfigMapKeySelector":{"required":["LocalObjectReference","key"],"properties":{"LocalObjectReference":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LocalObjectReference"},"key":{"type":"string"},"optional":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"ContainerdPullCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"expectedDigest":{"type":"string"},"expectedSize":{"type":"integer"}},"additionalProperties":false,"type":"object"},"ContainerdPushCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"}},"additionalProperties":false,"type":"object"},"DNSCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"server":{"type":"string"},"port":{"type":"integer"},"query":{"type":"string"},"querytype":{"type":"string"},"minrecords":{"type":"integer"},"exactreply":{"items":{"type":"string"},"type":"array"},"timeout":{"type":"integer"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"DatabaseBackupCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"gcp":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GCPDatabase"},"maxAge":{"type":"string"}},"additionalProperties":false,"type":"object"},"Display":{"properties":{"template":{"type":"string"},"jsonPath":{"type":"string"},"expr":{"type":"string"},"javascript":{"type":"string"}},"additionalProperties":false,"type":"object"},"DockerPullCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"expectedDigest":{"type":"string"},"expectedSize":{"type":"integer"}},"additionalProperties":false,"type":"object"},"DockerPushCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"EC2Check":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"ami":{"type":"string"},"userData":{"type":"string"},"securityGroup":{"type":"string"},"keepAlive":{"type":"boolean"},"waitTime":{"type":"integer"},"timeOut":{"type":"integer"},"canaryRef":{"items":{"$ref":"#/definitions/LocalObjectReference"},"type":"array"}},"additionalProperties":false,"type":"object"},"ElasticsearchCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"url":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"index":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"EnvVar":{"properties":{"name":{"type":"string"},"value":{"type":"string"},"valueFrom":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EnvVarSource"}},"additionalProperties":false,"type":"object"},"EnvVarSource":{"properties":{"configMapKeyRef":{"$ref":"#/definitions/ConfigMapKeySelector"},"secretKeyRef":{"$ref":"#/definitions/SecretKeySelector"}},"additionalProperties":false,"type":"object"},"ExecCheck":{"required":["name","script"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"script":{"type":"string"}},"additionalProperties":false,"type":"object"},"FieldsV1":{"properties":{},"additionalProperties":false,"type":"object"},"FolderCheck":{"required":["name","path"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"path":{"type":"string"},"filter":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FolderFilter"},"minAge":{"type":"string"},"maxAge":{"type":"string"},"minCount":{"type":"integer"},"maxCount":{"type":"integer"},"minSize":{"type":"string"},"maxSize":{"type":"string"},"availableSize":{"type":"string"},"totalSize":{"type":"string"},"awsConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AWSConnection"},"gcpConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GCPConnection"},"smbConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SMBConnection"},"sftpConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SFTPConnection"}},"additionalProperties":false,"type":"object"},"FolderFilter":{"properties":{"minAge":{"type":"string"},"maxAge":{"type":"string"},"minSize":{"type":"string"},"maxSize":{"type":"string"},"regex":{"type":"string"}},"additionalProperties":false,"type":"object"},"ForEach":{"properties":{"components":{"items":{"$ref":"#/definitions/ComponentSpec"},"type":"array"},"properties":{"items":{"$ref":"#/definitions/Property"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"},"selectors":{"items":{"$ref":"#/definitions/ResourceSelector"},"type":"array"},"relationships":{"items":{"$ref":"#/definitions/RelationshipSpec"},"type":"array"},"checks":{"items":{"$ref":"#/definitions/ComponentCheck"},"type":"array"}},"additionalProperties":false,"type":"object"},"GCPConnection":{"properties":{"endpoint":{"type":"string"},"credentials":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"GCPDatabase":{"required":["project","instance"],"properties":{"project":{"type":"string"},"instance":{"type":"string"},"gcpConnection":{"$ref":"#/definitions/GCPConnection"}},"additionalProperties":false,"type":"object"},"GitHubCheck":{"required":["name","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"query":{"type":"string"},"githubToken":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"HTTPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"endpoint":{"type":"string"},"namespace":{"type":"string"},"thresholdMillis":{"type":"integer"},"responseCodes":{"items":{"type":"integer"},"type":"array"},"responseContent":{"type":"string"},"responseJSONContent":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JSONCheck"},"maxSSLExpiry":{"type":"integer"},"method":{"type":"string"},"ntlm":{"type":"boolean"},"ntlmv2":{"type":"boolean"},"body":{"type":"string"},"headers":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EnvVar"},"type":"array"},"authentication":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Authentication"},"templateBody":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"HelmCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"chartmuseum":{"type":"string"},"project":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"cafile":{"type":"string"}},"additionalProperties":false,"type":"object"},"ICMPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"endpoint":{"type":"string"},"thresholdMillis":{"type":"integer"},"packetLossThreshold":{"type":"integer"},"packetCount":{"type":"integer"}},"additionalProperties":false,"type":"object"},"JSONCheck":{"required":["path","value"],"properties":{"path":{"type":"string"},"value":{"type":"string"}},"additionalProperties":false,"type":"object"},"JmeterCheck":{"required":["name","jmx"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"jmx":{"$ref":"#/definitions/EnvVar"},"host":{"type":"string"},"port":{"type":"integer"},"properties":{"items":{"type":"string"},"type":"array"},"systemProperties":{"items":{"type":"string"},"type":"array"},"responseDuration":{"type":"string"}},"additionalProperties":false,"type":"object"},"JunitCheck":{"required":["name","testResults","spec"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"testResults":{"type":"string"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"timeout":{"type":"integer"},"spec":{"additionalProperties":true}},"additionalProperties":false,"type":"object"},"KubernetesCheck":{"required":["name","kind"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"namespace":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ResourceSelector"},"resource":{"$ref":"#/definitions/ResourceSelector"},"ignore":{"items":{"type":"string"},"type":"array"},"kind":{"type":"string"},"ready":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"LDAPCheck":{"required":["name","host","auth","bindDN"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"bindDN":{"type":"string"},"userSearch":{"type":"string"},"skipTLSVerify":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"Link":{"required":["Text"],"properties":{"type":{"type":"string"},"url":{"type":"string"},"Text":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Text"}},"additionalProperties":false,"type":"object"},"LocalObjectReference":{"properties":{"name":{"type":"string"}},"additionalProperties":false,"type":"object"},"LogSelector":{"properties":{"name":{"type":"string"},"type":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"}},"additionalProperties":false,"type":"object"},"ManagedFieldsEntry":{"properties":{"manager":{"type":"string"},"operation":{"type":"string"},"apiVersion":{"type":"string"},"time":{"$ref":"#/definitions/Time"},"fieldsType":{"type":"string"},"fieldsV1":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FieldsV1"},"subresource":{"type":"string"}},"additionalProperties":false,"type":"object"},"MongoDBCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"MssqlCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"MysqlCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"NamespaceCheck":{"required":["name","podSpec"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespaceNamePrefix":{"type":"string"},"namespaceLabels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespaceAnnotations":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"podSpec":{"type":"string"},"schedule_timeout":{"type":"integer"},"readyTimeout":{"type":"integer"},"httpTimeout":{"type":"integer"},"deleteTimeout":{"type":"integer"},"ingressTimeout":{"type":"integer"},"httpRetryInterval":{"type":"integer"},"deadline":{"type":"integer"},"port":{"type":"integer"},"path":{"type":"string"},"ingressName":{"type":"string"},"ingressHost":{"type":"string"},"expectedContent":{"type":"string"},"expectedHttpStatuses":{"items":{"type":"integer"},"type":"array"},"priorityClass":{"type":"string"}},"additionalProperties":false,"type":"object"},"ObjectFieldSelector":{"required":["fieldPath"],"properties":{"apiVersion":{"type":"string"},"fieldPath":{"type":"string"}},"additionalProperties":false,"type":"object"},"ObjectMeta":{"properties":{"name":{"type":"string"},"generateName":{"type":"string"},"namespace":{"type":"string"},"selfLink":{"type":"string"},"uid":{"type":"string"},"resourceVersion":{"type":"string"},"generation":{"type":"integer"},"creationTimestamp":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Time"},"deletionTimestamp":{"$ref":"#/definitions/Time"},"deletionGracePeriodSeconds":{"type":"integer"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"annotations":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"ownerReferences":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/OwnerReference"},"type":"array"},"finalizers":{"items":{"type":"string"},"type":"array"},"managedFields":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ManagedFieldsEntry"},"type":"array"}},"additionalProperties":false,"type":"object"},"OwnerReference":{"required":["apiVersion","kind","name","uid"],"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"},"controller":{"type":"boolean"},"blockOwnerDeletion":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"PodCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespace":{"type":"string"},"spec":{"type":"string"},"scheduleTimeout":{"type":"integer"},"readyTimeout":{"type":"integer"},"httpTimeout":{"type":"integer"},"deleteTimeout":{"type":"integer"},"ingressTimeout":{"type":"integer"},"httpRetryInterval":{"type":"integer"},"deadline":{"type":"integer"},"port":{"type":"integer"},"path":{"type":"string"},"ingressName":{"type":"string"},"ingressHost":{"type":"string"},"ingressClass":{"type":"string"},"expectedContent":{"type":"string"},"expectedHttpStatuses":{"items":{"type":"integer"},"type":"array"},"priorityClass":{"type":"string"}},"additionalProperties":false,"type":"object"},"PostgresCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"PrometheusCheck":{"required":["name","host","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"query":{"type":"string"}},"additionalProperties":false,"type":"object"},"Property":{"properties":{"label":{"type":"string"},"name":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"text":{"type":"string"},"order":{"type":"integer"},"headline":{"type":"boolean"},"type":{"type":"string"},"color":{"type":"string"},"unit":{"type":"string"},"value":{"type":"integer"},"max":{"type":"integer"},"min":{"type":"integer"},"status":{"type":"string"},"lastTransition":{"type":"string"},"links":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Link"},"type":"array"},"lookup":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CanarySpec"},"configLookup":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigLookup"},"summary":{"$ref":"#/definitions/Template"}},"additionalProperties":false,"type":"object"},"RedisCheck":{"required":["name","addr","db"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"addr":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"db":{"type":"integer"}},"additionalProperties":false,"type":"object"},"RelationshipSpec":{"properties":{"type":{"type":"string"},"ref":{"type":"string"}},"additionalProperties":false,"type":"object"},"ResourceSelector":{"properties":{"name":{"type":"string"},"labelSelector":{"type":"string"},"fieldSelector":{"type":"string"}},"additionalProperties":false,"type":"object"},"ResticCheck":{"required":["name","repository","password","maxAge"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"repository":{"type":"string"},"password":{"$ref":"#/definitions/EnvVar"},"maxAge":{"type":"string"},"checkIntegrity":{"type":"boolean"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"caCert":{"type":"string"}},"additionalProperties":false,"type":"object"},"S3Check":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"bucket":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Bucket"},"accessKey":{"type":"string"},"secretKey":{"type":"string"},"objectPath":{"type":"string"},"skipTLSVerify":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"SFTPConnection":{"required":["host","auth"],"properties":{"port":{"type":"integer"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"SMBConnection":{"required":["auth"],"properties":{"port":{"type":"integer"},"auth":{"$ref":"#/definitions/Authentication"},"domain":{"type":"string"},"workstation":{"type":"string"},"sharename":{"type":"string"},"searchPath":{"type":"string"}},"additionalProperties":false,"type":"object"},"SecretKeySelector":{"required":["LocalObjectReference","key"],"properties":{"LocalObjectReference":{"$ref":"#/definitions/LocalObjectReference"},"key":{"type":"string"},"optional":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"Summary":{"properties":{"healthy":{"type":"integer"},"unhealthy":{"type":"integer"},"warning":{"type":"integer"},"info":{"type":"integer"},"incidents":{"patternProperties":{".*":{"patternProperties":{".*":{"type":"integer"}},"type":"object"}},"type":"object"},"insights":{"patternProperties":{".*":{"patternProperties":{".*":{"type":"integer"}},"type":"object"}},"type":"object"}},"additionalProperties":false,"type":"object"},"TCPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"endpoint":{"type":"string"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"Template":{"properties":{"template":{"type":"string"},"jsonPath":{"type":"string"},"expr":{"type":"string"},"javascript":{"type":"string"}},"additionalProperties":false,"type":"object"},"Text":{"properties":{"tooltip":{"type":"string"},"icon":{"type":"string"},"text":{"type":"string"},"label":{"type":"string"}},"additionalProperties":false,"type":"object"},"Time":{"properties":{},"additionalProperties":false,"type":"object"},"TypeMeta":{"properties":{"kind":{"type":"string"},"apiVersion":{"type":"string"}},"additionalProperties":false,"type":"object"},"VarSource":{"properties":{"fieldRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ObjectFieldSelector"},"value":{"type":"string"},"configMapKeyRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigMapKeySelector"},"secretKeyRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SecretKeySelector"}},"additionalProperties":false,"type":"object"}}} \ No newline at end of file +{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Component","definitions":{"AWSConnection":{"properties":{"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"AlertManagerCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"alerts":{"items":{"type":"string"},"type":"array"},"filters":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"ignore":{"items":{"type":"string"},"type":"array"}},"additionalProperties":false,"type":"object"},"Authentication":{"required":["username","password"],"properties":{"username":{"$ref":"#/definitions/EnvVar"},"password":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"AwsConfigCheck":{"required":["name","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"query":{"type":"string"},"awsConnection":{"$ref":"#/definitions/AWSConnection"},"aggregatorName":{"type":"string"}},"additionalProperties":false,"type":"object"},"AwsConfigRuleCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"ignoreRules":{"items":{"type":"string"},"type":"array"},"rules":{"items":{"type":"string"},"type":"array"},"complianceTypes":{"items":{"type":"string"},"type":"array"},"awsConnection":{"$ref":"#/definitions/AWSConnection"}},"additionalProperties":false,"type":"object"},"AzureDevopsCheck":{"required":["name","organization","personalAccessToken","project","pipeline","variables","branch","thresholdMillis"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"organization":{"type":"string"},"personalAccessToken":{"$ref":"#/definitions/EnvVar"},"project":{"type":"string"},"pipeline":{"type":"string"},"variables":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"branch":{"items":{"type":"string"},"type":"array"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"Bucket":{"properties":{"name":{"type":"string"},"region":{"type":"string"},"endpoint":{"type":"string"}},"additionalProperties":false,"type":"object"},"CanarySpec":{"properties":{"env":{"patternProperties":{".*":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/VarSource"}},"type":"object"},"http":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/HTTPCheck"},"type":"array"},"dns":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DNSCheck"},"type":"array"},"docker":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DockerPullCheck"},"type":"array"},"dockerPush":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DockerPushCheck"},"type":"array"},"containerd":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ContainerdPullCheck"},"type":"array"},"containerdPush":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ContainerdPushCheck"},"type":"array"},"s3":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/S3Check"},"type":"array"},"tcp":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TCPCheck"},"type":"array"},"pod":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PodCheck"},"type":"array"},"ldap":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LDAPCheck"},"type":"array"},"icmp":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ICMPCheck"},"type":"array"},"postgres":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PostgresCheck"},"type":"array"},"mssql":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MssqlCheck"},"type":"array"},"mysql":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MysqlCheck"},"type":"array"},"restic":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ResticCheck"},"type":"array"},"jmeter":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JmeterCheck"},"type":"array"},"junit":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JunitCheck"},"type":"array"},"helm":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/HelmCheck"},"type":"array"},"namespace":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/NamespaceCheck"},"type":"array"},"redis":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/RedisCheck"},"type":"array"},"ec2":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EC2Check"},"type":"array"},"prometheus":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PrometheusCheck"},"type":"array"},"mongodb":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MongoDBCheck"},"type":"array"},"cloudwatch":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CloudWatchCheck"},"type":"array"},"github":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GitHubCheck"},"type":"array"},"kubernetes":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/KubernetesCheck"},"type":"array"},"folder":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FolderCheck"},"type":"array"},"exec":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ExecCheck"},"type":"array"},"awsConfig":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AwsConfigCheck"},"type":"array"},"awsConfigRule":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AwsConfigRuleCheck"},"type":"array"},"databaseBackup":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DatabaseBackupCheck"},"type":"array"},"configDB":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigDBCheck"},"type":"array"},"elasticsearch":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ElasticsearchCheck"},"type":"array"},"alertmanager":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AlertManagerCheck"},"type":"array"},"dynatrace":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DynatraceCheck"},"type":"array"},"azureDevops":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AzureDevopsCheck"},"type":"array"},"interval":{"type":"integer"},"schedule":{"type":"string"},"icon":{"type":"string"},"severity":{"type":"string"},"owner":{"type":"string"},"resultMode":{"type":"string"}},"additionalProperties":false,"type":"object"},"CloudWatchCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"filter":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CloudWatchFilter"}},"additionalProperties":false,"type":"object"},"CloudWatchFilter":{"properties":{"actionPrefix":{"type":"string"},"alarmPrefix":{"type":"string"},"alarms":{"items":{"type":"string"},"type":"array"},"state":{"type":"string"}},"additionalProperties":false,"type":"object"},"Component":{"required":["TypeMeta"],"properties":{"TypeMeta":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TypeMeta"},"metadata":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ObjectMeta"},"spec":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentSpec"},"status":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentStatus"}},"additionalProperties":false,"type":"object"},"ComponentCheck":{"properties":{"selector":{"$ref":"#/definitions/ResourceSelector"},"inline":{"$ref":"#/definitions/CanarySpec"}},"additionalProperties":false,"type":"object"},"ComponentSpec":{"properties":{"name":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"owner":{"type":"string"},"id":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Template"},"order":{"type":"integer"},"type":{"type":"string"},"lifecycle":{"type":"string"},"relationships":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/RelationshipSpec"},"type":"array"},"properties":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Property"},"type":"array"},"lookup":{"$ref":"#/definitions/CanarySpec"},"components":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentSpecObject"},"type":"array"},"selectors":{"items":{"$ref":"#/definitions/ResourceSelector"},"type":"array"},"checks":{"items":{"$ref":"#/definitions/ComponentCheck"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"},"summary":{"$ref":"#/definitions/Summary"},"forEach":{"$ref":"#/definitions/ForEach"},"logs":{"items":{"$ref":"#/definitions/LogSelector"},"type":"array"}},"additionalProperties":false,"type":"object"},"ComponentSpecObject":{"properties":{"name":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"owner":{"type":"string"},"id":{"$ref":"#/definitions/Template"},"order":{"type":"integer"},"type":{"type":"string"},"lifecycle":{"type":"string"},"relationships":{"items":{"$ref":"#/definitions/RelationshipSpec"},"type":"array"},"properties":{"items":{"$ref":"#/definitions/Property"},"type":"array"},"lookup":{"$ref":"#/definitions/CanarySpec"},"components":{"items":{"$ref":"#/definitions/ComponentSpecObject"},"type":"array"},"selectors":{"items":{"$ref":"#/definitions/ResourceSelector"},"type":"array"},"checks":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentCheck"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"},"summary":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Summary"},"forEach":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ForEach"},"logs":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LogSelector"},"type":"array"}},"additionalProperties":false,"type":"object"},"ComponentStatus":{"properties":{"status":{"type":"string"}},"additionalProperties":false,"type":"object"},"Config":{"properties":{"id":{"items":{"type":"string"},"type":"array"},"type":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"tags":{"patternProperties":{".*":{"type":"string"}},"type":"object"}},"additionalProperties":false,"type":"object"},"ConfigDBCheck":{"required":["name","query"],"properties":{"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"query":{"type":"string"}},"additionalProperties":false,"type":"object"},"ConfigLookup":{"properties":{"id":{"type":"string"},"config":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Config"},"field":{"type":"string"},"display":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Display"}},"additionalProperties":false,"type":"object"},"ConfigMapKeySelector":{"required":["LocalObjectReference","key"],"properties":{"LocalObjectReference":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LocalObjectReference"},"key":{"type":"string"},"optional":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"ContainerdPullCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"expectedDigest":{"type":"string"},"expectedSize":{"type":"integer"}},"additionalProperties":false,"type":"object"},"ContainerdPushCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"}},"additionalProperties":false,"type":"object"},"DNSCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"server":{"type":"string"},"port":{"type":"integer"},"query":{"type":"string"},"querytype":{"type":"string"},"minrecords":{"type":"integer"},"exactreply":{"items":{"type":"string"},"type":"array"},"timeout":{"type":"integer"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"DatabaseBackupCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"gcp":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GCPDatabase"},"maxAge":{"type":"string"}},"additionalProperties":false,"type":"object"},"Display":{"properties":{"template":{"type":"string"},"jsonPath":{"type":"string"},"expr":{"type":"string"},"javascript":{"type":"string"}},"additionalProperties":false,"type":"object"},"DockerPullCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"expectedDigest":{"type":"string"},"expectedSize":{"type":"integer"}},"additionalProperties":false,"type":"object"},"DockerPushCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"DynatraceCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"scheme":{"type":"string"},"apiKey":{"$ref":"#/definitions/EnvVar"},"namespace":{"type":"string"}},"additionalProperties":false,"type":"object"},"EC2Check":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"ami":{"type":"string"},"userData":{"type":"string"},"securityGroup":{"type":"string"},"keepAlive":{"type":"boolean"},"waitTime":{"type":"integer"},"timeOut":{"type":"integer"},"canaryRef":{"items":{"$ref":"#/definitions/LocalObjectReference"},"type":"array"}},"additionalProperties":false,"type":"object"},"ElasticsearchCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"url":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"index":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"EnvVar":{"properties":{"name":{"type":"string"},"value":{"type":"string"},"valueFrom":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EnvVarSource"}},"additionalProperties":false,"type":"object"},"EnvVarSource":{"properties":{"configMapKeyRef":{"$ref":"#/definitions/ConfigMapKeySelector"},"secretKeyRef":{"$ref":"#/definitions/SecretKeySelector"}},"additionalProperties":false,"type":"object"},"ExecCheck":{"required":["name","script"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"script":{"type":"string"}},"additionalProperties":false,"type":"object"},"FieldsV1":{"properties":{},"additionalProperties":false,"type":"object"},"FolderCheck":{"required":["name","path"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"path":{"type":"string"},"filter":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FolderFilter"},"minAge":{"type":"string"},"maxAge":{"type":"string"},"minCount":{"type":"integer"},"maxCount":{"type":"integer"},"minSize":{"type":"string"},"maxSize":{"type":"string"},"availableSize":{"type":"string"},"totalSize":{"type":"string"},"awsConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AWSConnection"},"gcpConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GCPConnection"},"smbConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SMBConnection"},"sftpConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SFTPConnection"}},"additionalProperties":false,"type":"object"},"FolderFilter":{"properties":{"minAge":{"type":"string"},"maxAge":{"type":"string"},"minSize":{"type":"string"},"maxSize":{"type":"string"},"regex":{"type":"string"}},"additionalProperties":false,"type":"object"},"ForEach":{"properties":{"components":{"items":{"$ref":"#/definitions/ComponentSpec"},"type":"array"},"properties":{"items":{"$ref":"#/definitions/Property"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"},"selectors":{"items":{"$ref":"#/definitions/ResourceSelector"},"type":"array"},"relationships":{"items":{"$ref":"#/definitions/RelationshipSpec"},"type":"array"},"checks":{"items":{"$ref":"#/definitions/ComponentCheck"},"type":"array"}},"additionalProperties":false,"type":"object"},"GCPConnection":{"properties":{"endpoint":{"type":"string"},"credentials":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"GCPDatabase":{"required":["project","instance"],"properties":{"project":{"type":"string"},"instance":{"type":"string"},"gcpConnection":{"$ref":"#/definitions/GCPConnection"}},"additionalProperties":false,"type":"object"},"GitHubCheck":{"required":["name","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"query":{"type":"string"},"githubToken":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"HTTPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"endpoint":{"type":"string"},"namespace":{"type":"string"},"thresholdMillis":{"type":"integer"},"responseCodes":{"items":{"type":"integer"},"type":"array"},"responseContent":{"type":"string"},"responseJSONContent":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JSONCheck"},"maxSSLExpiry":{"type":"integer"},"method":{"type":"string"},"ntlm":{"type":"boolean"},"ntlmv2":{"type":"boolean"},"body":{"type":"string"},"headers":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EnvVar"},"type":"array"},"authentication":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Authentication"},"templateBody":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"HelmCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"chartmuseum":{"type":"string"},"project":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"cafile":{"type":"string"}},"additionalProperties":false,"type":"object"},"ICMPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"endpoint":{"type":"string"},"thresholdMillis":{"type":"integer"},"packetLossThreshold":{"type":"integer"},"packetCount":{"type":"integer"}},"additionalProperties":false,"type":"object"},"JSONCheck":{"required":["path","value"],"properties":{"path":{"type":"string"},"value":{"type":"string"}},"additionalProperties":false,"type":"object"},"JmeterCheck":{"required":["name","jmx"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"jmx":{"$ref":"#/definitions/EnvVar"},"host":{"type":"string"},"port":{"type":"integer"},"properties":{"items":{"type":"string"},"type":"array"},"systemProperties":{"items":{"type":"string"},"type":"array"},"responseDuration":{"type":"string"}},"additionalProperties":false,"type":"object"},"JunitCheck":{"required":["name","testResults","spec"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"testResults":{"type":"string"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"timeout":{"type":"integer"},"spec":{"additionalProperties":true}},"additionalProperties":false,"type":"object"},"KubernetesCheck":{"required":["name","kind"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"namespace":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ResourceSelector"},"resource":{"$ref":"#/definitions/ResourceSelector"},"ignore":{"items":{"type":"string"},"type":"array"},"kind":{"type":"string"},"ready":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"LDAPCheck":{"required":["name","host","auth","bindDN"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"bindDN":{"type":"string"},"userSearch":{"type":"string"},"skipTLSVerify":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"Link":{"required":["Text"],"properties":{"type":{"type":"string"},"url":{"type":"string"},"Text":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Text"}},"additionalProperties":false,"type":"object"},"LocalObjectReference":{"properties":{"name":{"type":"string"}},"additionalProperties":false,"type":"object"},"LogSelector":{"properties":{"name":{"type":"string"},"type":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"}},"additionalProperties":false,"type":"object"},"ManagedFieldsEntry":{"properties":{"manager":{"type":"string"},"operation":{"type":"string"},"apiVersion":{"type":"string"},"time":{"$ref":"#/definitions/Time"},"fieldsType":{"type":"string"},"fieldsV1":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FieldsV1"},"subresource":{"type":"string"}},"additionalProperties":false,"type":"object"},"MongoDBCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"MssqlCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"MysqlCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"NamespaceCheck":{"required":["name","podSpec"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespaceNamePrefix":{"type":"string"},"namespaceLabels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespaceAnnotations":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"podSpec":{"type":"string"},"schedule_timeout":{"type":"integer"},"readyTimeout":{"type":"integer"},"httpTimeout":{"type":"integer"},"deleteTimeout":{"type":"integer"},"ingressTimeout":{"type":"integer"},"httpRetryInterval":{"type":"integer"},"deadline":{"type":"integer"},"port":{"type":"integer"},"path":{"type":"string"},"ingressName":{"type":"string"},"ingressHost":{"type":"string"},"expectedContent":{"type":"string"},"expectedHttpStatuses":{"items":{"type":"integer"},"type":"array"},"priorityClass":{"type":"string"}},"additionalProperties":false,"type":"object"},"ObjectFieldSelector":{"required":["fieldPath"],"properties":{"apiVersion":{"type":"string"},"fieldPath":{"type":"string"}},"additionalProperties":false,"type":"object"},"ObjectMeta":{"properties":{"name":{"type":"string"},"generateName":{"type":"string"},"namespace":{"type":"string"},"selfLink":{"type":"string"},"uid":{"type":"string"},"resourceVersion":{"type":"string"},"generation":{"type":"integer"},"creationTimestamp":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Time"},"deletionTimestamp":{"$ref":"#/definitions/Time"},"deletionGracePeriodSeconds":{"type":"integer"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"annotations":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"ownerReferences":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/OwnerReference"},"type":"array"},"finalizers":{"items":{"type":"string"},"type":"array"},"managedFields":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ManagedFieldsEntry"},"type":"array"}},"additionalProperties":false,"type":"object"},"OwnerReference":{"required":["apiVersion","kind","name","uid"],"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"},"controller":{"type":"boolean"},"blockOwnerDeletion":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"PodCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespace":{"type":"string"},"spec":{"type":"string"},"scheduleTimeout":{"type":"integer"},"readyTimeout":{"type":"integer"},"httpTimeout":{"type":"integer"},"deleteTimeout":{"type":"integer"},"ingressTimeout":{"type":"integer"},"httpRetryInterval":{"type":"integer"},"deadline":{"type":"integer"},"port":{"type":"integer"},"path":{"type":"string"},"ingressName":{"type":"string"},"ingressHost":{"type":"string"},"ingressClass":{"type":"string"},"expectedContent":{"type":"string"},"expectedHttpStatuses":{"items":{"type":"integer"},"type":"array"},"priorityClass":{"type":"string"}},"additionalProperties":false,"type":"object"},"PostgresCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"PrometheusCheck":{"required":["name","host","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"query":{"type":"string"}},"additionalProperties":false,"type":"object"},"Property":{"properties":{"label":{"type":"string"},"name":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"text":{"type":"string"},"order":{"type":"integer"},"headline":{"type":"boolean"},"type":{"type":"string"},"color":{"type":"string"},"unit":{"type":"string"},"value":{"type":"integer"},"max":{"type":"integer"},"min":{"type":"integer"},"status":{"type":"string"},"lastTransition":{"type":"string"},"links":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Link"},"type":"array"},"lookup":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CanarySpec"},"configLookup":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigLookup"},"summary":{"$ref":"#/definitions/Template"}},"additionalProperties":false,"type":"object"},"RedisCheck":{"required":["name","addr","db"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"addr":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"db":{"type":"integer"}},"additionalProperties":false,"type":"object"},"RelationshipSpec":{"properties":{"type":{"type":"string"},"ref":{"type":"string"}},"additionalProperties":false,"type":"object"},"ResourceSelector":{"properties":{"name":{"type":"string"},"labelSelector":{"type":"string"},"fieldSelector":{"type":"string"}},"additionalProperties":false,"type":"object"},"ResticCheck":{"required":["name","repository","password","maxAge"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"repository":{"type":"string"},"password":{"$ref":"#/definitions/EnvVar"},"maxAge":{"type":"string"},"checkIntegrity":{"type":"boolean"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"caCert":{"type":"string"}},"additionalProperties":false,"type":"object"},"S3Check":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"bucket":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Bucket"},"accessKey":{"type":"string"},"secretKey":{"type":"string"},"objectPath":{"type":"string"},"skipTLSVerify":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"SFTPConnection":{"required":["host","auth"],"properties":{"port":{"type":"integer"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"SMBConnection":{"required":["auth"],"properties":{"port":{"type":"integer"},"auth":{"$ref":"#/definitions/Authentication"},"domain":{"type":"string"},"workstation":{"type":"string"},"sharename":{"type":"string"},"searchPath":{"type":"string"}},"additionalProperties":false,"type":"object"},"SecretKeySelector":{"required":["LocalObjectReference","key"],"properties":{"LocalObjectReference":{"$ref":"#/definitions/LocalObjectReference"},"key":{"type":"string"},"optional":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"Summary":{"properties":{"healthy":{"type":"integer"},"unhealthy":{"type":"integer"},"warning":{"type":"integer"},"info":{"type":"integer"},"incidents":{"patternProperties":{".*":{"patternProperties":{".*":{"type":"integer"}},"type":"object"}},"type":"object"},"insights":{"patternProperties":{".*":{"patternProperties":{".*":{"type":"integer"}},"type":"object"}},"type":"object"}},"additionalProperties":false,"type":"object"},"TCPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"endpoint":{"type":"string"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"Template":{"properties":{"template":{"type":"string"},"jsonPath":{"type":"string"},"expr":{"type":"string"},"javascript":{"type":"string"}},"additionalProperties":false,"type":"object"},"Text":{"properties":{"tooltip":{"type":"string"},"icon":{"type":"string"},"text":{"type":"string"},"label":{"type":"string"}},"additionalProperties":false,"type":"object"},"Time":{"properties":{},"additionalProperties":false,"type":"object"},"TypeMeta":{"properties":{"kind":{"type":"string"},"apiVersion":{"type":"string"}},"additionalProperties":false,"type":"object"},"VarSource":{"properties":{"fieldRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ObjectFieldSelector"},"value":{"type":"string"},"configMapKeyRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigMapKeySelector"},"secretKeyRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SecretKeySelector"}},"additionalProperties":false,"type":"object"}}} \ No newline at end of file diff --git a/config/schemas/topology.schema.json b/config/schemas/topology.schema.json index 1e2818b64..7b44be9ee 100644 --- a/config/schemas/topology.schema.json +++ b/config/schemas/topology.schema.json @@ -1 +1 @@ -{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Topology","definitions":{"AWSConnection":{"properties":{"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"AlertManagerCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"alerts":{"items":{"type":"string"},"type":"array"},"filters":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"ignore":{"items":{"type":"string"},"type":"array"}},"additionalProperties":false,"type":"object"},"Authentication":{"required":["username","password"],"properties":{"username":{"$ref":"#/definitions/EnvVar"},"password":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"AwsConfigCheck":{"required":["name","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"query":{"type":"string"},"awsConnection":{"$ref":"#/definitions/AWSConnection"},"aggregatorName":{"type":"string"}},"additionalProperties":false,"type":"object"},"AwsConfigRuleCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"ignoreRules":{"items":{"type":"string"},"type":"array"},"rules":{"items":{"type":"string"},"type":"array"},"complianceTypes":{"items":{"type":"string"},"type":"array"},"awsConnection":{"$ref":"#/definitions/AWSConnection"}},"additionalProperties":false,"type":"object"},"AzureDevopsCheck":{"required":["name","organization","personalAccessToken","project","pipeline","variables","branch","thresholdMillis"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"organization":{"type":"string"},"personalAccessToken":{"$ref":"#/definitions/EnvVar"},"project":{"type":"string"},"pipeline":{"type":"string"},"variables":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"branch":{"items":{"type":"string"},"type":"array"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"Bucket":{"properties":{"name":{"type":"string"},"region":{"type":"string"},"endpoint":{"type":"string"}},"additionalProperties":false,"type":"object"},"CanarySpec":{"properties":{"env":{"patternProperties":{".*":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/VarSource"}},"type":"object"},"http":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/HTTPCheck"},"type":"array"},"dns":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DNSCheck"},"type":"array"},"docker":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DockerPullCheck"},"type":"array"},"dockerPush":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DockerPushCheck"},"type":"array"},"containerd":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ContainerdPullCheck"},"type":"array"},"containerdPush":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ContainerdPushCheck"},"type":"array"},"s3":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/S3Check"},"type":"array"},"tcp":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TCPCheck"},"type":"array"},"pod":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PodCheck"},"type":"array"},"ldap":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LDAPCheck"},"type":"array"},"icmp":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ICMPCheck"},"type":"array"},"postgres":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PostgresCheck"},"type":"array"},"mssql":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MssqlCheck"},"type":"array"},"mysql":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MysqlCheck"},"type":"array"},"restic":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ResticCheck"},"type":"array"},"jmeter":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JmeterCheck"},"type":"array"},"junit":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JunitCheck"},"type":"array"},"helm":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/HelmCheck"},"type":"array"},"namespace":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/NamespaceCheck"},"type":"array"},"redis":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/RedisCheck"},"type":"array"},"ec2":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EC2Check"},"type":"array"},"prometheus":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PrometheusCheck"},"type":"array"},"mongodb":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MongoDBCheck"},"type":"array"},"cloudwatch":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CloudWatchCheck"},"type":"array"},"github":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GitHubCheck"},"type":"array"},"kubernetes":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/KubernetesCheck"},"type":"array"},"folder":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FolderCheck"},"type":"array"},"exec":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ExecCheck"},"type":"array"},"awsConfig":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AwsConfigCheck"},"type":"array"},"awsConfigRule":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AwsConfigRuleCheck"},"type":"array"},"databaseBackup":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DatabaseBackupCheck"},"type":"array"},"configDB":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigDBCheck"},"type":"array"},"elasticsearch":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ElasticsearchCheck"},"type":"array"},"alertmanager":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AlertManagerCheck"},"type":"array"},"azureDevops":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AzureDevopsCheck"},"type":"array"},"interval":{"type":"integer"},"schedule":{"type":"string"},"icon":{"type":"string"},"severity":{"type":"string"},"owner":{"type":"string"},"resultMode":{"type":"string"}},"additionalProperties":false,"type":"object"},"CloudWatchCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"filter":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CloudWatchFilter"}},"additionalProperties":false,"type":"object"},"CloudWatchFilter":{"properties":{"actionPrefix":{"type":"string"},"alarmPrefix":{"type":"string"},"alarms":{"items":{"type":"string"},"type":"array"},"state":{"type":"string"}},"additionalProperties":false,"type":"object"},"ComponentCheck":{"properties":{"selector":{"$ref":"#/definitions/ResourceSelector"},"inline":{"$ref":"#/definitions/CanarySpec"}},"additionalProperties":false,"type":"object"},"ComponentSpec":{"properties":{"name":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"owner":{"type":"string"},"id":{"$ref":"#/definitions/Template"},"order":{"type":"integer"},"type":{"type":"string"},"lifecycle":{"type":"string"},"relationships":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/RelationshipSpec"},"type":"array"},"properties":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Property"},"type":"array"},"lookup":{"$ref":"#/definitions/CanarySpec"},"components":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentSpecObject"},"type":"array"},"selectors":{"items":{"$ref":"#/definitions/ResourceSelector"},"type":"array"},"checks":{"items":{"$ref":"#/definitions/ComponentCheck"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"},"summary":{"$ref":"#/definitions/Summary"},"forEach":{"$ref":"#/definitions/ForEach"},"logs":{"items":{"$ref":"#/definitions/LogSelector"},"type":"array"}},"additionalProperties":false,"type":"object"},"ComponentSpecObject":{"properties":{"name":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"owner":{"type":"string"},"id":{"$ref":"#/definitions/Template"},"order":{"type":"integer"},"type":{"type":"string"},"lifecycle":{"type":"string"},"relationships":{"items":{"$ref":"#/definitions/RelationshipSpec"},"type":"array"},"properties":{"items":{"$ref":"#/definitions/Property"},"type":"array"},"lookup":{"$ref":"#/definitions/CanarySpec"},"components":{"items":{"$ref":"#/definitions/ComponentSpecObject"},"type":"array"},"selectors":{"items":{"$ref":"#/definitions/ResourceSelector"},"type":"array"},"checks":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentCheck"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"},"summary":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Summary"},"forEach":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ForEach"},"logs":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LogSelector"},"type":"array"}},"additionalProperties":false,"type":"object"},"Config":{"properties":{"id":{"items":{"type":"string"},"type":"array"},"type":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"tags":{"patternProperties":{".*":{"type":"string"}},"type":"object"}},"additionalProperties":false,"type":"object"},"ConfigDBCheck":{"required":["name","query"],"properties":{"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"query":{"type":"string"}},"additionalProperties":false,"type":"object"},"ConfigLookup":{"properties":{"id":{"type":"string"},"config":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Config"},"field":{"type":"string"},"display":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Display"}},"additionalProperties":false,"type":"object"},"ConfigMapKeySelector":{"required":["LocalObjectReference","key"],"properties":{"LocalObjectReference":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LocalObjectReference"},"key":{"type":"string"},"optional":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"ContainerdPullCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"expectedDigest":{"type":"string"},"expectedSize":{"type":"integer"}},"additionalProperties":false,"type":"object"},"ContainerdPushCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"}},"additionalProperties":false,"type":"object"},"DNSCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"server":{"type":"string"},"port":{"type":"integer"},"query":{"type":"string"},"querytype":{"type":"string"},"minrecords":{"type":"integer"},"exactreply":{"items":{"type":"string"},"type":"array"},"timeout":{"type":"integer"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"DatabaseBackupCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"gcp":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GCPDatabase"},"maxAge":{"type":"string"}},"additionalProperties":false,"type":"object"},"Display":{"properties":{"template":{"type":"string"},"jsonPath":{"type":"string"},"expr":{"type":"string"},"javascript":{"type":"string"}},"additionalProperties":false,"type":"object"},"DockerPullCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"expectedDigest":{"type":"string"},"expectedSize":{"type":"integer"}},"additionalProperties":false,"type":"object"},"DockerPushCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"EC2Check":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"ami":{"type":"string"},"userData":{"type":"string"},"securityGroup":{"type":"string"},"keepAlive":{"type":"boolean"},"waitTime":{"type":"integer"},"timeOut":{"type":"integer"},"canaryRef":{"items":{"$ref":"#/definitions/LocalObjectReference"},"type":"array"}},"additionalProperties":false,"type":"object"},"ElasticsearchCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"url":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"index":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"EnvVar":{"properties":{"name":{"type":"string"},"value":{"type":"string"},"valueFrom":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EnvVarSource"}},"additionalProperties":false,"type":"object"},"EnvVarSource":{"properties":{"configMapKeyRef":{"$ref":"#/definitions/ConfigMapKeySelector"},"secretKeyRef":{"$ref":"#/definitions/SecretKeySelector"}},"additionalProperties":false,"type":"object"},"ExecCheck":{"required":["name","script"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"script":{"type":"string"}},"additionalProperties":false,"type":"object"},"FieldsV1":{"properties":{},"additionalProperties":false,"type":"object"},"FolderCheck":{"required":["name","path"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"path":{"type":"string"},"filter":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FolderFilter"},"minAge":{"type":"string"},"maxAge":{"type":"string"},"minCount":{"type":"integer"},"maxCount":{"type":"integer"},"minSize":{"type":"string"},"maxSize":{"type":"string"},"availableSize":{"type":"string"},"totalSize":{"type":"string"},"awsConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AWSConnection"},"gcpConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GCPConnection"},"smbConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SMBConnection"},"sftpConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SFTPConnection"}},"additionalProperties":false,"type":"object"},"FolderFilter":{"properties":{"minAge":{"type":"string"},"maxAge":{"type":"string"},"minSize":{"type":"string"},"maxSize":{"type":"string"},"regex":{"type":"string"}},"additionalProperties":false,"type":"object"},"ForEach":{"properties":{"components":{"items":{"$ref":"#/definitions/ComponentSpec"},"type":"array"},"properties":{"items":{"$ref":"#/definitions/Property"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"},"selectors":{"items":{"$ref":"#/definitions/ResourceSelector"},"type":"array"},"relationships":{"items":{"$ref":"#/definitions/RelationshipSpec"},"type":"array"},"checks":{"items":{"$ref":"#/definitions/ComponentCheck"},"type":"array"}},"additionalProperties":false,"type":"object"},"GCPConnection":{"properties":{"endpoint":{"type":"string"},"credentials":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"GCPDatabase":{"required":["project","instance"],"properties":{"project":{"type":"string"},"instance":{"type":"string"},"gcpConnection":{"$ref":"#/definitions/GCPConnection"}},"additionalProperties":false,"type":"object"},"GitHubCheck":{"required":["name","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"query":{"type":"string"},"githubToken":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"HTTPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"endpoint":{"type":"string"},"namespace":{"type":"string"},"thresholdMillis":{"type":"integer"},"responseCodes":{"items":{"type":"integer"},"type":"array"},"responseContent":{"type":"string"},"responseJSONContent":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JSONCheck"},"maxSSLExpiry":{"type":"integer"},"method":{"type":"string"},"ntlm":{"type":"boolean"},"ntlmv2":{"type":"boolean"},"body":{"type":"string"},"headers":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EnvVar"},"type":"array"},"authentication":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Authentication"},"templateBody":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"HelmCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"chartmuseum":{"type":"string"},"project":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"cafile":{"type":"string"}},"additionalProperties":false,"type":"object"},"ICMPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"endpoint":{"type":"string"},"thresholdMillis":{"type":"integer"},"packetLossThreshold":{"type":"integer"},"packetCount":{"type":"integer"}},"additionalProperties":false,"type":"object"},"JSONCheck":{"required":["path","value"],"properties":{"path":{"type":"string"},"value":{"type":"string"}},"additionalProperties":false,"type":"object"},"JmeterCheck":{"required":["name","jmx"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"jmx":{"$ref":"#/definitions/EnvVar"},"host":{"type":"string"},"port":{"type":"integer"},"properties":{"items":{"type":"string"},"type":"array"},"systemProperties":{"items":{"type":"string"},"type":"array"},"responseDuration":{"type":"string"}},"additionalProperties":false,"type":"object"},"JunitCheck":{"required":["name","testResults","spec"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"testResults":{"type":"string"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"timeout":{"type":"integer"},"spec":{"additionalProperties":true}},"additionalProperties":false,"type":"object"},"KubernetesCheck":{"required":["name","kind"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"namespace":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ResourceSelector"},"resource":{"$ref":"#/definitions/ResourceSelector"},"ignore":{"items":{"type":"string"},"type":"array"},"kind":{"type":"string"},"ready":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"LDAPCheck":{"required":["name","host","auth","bindDN"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"bindDN":{"type":"string"},"userSearch":{"type":"string"},"skipTLSVerify":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"Link":{"required":["Text"],"properties":{"type":{"type":"string"},"url":{"type":"string"},"Text":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Text"}},"additionalProperties":false,"type":"object"},"LocalObjectReference":{"properties":{"name":{"type":"string"}},"additionalProperties":false,"type":"object"},"LogSelector":{"properties":{"name":{"type":"string"},"type":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"}},"additionalProperties":false,"type":"object"},"ManagedFieldsEntry":{"properties":{"manager":{"type":"string"},"operation":{"type":"string"},"apiVersion":{"type":"string"},"time":{"$ref":"#/definitions/Time"},"fieldsType":{"type":"string"},"fieldsV1":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FieldsV1"},"subresource":{"type":"string"}},"additionalProperties":false,"type":"object"},"MongoDBCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"MssqlCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"MysqlCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"NamespaceCheck":{"required":["name","podSpec"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespaceNamePrefix":{"type":"string"},"namespaceLabels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespaceAnnotations":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"podSpec":{"type":"string"},"schedule_timeout":{"type":"integer"},"readyTimeout":{"type":"integer"},"httpTimeout":{"type":"integer"},"deleteTimeout":{"type":"integer"},"ingressTimeout":{"type":"integer"},"httpRetryInterval":{"type":"integer"},"deadline":{"type":"integer"},"port":{"type":"integer"},"path":{"type":"string"},"ingressName":{"type":"string"},"ingressHost":{"type":"string"},"expectedContent":{"type":"string"},"expectedHttpStatuses":{"items":{"type":"integer"},"type":"array"},"priorityClass":{"type":"string"}},"additionalProperties":false,"type":"object"},"ObjectFieldSelector":{"required":["fieldPath"],"properties":{"apiVersion":{"type":"string"},"fieldPath":{"type":"string"}},"additionalProperties":false,"type":"object"},"ObjectMeta":{"properties":{"name":{"type":"string"},"generateName":{"type":"string"},"namespace":{"type":"string"},"selfLink":{"type":"string"},"uid":{"type":"string"},"resourceVersion":{"type":"string"},"generation":{"type":"integer"},"creationTimestamp":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Time"},"deletionTimestamp":{"$ref":"#/definitions/Time"},"deletionGracePeriodSeconds":{"type":"integer"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"annotations":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"ownerReferences":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/OwnerReference"},"type":"array"},"finalizers":{"items":{"type":"string"},"type":"array"},"managedFields":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ManagedFieldsEntry"},"type":"array"}},"additionalProperties":false,"type":"object"},"OwnerReference":{"required":["apiVersion","kind","name","uid"],"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"},"controller":{"type":"boolean"},"blockOwnerDeletion":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"PodCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespace":{"type":"string"},"spec":{"type":"string"},"scheduleTimeout":{"type":"integer"},"readyTimeout":{"type":"integer"},"httpTimeout":{"type":"integer"},"deleteTimeout":{"type":"integer"},"ingressTimeout":{"type":"integer"},"httpRetryInterval":{"type":"integer"},"deadline":{"type":"integer"},"port":{"type":"integer"},"path":{"type":"string"},"ingressName":{"type":"string"},"ingressHost":{"type":"string"},"ingressClass":{"type":"string"},"expectedContent":{"type":"string"},"expectedHttpStatuses":{"items":{"type":"integer"},"type":"array"},"priorityClass":{"type":"string"}},"additionalProperties":false,"type":"object"},"PostgresCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"PrometheusCheck":{"required":["name","host","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"query":{"type":"string"}},"additionalProperties":false,"type":"object"},"Property":{"properties":{"label":{"type":"string"},"name":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"text":{"type":"string"},"order":{"type":"integer"},"headline":{"type":"boolean"},"type":{"type":"string"},"color":{"type":"string"},"unit":{"type":"string"},"value":{"type":"integer"},"max":{"type":"integer"},"min":{"type":"integer"},"status":{"type":"string"},"lastTransition":{"type":"string"},"links":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Link"},"type":"array"},"lookup":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CanarySpec"},"configLookup":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigLookup"},"summary":{"$ref":"#/definitions/Template"}},"additionalProperties":false,"type":"object"},"RedisCheck":{"required":["name","addr","db"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"addr":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"db":{"type":"integer"}},"additionalProperties":false,"type":"object"},"RelationshipSpec":{"properties":{"type":{"type":"string"},"ref":{"type":"string"}},"additionalProperties":false,"type":"object"},"ResourceSelector":{"properties":{"name":{"type":"string"},"labelSelector":{"type":"string"},"fieldSelector":{"type":"string"}},"additionalProperties":false,"type":"object"},"ResticCheck":{"required":["name","repository","password","maxAge"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"repository":{"type":"string"},"password":{"$ref":"#/definitions/EnvVar"},"maxAge":{"type":"string"},"checkIntegrity":{"type":"boolean"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"caCert":{"type":"string"}},"additionalProperties":false,"type":"object"},"S3Check":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"bucket":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Bucket"},"accessKey":{"type":"string"},"secretKey":{"type":"string"},"objectPath":{"type":"string"},"skipTLSVerify":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"SFTPConnection":{"required":["host","auth"],"properties":{"port":{"type":"integer"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"SMBConnection":{"required":["auth"],"properties":{"port":{"type":"integer"},"auth":{"$ref":"#/definitions/Authentication"},"domain":{"type":"string"},"workstation":{"type":"string"},"sharename":{"type":"string"},"searchPath":{"type":"string"}},"additionalProperties":false,"type":"object"},"SecretKeySelector":{"required":["LocalObjectReference","key"],"properties":{"LocalObjectReference":{"$ref":"#/definitions/LocalObjectReference"},"key":{"type":"string"},"optional":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"Summary":{"properties":{"healthy":{"type":"integer"},"unhealthy":{"type":"integer"},"warning":{"type":"integer"},"info":{"type":"integer"},"incidents":{"patternProperties":{".*":{"patternProperties":{".*":{"type":"integer"}},"type":"object"}},"type":"object"},"insights":{"patternProperties":{".*":{"patternProperties":{".*":{"type":"integer"}},"type":"object"}},"type":"object"}},"additionalProperties":false,"type":"object"},"TCPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"endpoint":{"type":"string"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"Template":{"properties":{"template":{"type":"string"},"jsonPath":{"type":"string"},"expr":{"type":"string"},"javascript":{"type":"string"}},"additionalProperties":false,"type":"object"},"Text":{"properties":{"tooltip":{"type":"string"},"icon":{"type":"string"},"text":{"type":"string"},"label":{"type":"string"}},"additionalProperties":false,"type":"object"},"Time":{"properties":{},"additionalProperties":false,"type":"object"},"Topology":{"required":["TypeMeta"],"properties":{"TypeMeta":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TypeMeta"},"metadata":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ObjectMeta"},"spec":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TopologySpec"},"status":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TopologyStatus"}},"additionalProperties":false,"type":"object"},"TopologySpec":{"properties":{"type":{"type":"string"},"id":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Template"},"schedule":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"text":{"type":"string"},"label":{"type":"string"},"owner":{"type":"string"},"components":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentSpec"},"type":"array"},"properties":{"items":{"$ref":"#/definitions/Property"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"}},"additionalProperties":false,"type":"object"},"TopologyStatus":{"properties":{"persistentID":{"type":"string"},"observedGeneration":{"type":"integer"},"status":{"type":"string"}},"additionalProperties":false,"type":"object"},"TypeMeta":{"properties":{"kind":{"type":"string"},"apiVersion":{"type":"string"}},"additionalProperties":false,"type":"object"},"VarSource":{"properties":{"fieldRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ObjectFieldSelector"},"value":{"type":"string"},"configMapKeyRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigMapKeySelector"},"secretKeyRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SecretKeySelector"}},"additionalProperties":false,"type":"object"}}} \ No newline at end of file +{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Topology","definitions":{"AWSConnection":{"properties":{"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"AlertManagerCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"alerts":{"items":{"type":"string"},"type":"array"},"filters":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"ignore":{"items":{"type":"string"},"type":"array"}},"additionalProperties":false,"type":"object"},"Authentication":{"required":["username","password"],"properties":{"username":{"$ref":"#/definitions/EnvVar"},"password":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"AwsConfigCheck":{"required":["name","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"query":{"type":"string"},"awsConnection":{"$ref":"#/definitions/AWSConnection"},"aggregatorName":{"type":"string"}},"additionalProperties":false,"type":"object"},"AwsConfigRuleCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"ignoreRules":{"items":{"type":"string"},"type":"array"},"rules":{"items":{"type":"string"},"type":"array"},"complianceTypes":{"items":{"type":"string"},"type":"array"},"awsConnection":{"$ref":"#/definitions/AWSConnection"}},"additionalProperties":false,"type":"object"},"AzureDevopsCheck":{"required":["name","organization","personalAccessToken","project","pipeline","variables","branch","thresholdMillis"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"organization":{"type":"string"},"personalAccessToken":{"$ref":"#/definitions/EnvVar"},"project":{"type":"string"},"pipeline":{"type":"string"},"variables":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"branch":{"items":{"type":"string"},"type":"array"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"Bucket":{"properties":{"name":{"type":"string"},"region":{"type":"string"},"endpoint":{"type":"string"}},"additionalProperties":false,"type":"object"},"CanarySpec":{"properties":{"env":{"patternProperties":{".*":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/VarSource"}},"type":"object"},"http":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/HTTPCheck"},"type":"array"},"dns":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DNSCheck"},"type":"array"},"docker":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DockerPullCheck"},"type":"array"},"dockerPush":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DockerPushCheck"},"type":"array"},"containerd":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ContainerdPullCheck"},"type":"array"},"containerdPush":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ContainerdPushCheck"},"type":"array"},"s3":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/S3Check"},"type":"array"},"tcp":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TCPCheck"},"type":"array"},"pod":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PodCheck"},"type":"array"},"ldap":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LDAPCheck"},"type":"array"},"icmp":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ICMPCheck"},"type":"array"},"postgres":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PostgresCheck"},"type":"array"},"mssql":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MssqlCheck"},"type":"array"},"mysql":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MysqlCheck"},"type":"array"},"restic":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ResticCheck"},"type":"array"},"jmeter":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JmeterCheck"},"type":"array"},"junit":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JunitCheck"},"type":"array"},"helm":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/HelmCheck"},"type":"array"},"namespace":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/NamespaceCheck"},"type":"array"},"redis":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/RedisCheck"},"type":"array"},"ec2":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EC2Check"},"type":"array"},"prometheus":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PrometheusCheck"},"type":"array"},"mongodb":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MongoDBCheck"},"type":"array"},"cloudwatch":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CloudWatchCheck"},"type":"array"},"github":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GitHubCheck"},"type":"array"},"kubernetes":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/KubernetesCheck"},"type":"array"},"folder":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FolderCheck"},"type":"array"},"exec":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ExecCheck"},"type":"array"},"awsConfig":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AwsConfigCheck"},"type":"array"},"awsConfigRule":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AwsConfigRuleCheck"},"type":"array"},"databaseBackup":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DatabaseBackupCheck"},"type":"array"},"configDB":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigDBCheck"},"type":"array"},"elasticsearch":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ElasticsearchCheck"},"type":"array"},"alertmanager":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AlertManagerCheck"},"type":"array"},"dynatrace":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DynatraceCheck"},"type":"array"},"azureDevops":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AzureDevopsCheck"},"type":"array"},"interval":{"type":"integer"},"schedule":{"type":"string"},"icon":{"type":"string"},"severity":{"type":"string"},"owner":{"type":"string"},"resultMode":{"type":"string"}},"additionalProperties":false,"type":"object"},"CloudWatchCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"filter":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CloudWatchFilter"}},"additionalProperties":false,"type":"object"},"CloudWatchFilter":{"properties":{"actionPrefix":{"type":"string"},"alarmPrefix":{"type":"string"},"alarms":{"items":{"type":"string"},"type":"array"},"state":{"type":"string"}},"additionalProperties":false,"type":"object"},"ComponentCheck":{"properties":{"selector":{"$ref":"#/definitions/ResourceSelector"},"inline":{"$ref":"#/definitions/CanarySpec"}},"additionalProperties":false,"type":"object"},"ComponentSpec":{"properties":{"name":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"owner":{"type":"string"},"id":{"$ref":"#/definitions/Template"},"order":{"type":"integer"},"type":{"type":"string"},"lifecycle":{"type":"string"},"relationships":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/RelationshipSpec"},"type":"array"},"properties":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Property"},"type":"array"},"lookup":{"$ref":"#/definitions/CanarySpec"},"components":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentSpecObject"},"type":"array"},"selectors":{"items":{"$ref":"#/definitions/ResourceSelector"},"type":"array"},"checks":{"items":{"$ref":"#/definitions/ComponentCheck"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"},"summary":{"$ref":"#/definitions/Summary"},"forEach":{"$ref":"#/definitions/ForEach"},"logs":{"items":{"$ref":"#/definitions/LogSelector"},"type":"array"}},"additionalProperties":false,"type":"object"},"ComponentSpecObject":{"properties":{"name":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"owner":{"type":"string"},"id":{"$ref":"#/definitions/Template"},"order":{"type":"integer"},"type":{"type":"string"},"lifecycle":{"type":"string"},"relationships":{"items":{"$ref":"#/definitions/RelationshipSpec"},"type":"array"},"properties":{"items":{"$ref":"#/definitions/Property"},"type":"array"},"lookup":{"$ref":"#/definitions/CanarySpec"},"components":{"items":{"$ref":"#/definitions/ComponentSpecObject"},"type":"array"},"selectors":{"items":{"$ref":"#/definitions/ResourceSelector"},"type":"array"},"checks":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentCheck"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"},"summary":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Summary"},"forEach":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ForEach"},"logs":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LogSelector"},"type":"array"}},"additionalProperties":false,"type":"object"},"Config":{"properties":{"id":{"items":{"type":"string"},"type":"array"},"type":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"tags":{"patternProperties":{".*":{"type":"string"}},"type":"object"}},"additionalProperties":false,"type":"object"},"ConfigDBCheck":{"required":["name","query"],"properties":{"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"query":{"type":"string"}},"additionalProperties":false,"type":"object"},"ConfigLookup":{"properties":{"id":{"type":"string"},"config":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Config"},"field":{"type":"string"},"display":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Display"}},"additionalProperties":false,"type":"object"},"ConfigMapKeySelector":{"required":["LocalObjectReference","key"],"properties":{"LocalObjectReference":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LocalObjectReference"},"key":{"type":"string"},"optional":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"ContainerdPullCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"expectedDigest":{"type":"string"},"expectedSize":{"type":"integer"}},"additionalProperties":false,"type":"object"},"ContainerdPushCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"}},"additionalProperties":false,"type":"object"},"DNSCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"server":{"type":"string"},"port":{"type":"integer"},"query":{"type":"string"},"querytype":{"type":"string"},"minrecords":{"type":"integer"},"exactreply":{"items":{"type":"string"},"type":"array"},"timeout":{"type":"integer"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"DatabaseBackupCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"gcp":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GCPDatabase"},"maxAge":{"type":"string"}},"additionalProperties":false,"type":"object"},"Display":{"properties":{"template":{"type":"string"},"jsonPath":{"type":"string"},"expr":{"type":"string"},"javascript":{"type":"string"}},"additionalProperties":false,"type":"object"},"DockerPullCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"expectedDigest":{"type":"string"},"expectedSize":{"type":"integer"}},"additionalProperties":false,"type":"object"},"DockerPushCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"DynatraceCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"scheme":{"type":"string"},"apiKey":{"$ref":"#/definitions/EnvVar"},"namespace":{"type":"string"}},"additionalProperties":false,"type":"object"},"EC2Check":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"ami":{"type":"string"},"userData":{"type":"string"},"securityGroup":{"type":"string"},"keepAlive":{"type":"boolean"},"waitTime":{"type":"integer"},"timeOut":{"type":"integer"},"canaryRef":{"items":{"$ref":"#/definitions/LocalObjectReference"},"type":"array"}},"additionalProperties":false,"type":"object"},"ElasticsearchCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"url":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"index":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"EnvVar":{"properties":{"name":{"type":"string"},"value":{"type":"string"},"valueFrom":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EnvVarSource"}},"additionalProperties":false,"type":"object"},"EnvVarSource":{"properties":{"configMapKeyRef":{"$ref":"#/definitions/ConfigMapKeySelector"},"secretKeyRef":{"$ref":"#/definitions/SecretKeySelector"}},"additionalProperties":false,"type":"object"},"ExecCheck":{"required":["name","script"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"script":{"type":"string"}},"additionalProperties":false,"type":"object"},"FieldsV1":{"properties":{},"additionalProperties":false,"type":"object"},"FolderCheck":{"required":["name","path"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"path":{"type":"string"},"filter":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FolderFilter"},"minAge":{"type":"string"},"maxAge":{"type":"string"},"minCount":{"type":"integer"},"maxCount":{"type":"integer"},"minSize":{"type":"string"},"maxSize":{"type":"string"},"availableSize":{"type":"string"},"totalSize":{"type":"string"},"awsConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AWSConnection"},"gcpConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GCPConnection"},"smbConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SMBConnection"},"sftpConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SFTPConnection"}},"additionalProperties":false,"type":"object"},"FolderFilter":{"properties":{"minAge":{"type":"string"},"maxAge":{"type":"string"},"minSize":{"type":"string"},"maxSize":{"type":"string"},"regex":{"type":"string"}},"additionalProperties":false,"type":"object"},"ForEach":{"properties":{"components":{"items":{"$ref":"#/definitions/ComponentSpec"},"type":"array"},"properties":{"items":{"$ref":"#/definitions/Property"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"},"selectors":{"items":{"$ref":"#/definitions/ResourceSelector"},"type":"array"},"relationships":{"items":{"$ref":"#/definitions/RelationshipSpec"},"type":"array"},"checks":{"items":{"$ref":"#/definitions/ComponentCheck"},"type":"array"}},"additionalProperties":false,"type":"object"},"GCPConnection":{"properties":{"endpoint":{"type":"string"},"credentials":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"GCPDatabase":{"required":["project","instance"],"properties":{"project":{"type":"string"},"instance":{"type":"string"},"gcpConnection":{"$ref":"#/definitions/GCPConnection"}},"additionalProperties":false,"type":"object"},"GitHubCheck":{"required":["name","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"query":{"type":"string"},"githubToken":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"HTTPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"endpoint":{"type":"string"},"namespace":{"type":"string"},"thresholdMillis":{"type":"integer"},"responseCodes":{"items":{"type":"integer"},"type":"array"},"responseContent":{"type":"string"},"responseJSONContent":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JSONCheck"},"maxSSLExpiry":{"type":"integer"},"method":{"type":"string"},"ntlm":{"type":"boolean"},"ntlmv2":{"type":"boolean"},"body":{"type":"string"},"headers":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EnvVar"},"type":"array"},"authentication":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Authentication"},"templateBody":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"HelmCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"chartmuseum":{"type":"string"},"project":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"cafile":{"type":"string"}},"additionalProperties":false,"type":"object"},"ICMPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"endpoint":{"type":"string"},"thresholdMillis":{"type":"integer"},"packetLossThreshold":{"type":"integer"},"packetCount":{"type":"integer"}},"additionalProperties":false,"type":"object"},"JSONCheck":{"required":["path","value"],"properties":{"path":{"type":"string"},"value":{"type":"string"}},"additionalProperties":false,"type":"object"},"JmeterCheck":{"required":["name","jmx"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"jmx":{"$ref":"#/definitions/EnvVar"},"host":{"type":"string"},"port":{"type":"integer"},"properties":{"items":{"type":"string"},"type":"array"},"systemProperties":{"items":{"type":"string"},"type":"array"},"responseDuration":{"type":"string"}},"additionalProperties":false,"type":"object"},"JunitCheck":{"required":["name","testResults","spec"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"testResults":{"type":"string"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"timeout":{"type":"integer"},"spec":{"additionalProperties":true}},"additionalProperties":false,"type":"object"},"KubernetesCheck":{"required":["name","kind"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"namespace":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ResourceSelector"},"resource":{"$ref":"#/definitions/ResourceSelector"},"ignore":{"items":{"type":"string"},"type":"array"},"kind":{"type":"string"},"ready":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"LDAPCheck":{"required":["name","host","auth","bindDN"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"bindDN":{"type":"string"},"userSearch":{"type":"string"},"skipTLSVerify":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"Link":{"required":["Text"],"properties":{"type":{"type":"string"},"url":{"type":"string"},"Text":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Text"}},"additionalProperties":false,"type":"object"},"LocalObjectReference":{"properties":{"name":{"type":"string"}},"additionalProperties":false,"type":"object"},"LogSelector":{"properties":{"name":{"type":"string"},"type":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"}},"additionalProperties":false,"type":"object"},"ManagedFieldsEntry":{"properties":{"manager":{"type":"string"},"operation":{"type":"string"},"apiVersion":{"type":"string"},"time":{"$ref":"#/definitions/Time"},"fieldsType":{"type":"string"},"fieldsV1":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FieldsV1"},"subresource":{"type":"string"}},"additionalProperties":false,"type":"object"},"MongoDBCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"MssqlCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"MysqlCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"NamespaceCheck":{"required":["name","podSpec"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespaceNamePrefix":{"type":"string"},"namespaceLabels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespaceAnnotations":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"podSpec":{"type":"string"},"schedule_timeout":{"type":"integer"},"readyTimeout":{"type":"integer"},"httpTimeout":{"type":"integer"},"deleteTimeout":{"type":"integer"},"ingressTimeout":{"type":"integer"},"httpRetryInterval":{"type":"integer"},"deadline":{"type":"integer"},"port":{"type":"integer"},"path":{"type":"string"},"ingressName":{"type":"string"},"ingressHost":{"type":"string"},"expectedContent":{"type":"string"},"expectedHttpStatuses":{"items":{"type":"integer"},"type":"array"},"priorityClass":{"type":"string"}},"additionalProperties":false,"type":"object"},"ObjectFieldSelector":{"required":["fieldPath"],"properties":{"apiVersion":{"type":"string"},"fieldPath":{"type":"string"}},"additionalProperties":false,"type":"object"},"ObjectMeta":{"properties":{"name":{"type":"string"},"generateName":{"type":"string"},"namespace":{"type":"string"},"selfLink":{"type":"string"},"uid":{"type":"string"},"resourceVersion":{"type":"string"},"generation":{"type":"integer"},"creationTimestamp":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Time"},"deletionTimestamp":{"$ref":"#/definitions/Time"},"deletionGracePeriodSeconds":{"type":"integer"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"annotations":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"ownerReferences":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/OwnerReference"},"type":"array"},"finalizers":{"items":{"type":"string"},"type":"array"},"managedFields":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ManagedFieldsEntry"},"type":"array"}},"additionalProperties":false,"type":"object"},"OwnerReference":{"required":["apiVersion","kind","name","uid"],"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"},"controller":{"type":"boolean"},"blockOwnerDeletion":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"PodCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespace":{"type":"string"},"spec":{"type":"string"},"scheduleTimeout":{"type":"integer"},"readyTimeout":{"type":"integer"},"httpTimeout":{"type":"integer"},"deleteTimeout":{"type":"integer"},"ingressTimeout":{"type":"integer"},"httpRetryInterval":{"type":"integer"},"deadline":{"type":"integer"},"port":{"type":"integer"},"path":{"type":"string"},"ingressName":{"type":"string"},"ingressHost":{"type":"string"},"ingressClass":{"type":"string"},"expectedContent":{"type":"string"},"expectedHttpStatuses":{"items":{"type":"integer"},"type":"array"},"priorityClass":{"type":"string"}},"additionalProperties":false,"type":"object"},"PostgresCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"PrometheusCheck":{"required":["name","host","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"query":{"type":"string"}},"additionalProperties":false,"type":"object"},"Property":{"properties":{"label":{"type":"string"},"name":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"text":{"type":"string"},"order":{"type":"integer"},"headline":{"type":"boolean"},"type":{"type":"string"},"color":{"type":"string"},"unit":{"type":"string"},"value":{"type":"integer"},"max":{"type":"integer"},"min":{"type":"integer"},"status":{"type":"string"},"lastTransition":{"type":"string"},"links":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Link"},"type":"array"},"lookup":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CanarySpec"},"configLookup":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigLookup"},"summary":{"$ref":"#/definitions/Template"}},"additionalProperties":false,"type":"object"},"RedisCheck":{"required":["name","addr","db"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"addr":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"db":{"type":"integer"}},"additionalProperties":false,"type":"object"},"RelationshipSpec":{"properties":{"type":{"type":"string"},"ref":{"type":"string"}},"additionalProperties":false,"type":"object"},"ResourceSelector":{"properties":{"name":{"type":"string"},"labelSelector":{"type":"string"},"fieldSelector":{"type":"string"}},"additionalProperties":false,"type":"object"},"ResticCheck":{"required":["name","repository","password","maxAge"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"repository":{"type":"string"},"password":{"$ref":"#/definitions/EnvVar"},"maxAge":{"type":"string"},"checkIntegrity":{"type":"boolean"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"caCert":{"type":"string"}},"additionalProperties":false,"type":"object"},"S3Check":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"bucket":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Bucket"},"accessKey":{"type":"string"},"secretKey":{"type":"string"},"objectPath":{"type":"string"},"skipTLSVerify":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"SFTPConnection":{"required":["host","auth"],"properties":{"port":{"type":"integer"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"SMBConnection":{"required":["auth"],"properties":{"port":{"type":"integer"},"auth":{"$ref":"#/definitions/Authentication"},"domain":{"type":"string"},"workstation":{"type":"string"},"sharename":{"type":"string"},"searchPath":{"type":"string"}},"additionalProperties":false,"type":"object"},"SecretKeySelector":{"required":["LocalObjectReference","key"],"properties":{"LocalObjectReference":{"$ref":"#/definitions/LocalObjectReference"},"key":{"type":"string"},"optional":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"Summary":{"properties":{"healthy":{"type":"integer"},"unhealthy":{"type":"integer"},"warning":{"type":"integer"},"info":{"type":"integer"},"incidents":{"patternProperties":{".*":{"patternProperties":{".*":{"type":"integer"}},"type":"object"}},"type":"object"},"insights":{"patternProperties":{".*":{"patternProperties":{".*":{"type":"integer"}},"type":"object"}},"type":"object"}},"additionalProperties":false,"type":"object"},"TCPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"endpoint":{"type":"string"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"Template":{"properties":{"template":{"type":"string"},"jsonPath":{"type":"string"},"expr":{"type":"string"},"javascript":{"type":"string"}},"additionalProperties":false,"type":"object"},"Text":{"properties":{"tooltip":{"type":"string"},"icon":{"type":"string"},"text":{"type":"string"},"label":{"type":"string"}},"additionalProperties":false,"type":"object"},"Time":{"properties":{},"additionalProperties":false,"type":"object"},"Topology":{"required":["TypeMeta"],"properties":{"TypeMeta":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TypeMeta"},"metadata":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ObjectMeta"},"spec":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TopologySpec"},"status":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TopologyStatus"}},"additionalProperties":false,"type":"object"},"TopologySpec":{"properties":{"type":{"type":"string"},"id":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Template"},"schedule":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"text":{"type":"string"},"label":{"type":"string"},"owner":{"type":"string"},"components":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentSpec"},"type":"array"},"properties":{"items":{"$ref":"#/definitions/Property"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"}},"additionalProperties":false,"type":"object"},"TopologyStatus":{"properties":{"persistentID":{"type":"string"},"observedGeneration":{"type":"integer"},"status":{"type":"string"}},"additionalProperties":false,"type":"object"},"TypeMeta":{"properties":{"kind":{"type":"string"},"apiVersion":{"type":"string"}},"additionalProperties":false,"type":"object"},"VarSource":{"properties":{"fieldRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ObjectFieldSelector"},"value":{"type":"string"},"configMapKeyRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigMapKeySelector"},"secretKeyRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SecretKeySelector"}},"additionalProperties":false,"type":"object"}}} \ No newline at end of file From e1f445730fd0202fd333af92123711f6d539cdfb Mon Sep 17 00:00:00 2001 From: Aditya Thebe Date: Fri, 12 May 2023 16:45:22 +0545 Subject: [PATCH 07/20] feat: connection support --- api/context/context.go | 37 +- api/v1/checks.go | 355 ++++++++++++++---- api/v1/zz_generated.deepcopy.go | 8 +- checks/alertmanager.go | 6 + checks/aws_config.go | 8 + checks/aws_config_rule.go | 5 +- checks/azure_devops.go | 27 +- checks/checker.go | 46 +-- checks/cloudwatch.go | 5 + checks/database_backup_gcp.go | 5 + checks/dns.go | 4 +- checks/ec2.go | 13 +- checks/elasticsearch.go | 4 + checks/folder_gcs.go | 5 + checks/folder_s3.go | 4 + checks/folder_sftp.go | 15 +- checks/folder_smb.go | 17 +- checks/github.go | 22 +- checks/http.go | 13 +- checks/icmp.go | 4 +- checks/jmeter.go | 8 + checks/ldap.go | 27 +- checks/mongodb.go | 18 +- checks/prometheus.go | 5 + checks/redis.go | 54 ++- checks/restic.go | 87 +++-- checks/s3.go | 37 +- checks/sql.go | 35 +- checks/tcp.go | 9 + cmd/run.go | 2 +- config/deploy/crd.yaml | 136 ++++++- config/deploy/manifests.yaml | 136 ++++++- config/schemas/canary.schema.json | 2 +- config/schemas/component.schema.json | 2 +- config/schemas/topology.schema.json | 2 +- .../SFTP/sftp_fail_connection.yaml | 12 + fixtures/minimal/http_fail_connection.yaml | 18 + go.mod | 4 +- go.sum | 8 +- hack/generate-schemas/go.mod | 5 +- hack/generate-schemas/go.sum | 10 +- pkg/api/run_now.go | 2 +- pkg/jobs/canary/canary_jobs.go | 2 +- test/run_test.go | 3 +- 44 files changed, 953 insertions(+), 274 deletions(-) create mode 100644 fixtures/datasources/SFTP/sftp_fail_connection.yaml create mode 100644 fixtures/minimal/http_fail_connection.yaml diff --git a/api/context/context.go b/api/context/context.go index 05421bd37..aef5e4e8f 100644 --- a/api/context/context.go +++ b/api/context/context.go @@ -2,12 +2,16 @@ package context import ( gocontext "context" + "errors" "fmt" "time" v1 "github.com/flanksource/canary-checker/api/v1" "github.com/flanksource/commons/logger" + "github.com/flanksource/duty" + "github.com/flanksource/duty/models" "github.com/flanksource/kommons" + "gorm.io/gorm" ) type KubernetesContext struct { @@ -25,6 +29,7 @@ type Context struct { Canary v1.Canary Environment map[string]interface{} logger.Logger + db *gorm.DB } func (ctx *Context) String() string { @@ -41,6 +46,34 @@ func (ctx *Context) WithDeadline(deadline time.Time) (*Context, gocontext.Cancel return ctx, fn } +func (ctx *Context) HydrateConnectionByURL(connectionName string) (*models.Connection, error) { + if connectionName == "" { + return nil, nil + } + + if ctx.db == nil { + return nil, errors.New("db has not been initialized") + } + + k8sClient, err := ctx.Kommons.GetClientset() + if err != nil { + return nil, err + } + + connection, err := duty.HydratedConnectionByURL(ctx, ctx.db, k8sClient, ctx.Namespace, connectionName) + if err != nil { + return nil, err + } + + // Connection name was explicitly provided but was not found. + // That's an error. + if connection == nil { + return nil, fmt.Errorf("connection %s not found", connectionName) + } + + return connection, nil +} + func NewKubernetesContext(client *kommons.Client, namespace string) *KubernetesContext { if namespace == "" { namespace = "default" @@ -64,11 +97,13 @@ func (ctx *KubernetesContext) Clone() *KubernetesContext { } } -func New(client *kommons.Client, canary v1.Canary) *Context { +func New(client *kommons.Client, db *gorm.DB, canary v1.Canary) *Context { if canary.Namespace == "" { canary.Namespace = "default" } + return &Context{ + db: db, Context: gocontext.Background(), Kommons: client, Namespace: canary.GetNamespace(), diff --git a/api/v1/checks.go b/api/v1/checks.go index c2e82697a..629547ac4 100644 --- a/api/v1/checks.go +++ b/api/v1/checks.go @@ -1,16 +1,24 @@ package v1 import ( + "context" "encoding/json" "fmt" + "strconv" "strings" "github.com/flanksource/canary-checker/api/external" + "github.com/flanksource/duty/models" "github.com/flanksource/duty/types" "github.com/flanksource/kommons" v1 "k8s.io/api/core/v1" ) +type checkContext interface { + context.Context + HydrateConnectionByURL(connectionName string) (*models.Connection, error) +} + type Check struct { Name, Type, Endpoint, Description, Icon string Labels map[string]string @@ -43,6 +51,8 @@ func (c Check) GetLabels() map[string]string { type HTTPCheck struct { Description `yaml:",inline" json:",inline"` Templatable `yaml:",inline" json:",inline"` + // Name of the connection that'll be used to derive the endpoint. + ConnectionName string `yaml:"connection,omitempty" json:"connection,omitempty"` // HTTP endpoint to check. Mutually exclusive with Namespace Endpoint string `yaml:"endpoint" json:"endpoint,omitempty" template:"true"` // Namespace to crawl for TLS endpoints. Mutually exclusive with Endpoint @@ -125,17 +135,13 @@ type Bucket struct { } type S3Check struct { - Description `yaml:",inline" json:",inline"` - Bucket Bucket `yaml:"bucket" json:"bucket,omitempty"` - AccessKey string `yaml:"accessKey" json:"accessKey,omitempty"` - SecretKey string `yaml:"secretKey" json:"secretKey,omitempty"` - ObjectPath string `yaml:"objectPath" json:"objectPath,omitempty"` - // Skip TLS verify when connecting to s3 - SkipTLSVerify bool `yaml:"skipTLSVerify,omitempty" json:"skipTLSVerify,omitempty"` + Description `yaml:",inline" json:",inline"` + AWSConnection `yaml:",inline" json:",inline"` + BucketName string `yaml:"bucketName" json:"bucketName,omitempty"` } func (c S3Check) GetEndpoint() string { - return fmt.Sprintf("%s/%s", c.Bucket.Endpoint, c.Bucket.Name) + return fmt.Sprintf("%s/%s", c.AWSConnection.Endpoint, c.BucketName) } func (c S3Check) GetType() string { @@ -173,6 +179,10 @@ func (c CloudWatchCheck) GetType() string { type ResticCheck struct { Description `yaml:",inline" json:",inline"` + // Name of the connection used to derive restic password. + ConnectionName string `yaml:"connection,omitempty" json:"connection,omitempty"` + // Name of the AWS connection used to derive the access key and secret key. + AWSConnectionName string `yaml:"awsConnectionName,omitempty" json:"awsConnectionName,omitempty"` // Repository The restic repository path eg: rest:https://user:pass@host:8000/ or rest:https://host:8000/ or s3:s3.amazonaws.com/bucket_name Repository string `yaml:"repository" json:"repository"` // Password for the restic repository @@ -199,7 +209,9 @@ func (c ResticCheck) GetType() string { type JmeterCheck struct { Description `yaml:",inline" json:",inline"` - // Jmx defines tge ConfigMap or Secret reference to get the JMX test plan + // Name of the connection that'll be used to derive host and other connection details. + ConnectionName string `yaml:"connection,omitempty" json:"connection,omitempty"` + // Jmx defines the ConfigMap or Secret reference to get the JMX test plan Jmx kommons.EnvVar `yaml:"jmx" json:"jmx"` // Host is the server against which test plan needs to be executed Host string `yaml:"host,omitempty" json:"host,omitempty"` @@ -221,6 +233,28 @@ func (c JmeterCheck) GetType() string { return "jmeter" } +// HydrateConnection will attempt to populate the host and port from the connection name. +func (c *JmeterCheck) HydrateConnection(ctx checkContext) (bool, error) { + connection, err := ctx.HydrateConnectionByURL(c.ConnectionName) + if err != nil { + return false, err + } + + if connection == nil { + return false, nil + } + + c.Host = connection.URL + + if portRaw, ok := connection.Properties["port"]; ok { + if port, err := strconv.Atoi(portRaw); nil == err { + c.Port = int32(port) + } + } + + return true, nil +} + type DockerPullCheck struct { Description `yaml:",inline" json:",inline"` Image string `yaml:"image" json:"image"` @@ -284,9 +318,12 @@ func (c ContainerdPushCheck) GetType() string { type RedisCheck struct { Description `yaml:",inline" json:",inline"` - Addr string `yaml:"addr" json:"addr" template:"true"` - Auth *Authentication `yaml:"auth,omitempty" json:"auth,omitempty"` - DB int `yaml:"db" json:"db"` + // ConnectionName is the name of the connection. + // It is used to populate addr, db and auth. + ConnectionName string `yaml:"connection,omitempty" json:"connection,omitempty"` + Addr string `yaml:"addr" json:"addr" template:"true"` + Auth *Authentication `yaml:"auth,omitempty" json:"auth,omitempty"` + DB int `yaml:"db" json:"db"` } func (c RedisCheck) GetType() string { @@ -399,13 +436,14 @@ type Elasticsearch struct { } type ElasticsearchCheck struct { - Description `yaml:",inline" json:",inline"` - Templatable `yaml:",inline" json:",inline"` - URL string `yaml:"url" json:"url,omitempty" template:"true"` - Auth *Authentication `yaml:"auth,omitempty" json:"auth,omitempty"` - Query string `yaml:"query" json:"query,omitempty" template:"true"` - Index string `yaml:"index" json:"index,omitempty" template:"true"` - Results int `yaml:"results" json:"results,omitempty" template:"true"` + Description `yaml:",inline" json:",inline"` + Templatable `yaml:",inline" json:",inline"` + ConnectionName string `yaml:"connection,omitempty" json:"connection,omitempty"` + URL string `yaml:"url" json:"url,omitempty" template:"true"` + Auth *Authentication `yaml:"auth,omitempty" json:"auth,omitempty"` + Query string `yaml:"query" json:"query,omitempty" template:"true"` + Index string `yaml:"index" json:"index,omitempty" template:"true"` + Results int `yaml:"results" json:"results,omitempty" template:"true"` } func (c ElasticsearchCheck) GetType() string { @@ -416,6 +454,21 @@ func (c ElasticsearchCheck) GetEndpoint() string { return c.URL } +func (c *ElasticsearchCheck) HydrateConnection(ctx checkContext) error { + connection, err := ctx.HydrateConnectionByURL(c.ConnectionName) + if err != nil { + return err + } + + if connection != nil { + c.URL = connection.URL + c.Auth.Username.Value = connection.Username + c.Auth.Password.Value = connection.Password + } + + return nil +} + type DynatraceCheck struct { Description `yaml:",inline" json:",inline"` Templatable `yaml:",inline" json:",inline"` @@ -442,13 +495,14 @@ type AlertManager struct { } type AlertManagerCheck struct { - Description `yaml:",inline" json:",inline"` - Templatable `yaml:",inline" json:",inline"` - Host string `yaml:"host" json:"host,omitempty" template:"true"` - Auth *Authentication `yaml:"auth,omitempty" json:"auth,omitempty"` - Alerts []string `yaml:"alerts" json:"alerts,omitempty" template:"true"` - Filters map[string]string `yaml:"filters" json:"filters,omitempty" template:"true"` - Ignore []string `yaml:"ignore" json:"ignore,omitempty" template:"true"` + Description `yaml:",inline" json:",inline"` + Templatable `yaml:",inline" json:",inline"` + ConnectionName string `yaml:"connection,omitempty" json:"connection,omitempty"` + Host string `yaml:"host" json:"host,omitempty" template:"true"` + Auth *Authentication `yaml:"auth,omitempty" json:"auth,omitempty"` + Alerts []string `yaml:"alerts" json:"alerts,omitempty" template:"true"` + Filters map[string]string `yaml:"filters" json:"filters,omitempty" template:"true"` + Ignore []string `yaml:"ignore" json:"ignore,omitempty" template:"true"` } func (c AlertManagerCheck) GetType() string { @@ -493,12 +547,13 @@ func (c PodCheck) GetType() string { } type LDAPCheck struct { - Description `yaml:",inline" json:",inline"` - Host string `yaml:"host" json:"host" template:"true"` - Auth *Authentication `yaml:"auth" json:"auth"` - BindDN string `yaml:"bindDN" json:"bindDN"` - UserSearch string `yaml:"userSearch,omitempty" json:"userSearch,omitempty"` - SkipTLSVerify bool `yaml:"skipTLSVerify,omitempty" json:"skipTLSVerify,omitempty"` + Description `yaml:",inline" json:",inline"` + ConnectionName string `yaml:"connection,omitempty" json:"connection,omitempty"` + Host string `yaml:"host" json:"host" template:"true"` + Auth *Authentication `yaml:"auth" json:"auth"` + BindDN string `yaml:"bindDN" json:"bindDN"` + UserSearch string `yaml:"userSearch,omitempty" json:"userSearch,omitempty"` + SkipTLSVerify bool `yaml:"skipTLSVerify,omitempty" json:"skipTLSVerify,omitempty"` } func (c LDAPCheck) GetEndpoint() string { @@ -509,6 +564,28 @@ func (c LDAPCheck) GetType() string { return "ldap" } +func (c *LDAPCheck) HydrateConnection(ctx checkContext) (bool, error) { + connection, err := ctx.HydrateConnectionByURL(c.ConnectionName) + if err != nil { + return false, err + } + + if connection == nil { + return false, nil + } + + c.Host = connection.URL + c.Auth.Username.Value = connection.Username + c.Auth.Password.Value = connection.Password + + c.Auth = &Authentication{ + Username: kommons.EnvVar{Value: c.Auth.Username.Value}, + Password: kommons.EnvVar{Value: c.Auth.Password.Value}, + } + + return true, nil +} + type NamespaceCheck struct { Description `yaml:",inline" json:",inline"` NamespaceNamePrefix string `yaml:"namespaceNamePrefix,omitempty" json:"namespaceNamePrefix,omitempty"` @@ -626,6 +703,8 @@ func (c JunitCheck) GetType() string { } type SMBConnection struct { + // ConnectionName of the connection. It'll be used to populate the connection fields. + ConnectionName string `yaml:"connection,omitempty" json:"connection,omitempty"` //Port on which smb server is running. Defaults to 445 Port int `yaml:"port,omitempty" json:"port,omitempty"` Auth *Authentication `yaml:"auth" json:"auth"` @@ -646,13 +725,80 @@ func (c SMBConnection) GetPort() int { return 445 } +func (c *SMBConnection) HydrateConnection(ctx checkContext) (found bool, err error) { + connection, err := ctx.HydrateConnectionByURL(c.ConnectionName) + if err != nil { + return false, err + } + + if connection == nil { + return false, nil + } + + c.Auth = &Authentication{ + Username: kommons.EnvVar{Value: connection.Username}, + Password: kommons.EnvVar{Value: connection.Password}, + } + + if workstation, ok := connection.Properties["workstation"]; ok { + c.Workstation = workstation + } + + if domain, ok := connection.Properties["domain"]; ok { + c.Domain = domain + } + + if sharename, ok := connection.Properties["sharename"]; ok { + c.Sharename = sharename + } + + if searchPath, ok := connection.Properties["searchPath"]; ok { + c.SearchPath = searchPath + } + + if portRaw, ok := connection.Properties["port"]; ok { + if port, err := strconv.Atoi(portRaw); nil == err { + c.Port = port + } + } + + return true, nil +} + type SFTPConnection struct { + // ConnectionName of the connection. It'll be used to populate the connection fields. + ConnectionName string `yaml:"connection,omitempty" json:"connection,omitempty"` // Port for the SSH server. Defaults to 22 Port int `yaml:"port,omitempty" json:"port,omitempty"` Host string `yaml:"host" json:"host"` Auth *Authentication `yaml:"auth" json:"auth"` } +func (c *SFTPConnection) HydrateConnection(ctx checkContext) (found bool, err error) { + connection, err := ctx.HydrateConnectionByURL(c.ConnectionName) + if err != nil { + return false, err + } + + if connection == nil { + return false, nil + } + + c.Host = connection.URL + c.Auth = &Authentication{ + Username: kommons.EnvVar{Value: connection.Username}, + Password: kommons.EnvVar{Value: connection.Password}, + } + + if portRaw, ok := connection.Properties["port"]; ok { + if port, err := strconv.Atoi(portRaw); nil == err { + c.Port = port + } + } + + return true, nil +} + func (c SFTPConnection) GetPort() int { if c.Port != 0 { return c.Port @@ -666,9 +812,11 @@ func (c SFTPConnection) GetPort() int { type Prometheus struct { PrometheusCheck `yaml:",inline" json:",inline"` } + type PrometheusCheck struct { - Description `yaml:",inline" json:",inline"` - Templatable `yaml:",inline" json:",inline"` + Description `yaml:",inline" json:",inline"` + Templatable `yaml:",inline" json:",inline"` + ConnectionName string `yaml:"connection,omitempty" json:"connection,omitempty"` // Address of the prometheus server Host string `yaml:"host" json:"host" template:"true" ` // PromQL query @@ -683,6 +831,20 @@ func (c PrometheusCheck) GetEndpoint() string { return fmt.Sprintf("%v/%v", c.Host, c.Description) } +func (c *PrometheusCheck) HydrateConnection(ctx checkContext) (bool, error) { + connection, err := ctx.HydrateConnectionByURL(c.ConnectionName) + if err != nil { + return false, err + } + + if connection == nil { + return false, nil + } + + c.Host = connection.URL + return true, nil +} + type MongoDBCheck struct { Description `yaml:",inline" json:",inline"` // Monogodb connection string, e.g. mongodb://:27017/?authSource=admin, See https://docs.mongodb.com/manual/reference/connection-string/ @@ -699,11 +861,12 @@ type Git struct { } type GitHubCheck struct { - Description `yaml:",inline" json:",inline"` - Templatable `yaml:",inline" json:",inline"` + Description `yaml:",inline" json:",inline"` + Templatable `yaml:",inline" json:",inline"` + ConnectionName string `yaml:"connection,omitempty" json:"connection,omitempty"` // Query to be executed. Please see https://github.com/askgitdev/askgit for more details regarding syntax - Query string `yaml:"query" json:"query"` - GithubToken *kommons.EnvVar `yaml:"githubToken,omitempty" json:"githubToken,omitempty"` + Query string `yaml:"query" json:"query"` + GithubToken types.EnvVar `yaml:"githubToken,omitempty" json:"githubToken,omitempty"` } func (c GitHubCheck) GetType() string { @@ -761,10 +924,12 @@ func (c KubernetesCheck) CheckReady() bool { } type AWSConnection struct { - AccessKey kommons.EnvVar `yaml:"accessKey" json:"accessKey,omitempty"` - SecretKey kommons.EnvVar `yaml:"secretKey" json:"secretKey,omitempty"` - Region string `yaml:"region,omitempty" json:"region,omitempty"` - Endpoint string `yaml:"endpoint,omitempty" json:"endpoint,omitempty"` + // ConnectionName of the connection. It'll be used to populate the endpoint, accessKey and secretKey. + ConnectionName string `yaml:"connection,omitempty" json:"connection,omitempty"` + AccessKey kommons.EnvVar `yaml:"accessKey" json:"accessKey,omitempty"` + SecretKey kommons.EnvVar `yaml:"secretKey" json:"secretKey,omitempty"` + Region string `yaml:"region,omitempty" json:"region,omitempty"` + Endpoint string `yaml:"endpoint,omitempty" json:"endpoint,omitempty"` // Skip TLS verify when connecting to aws SkipTLSVerify bool `yaml:"skipTLSVerify,omitempty" json:"skipTLSVerify,omitempty"` // glob path to restrict matches to a subset @@ -773,9 +938,40 @@ type AWSConnection struct { UsePathStyle bool `yaml:"usePathStyle,omitempty" json:"usePathStyle,omitempty"` } +// Populate populates an AWSConnection with credentials and other information. +// If a connection name is specified, it'll be used to populate the endpoint, accessKey and secretKey. +func (t *AWSConnection) Populate(ctx checkContext, kommonsClient *kommons.Client, namespace string) error { + if t.ConnectionName != "" { + connection, err := ctx.HydrateConnectionByURL(t.ConnectionName) + if err != nil { + return fmt.Errorf("could not parse EC2 access key: %v", err) + } + + t.AccessKey.Value = connection.Username + t.SecretKey.Value = connection.Password + t.Endpoint = connection.URL + } + + if _, accessKey, err := kommonsClient.GetEnvValue(t.AccessKey, namespace); err != nil { + return fmt.Errorf("could not parse EC2 access key: %v", err) + } else { + t.AccessKey.Value = accessKey + } + + if _, secretKey, err := kommonsClient.GetEnvValue(t.SecretKey, namespace); err != nil { + return fmt.Errorf(fmt.Sprintf("Could not parse EC2 secret key: %v", err)) + } else { + t.SecretKey.Value = secretKey + } + + return nil +} + type GCPConnection struct { - Endpoint string `yaml:"endpoint" json:"endpoint,omitempty"` - Credentials *kommons.EnvVar `yaml:"credentials" json:"credentials,omitempty"` + // ConnectionName of the connection. It'll be used to populate the endpoint and credentials. + ConnectionName string `yaml:"connection,omitempty" json:"connection,omitempty"` + Endpoint string `yaml:"endpoint" json:"endpoint,omitempty"` + Credentials *kommons.EnvVar `yaml:"credentials" json:"credentials,omitempty"` } func (g *GCPConnection) Validate() *GCPConnection { @@ -785,6 +981,22 @@ func (g *GCPConnection) Validate() *GCPConnection { return g } +// HydrateConnection attempts to find the connection by name +// and populate the endpoint and credentials. +func (g *GCPConnection) HydrateConnection(ctx checkContext) error { + connection, err := ctx.HydrateConnectionByURL(g.ConnectionName) + if err != nil { + return err + } + + if connection != nil { + g.Credentials.Value = connection.Password + g.Endpoint = connection.URL + } + + return nil +} + type FolderCheck struct { Description `yaml:",inline" json:",inline"` Templatable `yaml:",inline" json:",inline"` @@ -1135,6 +1347,7 @@ type DatabaseBackup struct { type EC2 struct { EC2Check `yaml:",inline" json:",inline"` } + type EC2Check struct { Description `yaml:",inline" json:",inline"` AWSConnection `yaml:",inline" json:",inline"` @@ -1180,40 +1393,40 @@ func (c AzureDevopsCheck) GetEndpoint() string { } var AllChecks = []external.Check{ + AlertManagerCheck{}, + AwsConfigCheck{}, + AwsConfigRuleCheck{}, AzureDevopsCheck{}, - HTTPCheck{}, - TCPCheck{}, - ICMPCheck{}, - S3Check{}, - DockerPullCheck{}, - DockerPushCheck{}, + CloudWatchCheck{}, + ConfigDBCheck{}, ContainerdPullCheck{}, ContainerdPushCheck{}, - PostgresCheck{}, - MssqlCheck{}, - MysqlCheck{}, - RedisCheck{}, - PodCheck{}, - LDAPCheck{}, - ResticCheck{}, - NamespaceCheck{}, + DatabaseBackupCheck{}, DNSCheck{}, + DockerPullCheck{}, + DockerPushCheck{}, DynatraceCheck{}, + EC2Check{}, + ElasticsearchCheck{}, + ExecCheck{}, + FolderCheck{}, + GitHubCheck{}, HelmCheck{}, + HTTPCheck{}, + ICMPCheck{}, JmeterCheck{}, JunitCheck{}, - EC2Check{}, - PrometheusCheck{}, - MongoDBCheck{}, - CloudWatchCheck{}, - GitHubCheck{}, Kubernetes{}, - FolderCheck{}, - ExecCheck{}, - AwsConfigCheck{}, - AwsConfigRuleCheck{}, - DatabaseBackupCheck{}, - ConfigDBCheck{}, - ElasticsearchCheck{}, - AlertManagerCheck{}, + LDAPCheck{}, + MongoDBCheck{}, + MssqlCheck{}, + MysqlCheck{}, + NamespaceCheck{}, + PodCheck{}, + PostgresCheck{}, + PrometheusCheck{}, + RedisCheck{}, + ResticCheck{}, + S3Check{}, + TCPCheck{}, } diff --git a/api/v1/zz_generated.deepcopy.go b/api/v1/zz_generated.deepcopy.go index 9c1b00217..dd81818e0 100644 --- a/api/v1/zz_generated.deepcopy.go +++ b/api/v1/zz_generated.deepcopy.go @@ -1772,11 +1772,7 @@ func (in *GitHubCheck) DeepCopyInto(out *GitHubCheck) { *out = *in in.Description.DeepCopyInto(&out.Description) out.Templatable = in.Templatable - if in.GithubToken != nil { - in, out := &in.GithubToken, &out.GithubToken - *out = new(kommons.EnvVar) - (*in).DeepCopyInto(*out) - } + in.GithubToken.DeepCopyInto(&out.GithubToken) } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GitHubCheck. @@ -2592,7 +2588,7 @@ func (in *S3) DeepCopy() *S3 { func (in *S3Check) DeepCopyInto(out *S3Check) { *out = *in in.Description.DeepCopyInto(&out.Description) - out.Bucket = in.Bucket + in.AWSConnection.DeepCopyInto(&out.AWSConnection) } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new S3Check. diff --git a/checks/alertmanager.go b/checks/alertmanager.go index 903a4010c..afad3608b 100644 --- a/checks/alertmanager.go +++ b/checks/alertmanager.go @@ -32,6 +32,12 @@ func (c *AlertManagerChecker) Check(ctx *context.Context, extConfig external.Che result := pkg.Success(check, ctx.Canary) results = append(results, result) + if connection, err := ctx.HydrateConnectionByURL(check.ConnectionName); err != nil { + return results.Failf("failed to find connection from %q: %v", check.ConnectionName, err) + } else if connection != nil { + check.Host = connection.URL + } + client := alertmanagerClient.NewHTTPClientWithConfig(nil, &alertmanagerClient.TransportConfig{ Host: check.GetEndpoint(), Schemes: []string{"http", "https"}, diff --git a/checks/aws_config.go b/checks/aws_config.go index 8197521fa..09f5b0486 100644 --- a/checks/aws_config.go +++ b/checks/aws_config.go @@ -34,13 +34,20 @@ func (c *AwsConfigChecker) Check(ctx *context.Context, extConfig external.Check) result := pkg.Success(check, ctx.Canary) var results pkg.Results results = append(results, result) + if check.AWSConnection == nil { check.AWSConnection = &v1.AWSConnection{} + } else { + if err := check.AWSConnection.Populate(ctx, ctx.Kommons, ctx.Namespace); err != nil { + return results.Failf("failed to populate aws connection: %v", err) + } } + cfg, err := awsUtil.NewSession(ctx, *check.AWSConnection) if err != nil { return results.ErrorMessage(err) } + client := configservice.NewFromConfig(*cfg) if check.AggregatorName != nil { output, err := client.SelectAggregateResourceConfig(ctx, &configservice.SelectAggregateResourceConfigInput{ @@ -60,5 +67,6 @@ func (c *AwsConfigChecker) Check(ctx *context.Context, extConfig external.Check) } result.AddDetails(output.Results) } + return results } diff --git a/checks/aws_config_rule.go b/checks/aws_config_rule.go index 2188bf198..038f3855d 100644 --- a/checks/aws_config_rule.go +++ b/checks/aws_config_rule.go @@ -40,13 +40,16 @@ func (c *AwsConfigRuleChecker) Check(ctx *context.Context, extConfig external.Ch results = append(results, result) if check.AWSConnection == nil { check.AWSConnection = &v1.AWSConnection{} + } else if err := check.AWSConnection.Populate(ctx, ctx.Kommons, ctx.Namespace); err != nil { + return results.Failf("failed to populate aws connection: %v", err) } + cfg, err := awsUtil.NewSession(ctx, *check.AWSConnection) if err != nil { return results.Failf("failed to create a session: %v", err) } - client := configservice.NewFromConfig(*cfg) + client := configservice.NewFromConfig(*cfg) if err != nil { return results.Failf("failed to describe compliance rules: %v", err) } diff --git a/checks/azure_devops.go b/checks/azure_devops.go index ae9f33d15..b75bf34a6 100644 --- a/checks/azure_devops.go +++ b/checks/azure_devops.go @@ -13,7 +13,6 @@ import ( "github.com/flanksource/canary-checker/api/context" v1 "github.com/flanksource/canary-checker/api/v1" "github.com/flanksource/canary-checker/pkg" - "github.com/flanksource/canary-checker/pkg/db" "github.com/flanksource/duty" ) @@ -40,30 +39,22 @@ func (t *AzureDevopsChecker) check(ctx *context.Context, check v1.AzureDevopsChe var personalAccessToken string if check.PersonalAccessToken.ValueStatic != "" { personalAccessToken = check.PersonalAccessToken.ValueStatic + } else if connection, err := ctx.HydrateConnectionByURL(check.ConnectionName); err != nil { + return results.Failf("failed to hydrate connection: %v", err) + } else if connection != nil { + personalAccessToken = connection.Password } else if ctx.Kommons != nil { k8sClient, err := ctx.Kommons.GetClientset() if err != nil { return results.Failf("failed to get k8s client: %v", err) } - if check.ConnectionName != "" { - connection, err := duty.HydratedConnectionByURL(ctx, db.Gorm, k8sClient, ctx.Namespace, check.ConnectionName) - if err != nil { - return results.ErrorMessage(err) - } - - if connection == nil { - return results.Failf("connection %q not found", check.ConnectionName) - } - - personalAccessToken = connection.Password - } else if ctx.Kommons != nil { - value, err := duty.GetEnvValueFromCache(k8sClient, check.PersonalAccessToken, ctx.Namespace) - if err != nil { - return results.ErrorMessage(err) - } - personalAccessToken = value + value, err := duty.GetEnvValueFromCache(k8sClient, check.PersonalAccessToken, ctx.Namespace) + if err != nil { + return results.ErrorMessage(err) } + + personalAccessToken = value } connection := azuredevops.NewPatConnection(fmt.Sprintf("https://dev.azure.com/%s", check.Organization), personalAccessToken) diff --git a/checks/checker.go b/checks/checker.go index 5dc66cc7c..e444501d7 100644 --- a/checks/checker.go +++ b/checks/checker.go @@ -23,35 +23,35 @@ type Checker interface { } var All = []Checker{ + &AlertManagerChecker{}, + &AwsConfigChecker{}, + &AwsConfigRuleChecker{}, + &AzureDevopsChecker{}, + &CloudWatchChecker{}, + &ConfigdbChecker{}, + &DatabaseBackupChecker{}, &DNSChecker{}, + &DynatraceChecker{}, + &EC2Checker{}, + &ElasticsearchChecker{}, + &ExecChecker{}, + &FolderChecker{}, + &GitHubChecker{}, &HTTPChecker{}, &IcmpChecker{}, - &S3Checker{}, - &PostgresChecker{}, - &MssqlChecker{}, - &MysqlChecker{}, - &LdapChecker{}, &JmeterChecker{}, - &ResticChecker{}, - &RedisChecker{}, &JunitChecker{}, - &EC2Checker{}, - &PrometheusChecker{}, - &MongoDBChecker{}, - &CloudWatchChecker{}, - &GitHubChecker{}, &KubernetesChecker{}, - &FolderChecker{}, - &ExecChecker{}, - &AwsConfigChecker{}, - &AwsConfigRuleChecker{}, - &DatabaseBackupChecker{}, - &ConfigdbChecker{}, - &ElasticsearchChecker{}, - &AlertManagerChecker{}, - &AzureDevopsChecker{}, - &DynatraceChecker{}, - NewPodChecker(), + &LdapChecker{}, + &MongoDBChecker{}, + &MssqlChecker{}, + &MysqlChecker{}, + &PostgresChecker{}, + &PrometheusChecker{}, + &RedisChecker{}, + &ResticChecker{}, + &S3Checker{}, NewNamespaceChecker(), + NewPodChecker(), NewTCPChecker(), } diff --git a/checks/cloudwatch.go b/checks/cloudwatch.go index 7d2bc0105..3608f864b 100644 --- a/checks/cloudwatch.go +++ b/checks/cloudwatch.go @@ -37,6 +37,11 @@ func (c *CloudWatchChecker) Check(ctx *context.Context, extConfig external.Check result := pkg.Success(check, ctx.Canary) var results pkg.Results results = append(results, result) + + if err := check.AWSConnection.Populate(ctx, ctx.Kommons, ctx.Namespace); err != nil { + return results.Failf("failed to populate aws connection: %v", err) + } + cfg, err := awsUtil.NewSession(ctx, check.AWSConnection) if err != nil { return results.ErrorMessage(err) diff --git a/checks/database_backup_gcp.go b/checks/database_backup_gcp.go index 42a64d334..104e2149c 100644 --- a/checks/database_backup_gcp.go +++ b/checks/database_backup_gcp.go @@ -29,11 +29,16 @@ func GCPDatabaseBackupCheck(ctx *context.Context, check v1.DatabaseBackupCheck) var results pkg.Results results = append(results, result) + if err := check.GCP.HydrateConnection(ctx); err != nil { + return results.Failf("failed to populate GCP connection: %v", err) + } + svc, err := gcp.NewSQLAdmin(ctx, check.GCP.GCPConnection) if err != nil { databaseScanFailCount.WithLabelValues(check.GCP.Project, check.GCP.Instance).Inc() return results.ErrorMessage(err) } + // Only checking one backup for now, but setting up the logic that this could maybe be configurable. // Would need some extra parsing on the age to select latest backupList, err := svc.BackupRuns.List(check.GCP.Project, check.GCP.Instance).MaxResults(1).Do() diff --git a/checks/dns.go b/checks/dns.go index 8c01f7367..0b2267c2e 100644 --- a/checks/dns.go +++ b/checks/dns.go @@ -64,12 +64,12 @@ func (c *DNSChecker) Check(ctx *canaryContext.Context, extConfig external.Check) r = net.Resolver{} } - resultCh := make(chan *pkg.CheckResult, 1) - queryType := check.QueryType if queryType == "" { queryType = "A" } + + resultCh := make(chan *pkg.CheckResult, 1) if fn, ok := resolvers[strings.ToUpper(queryType)]; !ok { return results.Failf("unknown query type: %s", queryType) } else { diff --git a/checks/ec2.go b/checks/ec2.go index 62e804db5..fdb2b0b7a 100644 --- a/checks/ec2.go +++ b/checks/ec2.go @@ -110,27 +110,22 @@ type AWS struct { } func NewAWS(ctx *context.Context, check v1.EC2Check) (*AWS, error) { - namespace := ctx.Canary.GetNamespace() - _, accessKey, err := ctx.Kommons.GetEnvValue(check.AccessKey, namespace) - if err != nil { - return nil, fmt.Errorf("could not parse EC2 access key: %v", err) - } - _, secretKey, err := ctx.Kommons.GetEnvValue(check.SecretKey, namespace) - if err != nil { - return nil, fmt.Errorf(fmt.Sprintf("Could not parse EC2 secret key: %v", err)) + if err := check.AWSConnection.Populate(ctx, ctx.Kommons, ctx.Canary.GetNamespace()); err != nil { + return nil, fmt.Errorf("failed to populate AWS connection: %v", err) } tr := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: check.SkipTLSVerify}, } cfg, err := config.LoadDefaultConfig(ctx, - config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(accessKey, secretKey, "")), + config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(check.AWSConnection.AccessKey.Value, check.AWSConnection.SecretKey.Value, "")), config.WithRegion(check.Region), config.WithHTTPClient(&http.Client{Transport: tr}), ) if err != nil { return nil, fmt.Errorf(fmt.Sprintf("failed to load AWS credentials: %v", err)) } + return &AWS{ EC2: ec2.NewFromConfig(cfg), Config: cfg, diff --git a/checks/elasticsearch.go b/checks/elasticsearch.go index b98657710..688ebe411 100644 --- a/checks/elasticsearch.go +++ b/checks/elasticsearch.go @@ -34,6 +34,10 @@ func (c *ElasticsearchChecker) Check(ctx *context.Context, extConfig external.Ch var results pkg.Results results = append(results, result) + if err := check.HydrateConnection(ctx); err != nil { + return results.Failf("Failed to find connection for elastic search: %v", err) + } + cfg := elasticsearch.Config{ Addresses: []string{check.GetEndpoint()}, Username: check.Auth.GetUsername(), diff --git a/checks/folder_gcs.go b/checks/folder_gcs.go index 4fcd07cf5..8644fecbd 100644 --- a/checks/folder_gcs.go +++ b/checks/folder_gcs.go @@ -19,6 +19,11 @@ func CheckGCSBucket(ctx *context.Context, check v1.FolderCheck) pkg.Results { result := pkg.Success(check, ctx.Canary) var results pkg.Results results = append(results, result) + + if err := check.GCPConnection.HydrateConnection(ctx); err != nil { + return results.Failf("failed to populate GCP connection: %v", err) + } + cfg, err := gcp.NewSession(ctx, check.GCPConnection) if err != nil { return results.ErrorMessage(err) diff --git a/checks/folder_s3.go b/checks/folder_s3.go index 78bf2b500..cd2e5aa3b 100644 --- a/checks/folder_s3.go +++ b/checks/folder_s3.go @@ -24,9 +24,13 @@ func CheckS3Bucket(ctx *context.Context, check v1.FolderCheck) pkg.Results { result := pkg.Success(check, ctx.Canary) var results pkg.Results results = append(results, result) + if check.AWSConnection == nil { check.AWSConnection = &v1.AWSConnection{} + } else if err := check.AWSConnection.Populate(ctx, ctx.Kommons, ctx.Namespace); err != nil { + return results.Failf("failed to populate aws connection: %v", err) } + cfg, err := awsUtil.NewSession(ctx, *check.AWSConnection) if err != nil { return results.ErrorMessage(err) diff --git a/checks/folder_sftp.go b/checks/folder_sftp.go index e4a0544bb..9e65b5e5b 100644 --- a/checks/folder_sftp.go +++ b/checks/folder_sftp.go @@ -14,15 +14,24 @@ func CheckSFTP(ctx *context.Context, check v1.FolderCheck) pkg.Results { result := pkg.Success(check, ctx.Canary) var results pkg.Results results = append(results, result) - auth, err := GetAuthValues(check.SFTPConnection.Auth, ctx.Kommons, ctx.Canary.Namespace) + + foundConn, err := check.SFTPConnection.HydrateConnection(ctx) if err != nil { - return results.ErrorMessage(err) + return results.Failf("failed to populate SFTP connection: %v", err) + } + + auth := check.SFTPConnection.Auth + if !foundConn { + auth, err = GetAuthValues(check.SFTPConnection.Auth, ctx.Kommons, ctx.Canary.Namespace) + if err != nil { + return results.ErrorMessage(err) + } } + conn, err := sshConnect(check.SFTPConnection.Host, check.SFTPConnection.GetPort(), auth.GetUsername(), auth.GetPassword()) if err != nil { return results.ErrorMessage(err) } - defer conn.Close() client, err := sftp.NewClient(conn) diff --git a/checks/folder_smb.go b/checks/folder_smb.go index 28c2f9656..460794d43 100644 --- a/checks/folder_smb.go +++ b/checks/folder_smb.go @@ -72,15 +72,24 @@ func CheckSmb(ctx *context.Context, check v1.FolderCheck) pkg.Results { var results pkg.Results results = append(results, result) namespace := ctx.Canary.Namespace + var serverPath = strings.TrimPrefix(check.Path, "smb://") - server, sharename, path, err := getServerDetails(serverPath) + server, sharename, path, err := extractServerDetails(serverPath) if err != nil { return results.ErrorMessage(err) } - auth, err := GetAuthValues(check.SMBConnection.Auth, ctx.Kommons, namespace) + foundConn, err := check.SMBConnection.HydrateConnection(ctx) if err != nil { - return results.ErrorMessage(err) + return results.Failf("failed to populate SMB connection: %v", err) + } + + auth := check.SMBConnection.Auth + if !foundConn { + auth, err = GetAuthValues(check.SMBConnection.Auth, ctx.Kommons, namespace) + if err != nil { + return results.ErrorMessage(err) + } } session, totalBlockCount, freeBlockCount, blockSize, err := smbConnect(server, check.SMBConnection.GetPort(), sharename, auth) @@ -110,7 +119,7 @@ func CheckSmb(ctx *context.Context, check v1.FolderCheck) pkg.Results { return results } -func getServerDetails(serverPath string) (server, sharename, searchPath string, err error) { +func extractServerDetails(serverPath string) (server, sharename, searchPath string, err error) { serverPath = strings.TrimLeft(serverPath, "\\") if serverPath == "" { return "", "", "", fmt.Errorf("empty path specified") diff --git a/checks/github.go b/checks/github.go index d4265b803..8a2c2e0df 100644 --- a/checks/github.go +++ b/checks/github.go @@ -10,6 +10,7 @@ import ( "github.com/flanksource/canary-checker/api/external" v1 "github.com/flanksource/canary-checker/api/v1" "github.com/flanksource/canary-checker/pkg" + "github.com/flanksource/duty" ) func init() { @@ -36,16 +37,31 @@ func (c *GitHubChecker) Check(ctx *context.Context, extConfig external.Check) pk result := pkg.Success(check, ctx.Canary) var results pkg.Results results = append(results, result) - _, githubToken, err := ctx.Kommons.GetEnvValue(*check.GithubToken, ctx.Canary.GetNamespace()) - if err != nil { - return results.Failf("error fetching github token: %v", err) + + var githubToken string + if connection, err := ctx.HydrateConnectionByURL(check.ConnectionName); err != nil { + return results.Failf("failed to find connection for github token %q: %v", check.ConnectionName, err) + } else if connection != nil { + githubToken = connection.Password + } else { + k8sClient, err := ctx.Kommons.GetClientset() + if err != nil { + return results.Failf("error getting k8s client from kommons client: %v", err) + } + + githubToken, err = duty.GetEnvValueFromCache(k8sClient, check.GithubToken, ctx.Canary.GetNamespace()) + if err != nil { + return results.Failf("error fetching github token from env cache: %v", err) + } } + askGitCmd := fmt.Sprintf("GITHUB_TOKEN=%v askgit \"%v\" --format json", githubToken, check.Query) cmd := osExec.Command("bash", "-c", askGitCmd) output, err := cmd.CombinedOutput() if err != nil { return results.Failf("error executing askgit command: %v", err) } + rows := string(output) var rowResults = make([]map[string]string, 0) for _, row := range strings.Split(rows, "\n") { diff --git a/checks/http.go b/checks/http.go index fa03625e5..d24be6aff 100644 --- a/checks/http.go +++ b/checks/http.go @@ -101,18 +101,23 @@ func truncate(text string, max int) string { return text[0:max] } -// CheckConfig : Check every record of DNS name against config information -// Returns check result and metrics - func (c *HTTPChecker) Check(ctx *context.Context, extConfig external.Check) pkg.Results { check := extConfig.(v1.HTTPCheck) var results pkg.Results + var err error result := pkg.Success(check, ctx.Canary) results = append(results, result) + + if connection, err := ctx.HydrateConnectionByURL(check.ConnectionName); err != nil { + return results.Failf("failed to find HTTP connection %q: %v", check.ConnectionName, err) + } else if connection != nil { + check.Endpoint = connection.URL + } + if _, err := url.Parse(check.Endpoint); err != nil { return results.ErrorMessage(err) } - var err error + endpoint := check.Endpoint body := check.Body if check.TemplateBody { diff --git a/checks/icmp.go b/checks/icmp.go index a3cc0bd4a..384c3972e 100644 --- a/checks/icmp.go +++ b/checks/icmp.go @@ -50,10 +50,11 @@ func (c *IcmpChecker) Run(ctx *context.Context) pkg.Results { // Returns check result and metrics func (c *IcmpChecker) Check(ctx *context.Context, extConfig external.Check) pkg.Results { check := extConfig.(v1.ICMPCheck) - endpoint := check.Endpoint var results pkg.Results result := pkg.Success(check, ctx.Canary) results = append(results, result) + + endpoint := check.Endpoint ips, err := dns.Lookup("A", endpoint) if err != nil { return results.ErrorMessage(err) @@ -85,6 +86,7 @@ func (c *IcmpChecker) Check(ctx *context.Context, extConfig external.Check) pkg. packetLoss.WithLabelValues(endpoint, ips[0].String()).Set(loss) return results //nolint } + return results.Failf("no IP found for %s", endpoint) } diff --git a/checks/jmeter.go b/checks/jmeter.go index 96b9bec32..325b56733 100644 --- a/checks/jmeter.go +++ b/checks/jmeter.go @@ -39,11 +39,13 @@ func (c *JmeterChecker) Check(ctx *context.Context, extConfig external.Check) pk result := pkg.Success(check, ctx.Canary) var results pkg.Results results = append(results, result) + namespace := ctx.Canary.Namespace _, value, err := ctx.Kommons.GetEnvValue(check.Jmx, namespace) if err != nil { return results.Failf("Failed to parse the jmx plan: %v", err) } + testPlanFilename := fmt.Sprintf("/tmp/jmx-%s-%s-%d.jmx", namespace, check.Jmx.Name, rand.Int()) logFilename := fmt.Sprintf("/tmp/jmx-%s-%s-%d.jtl", namespace, check.Jmx.Name, rand.Int()) err = os.WriteFile(testPlanFilename, []byte(value), 0755) @@ -51,6 +53,11 @@ func (c *JmeterChecker) Check(ctx *context.Context, extConfig external.Check) pk if err != nil { return results.Failf("unable to write test plan file") } + + if _, err := check.HydrateConnection(ctx); err != nil { + return results.Failf("unable to populate JMeter connection: %v", err) + } + var host string var port string if check.Host != "" { @@ -83,6 +90,7 @@ func (c *JmeterChecker) Check(ctx *context.Context, extConfig external.Check) pk return results.Failf("the response took %v longer than specified", (totalDuration - resDuration).String()) } } + return results } diff --git a/checks/ldap.go b/checks/ldap.go index 514a5efd1..89ac8e9a3 100644 --- a/checks/ldap.go +++ b/checks/ldap.go @@ -35,20 +35,26 @@ func (c *LdapChecker) Check(ctx *context.Context, extConfig external.Check) pkg. check := extConfig.(v1.LDAPCheck) result := pkg.Success(check, ctx.Canary) var results pkg.Results + var err error results = append(results, result) - ld, err := ldap.DialURL(check.Host, ldap.DialWithTLSConfig(&tls.Config{ - InsecureSkipVerify: check.SkipTLSVerify, - })) - if err != nil { - return results.Failf("Failed to connect %v", err) + + if ok, err := check.HydrateConnection(ctx); err != nil { + return results.Failf("failed to hydrate connection: %v", err) + } else if !ok { + namespace := ctx.Canary.Namespace + check.Auth, err = GetAuthValues(check.Auth, ctx.Kommons, namespace) + if err != nil { + return results.Failf("failed to fetch auth details: %v", err) + } } - namespace := ctx.Canary.Namespace - auth, err := GetAuthValues(check.Auth, ctx.Kommons, namespace) + + ld, err := ldap.DialURL(check.Host, ldap.DialWithTLSConfig(&tls.Config{InsecureSkipVerify: check.SkipTLSVerify})) if err != nil { - return results.Failf("failed to fetch auth details: %v", err) + return results.Failf("Failed to connect %v", err) } - if err := ld.Bind(auth.Username.Value, auth.Password.Value); err != nil { - return results.Failf("Failed to bind using %s %v", auth.Username.Value, err) + + if err := ld.Bind(check.Auth.Username.Value, check.Auth.Password.Value); err != nil { + return results.Failf("Failed to bind using %s %v", check.Auth.Username.Value, err) } req := &ldap.SearchRequest{ @@ -57,7 +63,6 @@ func (c *LdapChecker) Check(ctx *context.Context, extConfig external.Check) pkg. Filter: check.UserSearch, } res, err := ld.Search(req) - if err != nil { return results.Failf("Failed to search host %v error: %v", check.Host, err) } diff --git a/checks/mongodb.go b/checks/mongodb.go index 1416ea47f..8c20ad68c 100644 --- a/checks/mongodb.go +++ b/checks/mongodb.go @@ -36,26 +36,36 @@ func (c *MongoDBChecker) Check(ctx *context.Context, extConfig external.Check) p results = append(results, result) var err error - connection, err := GetConnection(ctx, &check.Connection, ctx.Namespace) - if err != nil { - return results.ErrorMessage(err) + var dbConnectionString string + if connection, err := ctx.HydrateConnectionByURL(check.Connection.Connection); err != nil { + return results.Failf("error getting connection: %v", err) + } else if connection != nil { + dbConnectionString = connection.URL + } else { + dbConnectionString, err = GetConnection(ctx, &check.Connection, ctx.Namespace) + if err != nil { + return results.ErrorMessage(err) + } } opts := options.Client(). - ApplyURI(connection). + ApplyURI(dbConnectionString). SetConnectTimeout(3 * time.Second). SetSocketTimeout(3 * time.Second) _ctx, cancel := gocontext.WithTimeout(ctx, 5*time.Second) defer cancel() + client, err := mongo.Connect(_ctx, opts) if err != nil { return results.ErrorMessage(err) } defer client.Disconnect(ctx) //nolint: errcheck + err = client.Ping(_ctx, readpref.Primary()) if err != nil { return results.ErrorMessage(err) } + return results } diff --git a/checks/prometheus.go b/checks/prometheus.go index 2735d3815..b96930014 100644 --- a/checks/prometheus.go +++ b/checks/prometheus.go @@ -33,9 +33,14 @@ func (c *PrometheusChecker) Check(ctx *context.Context, extConfig external.Check var results pkg.Results results = append(results, result) + if _, err := check.HydrateConnection(ctx); err != nil { + return results.Failf("error hydrating connection: %v", err) + } + if check.Host == "" { return results.Failf("Must specify a prometheus host") } + promClient, err := prometheus.NewPrometheusAPI(check.Host) if err != nil { return results.ErrorMessage(err) diff --git a/checks/redis.go b/checks/redis.go index ee5e6ae7c..9de080547 100644 --- a/checks/redis.go +++ b/checks/redis.go @@ -1,6 +1,8 @@ package checks import ( + "strconv" + "github.com/flanksource/canary-checker/api/context" "github.com/flanksource/canary-checker/api/external" @@ -37,28 +39,50 @@ func (c *RedisChecker) Check(ctx *context.Context, extConfig external.Check) pkg var results pkg.Results results = append(results, result) namespace := ctx.Canary.Namespace - var err error - auth, err := GetAuthValues(check.Auth, ctx.Kommons, namespace) - if err != nil { - return results.Failf("failed to fetch auth details: %v", err) - } - opts := &redis.Options{ - Addr: check.Addr, - DB: check.DB, - } - if auth != nil { - opts.Username = auth.GetUsername() - opts.Password = auth.GetPassword() + + var redisOpts *redis.Options + if check.ConnectionName != "" { + connection, err := ctx.HydrateConnectionByURL(check.ConnectionName) + if err != nil { + return results.Failf("failed to fetch connection %q: %v", check.ConnectionName, err) + } + + redisOpts = &redis.Options{ + Addr: connection.URL, + Username: connection.Username, + Password: connection.Password, + } + + if db, ok := connection.Properties["db"]; ok { + if dbInt, err := strconv.Atoi(db); nil == err { + redisOpts.DB = dbInt + } + } + } else { + auth, err := GetAuthValues(check.Auth, ctx.Kommons, namespace) + if err != nil { + return results.Failf("failed to fetch auth details: %v", err) + } + + redisOpts = &redis.Options{ + Addr: check.Addr, + DB: check.DB, + } + if auth != nil { + redisOpts.Username = auth.GetUsername() + redisOpts.Password = auth.GetPassword() + } } - rdb := redis.NewClient(opts) + rdb := redis.NewClient(redisOpts) queryResult, err := rdb.Ping(ctx).Result() - if err != nil { - return results.Failf("failed to execute query %s", err) + return results.Failf("failed to execute query %v", err) } + if queryResult != "PONG" { return results.Failf("expected PONG as result, got %s", result) } + return results } diff --git a/checks/restic.go b/checks/restic.go index c39868bdd..c717e0df5 100644 --- a/checks/restic.go +++ b/checks/restic.go @@ -4,10 +4,10 @@ import ( "encoding/json" "fmt" osExec "os/exec" + "strconv" "time" "github.com/flanksource/canary-checker/api/context" - "github.com/flanksource/kommons" "github.com/flanksource/canary-checker/api/external" v1 "github.com/flanksource/canary-checker/api/v1" @@ -45,18 +45,71 @@ func (c *ResticChecker) Check(ctx *context.Context, extConfig external.Check) pk result := pkg.Success(check, ctx.Canary) var results pkg.Results results = append(results, result) - envVars, err := c.getEnvVars(check, ctx.Canary.Namespace, ctx.Kommons) - if err != nil { - return results.Failf("error getting envVars %v", err) + + var envVars = make(map[string]string) + if check.ConnectionName != "" { + connection, err := ctx.HydrateConnectionByURL(check.ConnectionName) + if err != nil { + return results.Failf("error getting restic connection: %v", err) + } + envVars[resticPasswordEnvKey] = connection.Password + + check.Repository = connection.URL + check.CaCert = connection.Certificate + + if checkIntegrity, ok := connection.Properties["checkIntegrity"]; ok { + if val, err := strconv.ParseBool(checkIntegrity); err != nil { + check.CheckIntegrity = val + } + } + + if maxAge, ok := connection.Properties["maxAge"]; ok { + check.MaxAge = maxAge + } + } else { + _, password, err := ctx.Kommons.GetEnvValue(*check.Password, ctx.Canary.Namespace) + if err != nil { + return results.Failf("error getting restic password from env: %v", err) + } + envVars[resticPasswordEnvKey] = password + } + + if check.AWSConnectionName != "" { + connection, err := ctx.HydrateConnectionByURL(check.ConnectionName) + if err != nil { + return results.Failf("error getting aws connection: %v", err) + } + + envVars[resticAwsAccessKeyIDEnvKey] = connection.Username + envVars[resticAwsSecretAccessKey] = connection.Password + } else { + if check.AccessKey != nil { + _, accessKey, err := ctx.Kommons.GetEnvValue(*check.AccessKey, ctx.Canary.Namespace) + if err != nil { + return results.Failf("error getting aws access key from env: %v", err) + } + envVars[resticAwsAccessKeyIDEnvKey] = accessKey + } + + if check.SecretKey != nil { + _, secretKey, err := ctx.Kommons.GetEnvValue(*check.SecretKey, ctx.Canary.Namespace) + if err != nil { + return results.Failf("error getting aws secret key from env: %v", err) + } + envVars[resticAwsSecretAccessKey] = secretKey + } } + if check.CheckIntegrity { if err := checkIntegrity(check.Repository, check.CaCert, envVars); err != nil { return results.Failf("integrity check failed %v", err) } } + if err := checkBackupFreshness(check.Repository, check.MaxAge, check.CaCert, envVars); err != nil { return results.Failf("backup freshness check failed: %v", err) } + return results } @@ -102,29 +155,3 @@ func checkBackupFreshness(repository, maxAge, caCert string, envVars map[string] } return nil } - -func (c *ResticChecker) getEnvVars(r v1.ResticCheck, namespace string, kommons *kommons.Client) (map[string]string, error) { - var password, secretKey, accessKey string - var err error - _, password, err = kommons.GetEnvValue(*r.Password, namespace) - if err != nil { - return nil, err - } - if r.SecretKey != nil { - _, secretKey, err = kommons.GetEnvValue(*r.SecretKey, namespace) - if err != nil { - return nil, err - } - } - if r.AccessKey != nil { - _, accessKey, err = kommons.GetEnvValue(*r.AccessKey, namespace) - if err != nil { - return nil, err - } - } - return map[string]string{ - resticPasswordEnvKey: password, - resticAwsSecretAccessKey: secretKey, - resticAwsAccessKeyIDEnvKey: accessKey, - }, nil -} diff --git a/checks/s3.go b/checks/s3.go index eced4d8e5..c182c4b2e 100644 --- a/checks/s3.go +++ b/checks/s3.go @@ -69,57 +69,62 @@ func (c *S3Checker) Check(ctx *context.Context, extConfig external.Check) pkg.Re var results pkg.Results results = append(results, result) - bucket := check.Bucket + if err := check.AWSConnection.Populate(ctx, ctx.Kommons, ctx.Namespace); err != nil { + return results.Failf("failed to populate aws connection: %v", err) + } + cfg := aws.NewConfig(). - WithRegion(bucket.Region). - WithEndpoint(bucket.Endpoint). - WithCredentials( - credentials.NewStaticCredentials(check.AccessKey, check.SecretKey, ""), - ) + WithRegion(check.AWSConnection.Region). + WithEndpoint(check.AWSConnection.Endpoint). + WithCredentials(credentials.NewStaticCredentials(check.AWSConnection.AccessKey.Value, check.AWSConnection.SecretKey.Value, "")) + if check.SkipTLSVerify { tr := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, } cfg = cfg.WithHTTPClient(&http.Client{Transport: tr}) } + ssn, err := session.NewSession(cfg) if err != nil { - return results.Failf("Failed to create S3 session for %s: %v", bucket.Name, err) + return results.Failf("Failed to create S3 session for bucket %s: %v", check.BucketName, err) } + client := s3.New(ssn) yes := true client.Config.S3ForcePathStyle = &yes listTimer := NewTimer() - _, err = client.ListObjects(&s3.ListObjectsInput{Bucket: &bucket.Name}) + _, err = client.ListObjects(&s3.ListObjectsInput{Bucket: &check.BucketName}) if err != nil { - return results.Failf("Failed to list objects in bucket %s: %v", bucket.Name, err) + return results.Failf("Failed to list objects in bucket %s: %v", check.BucketName, err) } - listHistogram.WithLabelValues(bucket.Endpoint, bucket.Name).Observe(listTimer.Elapsed()) + listHistogram.WithLabelValues(check.AWSConnection.Endpoint, check.BucketName).Observe(listTimer.Elapsed()) data := utils.RandomString(16) updateTimer := NewTimer() _, err = client.PutObject(&s3.PutObjectInput{ - Bucket: &bucket.Name, + Bucket: &check.BucketName, Key: &check.ObjectPath, Body: bytes.NewReader([]byte(data)), }) if err != nil { - return results.Failf("Failed to put object %s in bucket %s: %v", check.ObjectPath, bucket.Name, err) + return results.Failf("Failed to put object %s in bucket %s: %v", check.ObjectPath, check.BucketName, err) } - updateHistogram.WithLabelValues(bucket.Endpoint, bucket.Name).Observe(updateTimer.Elapsed()) + updateHistogram.WithLabelValues(check.AWSConnection.Endpoint, check.BucketName).Observe(updateTimer.Elapsed()) obj, err := client.GetObject(&s3.GetObjectInput{ - Bucket: &bucket.Name, + Bucket: &check.BucketName, Key: &check.ObjectPath, }) - if err != nil { - return results.Failf("Failed to get object %s in bucket %s: %v", check.ObjectPath, bucket.Name, err) + return results.Failf("Failed to get object %s in bucket %s: %v", check.ObjectPath, check.BucketName, err) } + returnedData, _ := io.ReadAll(obj.Body) if string(returnedData) != data { return results.Failf("Get object doesn't match %s != %s", data, string(returnedData)) } + return results } diff --git a/checks/sql.go b/checks/sql.go index e8a3fa69d..3dc0a3412 100644 --- a/checks/sql.go +++ b/checks/sql.go @@ -30,19 +30,22 @@ type SQLDetails struct { func querySQL(driver string, connection string, query string) (*SQLDetails, error) { db, err := sql.Open(driver, connection) if err != nil { - return nil, fmt.Errorf("failed to connect to db: %s", err.Error()) + return nil, fmt.Errorf("failed to connect to db: %w", err) } defer db.Close() + rows, err := db.Query(query) result := SQLDetails{} if err != nil || rows.Err() != nil { - return nil, fmt.Errorf("failed to query db: %s", err.Error()) + return nil, fmt.Errorf("failed to query db: %w", err) } defer rows.Close() + columns, err := rows.Columns() if err != nil { - return nil, fmt.Errorf("failed to get columns") + return nil, fmt.Errorf("failed to get columns: %w", err) } + for rows.Next() { var rowValues = make([]interface{}, len(columns)) for i := range rowValues { @@ -52,6 +55,7 @@ func querySQL(driver string, connection string, query string) (*SQLDetails, erro if err := rows.Scan(rowValues...); err != nil { return nil, err } + var row = make(map[string]interface{}) for i, val := range rowValues { v := *val.(*sql.NullString) @@ -61,8 +65,10 @@ func querySQL(driver string, connection string, query string) (*SQLDetails, erro row[columns[i]] = nil } } + result.Rows = append(result.Rows, row) } + result.Count = len(result.Rows) return &result, nil } @@ -77,21 +83,32 @@ func CheckSQL(ctx *context.Context, checker SQLChecker) pkg.Results { // nolint: result := pkg.Success(checker.GetCheck(), ctx.Canary) var results pkg.Results results = append(results, result) - connection, err := GetConnection(ctx, &check.Connection, ctx.Namespace) - if err != nil { - return results.ErrorMessage(err) + + var dbConnectionString string + if connection, err := ctx.HydrateConnectionByURL(check.Connection.Connection); err != nil { + return results.Failf("error getting connection: %v", err) + } else if connection != nil { + dbConnectionString = connection.URL + } else { + dbConnectionString, err = GetConnection(ctx, &check.Connection, ctx.Namespace) + if err != nil { + return results.ErrorMessage(err) + } } + if ctx.IsTrace() { - ctx.Tracef("connecting to %s", connection) + ctx.Tracef("connecting to %s", dbConnectionString) } - details, err := querySQL(checker.GetDriver(), connection, check.GetQuery()) + details, err := querySQL(checker.GetDriver(), dbConnectionString, check.GetQuery()) if err != nil { return results.ErrorMessage(err) } + result.AddDetails(details) if details.Count < check.Result { - return results.Failf("Query return %d rows, expected %d", details.Count, check.Result) + return results.Failf("Query returned %d rows, expected %d", details.Count, check.Result) } + return results } diff --git a/checks/tcp.go b/checks/tcp.go index 9c0377bf6..ec0d8ee31 100644 --- a/checks/tcp.go +++ b/checks/tcp.go @@ -7,6 +7,8 @@ import ( "time" "github.com/flanksource/canary-checker/api/context" + "github.com/flanksource/canary-checker/pkg/db" + "github.com/flanksource/duty" "github.com/flanksource/canary-checker/api/external" v1 "github.com/flanksource/canary-checker/api/v1" @@ -36,6 +38,13 @@ func (t *TCPChecker) Check(ctx *context.Context, extConfig external.Check) pkg.R result := pkg.Success(c, ctx.Canary) var results pkg.Results results = append(results, result) + + if connection, err := duty.FindConnectionByURL(ctx, db.Gorm, c.Endpoint); err != nil { + return results.Failf("failed to find TCP endpoint from connection %q: %v", c.Endpoint, err) + } else if connection != nil { + c.Endpoint = connection.URL + } + addr, port, err := extractAddrAndPort(c.Endpoint) if err != nil { return results.ErrorMessage(err) diff --git a/cmd/run.go b/cmd/run.go index a5d00bd7b..ad8a6790c 100644 --- a/cmd/run.go +++ b/cmd/run.go @@ -64,7 +64,7 @@ var Run = &cobra.Command{ wg.Add(1) _config := config go func() { - queue <- checks.RunChecks(context.New(kommonsClient, _config)) + queue <- checks.RunChecks(context.New(kommonsClient, db.Gorm, _config)) wg.Done() }() } diff --git a/config/deploy/crd.yaml b/config/deploy/crd.yaml index 41cb2c169..f0c1448bd 100644 --- a/config/deploy/crd.yaml +++ b/config/deploy/crd.yaml @@ -134,6 +134,8 @@ spec: - password - username type: object + connection: + type: string description: description: Description for the check type: string @@ -234,6 +236,9 @@ spec: type: object type: object type: object + connection: + description: ConnectionName of the connection. It'll be used to populate the endpoint, accessKey and secretKey. + type: string endpoint: type: string objectPath: @@ -371,6 +376,9 @@ spec: type: object type: object type: object + connection: + description: ConnectionName of the connection. It'll be used to populate the endpoint, accessKey and secretKey. + type: string endpoint: type: string objectPath: @@ -626,6 +634,9 @@ spec: type: object type: object type: object + connection: + description: ConnectionName of the connection. It'll be used to populate the endpoint, accessKey and secretKey. + type: string description: description: Description for the check type: string @@ -940,6 +951,9 @@ spec: properties: gcpConnection: properties: + connection: + description: ConnectionName of the connection. It'll be used to populate the endpoint and credentials. + type: string credentials: properties: name: @@ -1393,6 +1407,9 @@ spec: type: object x-kubernetes-map-type: atomic type: array + connection: + description: ConnectionName of the connection. It'll be used to populate the endpoint, accessKey and secretKey. + type: string description: description: Description for the check type: string @@ -1539,6 +1556,8 @@ spec: - password - username type: object + connection: + type: string description: description: Description for the check type: string @@ -1749,6 +1768,9 @@ spec: type: object type: object type: object + connection: + description: ConnectionName of the connection. It'll be used to populate the endpoint, accessKey and secretKey. + type: string endpoint: type: string objectPath: @@ -1824,6 +1846,9 @@ spec: type: object gcpConnection: properties: + connection: + description: ConnectionName of the connection. It'll be used to populate the endpoint and credentials. + type: string credentials: properties: name: @@ -1963,6 +1988,9 @@ spec: - password - username type: object + connection: + description: ConnectionName of the connection. It'll be used to populate the connection fields. + type: string host: type: string port: @@ -2044,6 +2072,9 @@ spec: - password - username type: object + connection: + description: ConnectionName of the connection. It'll be used to populate the connection fields. + type: string domain: description: Domain... type: string @@ -2095,6 +2126,8 @@ spec: github: items: properties: + connection: + type: string description: description: Description for the check type: string @@ -2123,8 +2156,6 @@ spec: type: string name: type: string - optional: - type: boolean required: - key type: object @@ -2134,8 +2165,6 @@ spec: type: string name: type: string - optional: - type: boolean required: - key type: object @@ -2356,6 +2385,9 @@ spec: body: description: Request Body Contents type: string + connection: + description: Name of the connection that'll be used to derive the endpoint. + type: string description: description: Description for the check type: string @@ -2525,6 +2557,9 @@ spec: jmeter: items: properties: + connection: + description: Name of the connection that'll be used to derive host and other connection details. + type: string description: description: Description for the check type: string @@ -2535,7 +2570,7 @@ spec: description: Icon for overwriting default icon on the dashboard type: string jmx: - description: Jmx defines tge ConfigMap or Secret reference to get the JMX test plan + description: Jmx defines the ConfigMap or Secret reference to get the JMX test plan properties: name: type: string @@ -2818,6 +2853,8 @@ spec: type: object bindDN: type: string + connection: + type: string description: description: Description for the check type: string @@ -3478,6 +3515,8 @@ spec: prometheus: items: properties: + connection: + type: string description: description: Description for the check type: string @@ -3612,6 +3651,9 @@ spec: - password - username type: object + connection: + description: ConnectionName is the name of the connection. It is used to populate addr, db and auth. + type: string db: type: integer description: @@ -3670,12 +3712,18 @@ spec: type: object type: object type: object + awsConnectionName: + description: Name of the AWS connection used to derive the access key and secret key. + type: string caCert: description: CaCert path to the root cert. In case of self-signed certificates type: string checkIntegrity: description: CheckIntegrity when enabled will check the Integrity and consistency of the restic reposiotry type: boolean + connection: + description: Name of the connection used to derive restic password. + type: string description: description: Description for the check type: string @@ -3775,19 +3823,47 @@ spec: items: properties: accessKey: - type: string - bucket: properties: - endpoint: - type: string name: type: string - region: + value: type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + secretKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + type: object type: object + bucketName: + type: string + connection: + description: ConnectionName of the connection. It'll be used to populate the endpoint, accessKey and secretKey. + type: string description: description: Description for the check type: string + endpoint: + type: string icon: description: Icon for overwriting default icon on the dashboard type: string @@ -3800,11 +3876,47 @@ spec: description: Name of the check type: string objectPath: + description: glob path to restrict matches to a subset type: string - secretKey: + region: type: string + secretKey: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + secretKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + type: object + type: object skipTLSVerify: - description: Skip TLS verify when connecting to s3 + description: Skip TLS verify when connecting to aws + type: boolean + usePathStyle: + description: 'Use path style path: http://s3.amazonaws.com/BUCKET/KEY instead of http://BUCKET.s3.amazonaws.com/KEY' type: boolean required: - name diff --git a/config/deploy/manifests.yaml b/config/deploy/manifests.yaml index 2523ca614..68045fb6e 100644 --- a/config/deploy/manifests.yaml +++ b/config/deploy/manifests.yaml @@ -134,6 +134,8 @@ spec: - password - username type: object + connection: + type: string description: description: Description for the check type: string @@ -234,6 +236,9 @@ spec: type: object type: object type: object + connection: + description: ConnectionName of the connection. It'll be used to populate the endpoint, accessKey and secretKey. + type: string endpoint: type: string objectPath: @@ -371,6 +376,9 @@ spec: type: object type: object type: object + connection: + description: ConnectionName of the connection. It'll be used to populate the endpoint, accessKey and secretKey. + type: string endpoint: type: string objectPath: @@ -626,6 +634,9 @@ spec: type: object type: object type: object + connection: + description: ConnectionName of the connection. It'll be used to populate the endpoint, accessKey and secretKey. + type: string description: description: Description for the check type: string @@ -940,6 +951,9 @@ spec: properties: gcpConnection: properties: + connection: + description: ConnectionName of the connection. It'll be used to populate the endpoint and credentials. + type: string credentials: properties: name: @@ -1393,6 +1407,9 @@ spec: type: object x-kubernetes-map-type: atomic type: array + connection: + description: ConnectionName of the connection. It'll be used to populate the endpoint, accessKey and secretKey. + type: string description: description: Description for the check type: string @@ -1539,6 +1556,8 @@ spec: - password - username type: object + connection: + type: string description: description: Description for the check type: string @@ -1749,6 +1768,9 @@ spec: type: object type: object type: object + connection: + description: ConnectionName of the connection. It'll be used to populate the endpoint, accessKey and secretKey. + type: string endpoint: type: string objectPath: @@ -1824,6 +1846,9 @@ spec: type: object gcpConnection: properties: + connection: + description: ConnectionName of the connection. It'll be used to populate the endpoint and credentials. + type: string credentials: properties: name: @@ -1963,6 +1988,9 @@ spec: - password - username type: object + connection: + description: ConnectionName of the connection. It'll be used to populate the connection fields. + type: string host: type: string port: @@ -2044,6 +2072,9 @@ spec: - password - username type: object + connection: + description: ConnectionName of the connection. It'll be used to populate the connection fields. + type: string domain: description: Domain... type: string @@ -2095,6 +2126,8 @@ spec: github: items: properties: + connection: + type: string description: description: Description for the check type: string @@ -2123,8 +2156,6 @@ spec: type: string name: type: string - optional: - type: boolean required: - key type: object @@ -2134,8 +2165,6 @@ spec: type: string name: type: string - optional: - type: boolean required: - key type: object @@ -2356,6 +2385,9 @@ spec: body: description: Request Body Contents type: string + connection: + description: Name of the connection that'll be used to derive the endpoint. + type: string description: description: Description for the check type: string @@ -2525,6 +2557,9 @@ spec: jmeter: items: properties: + connection: + description: Name of the connection that'll be used to derive host and other connection details. + type: string description: description: Description for the check type: string @@ -2535,7 +2570,7 @@ spec: description: Icon for overwriting default icon on the dashboard type: string jmx: - description: Jmx defines tge ConfigMap or Secret reference to get the JMX test plan + description: Jmx defines the ConfigMap or Secret reference to get the JMX test plan properties: name: type: string @@ -2818,6 +2853,8 @@ spec: type: object bindDN: type: string + connection: + type: string description: description: Description for the check type: string @@ -3478,6 +3515,8 @@ spec: prometheus: items: properties: + connection: + type: string description: description: Description for the check type: string @@ -3612,6 +3651,9 @@ spec: - password - username type: object + connection: + description: ConnectionName is the name of the connection. It is used to populate addr, db and auth. + type: string db: type: integer description: @@ -3670,12 +3712,18 @@ spec: type: object type: object type: object + awsConnectionName: + description: Name of the AWS connection used to derive the access key and secret key. + type: string caCert: description: CaCert path to the root cert. In case of self-signed certificates type: string checkIntegrity: description: CheckIntegrity when enabled will check the Integrity and consistency of the restic reposiotry type: boolean + connection: + description: Name of the connection used to derive restic password. + type: string description: description: Description for the check type: string @@ -3775,19 +3823,47 @@ spec: items: properties: accessKey: - type: string - bucket: properties: - endpoint: - type: string name: type: string - region: + value: type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + secretKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + type: object type: object + bucketName: + type: string + connection: + description: ConnectionName of the connection. It'll be used to populate the endpoint, accessKey and secretKey. + type: string description: description: Description for the check type: string + endpoint: + type: string icon: description: Icon for overwriting default icon on the dashboard type: string @@ -3800,11 +3876,47 @@ spec: description: Name of the check type: string objectPath: + description: glob path to restrict matches to a subset type: string - secretKey: + region: type: string + secretKey: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + secretKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + type: object + type: object skipTLSVerify: - description: Skip TLS verify when connecting to s3 + description: Skip TLS verify when connecting to aws + type: boolean + usePathStyle: + description: 'Use path style path: http://s3.amazonaws.com/BUCKET/KEY instead of http://BUCKET.s3.amazonaws.com/KEY' type: boolean required: - name diff --git a/config/schemas/canary.schema.json b/config/schemas/canary.schema.json index fe9f33fe8..fea30125f 100644 --- a/config/schemas/canary.schema.json +++ b/config/schemas/canary.schema.json @@ -1 +1 @@ -{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Canary","definitions":{"AWSConnection":{"properties":{"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"AlertManagerCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"alerts":{"items":{"type":"string"},"type":"array"},"filters":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"ignore":{"items":{"type":"string"},"type":"array"}},"additionalProperties":false,"type":"object"},"Authentication":{"required":["username","password"],"properties":{"username":{"$ref":"#/definitions/EnvVar"},"password":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"AwsConfigCheck":{"required":["name","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"query":{"type":"string"},"awsConnection":{"$ref":"#/definitions/AWSConnection"},"aggregatorName":{"type":"string"}},"additionalProperties":false,"type":"object"},"AwsConfigRuleCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"ignoreRules":{"items":{"type":"string"},"type":"array"},"rules":{"items":{"type":"string"},"type":"array"},"complianceTypes":{"items":{"type":"string"},"type":"array"},"awsConnection":{"$ref":"#/definitions/AWSConnection"}},"additionalProperties":false,"type":"object"},"AzureDevopsCheck":{"required":["name","organization","personalAccessToken","project","pipeline","variables","branch","thresholdMillis"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"organization":{"type":"string"},"personalAccessToken":{"$ref":"#/definitions/EnvVar"},"project":{"type":"string"},"pipeline":{"type":"string"},"variables":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"branch":{"items":{"type":"string"},"type":"array"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"Bucket":{"properties":{"name":{"type":"string"},"region":{"type":"string"},"endpoint":{"type":"string"}},"additionalProperties":false,"type":"object"},"Canary":{"required":["TypeMeta"],"properties":{"TypeMeta":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TypeMeta"},"metadata":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ObjectMeta"},"spec":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CanarySpec"},"status":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CanaryStatus"}},"additionalProperties":false,"type":"object"},"CanarySpec":{"properties":{"env":{"patternProperties":{".*":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/VarSource"}},"type":"object"},"http":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/HTTPCheck"},"type":"array"},"dns":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DNSCheck"},"type":"array"},"docker":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DockerPullCheck"},"type":"array"},"dockerPush":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DockerPushCheck"},"type":"array"},"containerd":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ContainerdPullCheck"},"type":"array"},"containerdPush":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ContainerdPushCheck"},"type":"array"},"s3":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/S3Check"},"type":"array"},"tcp":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TCPCheck"},"type":"array"},"pod":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PodCheck"},"type":"array"},"ldap":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LDAPCheck"},"type":"array"},"icmp":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ICMPCheck"},"type":"array"},"postgres":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PostgresCheck"},"type":"array"},"mssql":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MssqlCheck"},"type":"array"},"mysql":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MysqlCheck"},"type":"array"},"restic":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ResticCheck"},"type":"array"},"jmeter":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JmeterCheck"},"type":"array"},"junit":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JunitCheck"},"type":"array"},"helm":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/HelmCheck"},"type":"array"},"namespace":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/NamespaceCheck"},"type":"array"},"redis":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/RedisCheck"},"type":"array"},"ec2":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EC2Check"},"type":"array"},"prometheus":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PrometheusCheck"},"type":"array"},"mongodb":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MongoDBCheck"},"type":"array"},"cloudwatch":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CloudWatchCheck"},"type":"array"},"github":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GitHubCheck"},"type":"array"},"kubernetes":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/KubernetesCheck"},"type":"array"},"folder":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FolderCheck"},"type":"array"},"exec":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ExecCheck"},"type":"array"},"awsConfig":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AwsConfigCheck"},"type":"array"},"awsConfigRule":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AwsConfigRuleCheck"},"type":"array"},"databaseBackup":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DatabaseBackupCheck"},"type":"array"},"configDB":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigDBCheck"},"type":"array"},"elasticsearch":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ElasticsearchCheck"},"type":"array"},"alertmanager":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AlertManagerCheck"},"type":"array"},"dynatrace":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DynatraceCheck"},"type":"array"},"azureDevops":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AzureDevopsCheck"},"type":"array"},"interval":{"type":"integer"},"schedule":{"type":"string"},"icon":{"type":"string"},"severity":{"type":"string"},"owner":{"type":"string"},"resultMode":{"type":"string"}},"additionalProperties":false,"type":"object"},"CanaryStatus":{"properties":{"persistedID":{"type":"string"},"lastTransitionedTime":{"$ref":"#/definitions/Time"},"lastCheck":{"$ref":"#/definitions/Time"},"message":{"type":"string"},"errorMessage":{"type":"string"},"status":{"type":"string"},"checks":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"observedGeneration":{"type":"integer"},"checkStatus":{"patternProperties":{".*":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CheckStatus"}},"type":"object"},"uptime1h":{"type":"string"},"latency1h":{"type":"string"}},"additionalProperties":false,"type":"object"},"CheckStatus":{"properties":{"lastTransitionedTime":{"$ref":"#/definitions/Time"},"lastCheck":{"$ref":"#/definitions/Time"},"message":{"type":"string"},"errorMessage":{"type":"string"},"uptime1h":{"type":"string"},"latency1h":{"type":"string"}},"additionalProperties":false,"type":"object"},"CloudWatchCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"filter":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CloudWatchFilter"}},"additionalProperties":false,"type":"object"},"CloudWatchFilter":{"properties":{"actionPrefix":{"type":"string"},"alarmPrefix":{"type":"string"},"alarms":{"items":{"type":"string"},"type":"array"},"state":{"type":"string"}},"additionalProperties":false,"type":"object"},"ConfigDBCheck":{"required":["name","query"],"properties":{"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"query":{"type":"string"}},"additionalProperties":false,"type":"object"},"ConfigMapKeySelector":{"required":["LocalObjectReference","key"],"properties":{"LocalObjectReference":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LocalObjectReference"},"key":{"type":"string"},"optional":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"ContainerdPullCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"expectedDigest":{"type":"string"},"expectedSize":{"type":"integer"}},"additionalProperties":false,"type":"object"},"ContainerdPushCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"}},"additionalProperties":false,"type":"object"},"DNSCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"server":{"type":"string"},"port":{"type":"integer"},"query":{"type":"string"},"querytype":{"type":"string"},"minrecords":{"type":"integer"},"exactreply":{"items":{"type":"string"},"type":"array"},"timeout":{"type":"integer"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"DatabaseBackupCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"gcp":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GCPDatabase"},"maxAge":{"type":"string"}},"additionalProperties":false,"type":"object"},"DockerPullCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"expectedDigest":{"type":"string"},"expectedSize":{"type":"integer"}},"additionalProperties":false,"type":"object"},"DockerPushCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"DynatraceCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"scheme":{"type":"string"},"apiKey":{"$ref":"#/definitions/EnvVar"},"namespace":{"type":"string"}},"additionalProperties":false,"type":"object"},"EC2Check":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"ami":{"type":"string"},"userData":{"type":"string"},"securityGroup":{"type":"string"},"keepAlive":{"type":"boolean"},"waitTime":{"type":"integer"},"timeOut":{"type":"integer"},"canaryRef":{"items":{"$ref":"#/definitions/LocalObjectReference"},"type":"array"}},"additionalProperties":false,"type":"object"},"ElasticsearchCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"url":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"index":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"EnvVar":{"properties":{"name":{"type":"string"},"value":{"type":"string"},"valueFrom":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EnvVarSource"}},"additionalProperties":false,"type":"object"},"EnvVarSource":{"properties":{"configMapKeyRef":{"$ref":"#/definitions/ConfigMapKeySelector"},"secretKeyRef":{"$ref":"#/definitions/SecretKeySelector"}},"additionalProperties":false,"type":"object"},"ExecCheck":{"required":["name","script"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"script":{"type":"string"}},"additionalProperties":false,"type":"object"},"FieldsV1":{"properties":{},"additionalProperties":false,"type":"object"},"FolderCheck":{"required":["name","path"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"path":{"type":"string"},"filter":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FolderFilter"},"minAge":{"type":"string"},"maxAge":{"type":"string"},"minCount":{"type":"integer"},"maxCount":{"type":"integer"},"minSize":{"type":"string"},"maxSize":{"type":"string"},"availableSize":{"type":"string"},"totalSize":{"type":"string"},"awsConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AWSConnection"},"gcpConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GCPConnection"},"smbConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SMBConnection"},"sftpConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SFTPConnection"}},"additionalProperties":false,"type":"object"},"FolderFilter":{"properties":{"minAge":{"type":"string"},"maxAge":{"type":"string"},"minSize":{"type":"string"},"maxSize":{"type":"string"},"regex":{"type":"string"}},"additionalProperties":false,"type":"object"},"GCPConnection":{"properties":{"endpoint":{"type":"string"},"credentials":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"GCPDatabase":{"required":["project","instance"],"properties":{"project":{"type":"string"},"instance":{"type":"string"},"gcpConnection":{"$ref":"#/definitions/GCPConnection"}},"additionalProperties":false,"type":"object"},"GitHubCheck":{"required":["name","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"query":{"type":"string"},"githubToken":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"HTTPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"endpoint":{"type":"string"},"namespace":{"type":"string"},"thresholdMillis":{"type":"integer"},"responseCodes":{"items":{"type":"integer"},"type":"array"},"responseContent":{"type":"string"},"responseJSONContent":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JSONCheck"},"maxSSLExpiry":{"type":"integer"},"method":{"type":"string"},"ntlm":{"type":"boolean"},"ntlmv2":{"type":"boolean"},"body":{"type":"string"},"headers":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EnvVar"},"type":"array"},"authentication":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Authentication"},"templateBody":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"HelmCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"chartmuseum":{"type":"string"},"project":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"cafile":{"type":"string"}},"additionalProperties":false,"type":"object"},"ICMPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"endpoint":{"type":"string"},"thresholdMillis":{"type":"integer"},"packetLossThreshold":{"type":"integer"},"packetCount":{"type":"integer"}},"additionalProperties":false,"type":"object"},"JSONCheck":{"required":["path","value"],"properties":{"path":{"type":"string"},"value":{"type":"string"}},"additionalProperties":false,"type":"object"},"JmeterCheck":{"required":["name","jmx"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"jmx":{"$ref":"#/definitions/EnvVar"},"host":{"type":"string"},"port":{"type":"integer"},"properties":{"items":{"type":"string"},"type":"array"},"systemProperties":{"items":{"type":"string"},"type":"array"},"responseDuration":{"type":"string"}},"additionalProperties":false,"type":"object"},"JunitCheck":{"required":["name","testResults","spec"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"testResults":{"type":"string"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"timeout":{"type":"integer"},"spec":{"additionalProperties":true}},"additionalProperties":false,"type":"object"},"KubernetesCheck":{"required":["name","kind"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"namespace":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ResourceSelector"},"resource":{"$ref":"#/definitions/ResourceSelector"},"ignore":{"items":{"type":"string"},"type":"array"},"kind":{"type":"string"},"ready":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"LDAPCheck":{"required":["name","host","auth","bindDN"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"bindDN":{"type":"string"},"userSearch":{"type":"string"},"skipTLSVerify":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"LocalObjectReference":{"properties":{"name":{"type":"string"}},"additionalProperties":false,"type":"object"},"ManagedFieldsEntry":{"properties":{"manager":{"type":"string"},"operation":{"type":"string"},"apiVersion":{"type":"string"},"time":{"$ref":"#/definitions/Time"},"fieldsType":{"type":"string"},"fieldsV1":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FieldsV1"},"subresource":{"type":"string"}},"additionalProperties":false,"type":"object"},"MongoDBCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"MssqlCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"MysqlCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"NamespaceCheck":{"required":["name","podSpec"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespaceNamePrefix":{"type":"string"},"namespaceLabels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespaceAnnotations":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"podSpec":{"type":"string"},"schedule_timeout":{"type":"integer"},"readyTimeout":{"type":"integer"},"httpTimeout":{"type":"integer"},"deleteTimeout":{"type":"integer"},"ingressTimeout":{"type":"integer"},"httpRetryInterval":{"type":"integer"},"deadline":{"type":"integer"},"port":{"type":"integer"},"path":{"type":"string"},"ingressName":{"type":"string"},"ingressHost":{"type":"string"},"expectedContent":{"type":"string"},"expectedHttpStatuses":{"items":{"type":"integer"},"type":"array"},"priorityClass":{"type":"string"}},"additionalProperties":false,"type":"object"},"ObjectFieldSelector":{"required":["fieldPath"],"properties":{"apiVersion":{"type":"string"},"fieldPath":{"type":"string"}},"additionalProperties":false,"type":"object"},"ObjectMeta":{"properties":{"name":{"type":"string"},"generateName":{"type":"string"},"namespace":{"type":"string"},"selfLink":{"type":"string"},"uid":{"type":"string"},"resourceVersion":{"type":"string"},"generation":{"type":"integer"},"creationTimestamp":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Time"},"deletionTimestamp":{"$ref":"#/definitions/Time"},"deletionGracePeriodSeconds":{"type":"integer"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"annotations":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"ownerReferences":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/OwnerReference"},"type":"array"},"finalizers":{"items":{"type":"string"},"type":"array"},"managedFields":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ManagedFieldsEntry"},"type":"array"}},"additionalProperties":false,"type":"object"},"OwnerReference":{"required":["apiVersion","kind","name","uid"],"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"},"controller":{"type":"boolean"},"blockOwnerDeletion":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"PodCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespace":{"type":"string"},"spec":{"type":"string"},"scheduleTimeout":{"type":"integer"},"readyTimeout":{"type":"integer"},"httpTimeout":{"type":"integer"},"deleteTimeout":{"type":"integer"},"ingressTimeout":{"type":"integer"},"httpRetryInterval":{"type":"integer"},"deadline":{"type":"integer"},"port":{"type":"integer"},"path":{"type":"string"},"ingressName":{"type":"string"},"ingressHost":{"type":"string"},"ingressClass":{"type":"string"},"expectedContent":{"type":"string"},"expectedHttpStatuses":{"items":{"type":"integer"},"type":"array"},"priorityClass":{"type":"string"}},"additionalProperties":false,"type":"object"},"PostgresCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"PrometheusCheck":{"required":["name","host","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"query":{"type":"string"}},"additionalProperties":false,"type":"object"},"RedisCheck":{"required":["name","addr","db"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"addr":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"db":{"type":"integer"}},"additionalProperties":false,"type":"object"},"ResourceSelector":{"properties":{"name":{"type":"string"},"labelSelector":{"type":"string"},"fieldSelector":{"type":"string"}},"additionalProperties":false,"type":"object"},"ResticCheck":{"required":["name","repository","password","maxAge"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"repository":{"type":"string"},"password":{"$ref":"#/definitions/EnvVar"},"maxAge":{"type":"string"},"checkIntegrity":{"type":"boolean"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"caCert":{"type":"string"}},"additionalProperties":false,"type":"object"},"S3Check":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"bucket":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Bucket"},"accessKey":{"type":"string"},"secretKey":{"type":"string"},"objectPath":{"type":"string"},"skipTLSVerify":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"SFTPConnection":{"required":["host","auth"],"properties":{"port":{"type":"integer"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"SMBConnection":{"required":["auth"],"properties":{"port":{"type":"integer"},"auth":{"$ref":"#/definitions/Authentication"},"domain":{"type":"string"},"workstation":{"type":"string"},"sharename":{"type":"string"},"searchPath":{"type":"string"}},"additionalProperties":false,"type":"object"},"SecretKeySelector":{"required":["LocalObjectReference","key"],"properties":{"LocalObjectReference":{"$ref":"#/definitions/LocalObjectReference"},"key":{"type":"string"},"optional":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"TCPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"endpoint":{"type":"string"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"Template":{"properties":{"template":{"type":"string"},"jsonPath":{"type":"string"},"expr":{"type":"string"},"javascript":{"type":"string"}},"additionalProperties":false,"type":"object"},"Time":{"properties":{},"additionalProperties":false,"type":"object"},"TypeMeta":{"properties":{"kind":{"type":"string"},"apiVersion":{"type":"string"}},"additionalProperties":false,"type":"object"},"VarSource":{"properties":{"fieldRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ObjectFieldSelector"},"value":{"type":"string"},"configMapKeyRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigMapKeySelector"},"secretKeyRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SecretKeySelector"}},"additionalProperties":false,"type":"object"}}} \ No newline at end of file +{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Canary","definitions":{"AWSConnection":{"properties":{"connection":{"type":"string"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"AlertManagerCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"alerts":{"items":{"type":"string"},"type":"array"},"filters":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"ignore":{"items":{"type":"string"},"type":"array"}},"additionalProperties":false,"type":"object"},"Authentication":{"required":["username","password"],"properties":{"username":{"$ref":"#/definitions/EnvVar"},"password":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"AwsConfigCheck":{"required":["name","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"query":{"type":"string"},"awsConnection":{"$ref":"#/definitions/AWSConnection"},"aggregatorName":{"type":"string"}},"additionalProperties":false,"type":"object"},"AwsConfigRuleCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"ignoreRules":{"items":{"type":"string"},"type":"array"},"rules":{"items":{"type":"string"},"type":"array"},"complianceTypes":{"items":{"type":"string"},"type":"array"},"awsConnection":{"$ref":"#/definitions/AWSConnection"}},"additionalProperties":false,"type":"object"},"AzureDevopsCheck":{"required":["name","organization","personalAccessToken","project","pipeline","variables","branch","thresholdMillis"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"organization":{"type":"string"},"personalAccessToken":{"$ref":"#/definitions/EnvVar"},"project":{"type":"string"},"pipeline":{"type":"string"},"variables":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"branch":{"items":{"type":"string"},"type":"array"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"Canary":{"required":["TypeMeta"],"properties":{"TypeMeta":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TypeMeta"},"metadata":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ObjectMeta"},"spec":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CanarySpec"},"status":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CanaryStatus"}},"additionalProperties":false,"type":"object"},"CanarySpec":{"properties":{"env":{"patternProperties":{".*":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/VarSource"}},"type":"object"},"http":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/HTTPCheck"},"type":"array"},"dns":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DNSCheck"},"type":"array"},"docker":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DockerPullCheck"},"type":"array"},"dockerPush":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DockerPushCheck"},"type":"array"},"containerd":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ContainerdPullCheck"},"type":"array"},"containerdPush":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ContainerdPushCheck"},"type":"array"},"s3":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/S3Check"},"type":"array"},"tcp":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TCPCheck"},"type":"array"},"pod":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PodCheck"},"type":"array"},"ldap":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LDAPCheck"},"type":"array"},"icmp":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ICMPCheck"},"type":"array"},"postgres":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PostgresCheck"},"type":"array"},"mssql":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MssqlCheck"},"type":"array"},"mysql":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MysqlCheck"},"type":"array"},"restic":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ResticCheck"},"type":"array"},"jmeter":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JmeterCheck"},"type":"array"},"junit":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JunitCheck"},"type":"array"},"helm":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/HelmCheck"},"type":"array"},"namespace":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/NamespaceCheck"},"type":"array"},"redis":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/RedisCheck"},"type":"array"},"ec2":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EC2Check"},"type":"array"},"prometheus":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PrometheusCheck"},"type":"array"},"mongodb":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MongoDBCheck"},"type":"array"},"cloudwatch":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CloudWatchCheck"},"type":"array"},"github":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GitHubCheck"},"type":"array"},"kubernetes":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/KubernetesCheck"},"type":"array"},"folder":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FolderCheck"},"type":"array"},"exec":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ExecCheck"},"type":"array"},"awsConfig":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AwsConfigCheck"},"type":"array"},"awsConfigRule":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AwsConfigRuleCheck"},"type":"array"},"databaseBackup":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DatabaseBackupCheck"},"type":"array"},"configDB":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigDBCheck"},"type":"array"},"elasticsearch":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ElasticsearchCheck"},"type":"array"},"alertmanager":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AlertManagerCheck"},"type":"array"},"dynatrace":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DynatraceCheck"},"type":"array"},"azureDevops":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AzureDevopsCheck"},"type":"array"},"interval":{"type":"integer"},"schedule":{"type":"string"},"icon":{"type":"string"},"severity":{"type":"string"},"owner":{"type":"string"},"resultMode":{"type":"string"}},"additionalProperties":false,"type":"object"},"CanaryStatus":{"properties":{"persistedID":{"type":"string"},"lastTransitionedTime":{"$ref":"#/definitions/Time"},"lastCheck":{"$ref":"#/definitions/Time"},"message":{"type":"string"},"errorMessage":{"type":"string"},"status":{"type":"string"},"checks":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"observedGeneration":{"type":"integer"},"checkStatus":{"patternProperties":{".*":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CheckStatus"}},"type":"object"},"uptime1h":{"type":"string"},"latency1h":{"type":"string"}},"additionalProperties":false,"type":"object"},"CheckStatus":{"properties":{"lastTransitionedTime":{"$ref":"#/definitions/Time"},"lastCheck":{"$ref":"#/definitions/Time"},"message":{"type":"string"},"errorMessage":{"type":"string"},"uptime1h":{"type":"string"},"latency1h":{"type":"string"}},"additionalProperties":false,"type":"object"},"CloudWatchCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"filter":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CloudWatchFilter"}},"additionalProperties":false,"type":"object"},"CloudWatchFilter":{"properties":{"actionPrefix":{"type":"string"},"alarmPrefix":{"type":"string"},"alarms":{"items":{"type":"string"},"type":"array"},"state":{"type":"string"}},"additionalProperties":false,"type":"object"},"ConfigDBCheck":{"required":["name","query"],"properties":{"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"query":{"type":"string"}},"additionalProperties":false,"type":"object"},"ConfigMapKeySelector":{"required":["LocalObjectReference","key"],"properties":{"LocalObjectReference":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LocalObjectReference"},"key":{"type":"string"},"optional":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"ContainerdPullCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"expectedDigest":{"type":"string"},"expectedSize":{"type":"integer"}},"additionalProperties":false,"type":"object"},"ContainerdPushCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"}},"additionalProperties":false,"type":"object"},"DNSCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"server":{"type":"string"},"port":{"type":"integer"},"query":{"type":"string"},"querytype":{"type":"string"},"minrecords":{"type":"integer"},"exactreply":{"items":{"type":"string"},"type":"array"},"timeout":{"type":"integer"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"DatabaseBackupCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"gcp":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GCPDatabase"},"maxAge":{"type":"string"}},"additionalProperties":false,"type":"object"},"DockerPullCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"expectedDigest":{"type":"string"},"expectedSize":{"type":"integer"}},"additionalProperties":false,"type":"object"},"DockerPushCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"DynatraceCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"scheme":{"type":"string"},"apiKey":{"$ref":"#/definitions/EnvVar"},"namespace":{"type":"string"}},"additionalProperties":false,"type":"object"},"EC2Check":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"ami":{"type":"string"},"userData":{"type":"string"},"securityGroup":{"type":"string"},"keepAlive":{"type":"boolean"},"waitTime":{"type":"integer"},"timeOut":{"type":"integer"},"canaryRef":{"items":{"$ref":"#/definitions/LocalObjectReference"},"type":"array"}},"additionalProperties":false,"type":"object"},"ElasticsearchCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"url":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"index":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"EnvVar":{"properties":{"name":{"type":"string"},"value":{"type":"string"},"valueFrom":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EnvVarSource"}},"additionalProperties":false,"type":"object"},"EnvVarSource":{"properties":{"configMapKeyRef":{"$ref":"#/definitions/ConfigMapKeySelector"},"secretKeyRef":{"$ref":"#/definitions/SecretKeySelector"}},"additionalProperties":false,"type":"object"},"ExecCheck":{"required":["name","script"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"script":{"type":"string"}},"additionalProperties":false,"type":"object"},"FieldsV1":{"properties":{},"additionalProperties":false,"type":"object"},"FolderCheck":{"required":["name","path"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"path":{"type":"string"},"filter":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FolderFilter"},"minAge":{"type":"string"},"maxAge":{"type":"string"},"minCount":{"type":"integer"},"maxCount":{"type":"integer"},"minSize":{"type":"string"},"maxSize":{"type":"string"},"availableSize":{"type":"string"},"totalSize":{"type":"string"},"awsConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AWSConnection"},"gcpConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GCPConnection"},"smbConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SMBConnection"},"sftpConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SFTPConnection"}},"additionalProperties":false,"type":"object"},"FolderFilter":{"properties":{"minAge":{"type":"string"},"maxAge":{"type":"string"},"minSize":{"type":"string"},"maxSize":{"type":"string"},"regex":{"type":"string"}},"additionalProperties":false,"type":"object"},"GCPConnection":{"properties":{"connection":{"type":"string"},"endpoint":{"type":"string"},"credentials":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"GCPDatabase":{"required":["project","instance"],"properties":{"project":{"type":"string"},"instance":{"type":"string"},"gcpConnection":{"$ref":"#/definitions/GCPConnection"}},"additionalProperties":false,"type":"object"},"GitHubCheck":{"required":["name","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"query":{"type":"string"},"githubToken":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"HTTPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"endpoint":{"type":"string"},"namespace":{"type":"string"},"thresholdMillis":{"type":"integer"},"responseCodes":{"items":{"type":"integer"},"type":"array"},"responseContent":{"type":"string"},"responseJSONContent":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JSONCheck"},"maxSSLExpiry":{"type":"integer"},"method":{"type":"string"},"ntlm":{"type":"boolean"},"ntlmv2":{"type":"boolean"},"body":{"type":"string"},"headers":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EnvVar"},"type":"array"},"authentication":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Authentication"},"templateBody":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"HelmCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"chartmuseum":{"type":"string"},"project":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"cafile":{"type":"string"}},"additionalProperties":false,"type":"object"},"ICMPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"endpoint":{"type":"string"},"thresholdMillis":{"type":"integer"},"packetLossThreshold":{"type":"integer"},"packetCount":{"type":"integer"}},"additionalProperties":false,"type":"object"},"JSONCheck":{"required":["path","value"],"properties":{"path":{"type":"string"},"value":{"type":"string"}},"additionalProperties":false,"type":"object"},"JmeterCheck":{"required":["name","jmx"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"jmx":{"$ref":"#/definitions/EnvVar"},"host":{"type":"string"},"port":{"type":"integer"},"properties":{"items":{"type":"string"},"type":"array"},"systemProperties":{"items":{"type":"string"},"type":"array"},"responseDuration":{"type":"string"}},"additionalProperties":false,"type":"object"},"JunitCheck":{"required":["name","testResults","spec"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"testResults":{"type":"string"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"timeout":{"type":"integer"},"spec":{"additionalProperties":true}},"additionalProperties":false,"type":"object"},"KubernetesCheck":{"required":["name","kind"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"namespace":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ResourceSelector"},"resource":{"$ref":"#/definitions/ResourceSelector"},"ignore":{"items":{"type":"string"},"type":"array"},"kind":{"type":"string"},"ready":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"LDAPCheck":{"required":["name","host","auth","bindDN"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"bindDN":{"type":"string"},"userSearch":{"type":"string"},"skipTLSVerify":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"LocalObjectReference":{"properties":{"name":{"type":"string"}},"additionalProperties":false,"type":"object"},"ManagedFieldsEntry":{"properties":{"manager":{"type":"string"},"operation":{"type":"string"},"apiVersion":{"type":"string"},"time":{"$ref":"#/definitions/Time"},"fieldsType":{"type":"string"},"fieldsV1":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FieldsV1"},"subresource":{"type":"string"}},"additionalProperties":false,"type":"object"},"MongoDBCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"MssqlCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"MysqlCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"NamespaceCheck":{"required":["name","podSpec"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespaceNamePrefix":{"type":"string"},"namespaceLabels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespaceAnnotations":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"podSpec":{"type":"string"},"schedule_timeout":{"type":"integer"},"readyTimeout":{"type":"integer"},"httpTimeout":{"type":"integer"},"deleteTimeout":{"type":"integer"},"ingressTimeout":{"type":"integer"},"httpRetryInterval":{"type":"integer"},"deadline":{"type":"integer"},"port":{"type":"integer"},"path":{"type":"string"},"ingressName":{"type":"string"},"ingressHost":{"type":"string"},"expectedContent":{"type":"string"},"expectedHttpStatuses":{"items":{"type":"integer"},"type":"array"},"priorityClass":{"type":"string"}},"additionalProperties":false,"type":"object"},"ObjectFieldSelector":{"required":["fieldPath"],"properties":{"apiVersion":{"type":"string"},"fieldPath":{"type":"string"}},"additionalProperties":false,"type":"object"},"ObjectMeta":{"properties":{"name":{"type":"string"},"generateName":{"type":"string"},"namespace":{"type":"string"},"selfLink":{"type":"string"},"uid":{"type":"string"},"resourceVersion":{"type":"string"},"generation":{"type":"integer"},"creationTimestamp":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Time"},"deletionTimestamp":{"$ref":"#/definitions/Time"},"deletionGracePeriodSeconds":{"type":"integer"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"annotations":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"ownerReferences":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/OwnerReference"},"type":"array"},"finalizers":{"items":{"type":"string"},"type":"array"},"managedFields":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ManagedFieldsEntry"},"type":"array"}},"additionalProperties":false,"type":"object"},"OwnerReference":{"required":["apiVersion","kind","name","uid"],"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"},"controller":{"type":"boolean"},"blockOwnerDeletion":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"PodCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespace":{"type":"string"},"spec":{"type":"string"},"scheduleTimeout":{"type":"integer"},"readyTimeout":{"type":"integer"},"httpTimeout":{"type":"integer"},"deleteTimeout":{"type":"integer"},"ingressTimeout":{"type":"integer"},"httpRetryInterval":{"type":"integer"},"deadline":{"type":"integer"},"port":{"type":"integer"},"path":{"type":"string"},"ingressName":{"type":"string"},"ingressHost":{"type":"string"},"ingressClass":{"type":"string"},"expectedContent":{"type":"string"},"expectedHttpStatuses":{"items":{"type":"integer"},"type":"array"},"priorityClass":{"type":"string"}},"additionalProperties":false,"type":"object"},"PostgresCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"PrometheusCheck":{"required":["name","host","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"host":{"type":"string"},"query":{"type":"string"}},"additionalProperties":false,"type":"object"},"RedisCheck":{"required":["name","addr","db"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"addr":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"db":{"type":"integer"}},"additionalProperties":false,"type":"object"},"ResourceSelector":{"properties":{"name":{"type":"string"},"labelSelector":{"type":"string"},"fieldSelector":{"type":"string"}},"additionalProperties":false,"type":"object"},"ResticCheck":{"required":["name","repository","password","maxAge"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"awsConnectionName":{"type":"string"},"repository":{"type":"string"},"password":{"$ref":"#/definitions/EnvVar"},"maxAge":{"type":"string"},"checkIntegrity":{"type":"boolean"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"caCert":{"type":"string"}},"additionalProperties":false,"type":"object"},"S3Check":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"bucketName":{"type":"string"}},"additionalProperties":false,"type":"object"},"SFTPConnection":{"required":["host","auth"],"properties":{"connection":{"type":"string"},"port":{"type":"integer"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"SMBConnection":{"required":["auth"],"properties":{"connection":{"type":"string"},"port":{"type":"integer"},"auth":{"$ref":"#/definitions/Authentication"},"domain":{"type":"string"},"workstation":{"type":"string"},"sharename":{"type":"string"},"searchPath":{"type":"string"}},"additionalProperties":false,"type":"object"},"SecretKeySelector":{"required":["LocalObjectReference","key"],"properties":{"LocalObjectReference":{"$ref":"#/definitions/LocalObjectReference"},"key":{"type":"string"},"optional":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"TCPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"endpoint":{"type":"string"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"Template":{"properties":{"template":{"type":"string"},"jsonPath":{"type":"string"},"expr":{"type":"string"},"javascript":{"type":"string"}},"additionalProperties":false,"type":"object"},"Time":{"properties":{},"additionalProperties":false,"type":"object"},"TypeMeta":{"properties":{"kind":{"type":"string"},"apiVersion":{"type":"string"}},"additionalProperties":false,"type":"object"},"VarSource":{"properties":{"fieldRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ObjectFieldSelector"},"value":{"type":"string"},"configMapKeyRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigMapKeySelector"},"secretKeyRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SecretKeySelector"}},"additionalProperties":false,"type":"object"}}} \ No newline at end of file diff --git a/config/schemas/component.schema.json b/config/schemas/component.schema.json index e39a6d87f..e660318d8 100644 --- a/config/schemas/component.schema.json +++ b/config/schemas/component.schema.json @@ -1 +1 @@ -{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Component","definitions":{"AWSConnection":{"properties":{"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"AlertManagerCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"alerts":{"items":{"type":"string"},"type":"array"},"filters":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"ignore":{"items":{"type":"string"},"type":"array"}},"additionalProperties":false,"type":"object"},"Authentication":{"required":["username","password"],"properties":{"username":{"$ref":"#/definitions/EnvVar"},"password":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"AwsConfigCheck":{"required":["name","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"query":{"type":"string"},"awsConnection":{"$ref":"#/definitions/AWSConnection"},"aggregatorName":{"type":"string"}},"additionalProperties":false,"type":"object"},"AwsConfigRuleCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"ignoreRules":{"items":{"type":"string"},"type":"array"},"rules":{"items":{"type":"string"},"type":"array"},"complianceTypes":{"items":{"type":"string"},"type":"array"},"awsConnection":{"$ref":"#/definitions/AWSConnection"}},"additionalProperties":false,"type":"object"},"AzureDevopsCheck":{"required":["name","organization","personalAccessToken","project","pipeline","variables","branch","thresholdMillis"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"organization":{"type":"string"},"personalAccessToken":{"$ref":"#/definitions/EnvVar"},"project":{"type":"string"},"pipeline":{"type":"string"},"variables":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"branch":{"items":{"type":"string"},"type":"array"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"Bucket":{"properties":{"name":{"type":"string"},"region":{"type":"string"},"endpoint":{"type":"string"}},"additionalProperties":false,"type":"object"},"CanarySpec":{"properties":{"env":{"patternProperties":{".*":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/VarSource"}},"type":"object"},"http":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/HTTPCheck"},"type":"array"},"dns":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DNSCheck"},"type":"array"},"docker":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DockerPullCheck"},"type":"array"},"dockerPush":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DockerPushCheck"},"type":"array"},"containerd":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ContainerdPullCheck"},"type":"array"},"containerdPush":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ContainerdPushCheck"},"type":"array"},"s3":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/S3Check"},"type":"array"},"tcp":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TCPCheck"},"type":"array"},"pod":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PodCheck"},"type":"array"},"ldap":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LDAPCheck"},"type":"array"},"icmp":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ICMPCheck"},"type":"array"},"postgres":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PostgresCheck"},"type":"array"},"mssql":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MssqlCheck"},"type":"array"},"mysql":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MysqlCheck"},"type":"array"},"restic":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ResticCheck"},"type":"array"},"jmeter":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JmeterCheck"},"type":"array"},"junit":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JunitCheck"},"type":"array"},"helm":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/HelmCheck"},"type":"array"},"namespace":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/NamespaceCheck"},"type":"array"},"redis":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/RedisCheck"},"type":"array"},"ec2":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EC2Check"},"type":"array"},"prometheus":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PrometheusCheck"},"type":"array"},"mongodb":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MongoDBCheck"},"type":"array"},"cloudwatch":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CloudWatchCheck"},"type":"array"},"github":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GitHubCheck"},"type":"array"},"kubernetes":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/KubernetesCheck"},"type":"array"},"folder":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FolderCheck"},"type":"array"},"exec":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ExecCheck"},"type":"array"},"awsConfig":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AwsConfigCheck"},"type":"array"},"awsConfigRule":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AwsConfigRuleCheck"},"type":"array"},"databaseBackup":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DatabaseBackupCheck"},"type":"array"},"configDB":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigDBCheck"},"type":"array"},"elasticsearch":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ElasticsearchCheck"},"type":"array"},"alertmanager":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AlertManagerCheck"},"type":"array"},"dynatrace":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DynatraceCheck"},"type":"array"},"azureDevops":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AzureDevopsCheck"},"type":"array"},"interval":{"type":"integer"},"schedule":{"type":"string"},"icon":{"type":"string"},"severity":{"type":"string"},"owner":{"type":"string"},"resultMode":{"type":"string"}},"additionalProperties":false,"type":"object"},"CloudWatchCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"filter":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CloudWatchFilter"}},"additionalProperties":false,"type":"object"},"CloudWatchFilter":{"properties":{"actionPrefix":{"type":"string"},"alarmPrefix":{"type":"string"},"alarms":{"items":{"type":"string"},"type":"array"},"state":{"type":"string"}},"additionalProperties":false,"type":"object"},"Component":{"required":["TypeMeta"],"properties":{"TypeMeta":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TypeMeta"},"metadata":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ObjectMeta"},"spec":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentSpec"},"status":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentStatus"}},"additionalProperties":false,"type":"object"},"ComponentCheck":{"properties":{"selector":{"$ref":"#/definitions/ResourceSelector"},"inline":{"$ref":"#/definitions/CanarySpec"}},"additionalProperties":false,"type":"object"},"ComponentSpec":{"properties":{"name":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"owner":{"type":"string"},"id":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Template"},"order":{"type":"integer"},"type":{"type":"string"},"lifecycle":{"type":"string"},"relationships":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/RelationshipSpec"},"type":"array"},"properties":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Property"},"type":"array"},"lookup":{"$ref":"#/definitions/CanarySpec"},"components":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentSpecObject"},"type":"array"},"selectors":{"items":{"$ref":"#/definitions/ResourceSelector"},"type":"array"},"checks":{"items":{"$ref":"#/definitions/ComponentCheck"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"},"summary":{"$ref":"#/definitions/Summary"},"forEach":{"$ref":"#/definitions/ForEach"},"logs":{"items":{"$ref":"#/definitions/LogSelector"},"type":"array"}},"additionalProperties":false,"type":"object"},"ComponentSpecObject":{"properties":{"name":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"owner":{"type":"string"},"id":{"$ref":"#/definitions/Template"},"order":{"type":"integer"},"type":{"type":"string"},"lifecycle":{"type":"string"},"relationships":{"items":{"$ref":"#/definitions/RelationshipSpec"},"type":"array"},"properties":{"items":{"$ref":"#/definitions/Property"},"type":"array"},"lookup":{"$ref":"#/definitions/CanarySpec"},"components":{"items":{"$ref":"#/definitions/ComponentSpecObject"},"type":"array"},"selectors":{"items":{"$ref":"#/definitions/ResourceSelector"},"type":"array"},"checks":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentCheck"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"},"summary":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Summary"},"forEach":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ForEach"},"logs":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LogSelector"},"type":"array"}},"additionalProperties":false,"type":"object"},"ComponentStatus":{"properties":{"status":{"type":"string"}},"additionalProperties":false,"type":"object"},"Config":{"properties":{"id":{"items":{"type":"string"},"type":"array"},"type":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"tags":{"patternProperties":{".*":{"type":"string"}},"type":"object"}},"additionalProperties":false,"type":"object"},"ConfigDBCheck":{"required":["name","query"],"properties":{"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"query":{"type":"string"}},"additionalProperties":false,"type":"object"},"ConfigLookup":{"properties":{"id":{"type":"string"},"config":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Config"},"field":{"type":"string"},"display":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Display"}},"additionalProperties":false,"type":"object"},"ConfigMapKeySelector":{"required":["LocalObjectReference","key"],"properties":{"LocalObjectReference":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LocalObjectReference"},"key":{"type":"string"},"optional":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"ContainerdPullCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"expectedDigest":{"type":"string"},"expectedSize":{"type":"integer"}},"additionalProperties":false,"type":"object"},"ContainerdPushCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"}},"additionalProperties":false,"type":"object"},"DNSCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"server":{"type":"string"},"port":{"type":"integer"},"query":{"type":"string"},"querytype":{"type":"string"},"minrecords":{"type":"integer"},"exactreply":{"items":{"type":"string"},"type":"array"},"timeout":{"type":"integer"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"DatabaseBackupCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"gcp":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GCPDatabase"},"maxAge":{"type":"string"}},"additionalProperties":false,"type":"object"},"Display":{"properties":{"template":{"type":"string"},"jsonPath":{"type":"string"},"expr":{"type":"string"},"javascript":{"type":"string"}},"additionalProperties":false,"type":"object"},"DockerPullCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"expectedDigest":{"type":"string"},"expectedSize":{"type":"integer"}},"additionalProperties":false,"type":"object"},"DockerPushCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"DynatraceCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"scheme":{"type":"string"},"apiKey":{"$ref":"#/definitions/EnvVar"},"namespace":{"type":"string"}},"additionalProperties":false,"type":"object"},"EC2Check":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"ami":{"type":"string"},"userData":{"type":"string"},"securityGroup":{"type":"string"},"keepAlive":{"type":"boolean"},"waitTime":{"type":"integer"},"timeOut":{"type":"integer"},"canaryRef":{"items":{"$ref":"#/definitions/LocalObjectReference"},"type":"array"}},"additionalProperties":false,"type":"object"},"ElasticsearchCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"url":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"index":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"EnvVar":{"properties":{"name":{"type":"string"},"value":{"type":"string"},"valueFrom":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EnvVarSource"}},"additionalProperties":false,"type":"object"},"EnvVarSource":{"properties":{"configMapKeyRef":{"$ref":"#/definitions/ConfigMapKeySelector"},"secretKeyRef":{"$ref":"#/definitions/SecretKeySelector"}},"additionalProperties":false,"type":"object"},"ExecCheck":{"required":["name","script"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"script":{"type":"string"}},"additionalProperties":false,"type":"object"},"FieldsV1":{"properties":{},"additionalProperties":false,"type":"object"},"FolderCheck":{"required":["name","path"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"path":{"type":"string"},"filter":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FolderFilter"},"minAge":{"type":"string"},"maxAge":{"type":"string"},"minCount":{"type":"integer"},"maxCount":{"type":"integer"},"minSize":{"type":"string"},"maxSize":{"type":"string"},"availableSize":{"type":"string"},"totalSize":{"type":"string"},"awsConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AWSConnection"},"gcpConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GCPConnection"},"smbConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SMBConnection"},"sftpConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SFTPConnection"}},"additionalProperties":false,"type":"object"},"FolderFilter":{"properties":{"minAge":{"type":"string"},"maxAge":{"type":"string"},"minSize":{"type":"string"},"maxSize":{"type":"string"},"regex":{"type":"string"}},"additionalProperties":false,"type":"object"},"ForEach":{"properties":{"components":{"items":{"$ref":"#/definitions/ComponentSpec"},"type":"array"},"properties":{"items":{"$ref":"#/definitions/Property"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"},"selectors":{"items":{"$ref":"#/definitions/ResourceSelector"},"type":"array"},"relationships":{"items":{"$ref":"#/definitions/RelationshipSpec"},"type":"array"},"checks":{"items":{"$ref":"#/definitions/ComponentCheck"},"type":"array"}},"additionalProperties":false,"type":"object"},"GCPConnection":{"properties":{"endpoint":{"type":"string"},"credentials":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"GCPDatabase":{"required":["project","instance"],"properties":{"project":{"type":"string"},"instance":{"type":"string"},"gcpConnection":{"$ref":"#/definitions/GCPConnection"}},"additionalProperties":false,"type":"object"},"GitHubCheck":{"required":["name","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"query":{"type":"string"},"githubToken":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"HTTPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"endpoint":{"type":"string"},"namespace":{"type":"string"},"thresholdMillis":{"type":"integer"},"responseCodes":{"items":{"type":"integer"},"type":"array"},"responseContent":{"type":"string"},"responseJSONContent":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JSONCheck"},"maxSSLExpiry":{"type":"integer"},"method":{"type":"string"},"ntlm":{"type":"boolean"},"ntlmv2":{"type":"boolean"},"body":{"type":"string"},"headers":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EnvVar"},"type":"array"},"authentication":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Authentication"},"templateBody":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"HelmCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"chartmuseum":{"type":"string"},"project":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"cafile":{"type":"string"}},"additionalProperties":false,"type":"object"},"ICMPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"endpoint":{"type":"string"},"thresholdMillis":{"type":"integer"},"packetLossThreshold":{"type":"integer"},"packetCount":{"type":"integer"}},"additionalProperties":false,"type":"object"},"JSONCheck":{"required":["path","value"],"properties":{"path":{"type":"string"},"value":{"type":"string"}},"additionalProperties":false,"type":"object"},"JmeterCheck":{"required":["name","jmx"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"jmx":{"$ref":"#/definitions/EnvVar"},"host":{"type":"string"},"port":{"type":"integer"},"properties":{"items":{"type":"string"},"type":"array"},"systemProperties":{"items":{"type":"string"},"type":"array"},"responseDuration":{"type":"string"}},"additionalProperties":false,"type":"object"},"JunitCheck":{"required":["name","testResults","spec"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"testResults":{"type":"string"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"timeout":{"type":"integer"},"spec":{"additionalProperties":true}},"additionalProperties":false,"type":"object"},"KubernetesCheck":{"required":["name","kind"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"namespace":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ResourceSelector"},"resource":{"$ref":"#/definitions/ResourceSelector"},"ignore":{"items":{"type":"string"},"type":"array"},"kind":{"type":"string"},"ready":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"LDAPCheck":{"required":["name","host","auth","bindDN"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"bindDN":{"type":"string"},"userSearch":{"type":"string"},"skipTLSVerify":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"Link":{"required":["Text"],"properties":{"type":{"type":"string"},"url":{"type":"string"},"Text":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Text"}},"additionalProperties":false,"type":"object"},"LocalObjectReference":{"properties":{"name":{"type":"string"}},"additionalProperties":false,"type":"object"},"LogSelector":{"properties":{"name":{"type":"string"},"type":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"}},"additionalProperties":false,"type":"object"},"ManagedFieldsEntry":{"properties":{"manager":{"type":"string"},"operation":{"type":"string"},"apiVersion":{"type":"string"},"time":{"$ref":"#/definitions/Time"},"fieldsType":{"type":"string"},"fieldsV1":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FieldsV1"},"subresource":{"type":"string"}},"additionalProperties":false,"type":"object"},"MongoDBCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"MssqlCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"MysqlCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"NamespaceCheck":{"required":["name","podSpec"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespaceNamePrefix":{"type":"string"},"namespaceLabels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespaceAnnotations":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"podSpec":{"type":"string"},"schedule_timeout":{"type":"integer"},"readyTimeout":{"type":"integer"},"httpTimeout":{"type":"integer"},"deleteTimeout":{"type":"integer"},"ingressTimeout":{"type":"integer"},"httpRetryInterval":{"type":"integer"},"deadline":{"type":"integer"},"port":{"type":"integer"},"path":{"type":"string"},"ingressName":{"type":"string"},"ingressHost":{"type":"string"},"expectedContent":{"type":"string"},"expectedHttpStatuses":{"items":{"type":"integer"},"type":"array"},"priorityClass":{"type":"string"}},"additionalProperties":false,"type":"object"},"ObjectFieldSelector":{"required":["fieldPath"],"properties":{"apiVersion":{"type":"string"},"fieldPath":{"type":"string"}},"additionalProperties":false,"type":"object"},"ObjectMeta":{"properties":{"name":{"type":"string"},"generateName":{"type":"string"},"namespace":{"type":"string"},"selfLink":{"type":"string"},"uid":{"type":"string"},"resourceVersion":{"type":"string"},"generation":{"type":"integer"},"creationTimestamp":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Time"},"deletionTimestamp":{"$ref":"#/definitions/Time"},"deletionGracePeriodSeconds":{"type":"integer"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"annotations":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"ownerReferences":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/OwnerReference"},"type":"array"},"finalizers":{"items":{"type":"string"},"type":"array"},"managedFields":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ManagedFieldsEntry"},"type":"array"}},"additionalProperties":false,"type":"object"},"OwnerReference":{"required":["apiVersion","kind","name","uid"],"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"},"controller":{"type":"boolean"},"blockOwnerDeletion":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"PodCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespace":{"type":"string"},"spec":{"type":"string"},"scheduleTimeout":{"type":"integer"},"readyTimeout":{"type":"integer"},"httpTimeout":{"type":"integer"},"deleteTimeout":{"type":"integer"},"ingressTimeout":{"type":"integer"},"httpRetryInterval":{"type":"integer"},"deadline":{"type":"integer"},"port":{"type":"integer"},"path":{"type":"string"},"ingressName":{"type":"string"},"ingressHost":{"type":"string"},"ingressClass":{"type":"string"},"expectedContent":{"type":"string"},"expectedHttpStatuses":{"items":{"type":"integer"},"type":"array"},"priorityClass":{"type":"string"}},"additionalProperties":false,"type":"object"},"PostgresCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"PrometheusCheck":{"required":["name","host","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"query":{"type":"string"}},"additionalProperties":false,"type":"object"},"Property":{"properties":{"label":{"type":"string"},"name":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"text":{"type":"string"},"order":{"type":"integer"},"headline":{"type":"boolean"},"type":{"type":"string"},"color":{"type":"string"},"unit":{"type":"string"},"value":{"type":"integer"},"max":{"type":"integer"},"min":{"type":"integer"},"status":{"type":"string"},"lastTransition":{"type":"string"},"links":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Link"},"type":"array"},"lookup":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CanarySpec"},"configLookup":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigLookup"},"summary":{"$ref":"#/definitions/Template"}},"additionalProperties":false,"type":"object"},"RedisCheck":{"required":["name","addr","db"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"addr":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"db":{"type":"integer"}},"additionalProperties":false,"type":"object"},"RelationshipSpec":{"properties":{"type":{"type":"string"},"ref":{"type":"string"}},"additionalProperties":false,"type":"object"},"ResourceSelector":{"properties":{"name":{"type":"string"},"labelSelector":{"type":"string"},"fieldSelector":{"type":"string"}},"additionalProperties":false,"type":"object"},"ResticCheck":{"required":["name","repository","password","maxAge"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"repository":{"type":"string"},"password":{"$ref":"#/definitions/EnvVar"},"maxAge":{"type":"string"},"checkIntegrity":{"type":"boolean"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"caCert":{"type":"string"}},"additionalProperties":false,"type":"object"},"S3Check":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"bucket":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Bucket"},"accessKey":{"type":"string"},"secretKey":{"type":"string"},"objectPath":{"type":"string"},"skipTLSVerify":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"SFTPConnection":{"required":["host","auth"],"properties":{"port":{"type":"integer"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"SMBConnection":{"required":["auth"],"properties":{"port":{"type":"integer"},"auth":{"$ref":"#/definitions/Authentication"},"domain":{"type":"string"},"workstation":{"type":"string"},"sharename":{"type":"string"},"searchPath":{"type":"string"}},"additionalProperties":false,"type":"object"},"SecretKeySelector":{"required":["LocalObjectReference","key"],"properties":{"LocalObjectReference":{"$ref":"#/definitions/LocalObjectReference"},"key":{"type":"string"},"optional":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"Summary":{"properties":{"healthy":{"type":"integer"},"unhealthy":{"type":"integer"},"warning":{"type":"integer"},"info":{"type":"integer"},"incidents":{"patternProperties":{".*":{"patternProperties":{".*":{"type":"integer"}},"type":"object"}},"type":"object"},"insights":{"patternProperties":{".*":{"patternProperties":{".*":{"type":"integer"}},"type":"object"}},"type":"object"}},"additionalProperties":false,"type":"object"},"TCPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"endpoint":{"type":"string"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"Template":{"properties":{"template":{"type":"string"},"jsonPath":{"type":"string"},"expr":{"type":"string"},"javascript":{"type":"string"}},"additionalProperties":false,"type":"object"},"Text":{"properties":{"tooltip":{"type":"string"},"icon":{"type":"string"},"text":{"type":"string"},"label":{"type":"string"}},"additionalProperties":false,"type":"object"},"Time":{"properties":{},"additionalProperties":false,"type":"object"},"TypeMeta":{"properties":{"kind":{"type":"string"},"apiVersion":{"type":"string"}},"additionalProperties":false,"type":"object"},"VarSource":{"properties":{"fieldRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ObjectFieldSelector"},"value":{"type":"string"},"configMapKeyRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigMapKeySelector"},"secretKeyRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SecretKeySelector"}},"additionalProperties":false,"type":"object"}}} \ No newline at end of file +{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Component","definitions":{"AWSConnection":{"properties":{"connection":{"type":"string"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"AlertManagerCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"alerts":{"items":{"type":"string"},"type":"array"},"filters":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"ignore":{"items":{"type":"string"},"type":"array"}},"additionalProperties":false,"type":"object"},"Authentication":{"required":["username","password"],"properties":{"username":{"$ref":"#/definitions/EnvVar"},"password":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"AwsConfigCheck":{"required":["name","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"query":{"type":"string"},"awsConnection":{"$ref":"#/definitions/AWSConnection"},"aggregatorName":{"type":"string"}},"additionalProperties":false,"type":"object"},"AwsConfigRuleCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"ignoreRules":{"items":{"type":"string"},"type":"array"},"rules":{"items":{"type":"string"},"type":"array"},"complianceTypes":{"items":{"type":"string"},"type":"array"},"awsConnection":{"$ref":"#/definitions/AWSConnection"}},"additionalProperties":false,"type":"object"},"AzureDevopsCheck":{"required":["name","organization","personalAccessToken","project","pipeline","variables","branch","thresholdMillis"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"organization":{"type":"string"},"personalAccessToken":{"$ref":"#/definitions/EnvVar"},"project":{"type":"string"},"pipeline":{"type":"string"},"variables":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"branch":{"items":{"type":"string"},"type":"array"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"CanarySpec":{"properties":{"env":{"patternProperties":{".*":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/VarSource"}},"type":"object"},"http":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/HTTPCheck"},"type":"array"},"dns":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DNSCheck"},"type":"array"},"docker":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DockerPullCheck"},"type":"array"},"dockerPush":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DockerPushCheck"},"type":"array"},"containerd":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ContainerdPullCheck"},"type":"array"},"containerdPush":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ContainerdPushCheck"},"type":"array"},"s3":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/S3Check"},"type":"array"},"tcp":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TCPCheck"},"type":"array"},"pod":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PodCheck"},"type":"array"},"ldap":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LDAPCheck"},"type":"array"},"icmp":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ICMPCheck"},"type":"array"},"postgres":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PostgresCheck"},"type":"array"},"mssql":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MssqlCheck"},"type":"array"},"mysql":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MysqlCheck"},"type":"array"},"restic":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ResticCheck"},"type":"array"},"jmeter":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JmeterCheck"},"type":"array"},"junit":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JunitCheck"},"type":"array"},"helm":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/HelmCheck"},"type":"array"},"namespace":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/NamespaceCheck"},"type":"array"},"redis":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/RedisCheck"},"type":"array"},"ec2":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EC2Check"},"type":"array"},"prometheus":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PrometheusCheck"},"type":"array"},"mongodb":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MongoDBCheck"},"type":"array"},"cloudwatch":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CloudWatchCheck"},"type":"array"},"github":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GitHubCheck"},"type":"array"},"kubernetes":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/KubernetesCheck"},"type":"array"},"folder":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FolderCheck"},"type":"array"},"exec":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ExecCheck"},"type":"array"},"awsConfig":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AwsConfigCheck"},"type":"array"},"awsConfigRule":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AwsConfigRuleCheck"},"type":"array"},"databaseBackup":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DatabaseBackupCheck"},"type":"array"},"configDB":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigDBCheck"},"type":"array"},"elasticsearch":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ElasticsearchCheck"},"type":"array"},"alertmanager":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AlertManagerCheck"},"type":"array"},"dynatrace":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DynatraceCheck"},"type":"array"},"azureDevops":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AzureDevopsCheck"},"type":"array"},"interval":{"type":"integer"},"schedule":{"type":"string"},"icon":{"type":"string"},"severity":{"type":"string"},"owner":{"type":"string"},"resultMode":{"type":"string"}},"additionalProperties":false,"type":"object"},"CloudWatchCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"filter":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CloudWatchFilter"}},"additionalProperties":false,"type":"object"},"CloudWatchFilter":{"properties":{"actionPrefix":{"type":"string"},"alarmPrefix":{"type":"string"},"alarms":{"items":{"type":"string"},"type":"array"},"state":{"type":"string"}},"additionalProperties":false,"type":"object"},"Component":{"required":["TypeMeta"],"properties":{"TypeMeta":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TypeMeta"},"metadata":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ObjectMeta"},"spec":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentSpec"},"status":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentStatus"}},"additionalProperties":false,"type":"object"},"ComponentCheck":{"properties":{"selector":{"$ref":"#/definitions/ResourceSelector"},"inline":{"$ref":"#/definitions/CanarySpec"}},"additionalProperties":false,"type":"object"},"ComponentSpec":{"properties":{"name":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"owner":{"type":"string"},"id":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Template"},"order":{"type":"integer"},"type":{"type":"string"},"lifecycle":{"type":"string"},"relationships":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/RelationshipSpec"},"type":"array"},"properties":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Property"},"type":"array"},"lookup":{"$ref":"#/definitions/CanarySpec"},"components":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentSpecObject"},"type":"array"},"selectors":{"items":{"$ref":"#/definitions/ResourceSelector"},"type":"array"},"checks":{"items":{"$ref":"#/definitions/ComponentCheck"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"},"summary":{"$ref":"#/definitions/Summary"},"forEach":{"$ref":"#/definitions/ForEach"},"logs":{"items":{"$ref":"#/definitions/LogSelector"},"type":"array"}},"additionalProperties":false,"type":"object"},"ComponentSpecObject":{"properties":{"name":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"owner":{"type":"string"},"id":{"$ref":"#/definitions/Template"},"order":{"type":"integer"},"type":{"type":"string"},"lifecycle":{"type":"string"},"relationships":{"items":{"$ref":"#/definitions/RelationshipSpec"},"type":"array"},"properties":{"items":{"$ref":"#/definitions/Property"},"type":"array"},"lookup":{"$ref":"#/definitions/CanarySpec"},"components":{"items":{"$ref":"#/definitions/ComponentSpecObject"},"type":"array"},"selectors":{"items":{"$ref":"#/definitions/ResourceSelector"},"type":"array"},"checks":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentCheck"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"},"summary":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Summary"},"forEach":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ForEach"},"logs":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LogSelector"},"type":"array"}},"additionalProperties":false,"type":"object"},"ComponentStatus":{"properties":{"status":{"type":"string"}},"additionalProperties":false,"type":"object"},"Config":{"properties":{"id":{"items":{"type":"string"},"type":"array"},"type":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"tags":{"patternProperties":{".*":{"type":"string"}},"type":"object"}},"additionalProperties":false,"type":"object"},"ConfigDBCheck":{"required":["name","query"],"properties":{"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"query":{"type":"string"}},"additionalProperties":false,"type":"object"},"ConfigLookup":{"properties":{"id":{"type":"string"},"config":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Config"},"field":{"type":"string"},"display":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Display"}},"additionalProperties":false,"type":"object"},"ConfigMapKeySelector":{"required":["LocalObjectReference","key"],"properties":{"LocalObjectReference":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LocalObjectReference"},"key":{"type":"string"},"optional":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"ContainerdPullCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"expectedDigest":{"type":"string"},"expectedSize":{"type":"integer"}},"additionalProperties":false,"type":"object"},"ContainerdPushCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"}},"additionalProperties":false,"type":"object"},"DNSCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"server":{"type":"string"},"port":{"type":"integer"},"query":{"type":"string"},"querytype":{"type":"string"},"minrecords":{"type":"integer"},"exactreply":{"items":{"type":"string"},"type":"array"},"timeout":{"type":"integer"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"DatabaseBackupCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"gcp":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GCPDatabase"},"maxAge":{"type":"string"}},"additionalProperties":false,"type":"object"},"Display":{"properties":{"template":{"type":"string"},"jsonPath":{"type":"string"},"expr":{"type":"string"},"javascript":{"type":"string"}},"additionalProperties":false,"type":"object"},"DockerPullCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"expectedDigest":{"type":"string"},"expectedSize":{"type":"integer"}},"additionalProperties":false,"type":"object"},"DockerPushCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"DynatraceCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"scheme":{"type":"string"},"apiKey":{"$ref":"#/definitions/EnvVar"},"namespace":{"type":"string"}},"additionalProperties":false,"type":"object"},"EC2Check":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"ami":{"type":"string"},"userData":{"type":"string"},"securityGroup":{"type":"string"},"keepAlive":{"type":"boolean"},"waitTime":{"type":"integer"},"timeOut":{"type":"integer"},"canaryRef":{"items":{"$ref":"#/definitions/LocalObjectReference"},"type":"array"}},"additionalProperties":false,"type":"object"},"ElasticsearchCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"url":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"index":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"EnvVar":{"properties":{"name":{"type":"string"},"value":{"type":"string"},"valueFrom":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EnvVarSource"}},"additionalProperties":false,"type":"object"},"EnvVarSource":{"properties":{"configMapKeyRef":{"$ref":"#/definitions/ConfigMapKeySelector"},"secretKeyRef":{"$ref":"#/definitions/SecretKeySelector"}},"additionalProperties":false,"type":"object"},"ExecCheck":{"required":["name","script"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"script":{"type":"string"}},"additionalProperties":false,"type":"object"},"FieldsV1":{"properties":{},"additionalProperties":false,"type":"object"},"FolderCheck":{"required":["name","path"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"path":{"type":"string"},"filter":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FolderFilter"},"minAge":{"type":"string"},"maxAge":{"type":"string"},"minCount":{"type":"integer"},"maxCount":{"type":"integer"},"minSize":{"type":"string"},"maxSize":{"type":"string"},"availableSize":{"type":"string"},"totalSize":{"type":"string"},"awsConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AWSConnection"},"gcpConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GCPConnection"},"smbConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SMBConnection"},"sftpConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SFTPConnection"}},"additionalProperties":false,"type":"object"},"FolderFilter":{"properties":{"minAge":{"type":"string"},"maxAge":{"type":"string"},"minSize":{"type":"string"},"maxSize":{"type":"string"},"regex":{"type":"string"}},"additionalProperties":false,"type":"object"},"ForEach":{"properties":{"components":{"items":{"$ref":"#/definitions/ComponentSpec"},"type":"array"},"properties":{"items":{"$ref":"#/definitions/Property"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"},"selectors":{"items":{"$ref":"#/definitions/ResourceSelector"},"type":"array"},"relationships":{"items":{"$ref":"#/definitions/RelationshipSpec"},"type":"array"},"checks":{"items":{"$ref":"#/definitions/ComponentCheck"},"type":"array"}},"additionalProperties":false,"type":"object"},"GCPConnection":{"properties":{"connection":{"type":"string"},"endpoint":{"type":"string"},"credentials":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"GCPDatabase":{"required":["project","instance"],"properties":{"project":{"type":"string"},"instance":{"type":"string"},"gcpConnection":{"$ref":"#/definitions/GCPConnection"}},"additionalProperties":false,"type":"object"},"GitHubCheck":{"required":["name","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"query":{"type":"string"},"githubToken":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"HTTPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"endpoint":{"type":"string"},"namespace":{"type":"string"},"thresholdMillis":{"type":"integer"},"responseCodes":{"items":{"type":"integer"},"type":"array"},"responseContent":{"type":"string"},"responseJSONContent":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JSONCheck"},"maxSSLExpiry":{"type":"integer"},"method":{"type":"string"},"ntlm":{"type":"boolean"},"ntlmv2":{"type":"boolean"},"body":{"type":"string"},"headers":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EnvVar"},"type":"array"},"authentication":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Authentication"},"templateBody":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"HelmCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"chartmuseum":{"type":"string"},"project":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"cafile":{"type":"string"}},"additionalProperties":false,"type":"object"},"ICMPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"endpoint":{"type":"string"},"thresholdMillis":{"type":"integer"},"packetLossThreshold":{"type":"integer"},"packetCount":{"type":"integer"}},"additionalProperties":false,"type":"object"},"JSONCheck":{"required":["path","value"],"properties":{"path":{"type":"string"},"value":{"type":"string"}},"additionalProperties":false,"type":"object"},"JmeterCheck":{"required":["name","jmx"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"jmx":{"$ref":"#/definitions/EnvVar"},"host":{"type":"string"},"port":{"type":"integer"},"properties":{"items":{"type":"string"},"type":"array"},"systemProperties":{"items":{"type":"string"},"type":"array"},"responseDuration":{"type":"string"}},"additionalProperties":false,"type":"object"},"JunitCheck":{"required":["name","testResults","spec"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"testResults":{"type":"string"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"timeout":{"type":"integer"},"spec":{"additionalProperties":true}},"additionalProperties":false,"type":"object"},"KubernetesCheck":{"required":["name","kind"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"namespace":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ResourceSelector"},"resource":{"$ref":"#/definitions/ResourceSelector"},"ignore":{"items":{"type":"string"},"type":"array"},"kind":{"type":"string"},"ready":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"LDAPCheck":{"required":["name","host","auth","bindDN"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"bindDN":{"type":"string"},"userSearch":{"type":"string"},"skipTLSVerify":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"Link":{"required":["Text"],"properties":{"type":{"type":"string"},"url":{"type":"string"},"Text":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Text"}},"additionalProperties":false,"type":"object"},"LocalObjectReference":{"properties":{"name":{"type":"string"}},"additionalProperties":false,"type":"object"},"LogSelector":{"properties":{"name":{"type":"string"},"type":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"}},"additionalProperties":false,"type":"object"},"ManagedFieldsEntry":{"properties":{"manager":{"type":"string"},"operation":{"type":"string"},"apiVersion":{"type":"string"},"time":{"$ref":"#/definitions/Time"},"fieldsType":{"type":"string"},"fieldsV1":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FieldsV1"},"subresource":{"type":"string"}},"additionalProperties":false,"type":"object"},"MongoDBCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"MssqlCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"MysqlCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"NamespaceCheck":{"required":["name","podSpec"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespaceNamePrefix":{"type":"string"},"namespaceLabels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespaceAnnotations":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"podSpec":{"type":"string"},"schedule_timeout":{"type":"integer"},"readyTimeout":{"type":"integer"},"httpTimeout":{"type":"integer"},"deleteTimeout":{"type":"integer"},"ingressTimeout":{"type":"integer"},"httpRetryInterval":{"type":"integer"},"deadline":{"type":"integer"},"port":{"type":"integer"},"path":{"type":"string"},"ingressName":{"type":"string"},"ingressHost":{"type":"string"},"expectedContent":{"type":"string"},"expectedHttpStatuses":{"items":{"type":"integer"},"type":"array"},"priorityClass":{"type":"string"}},"additionalProperties":false,"type":"object"},"ObjectFieldSelector":{"required":["fieldPath"],"properties":{"apiVersion":{"type":"string"},"fieldPath":{"type":"string"}},"additionalProperties":false,"type":"object"},"ObjectMeta":{"properties":{"name":{"type":"string"},"generateName":{"type":"string"},"namespace":{"type":"string"},"selfLink":{"type":"string"},"uid":{"type":"string"},"resourceVersion":{"type":"string"},"generation":{"type":"integer"},"creationTimestamp":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Time"},"deletionTimestamp":{"$ref":"#/definitions/Time"},"deletionGracePeriodSeconds":{"type":"integer"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"annotations":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"ownerReferences":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/OwnerReference"},"type":"array"},"finalizers":{"items":{"type":"string"},"type":"array"},"managedFields":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ManagedFieldsEntry"},"type":"array"}},"additionalProperties":false,"type":"object"},"OwnerReference":{"required":["apiVersion","kind","name","uid"],"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"},"controller":{"type":"boolean"},"blockOwnerDeletion":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"PodCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespace":{"type":"string"},"spec":{"type":"string"},"scheduleTimeout":{"type":"integer"},"readyTimeout":{"type":"integer"},"httpTimeout":{"type":"integer"},"deleteTimeout":{"type":"integer"},"ingressTimeout":{"type":"integer"},"httpRetryInterval":{"type":"integer"},"deadline":{"type":"integer"},"port":{"type":"integer"},"path":{"type":"string"},"ingressName":{"type":"string"},"ingressHost":{"type":"string"},"ingressClass":{"type":"string"},"expectedContent":{"type":"string"},"expectedHttpStatuses":{"items":{"type":"integer"},"type":"array"},"priorityClass":{"type":"string"}},"additionalProperties":false,"type":"object"},"PostgresCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"PrometheusCheck":{"required":["name","host","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"host":{"type":"string"},"query":{"type":"string"}},"additionalProperties":false,"type":"object"},"Property":{"properties":{"label":{"type":"string"},"name":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"text":{"type":"string"},"order":{"type":"integer"},"headline":{"type":"boolean"},"type":{"type":"string"},"color":{"type":"string"},"unit":{"type":"string"},"value":{"type":"integer"},"max":{"type":"integer"},"min":{"type":"integer"},"status":{"type":"string"},"lastTransition":{"type":"string"},"links":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Link"},"type":"array"},"lookup":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CanarySpec"},"configLookup":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigLookup"},"summary":{"$ref":"#/definitions/Template"}},"additionalProperties":false,"type":"object"},"RedisCheck":{"required":["name","addr","db"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"addr":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"db":{"type":"integer"}},"additionalProperties":false,"type":"object"},"RelationshipSpec":{"properties":{"type":{"type":"string"},"ref":{"type":"string"}},"additionalProperties":false,"type":"object"},"ResourceSelector":{"properties":{"name":{"type":"string"},"labelSelector":{"type":"string"},"fieldSelector":{"type":"string"}},"additionalProperties":false,"type":"object"},"ResticCheck":{"required":["name","repository","password","maxAge"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"awsConnectionName":{"type":"string"},"repository":{"type":"string"},"password":{"$ref":"#/definitions/EnvVar"},"maxAge":{"type":"string"},"checkIntegrity":{"type":"boolean"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"caCert":{"type":"string"}},"additionalProperties":false,"type":"object"},"S3Check":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"bucketName":{"type":"string"}},"additionalProperties":false,"type":"object"},"SFTPConnection":{"required":["host","auth"],"properties":{"connection":{"type":"string"},"port":{"type":"integer"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"SMBConnection":{"required":["auth"],"properties":{"connection":{"type":"string"},"port":{"type":"integer"},"auth":{"$ref":"#/definitions/Authentication"},"domain":{"type":"string"},"workstation":{"type":"string"},"sharename":{"type":"string"},"searchPath":{"type":"string"}},"additionalProperties":false,"type":"object"},"SecretKeySelector":{"required":["LocalObjectReference","key"],"properties":{"LocalObjectReference":{"$ref":"#/definitions/LocalObjectReference"},"key":{"type":"string"},"optional":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"Summary":{"properties":{"healthy":{"type":"integer"},"unhealthy":{"type":"integer"},"warning":{"type":"integer"},"info":{"type":"integer"},"incidents":{"patternProperties":{".*":{"patternProperties":{".*":{"type":"integer"}},"type":"object"}},"type":"object"},"insights":{"patternProperties":{".*":{"patternProperties":{".*":{"type":"integer"}},"type":"object"}},"type":"object"}},"additionalProperties":false,"type":"object"},"TCPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"endpoint":{"type":"string"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"Template":{"properties":{"template":{"type":"string"},"jsonPath":{"type":"string"},"expr":{"type":"string"},"javascript":{"type":"string"}},"additionalProperties":false,"type":"object"},"Text":{"properties":{"tooltip":{"type":"string"},"icon":{"type":"string"},"text":{"type":"string"},"label":{"type":"string"}},"additionalProperties":false,"type":"object"},"Time":{"properties":{},"additionalProperties":false,"type":"object"},"TypeMeta":{"properties":{"kind":{"type":"string"},"apiVersion":{"type":"string"}},"additionalProperties":false,"type":"object"},"VarSource":{"properties":{"fieldRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ObjectFieldSelector"},"value":{"type":"string"},"configMapKeyRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigMapKeySelector"},"secretKeyRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SecretKeySelector"}},"additionalProperties":false,"type":"object"}}} \ No newline at end of file diff --git a/config/schemas/topology.schema.json b/config/schemas/topology.schema.json index 7b44be9ee..30d7f0d92 100644 --- a/config/schemas/topology.schema.json +++ b/config/schemas/topology.schema.json @@ -1 +1 @@ -{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Topology","definitions":{"AWSConnection":{"properties":{"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"AlertManagerCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"alerts":{"items":{"type":"string"},"type":"array"},"filters":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"ignore":{"items":{"type":"string"},"type":"array"}},"additionalProperties":false,"type":"object"},"Authentication":{"required":["username","password"],"properties":{"username":{"$ref":"#/definitions/EnvVar"},"password":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"AwsConfigCheck":{"required":["name","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"query":{"type":"string"},"awsConnection":{"$ref":"#/definitions/AWSConnection"},"aggregatorName":{"type":"string"}},"additionalProperties":false,"type":"object"},"AwsConfigRuleCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"ignoreRules":{"items":{"type":"string"},"type":"array"},"rules":{"items":{"type":"string"},"type":"array"},"complianceTypes":{"items":{"type":"string"},"type":"array"},"awsConnection":{"$ref":"#/definitions/AWSConnection"}},"additionalProperties":false,"type":"object"},"AzureDevopsCheck":{"required":["name","organization","personalAccessToken","project","pipeline","variables","branch","thresholdMillis"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"organization":{"type":"string"},"personalAccessToken":{"$ref":"#/definitions/EnvVar"},"project":{"type":"string"},"pipeline":{"type":"string"},"variables":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"branch":{"items":{"type":"string"},"type":"array"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"Bucket":{"properties":{"name":{"type":"string"},"region":{"type":"string"},"endpoint":{"type":"string"}},"additionalProperties":false,"type":"object"},"CanarySpec":{"properties":{"env":{"patternProperties":{".*":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/VarSource"}},"type":"object"},"http":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/HTTPCheck"},"type":"array"},"dns":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DNSCheck"},"type":"array"},"docker":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DockerPullCheck"},"type":"array"},"dockerPush":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DockerPushCheck"},"type":"array"},"containerd":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ContainerdPullCheck"},"type":"array"},"containerdPush":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ContainerdPushCheck"},"type":"array"},"s3":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/S3Check"},"type":"array"},"tcp":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TCPCheck"},"type":"array"},"pod":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PodCheck"},"type":"array"},"ldap":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LDAPCheck"},"type":"array"},"icmp":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ICMPCheck"},"type":"array"},"postgres":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PostgresCheck"},"type":"array"},"mssql":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MssqlCheck"},"type":"array"},"mysql":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MysqlCheck"},"type":"array"},"restic":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ResticCheck"},"type":"array"},"jmeter":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JmeterCheck"},"type":"array"},"junit":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JunitCheck"},"type":"array"},"helm":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/HelmCheck"},"type":"array"},"namespace":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/NamespaceCheck"},"type":"array"},"redis":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/RedisCheck"},"type":"array"},"ec2":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EC2Check"},"type":"array"},"prometheus":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PrometheusCheck"},"type":"array"},"mongodb":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MongoDBCheck"},"type":"array"},"cloudwatch":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CloudWatchCheck"},"type":"array"},"github":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GitHubCheck"},"type":"array"},"kubernetes":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/KubernetesCheck"},"type":"array"},"folder":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FolderCheck"},"type":"array"},"exec":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ExecCheck"},"type":"array"},"awsConfig":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AwsConfigCheck"},"type":"array"},"awsConfigRule":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AwsConfigRuleCheck"},"type":"array"},"databaseBackup":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DatabaseBackupCheck"},"type":"array"},"configDB":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigDBCheck"},"type":"array"},"elasticsearch":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ElasticsearchCheck"},"type":"array"},"alertmanager":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AlertManagerCheck"},"type":"array"},"dynatrace":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DynatraceCheck"},"type":"array"},"azureDevops":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AzureDevopsCheck"},"type":"array"},"interval":{"type":"integer"},"schedule":{"type":"string"},"icon":{"type":"string"},"severity":{"type":"string"},"owner":{"type":"string"},"resultMode":{"type":"string"}},"additionalProperties":false,"type":"object"},"CloudWatchCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"filter":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CloudWatchFilter"}},"additionalProperties":false,"type":"object"},"CloudWatchFilter":{"properties":{"actionPrefix":{"type":"string"},"alarmPrefix":{"type":"string"},"alarms":{"items":{"type":"string"},"type":"array"},"state":{"type":"string"}},"additionalProperties":false,"type":"object"},"ComponentCheck":{"properties":{"selector":{"$ref":"#/definitions/ResourceSelector"},"inline":{"$ref":"#/definitions/CanarySpec"}},"additionalProperties":false,"type":"object"},"ComponentSpec":{"properties":{"name":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"owner":{"type":"string"},"id":{"$ref":"#/definitions/Template"},"order":{"type":"integer"},"type":{"type":"string"},"lifecycle":{"type":"string"},"relationships":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/RelationshipSpec"},"type":"array"},"properties":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Property"},"type":"array"},"lookup":{"$ref":"#/definitions/CanarySpec"},"components":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentSpecObject"},"type":"array"},"selectors":{"items":{"$ref":"#/definitions/ResourceSelector"},"type":"array"},"checks":{"items":{"$ref":"#/definitions/ComponentCheck"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"},"summary":{"$ref":"#/definitions/Summary"},"forEach":{"$ref":"#/definitions/ForEach"},"logs":{"items":{"$ref":"#/definitions/LogSelector"},"type":"array"}},"additionalProperties":false,"type":"object"},"ComponentSpecObject":{"properties":{"name":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"owner":{"type":"string"},"id":{"$ref":"#/definitions/Template"},"order":{"type":"integer"},"type":{"type":"string"},"lifecycle":{"type":"string"},"relationships":{"items":{"$ref":"#/definitions/RelationshipSpec"},"type":"array"},"properties":{"items":{"$ref":"#/definitions/Property"},"type":"array"},"lookup":{"$ref":"#/definitions/CanarySpec"},"components":{"items":{"$ref":"#/definitions/ComponentSpecObject"},"type":"array"},"selectors":{"items":{"$ref":"#/definitions/ResourceSelector"},"type":"array"},"checks":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentCheck"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"},"summary":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Summary"},"forEach":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ForEach"},"logs":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LogSelector"},"type":"array"}},"additionalProperties":false,"type":"object"},"Config":{"properties":{"id":{"items":{"type":"string"},"type":"array"},"type":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"tags":{"patternProperties":{".*":{"type":"string"}},"type":"object"}},"additionalProperties":false,"type":"object"},"ConfigDBCheck":{"required":["name","query"],"properties":{"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"query":{"type":"string"}},"additionalProperties":false,"type":"object"},"ConfigLookup":{"properties":{"id":{"type":"string"},"config":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Config"},"field":{"type":"string"},"display":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Display"}},"additionalProperties":false,"type":"object"},"ConfigMapKeySelector":{"required":["LocalObjectReference","key"],"properties":{"LocalObjectReference":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LocalObjectReference"},"key":{"type":"string"},"optional":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"ContainerdPullCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"expectedDigest":{"type":"string"},"expectedSize":{"type":"integer"}},"additionalProperties":false,"type":"object"},"ContainerdPushCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"}},"additionalProperties":false,"type":"object"},"DNSCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"server":{"type":"string"},"port":{"type":"integer"},"query":{"type":"string"},"querytype":{"type":"string"},"minrecords":{"type":"integer"},"exactreply":{"items":{"type":"string"},"type":"array"},"timeout":{"type":"integer"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"DatabaseBackupCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"gcp":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GCPDatabase"},"maxAge":{"type":"string"}},"additionalProperties":false,"type":"object"},"Display":{"properties":{"template":{"type":"string"},"jsonPath":{"type":"string"},"expr":{"type":"string"},"javascript":{"type":"string"}},"additionalProperties":false,"type":"object"},"DockerPullCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"expectedDigest":{"type":"string"},"expectedSize":{"type":"integer"}},"additionalProperties":false,"type":"object"},"DockerPushCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"DynatraceCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"scheme":{"type":"string"},"apiKey":{"$ref":"#/definitions/EnvVar"},"namespace":{"type":"string"}},"additionalProperties":false,"type":"object"},"EC2Check":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"ami":{"type":"string"},"userData":{"type":"string"},"securityGroup":{"type":"string"},"keepAlive":{"type":"boolean"},"waitTime":{"type":"integer"},"timeOut":{"type":"integer"},"canaryRef":{"items":{"$ref":"#/definitions/LocalObjectReference"},"type":"array"}},"additionalProperties":false,"type":"object"},"ElasticsearchCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"url":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"index":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"EnvVar":{"properties":{"name":{"type":"string"},"value":{"type":"string"},"valueFrom":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EnvVarSource"}},"additionalProperties":false,"type":"object"},"EnvVarSource":{"properties":{"configMapKeyRef":{"$ref":"#/definitions/ConfigMapKeySelector"},"secretKeyRef":{"$ref":"#/definitions/SecretKeySelector"}},"additionalProperties":false,"type":"object"},"ExecCheck":{"required":["name","script"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"script":{"type":"string"}},"additionalProperties":false,"type":"object"},"FieldsV1":{"properties":{},"additionalProperties":false,"type":"object"},"FolderCheck":{"required":["name","path"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"path":{"type":"string"},"filter":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FolderFilter"},"minAge":{"type":"string"},"maxAge":{"type":"string"},"minCount":{"type":"integer"},"maxCount":{"type":"integer"},"minSize":{"type":"string"},"maxSize":{"type":"string"},"availableSize":{"type":"string"},"totalSize":{"type":"string"},"awsConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AWSConnection"},"gcpConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GCPConnection"},"smbConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SMBConnection"},"sftpConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SFTPConnection"}},"additionalProperties":false,"type":"object"},"FolderFilter":{"properties":{"minAge":{"type":"string"},"maxAge":{"type":"string"},"minSize":{"type":"string"},"maxSize":{"type":"string"},"regex":{"type":"string"}},"additionalProperties":false,"type":"object"},"ForEach":{"properties":{"components":{"items":{"$ref":"#/definitions/ComponentSpec"},"type":"array"},"properties":{"items":{"$ref":"#/definitions/Property"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"},"selectors":{"items":{"$ref":"#/definitions/ResourceSelector"},"type":"array"},"relationships":{"items":{"$ref":"#/definitions/RelationshipSpec"},"type":"array"},"checks":{"items":{"$ref":"#/definitions/ComponentCheck"},"type":"array"}},"additionalProperties":false,"type":"object"},"GCPConnection":{"properties":{"endpoint":{"type":"string"},"credentials":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"GCPDatabase":{"required":["project","instance"],"properties":{"project":{"type":"string"},"instance":{"type":"string"},"gcpConnection":{"$ref":"#/definitions/GCPConnection"}},"additionalProperties":false,"type":"object"},"GitHubCheck":{"required":["name","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"query":{"type":"string"},"githubToken":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"HTTPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"endpoint":{"type":"string"},"namespace":{"type":"string"},"thresholdMillis":{"type":"integer"},"responseCodes":{"items":{"type":"integer"},"type":"array"},"responseContent":{"type":"string"},"responseJSONContent":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JSONCheck"},"maxSSLExpiry":{"type":"integer"},"method":{"type":"string"},"ntlm":{"type":"boolean"},"ntlmv2":{"type":"boolean"},"body":{"type":"string"},"headers":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EnvVar"},"type":"array"},"authentication":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Authentication"},"templateBody":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"HelmCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"chartmuseum":{"type":"string"},"project":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"cafile":{"type":"string"}},"additionalProperties":false,"type":"object"},"ICMPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"endpoint":{"type":"string"},"thresholdMillis":{"type":"integer"},"packetLossThreshold":{"type":"integer"},"packetCount":{"type":"integer"}},"additionalProperties":false,"type":"object"},"JSONCheck":{"required":["path","value"],"properties":{"path":{"type":"string"},"value":{"type":"string"}},"additionalProperties":false,"type":"object"},"JmeterCheck":{"required":["name","jmx"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"jmx":{"$ref":"#/definitions/EnvVar"},"host":{"type":"string"},"port":{"type":"integer"},"properties":{"items":{"type":"string"},"type":"array"},"systemProperties":{"items":{"type":"string"},"type":"array"},"responseDuration":{"type":"string"}},"additionalProperties":false,"type":"object"},"JunitCheck":{"required":["name","testResults","spec"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"testResults":{"type":"string"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"timeout":{"type":"integer"},"spec":{"additionalProperties":true}},"additionalProperties":false,"type":"object"},"KubernetesCheck":{"required":["name","kind"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"namespace":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ResourceSelector"},"resource":{"$ref":"#/definitions/ResourceSelector"},"ignore":{"items":{"type":"string"},"type":"array"},"kind":{"type":"string"},"ready":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"LDAPCheck":{"required":["name","host","auth","bindDN"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"bindDN":{"type":"string"},"userSearch":{"type":"string"},"skipTLSVerify":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"Link":{"required":["Text"],"properties":{"type":{"type":"string"},"url":{"type":"string"},"Text":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Text"}},"additionalProperties":false,"type":"object"},"LocalObjectReference":{"properties":{"name":{"type":"string"}},"additionalProperties":false,"type":"object"},"LogSelector":{"properties":{"name":{"type":"string"},"type":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"}},"additionalProperties":false,"type":"object"},"ManagedFieldsEntry":{"properties":{"manager":{"type":"string"},"operation":{"type":"string"},"apiVersion":{"type":"string"},"time":{"$ref":"#/definitions/Time"},"fieldsType":{"type":"string"},"fieldsV1":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FieldsV1"},"subresource":{"type":"string"}},"additionalProperties":false,"type":"object"},"MongoDBCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"MssqlCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"MysqlCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"NamespaceCheck":{"required":["name","podSpec"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespaceNamePrefix":{"type":"string"},"namespaceLabels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespaceAnnotations":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"podSpec":{"type":"string"},"schedule_timeout":{"type":"integer"},"readyTimeout":{"type":"integer"},"httpTimeout":{"type":"integer"},"deleteTimeout":{"type":"integer"},"ingressTimeout":{"type":"integer"},"httpRetryInterval":{"type":"integer"},"deadline":{"type":"integer"},"port":{"type":"integer"},"path":{"type":"string"},"ingressName":{"type":"string"},"ingressHost":{"type":"string"},"expectedContent":{"type":"string"},"expectedHttpStatuses":{"items":{"type":"integer"},"type":"array"},"priorityClass":{"type":"string"}},"additionalProperties":false,"type":"object"},"ObjectFieldSelector":{"required":["fieldPath"],"properties":{"apiVersion":{"type":"string"},"fieldPath":{"type":"string"}},"additionalProperties":false,"type":"object"},"ObjectMeta":{"properties":{"name":{"type":"string"},"generateName":{"type":"string"},"namespace":{"type":"string"},"selfLink":{"type":"string"},"uid":{"type":"string"},"resourceVersion":{"type":"string"},"generation":{"type":"integer"},"creationTimestamp":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Time"},"deletionTimestamp":{"$ref":"#/definitions/Time"},"deletionGracePeriodSeconds":{"type":"integer"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"annotations":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"ownerReferences":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/OwnerReference"},"type":"array"},"finalizers":{"items":{"type":"string"},"type":"array"},"managedFields":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ManagedFieldsEntry"},"type":"array"}},"additionalProperties":false,"type":"object"},"OwnerReference":{"required":["apiVersion","kind","name","uid"],"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"},"controller":{"type":"boolean"},"blockOwnerDeletion":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"PodCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespace":{"type":"string"},"spec":{"type":"string"},"scheduleTimeout":{"type":"integer"},"readyTimeout":{"type":"integer"},"httpTimeout":{"type":"integer"},"deleteTimeout":{"type":"integer"},"ingressTimeout":{"type":"integer"},"httpRetryInterval":{"type":"integer"},"deadline":{"type":"integer"},"port":{"type":"integer"},"path":{"type":"string"},"ingressName":{"type":"string"},"ingressHost":{"type":"string"},"ingressClass":{"type":"string"},"expectedContent":{"type":"string"},"expectedHttpStatuses":{"items":{"type":"integer"},"type":"array"},"priorityClass":{"type":"string"}},"additionalProperties":false,"type":"object"},"PostgresCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"PrometheusCheck":{"required":["name","host","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"query":{"type":"string"}},"additionalProperties":false,"type":"object"},"Property":{"properties":{"label":{"type":"string"},"name":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"text":{"type":"string"},"order":{"type":"integer"},"headline":{"type":"boolean"},"type":{"type":"string"},"color":{"type":"string"},"unit":{"type":"string"},"value":{"type":"integer"},"max":{"type":"integer"},"min":{"type":"integer"},"status":{"type":"string"},"lastTransition":{"type":"string"},"links":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Link"},"type":"array"},"lookup":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CanarySpec"},"configLookup":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigLookup"},"summary":{"$ref":"#/definitions/Template"}},"additionalProperties":false,"type":"object"},"RedisCheck":{"required":["name","addr","db"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"addr":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"db":{"type":"integer"}},"additionalProperties":false,"type":"object"},"RelationshipSpec":{"properties":{"type":{"type":"string"},"ref":{"type":"string"}},"additionalProperties":false,"type":"object"},"ResourceSelector":{"properties":{"name":{"type":"string"},"labelSelector":{"type":"string"},"fieldSelector":{"type":"string"}},"additionalProperties":false,"type":"object"},"ResticCheck":{"required":["name","repository","password","maxAge"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"repository":{"type":"string"},"password":{"$ref":"#/definitions/EnvVar"},"maxAge":{"type":"string"},"checkIntegrity":{"type":"boolean"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"caCert":{"type":"string"}},"additionalProperties":false,"type":"object"},"S3Check":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"bucket":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Bucket"},"accessKey":{"type":"string"},"secretKey":{"type":"string"},"objectPath":{"type":"string"},"skipTLSVerify":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"SFTPConnection":{"required":["host","auth"],"properties":{"port":{"type":"integer"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"SMBConnection":{"required":["auth"],"properties":{"port":{"type":"integer"},"auth":{"$ref":"#/definitions/Authentication"},"domain":{"type":"string"},"workstation":{"type":"string"},"sharename":{"type":"string"},"searchPath":{"type":"string"}},"additionalProperties":false,"type":"object"},"SecretKeySelector":{"required":["LocalObjectReference","key"],"properties":{"LocalObjectReference":{"$ref":"#/definitions/LocalObjectReference"},"key":{"type":"string"},"optional":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"Summary":{"properties":{"healthy":{"type":"integer"},"unhealthy":{"type":"integer"},"warning":{"type":"integer"},"info":{"type":"integer"},"incidents":{"patternProperties":{".*":{"patternProperties":{".*":{"type":"integer"}},"type":"object"}},"type":"object"},"insights":{"patternProperties":{".*":{"patternProperties":{".*":{"type":"integer"}},"type":"object"}},"type":"object"}},"additionalProperties":false,"type":"object"},"TCPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"endpoint":{"type":"string"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"Template":{"properties":{"template":{"type":"string"},"jsonPath":{"type":"string"},"expr":{"type":"string"},"javascript":{"type":"string"}},"additionalProperties":false,"type":"object"},"Text":{"properties":{"tooltip":{"type":"string"},"icon":{"type":"string"},"text":{"type":"string"},"label":{"type":"string"}},"additionalProperties":false,"type":"object"},"Time":{"properties":{},"additionalProperties":false,"type":"object"},"Topology":{"required":["TypeMeta"],"properties":{"TypeMeta":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TypeMeta"},"metadata":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ObjectMeta"},"spec":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TopologySpec"},"status":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TopologyStatus"}},"additionalProperties":false,"type":"object"},"TopologySpec":{"properties":{"type":{"type":"string"},"id":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Template"},"schedule":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"text":{"type":"string"},"label":{"type":"string"},"owner":{"type":"string"},"components":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentSpec"},"type":"array"},"properties":{"items":{"$ref":"#/definitions/Property"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"}},"additionalProperties":false,"type":"object"},"TopologyStatus":{"properties":{"persistentID":{"type":"string"},"observedGeneration":{"type":"integer"},"status":{"type":"string"}},"additionalProperties":false,"type":"object"},"TypeMeta":{"properties":{"kind":{"type":"string"},"apiVersion":{"type":"string"}},"additionalProperties":false,"type":"object"},"VarSource":{"properties":{"fieldRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ObjectFieldSelector"},"value":{"type":"string"},"configMapKeyRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigMapKeySelector"},"secretKeyRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SecretKeySelector"}},"additionalProperties":false,"type":"object"}}} \ No newline at end of file +{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Topology","definitions":{"AWSConnection":{"properties":{"connection":{"type":"string"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"AlertManagerCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"alerts":{"items":{"type":"string"},"type":"array"},"filters":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"ignore":{"items":{"type":"string"},"type":"array"}},"additionalProperties":false,"type":"object"},"Authentication":{"required":["username","password"],"properties":{"username":{"$ref":"#/definitions/EnvVar"},"password":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"AwsConfigCheck":{"required":["name","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"query":{"type":"string"},"awsConnection":{"$ref":"#/definitions/AWSConnection"},"aggregatorName":{"type":"string"}},"additionalProperties":false,"type":"object"},"AwsConfigRuleCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"ignoreRules":{"items":{"type":"string"},"type":"array"},"rules":{"items":{"type":"string"},"type":"array"},"complianceTypes":{"items":{"type":"string"},"type":"array"},"awsConnection":{"$ref":"#/definitions/AWSConnection"}},"additionalProperties":false,"type":"object"},"AzureDevopsCheck":{"required":["name","organization","personalAccessToken","project","pipeline","variables","branch","thresholdMillis"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"organization":{"type":"string"},"personalAccessToken":{"$ref":"#/definitions/EnvVar"},"project":{"type":"string"},"pipeline":{"type":"string"},"variables":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"branch":{"items":{"type":"string"},"type":"array"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"CanarySpec":{"properties":{"env":{"patternProperties":{".*":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/VarSource"}},"type":"object"},"http":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/HTTPCheck"},"type":"array"},"dns":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DNSCheck"},"type":"array"},"docker":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DockerPullCheck"},"type":"array"},"dockerPush":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DockerPushCheck"},"type":"array"},"containerd":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ContainerdPullCheck"},"type":"array"},"containerdPush":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ContainerdPushCheck"},"type":"array"},"s3":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/S3Check"},"type":"array"},"tcp":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TCPCheck"},"type":"array"},"pod":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PodCheck"},"type":"array"},"ldap":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LDAPCheck"},"type":"array"},"icmp":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ICMPCheck"},"type":"array"},"postgres":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PostgresCheck"},"type":"array"},"mssql":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MssqlCheck"},"type":"array"},"mysql":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MysqlCheck"},"type":"array"},"restic":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ResticCheck"},"type":"array"},"jmeter":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JmeterCheck"},"type":"array"},"junit":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JunitCheck"},"type":"array"},"helm":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/HelmCheck"},"type":"array"},"namespace":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/NamespaceCheck"},"type":"array"},"redis":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/RedisCheck"},"type":"array"},"ec2":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EC2Check"},"type":"array"},"prometheus":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/PrometheusCheck"},"type":"array"},"mongodb":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/MongoDBCheck"},"type":"array"},"cloudwatch":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CloudWatchCheck"},"type":"array"},"github":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GitHubCheck"},"type":"array"},"kubernetes":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/KubernetesCheck"},"type":"array"},"folder":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FolderCheck"},"type":"array"},"exec":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ExecCheck"},"type":"array"},"awsConfig":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AwsConfigCheck"},"type":"array"},"awsConfigRule":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AwsConfigRuleCheck"},"type":"array"},"databaseBackup":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DatabaseBackupCheck"},"type":"array"},"configDB":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigDBCheck"},"type":"array"},"elasticsearch":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ElasticsearchCheck"},"type":"array"},"alertmanager":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AlertManagerCheck"},"type":"array"},"dynatrace":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/DynatraceCheck"},"type":"array"},"azureDevops":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AzureDevopsCheck"},"type":"array"},"interval":{"type":"integer"},"schedule":{"type":"string"},"icon":{"type":"string"},"severity":{"type":"string"},"owner":{"type":"string"},"resultMode":{"type":"string"}},"additionalProperties":false,"type":"object"},"CloudWatchCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"filter":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CloudWatchFilter"}},"additionalProperties":false,"type":"object"},"CloudWatchFilter":{"properties":{"actionPrefix":{"type":"string"},"alarmPrefix":{"type":"string"},"alarms":{"items":{"type":"string"},"type":"array"},"state":{"type":"string"}},"additionalProperties":false,"type":"object"},"ComponentCheck":{"properties":{"selector":{"$ref":"#/definitions/ResourceSelector"},"inline":{"$ref":"#/definitions/CanarySpec"}},"additionalProperties":false,"type":"object"},"ComponentSpec":{"properties":{"name":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"owner":{"type":"string"},"id":{"$ref":"#/definitions/Template"},"order":{"type":"integer"},"type":{"type":"string"},"lifecycle":{"type":"string"},"relationships":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/RelationshipSpec"},"type":"array"},"properties":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Property"},"type":"array"},"lookup":{"$ref":"#/definitions/CanarySpec"},"components":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentSpecObject"},"type":"array"},"selectors":{"items":{"$ref":"#/definitions/ResourceSelector"},"type":"array"},"checks":{"items":{"$ref":"#/definitions/ComponentCheck"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"},"summary":{"$ref":"#/definitions/Summary"},"forEach":{"$ref":"#/definitions/ForEach"},"logs":{"items":{"$ref":"#/definitions/LogSelector"},"type":"array"}},"additionalProperties":false,"type":"object"},"ComponentSpecObject":{"properties":{"name":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"owner":{"type":"string"},"id":{"$ref":"#/definitions/Template"},"order":{"type":"integer"},"type":{"type":"string"},"lifecycle":{"type":"string"},"relationships":{"items":{"$ref":"#/definitions/RelationshipSpec"},"type":"array"},"properties":{"items":{"$ref":"#/definitions/Property"},"type":"array"},"lookup":{"$ref":"#/definitions/CanarySpec"},"components":{"items":{"$ref":"#/definitions/ComponentSpecObject"},"type":"array"},"selectors":{"items":{"$ref":"#/definitions/ResourceSelector"},"type":"array"},"checks":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentCheck"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"},"summary":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Summary"},"forEach":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ForEach"},"logs":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LogSelector"},"type":"array"}},"additionalProperties":false,"type":"object"},"Config":{"properties":{"id":{"items":{"type":"string"},"type":"array"},"type":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"tags":{"patternProperties":{".*":{"type":"string"}},"type":"object"}},"additionalProperties":false,"type":"object"},"ConfigDBCheck":{"required":["name","query"],"properties":{"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"query":{"type":"string"}},"additionalProperties":false,"type":"object"},"ConfigLookup":{"properties":{"id":{"type":"string"},"config":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Config"},"field":{"type":"string"},"display":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Display"}},"additionalProperties":false,"type":"object"},"ConfigMapKeySelector":{"required":["LocalObjectReference","key"],"properties":{"LocalObjectReference":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/LocalObjectReference"},"key":{"type":"string"},"optional":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"ContainerdPullCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"expectedDigest":{"type":"string"},"expectedSize":{"type":"integer"}},"additionalProperties":false,"type":"object"},"ContainerdPushCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"}},"additionalProperties":false,"type":"object"},"DNSCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"server":{"type":"string"},"port":{"type":"integer"},"query":{"type":"string"},"querytype":{"type":"string"},"minrecords":{"type":"integer"},"exactreply":{"items":{"type":"string"},"type":"array"},"timeout":{"type":"integer"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"DatabaseBackupCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"gcp":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GCPDatabase"},"maxAge":{"type":"string"}},"additionalProperties":false,"type":"object"},"Display":{"properties":{"template":{"type":"string"},"jsonPath":{"type":"string"},"expr":{"type":"string"},"javascript":{"type":"string"}},"additionalProperties":false,"type":"object"},"DockerPullCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"expectedDigest":{"type":"string"},"expectedSize":{"type":"integer"}},"additionalProperties":false,"type":"object"},"DockerPushCheck":{"required":["name","image"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"image":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"DynatraceCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"host":{"type":"string"},"scheme":{"type":"string"},"apiKey":{"$ref":"#/definitions/EnvVar"},"namespace":{"type":"string"}},"additionalProperties":false,"type":"object"},"EC2Check":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"ami":{"type":"string"},"userData":{"type":"string"},"securityGroup":{"type":"string"},"keepAlive":{"type":"boolean"},"waitTime":{"type":"integer"},"timeOut":{"type":"integer"},"canaryRef":{"items":{"$ref":"#/definitions/LocalObjectReference"},"type":"array"}},"additionalProperties":false,"type":"object"},"ElasticsearchCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"url":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"index":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"EnvVar":{"properties":{"name":{"type":"string"},"value":{"type":"string"},"valueFrom":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EnvVarSource"}},"additionalProperties":false,"type":"object"},"EnvVarSource":{"properties":{"configMapKeyRef":{"$ref":"#/definitions/ConfigMapKeySelector"},"secretKeyRef":{"$ref":"#/definitions/SecretKeySelector"}},"additionalProperties":false,"type":"object"},"ExecCheck":{"required":["name","script"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"script":{"type":"string"}},"additionalProperties":false,"type":"object"},"FieldsV1":{"properties":{},"additionalProperties":false,"type":"object"},"FolderCheck":{"required":["name","path"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"path":{"type":"string"},"filter":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FolderFilter"},"minAge":{"type":"string"},"maxAge":{"type":"string"},"minCount":{"type":"integer"},"maxCount":{"type":"integer"},"minSize":{"type":"string"},"maxSize":{"type":"string"},"availableSize":{"type":"string"},"totalSize":{"type":"string"},"awsConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/AWSConnection"},"gcpConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/GCPConnection"},"smbConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SMBConnection"},"sftpConnection":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SFTPConnection"}},"additionalProperties":false,"type":"object"},"FolderFilter":{"properties":{"minAge":{"type":"string"},"maxAge":{"type":"string"},"minSize":{"type":"string"},"maxSize":{"type":"string"},"regex":{"type":"string"}},"additionalProperties":false,"type":"object"},"ForEach":{"properties":{"components":{"items":{"$ref":"#/definitions/ComponentSpec"},"type":"array"},"properties":{"items":{"$ref":"#/definitions/Property"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"},"selectors":{"items":{"$ref":"#/definitions/ResourceSelector"},"type":"array"},"relationships":{"items":{"$ref":"#/definitions/RelationshipSpec"},"type":"array"},"checks":{"items":{"$ref":"#/definitions/ComponentCheck"},"type":"array"}},"additionalProperties":false,"type":"object"},"GCPConnection":{"properties":{"connection":{"type":"string"},"endpoint":{"type":"string"},"credentials":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"GCPDatabase":{"required":["project","instance"],"properties":{"project":{"type":"string"},"instance":{"type":"string"},"gcpConnection":{"$ref":"#/definitions/GCPConnection"}},"additionalProperties":false,"type":"object"},"GitHubCheck":{"required":["name","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"query":{"type":"string"},"githubToken":{"$ref":"#/definitions/EnvVar"}},"additionalProperties":false,"type":"object"},"HTTPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"endpoint":{"type":"string"},"namespace":{"type":"string"},"thresholdMillis":{"type":"integer"},"responseCodes":{"items":{"type":"integer"},"type":"array"},"responseContent":{"type":"string"},"responseJSONContent":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/JSONCheck"},"maxSSLExpiry":{"type":"integer"},"method":{"type":"string"},"ntlm":{"type":"boolean"},"ntlmv2":{"type":"boolean"},"body":{"type":"string"},"headers":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/EnvVar"},"type":"array"},"authentication":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Authentication"},"templateBody":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"HelmCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"chartmuseum":{"type":"string"},"project":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"cafile":{"type":"string"}},"additionalProperties":false,"type":"object"},"ICMPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"endpoint":{"type":"string"},"thresholdMillis":{"type":"integer"},"packetLossThreshold":{"type":"integer"},"packetCount":{"type":"integer"}},"additionalProperties":false,"type":"object"},"JSONCheck":{"required":["path","value"],"properties":{"path":{"type":"string"},"value":{"type":"string"}},"additionalProperties":false,"type":"object"},"JmeterCheck":{"required":["name","jmx"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"jmx":{"$ref":"#/definitions/EnvVar"},"host":{"type":"string"},"port":{"type":"integer"},"properties":{"items":{"type":"string"},"type":"array"},"systemProperties":{"items":{"type":"string"},"type":"array"},"responseDuration":{"type":"string"}},"additionalProperties":false,"type":"object"},"JunitCheck":{"required":["name","testResults","spec"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"testResults":{"type":"string"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"timeout":{"type":"integer"},"spec":{"additionalProperties":true}},"additionalProperties":false,"type":"object"},"KubernetesCheck":{"required":["name","kind"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"namespace":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ResourceSelector"},"resource":{"$ref":"#/definitions/ResourceSelector"},"ignore":{"items":{"type":"string"},"type":"array"},"kind":{"type":"string"},"ready":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"LDAPCheck":{"required":["name","host","auth","bindDN"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"bindDN":{"type":"string"},"userSearch":{"type":"string"},"skipTLSVerify":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"Link":{"required":["Text"],"properties":{"type":{"type":"string"},"url":{"type":"string"},"Text":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Text"}},"additionalProperties":false,"type":"object"},"LocalObjectReference":{"properties":{"name":{"type":"string"}},"additionalProperties":false,"type":"object"},"LogSelector":{"properties":{"name":{"type":"string"},"type":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"}},"additionalProperties":false,"type":"object"},"ManagedFieldsEntry":{"properties":{"manager":{"type":"string"},"operation":{"type":"string"},"apiVersion":{"type":"string"},"time":{"$ref":"#/definitions/Time"},"fieldsType":{"type":"string"},"fieldsV1":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/FieldsV1"},"subresource":{"type":"string"}},"additionalProperties":false,"type":"object"},"MongoDBCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"MssqlCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"MysqlCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"NamespaceCheck":{"required":["name","podSpec"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespaceNamePrefix":{"type":"string"},"namespaceLabels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespaceAnnotations":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"podSpec":{"type":"string"},"schedule_timeout":{"type":"integer"},"readyTimeout":{"type":"integer"},"httpTimeout":{"type":"integer"},"deleteTimeout":{"type":"integer"},"ingressTimeout":{"type":"integer"},"httpRetryInterval":{"type":"integer"},"deadline":{"type":"integer"},"port":{"type":"integer"},"path":{"type":"string"},"ingressName":{"type":"string"},"ingressHost":{"type":"string"},"expectedContent":{"type":"string"},"expectedHttpStatuses":{"items":{"type":"integer"},"type":"array"},"priorityClass":{"type":"string"}},"additionalProperties":false,"type":"object"},"ObjectFieldSelector":{"required":["fieldPath"],"properties":{"apiVersion":{"type":"string"},"fieldPath":{"type":"string"}},"additionalProperties":false,"type":"object"},"ObjectMeta":{"properties":{"name":{"type":"string"},"generateName":{"type":"string"},"namespace":{"type":"string"},"selfLink":{"type":"string"},"uid":{"type":"string"},"resourceVersion":{"type":"string"},"generation":{"type":"integer"},"creationTimestamp":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Time"},"deletionTimestamp":{"$ref":"#/definitions/Time"},"deletionGracePeriodSeconds":{"type":"integer"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"annotations":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"ownerReferences":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/OwnerReference"},"type":"array"},"finalizers":{"items":{"type":"string"},"type":"array"},"managedFields":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ManagedFieldsEntry"},"type":"array"}},"additionalProperties":false,"type":"object"},"OwnerReference":{"required":["apiVersion","kind","name","uid"],"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"},"controller":{"type":"boolean"},"blockOwnerDeletion":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"PodCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"namespace":{"type":"string"},"spec":{"type":"string"},"scheduleTimeout":{"type":"integer"},"readyTimeout":{"type":"integer"},"httpTimeout":{"type":"integer"},"deleteTimeout":{"type":"integer"},"ingressTimeout":{"type":"integer"},"httpRetryInterval":{"type":"integer"},"deadline":{"type":"integer"},"port":{"type":"integer"},"path":{"type":"string"},"ingressName":{"type":"string"},"ingressHost":{"type":"string"},"ingressClass":{"type":"string"},"expectedContent":{"type":"string"},"expectedHttpStatuses":{"items":{"type":"integer"},"type":"array"},"priorityClass":{"type":"string"}},"additionalProperties":false,"type":"object"},"PostgresCheck":{"required":["name","connection"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"query":{"type":"string"},"results":{"type":"integer"}},"additionalProperties":false,"type":"object"},"PrometheusCheck":{"required":["name","host","query"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"test":{"$ref":"#/definitions/Template"},"display":{"$ref":"#/definitions/Template"},"transform":{"$ref":"#/definitions/Template"},"connection":{"type":"string"},"host":{"type":"string"},"query":{"type":"string"}},"additionalProperties":false,"type":"object"},"Property":{"properties":{"label":{"type":"string"},"name":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"text":{"type":"string"},"order":{"type":"integer"},"headline":{"type":"boolean"},"type":{"type":"string"},"color":{"type":"string"},"unit":{"type":"string"},"value":{"type":"integer"},"max":{"type":"integer"},"min":{"type":"integer"},"status":{"type":"string"},"lastTransition":{"type":"string"},"links":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Link"},"type":"array"},"lookup":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/CanarySpec"},"configLookup":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigLookup"},"summary":{"$ref":"#/definitions/Template"}},"additionalProperties":false,"type":"object"},"RedisCheck":{"required":["name","addr","db"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"addr":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"},"db":{"type":"integer"}},"additionalProperties":false,"type":"object"},"RelationshipSpec":{"properties":{"type":{"type":"string"},"ref":{"type":"string"}},"additionalProperties":false,"type":"object"},"ResourceSelector":{"properties":{"name":{"type":"string"},"labelSelector":{"type":"string"},"fieldSelector":{"type":"string"}},"additionalProperties":false,"type":"object"},"ResticCheck":{"required":["name","repository","password","maxAge"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"awsConnectionName":{"type":"string"},"repository":{"type":"string"},"password":{"$ref":"#/definitions/EnvVar"},"maxAge":{"type":"string"},"checkIntegrity":{"type":"boolean"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"caCert":{"type":"string"}},"additionalProperties":false,"type":"object"},"S3Check":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"connection":{"type":"string"},"accessKey":{"$ref":"#/definitions/EnvVar"},"secretKey":{"$ref":"#/definitions/EnvVar"},"region":{"type":"string"},"endpoint":{"type":"string"},"skipTLSVerify":{"type":"boolean"},"objectPath":{"type":"string"},"usePathStyle":{"type":"boolean"},"bucketName":{"type":"string"}},"additionalProperties":false,"type":"object"},"SFTPConnection":{"required":["host","auth"],"properties":{"connection":{"type":"string"},"port":{"type":"integer"},"host":{"type":"string"},"auth":{"$ref":"#/definitions/Authentication"}},"additionalProperties":false,"type":"object"},"SMBConnection":{"required":["auth"],"properties":{"connection":{"type":"string"},"port":{"type":"integer"},"auth":{"$ref":"#/definitions/Authentication"},"domain":{"type":"string"},"workstation":{"type":"string"},"sharename":{"type":"string"},"searchPath":{"type":"string"}},"additionalProperties":false,"type":"object"},"SecretKeySelector":{"required":["LocalObjectReference","key"],"properties":{"LocalObjectReference":{"$ref":"#/definitions/LocalObjectReference"},"key":{"type":"string"},"optional":{"type":"boolean"}},"additionalProperties":false,"type":"object"},"Summary":{"properties":{"healthy":{"type":"integer"},"unhealthy":{"type":"integer"},"warning":{"type":"integer"},"info":{"type":"integer"},"incidents":{"patternProperties":{".*":{"patternProperties":{".*":{"type":"integer"}},"type":"object"}},"type":"object"},"insights":{"patternProperties":{".*":{"patternProperties":{".*":{"type":"integer"}},"type":"object"}},"type":"object"}},"additionalProperties":false,"type":"object"},"TCPCheck":{"required":["name"],"properties":{"description":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"labels":{"patternProperties":{".*":{"type":"string"}},"type":"object"},"endpoint":{"type":"string"},"thresholdMillis":{"type":"integer"}},"additionalProperties":false,"type":"object"},"Template":{"properties":{"template":{"type":"string"},"jsonPath":{"type":"string"},"expr":{"type":"string"},"javascript":{"type":"string"}},"additionalProperties":false,"type":"object"},"Text":{"properties":{"tooltip":{"type":"string"},"icon":{"type":"string"},"text":{"type":"string"},"label":{"type":"string"}},"additionalProperties":false,"type":"object"},"Time":{"properties":{},"additionalProperties":false,"type":"object"},"Topology":{"required":["TypeMeta"],"properties":{"TypeMeta":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TypeMeta"},"metadata":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ObjectMeta"},"spec":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TopologySpec"},"status":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/TopologyStatus"}},"additionalProperties":false,"type":"object"},"TopologySpec":{"properties":{"type":{"type":"string"},"id":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/Template"},"schedule":{"type":"string"},"tooltip":{"type":"string"},"icon":{"type":"string"},"text":{"type":"string"},"label":{"type":"string"},"owner":{"type":"string"},"components":{"items":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ComponentSpec"},"type":"array"},"properties":{"items":{"$ref":"#/definitions/Property"},"type":"array"},"configs":{"items":{"$ref":"#/definitions/Config"},"type":"array"}},"additionalProperties":false,"type":"object"},"TopologyStatus":{"properties":{"persistentID":{"type":"string"},"observedGeneration":{"type":"integer"},"status":{"type":"string"}},"additionalProperties":false,"type":"object"},"TypeMeta":{"properties":{"kind":{"type":"string"},"apiVersion":{"type":"string"}},"additionalProperties":false,"type":"object"},"VarSource":{"properties":{"fieldRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ObjectFieldSelector"},"value":{"type":"string"},"configMapKeyRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/ConfigMapKeySelector"},"secretKeyRef":{"$schema":"http://json-schema.org/draft-04/schema#","$ref":"#/definitions/SecretKeySelector"}},"additionalProperties":false,"type":"object"}}} \ No newline at end of file diff --git a/fixtures/datasources/SFTP/sftp_fail_connection.yaml b/fixtures/datasources/SFTP/sftp_fail_connection.yaml new file mode 100644 index 000000000..f58afa05c --- /dev/null +++ b/fixtures/datasources/SFTP/sftp_fail_connection.yaml @@ -0,0 +1,12 @@ +apiVersion: canaries.flanksource.com/v1 +kind: Canary +metadata: + name: sftp-pass +spec: + interval: 30 + folder: + - path: /tmp/premier-league + name: sample sftp check + sftpConnection: + connection: connection://sftp/emirates + maxCount: 10 \ No newline at end of file diff --git a/fixtures/minimal/http_fail_connection.yaml b/fixtures/minimal/http_fail_connection.yaml new file mode 100644 index 000000000..43da9aee5 --- /dev/null +++ b/fixtures/minimal/http_fail_connection.yaml @@ -0,0 +1,18 @@ +apiVersion: canaries.flanksource.com/v1 +kind: Canary +metadata: + name: http-fail + labels: + "Expected-Fail": "true" +spec: + interval: 30 + http: + - connection: 'connection://http/500' + name: http fail response code check + responseCodes: [200] + - connection: 'connection://http/200' + name: http fail test expr check + display: + expr: sprint(code) + " should be 500" + test: + expr: code == 500 diff --git a/go.mod b/go.mod index 4edb697d5..9a3b9bf10 100644 --- a/go.mod +++ b/go.mod @@ -281,8 +281,8 @@ require ( k8s.io/apiextensions-apiserver v0.26.0 // indirect k8s.io/cli-runtime v0.24.4 // indirect k8s.io/component-base v0.26.0 // indirect - k8s.io/klog/v2 v2.90.1 // indirect - k8s.io/kube-openapi v0.0.0-20230426210814-b0c0aaee3cc0 // indirect + k8s.io/klog/v2 v2.100.1 // indirect + k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f // indirect k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/kustomize v2.0.3+incompatible // indirect diff --git a/go.sum b/go.sum index c8456d305..deecce3bf 100644 --- a/go.sum +++ b/go.sum @@ -3550,8 +3550,8 @@ k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.40.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw= -k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= +k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= @@ -3561,8 +3561,8 @@ k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lV k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/kube-openapi v0.0.0-20230426210814-b0c0aaee3cc0 h1:XET+pmtvzC9NYUnHIX8PUPDoxqMTtDCJMRfJpoUSWow= -k8s.io/kube-openapi v0.0.0-20230426210814-b0c0aaee3cc0/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg= +k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg= +k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= diff --git a/hack/generate-schemas/go.mod b/hack/generate-schemas/go.mod index 17cb1bd45..e03e48ff7 100644 --- a/hack/generate-schemas/go.mod +++ b/hack/generate-schemas/go.mod @@ -119,6 +119,7 @@ require ( github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/liamylian/jsontime/v2 v2.0.0 // indirect + github.com/lib/pq v1.10.9 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.18 // indirect @@ -172,8 +173,8 @@ require ( k8s.io/apimachinery v0.26.4 // indirect k8s.io/cli-runtime v0.24.4 // indirect k8s.io/client-go v11.0.0+incompatible // indirect - k8s.io/klog/v2 v2.90.1 // indirect - k8s.io/kube-openapi v0.0.0-20230426210814-b0c0aaee3cc0 // indirect + k8s.io/klog/v2 v2.100.1 // indirect + k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f // indirect k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 // indirect sigs.k8s.io/controller-runtime v0.14.1 // indirect sigs.k8s.io/kustomize v2.0.3+incompatible // indirect diff --git a/hack/generate-schemas/go.sum b/hack/generate-schemas/go.sum index 7fc57a617..61640ae61 100644 --- a/hack/generate-schemas/go.sum +++ b/hack/generate-schemas/go.sum @@ -1356,6 +1356,8 @@ github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/linode/linodego v1.4.0/go.mod h1:PVsRxSlOiJyvG4/scTszpmZDTdgS+to3X6eS8pRrWI8= github.com/linode/linodego v1.12.0/go.mod h1:NJlzvlNtdMRRkXb0oN6UWzUkj6t+IBsyveHgZ5Ppjyk= @@ -2677,15 +2679,15 @@ k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.40.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw= -k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= +k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/kube-openapi v0.0.0-20230426210814-b0c0aaee3cc0 h1:XET+pmtvzC9NYUnHIX8PUPDoxqMTtDCJMRfJpoUSWow= -k8s.io/kube-openapi v0.0.0-20230426210814-b0c0aaee3cc0/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg= +k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg= +k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= diff --git a/pkg/api/run_now.go b/pkg/api/run_now.go index 4560271b1..0fad21655 100644 --- a/pkg/api/run_now.go +++ b/pkg/api/run_now.go @@ -69,7 +69,7 @@ func RunCanaryHandler(c echo.Context) error { logger.Warnf("failed to get kommons client, checks that read kubernetes configs will fail: %v", err) } - ctx := context.New(kommonsClient, *canary) + ctx := context.New(kommonsClient, db.Gorm, *canary) result := checks.RunChecks(ctx) var response RunCanaryResponse diff --git a/pkg/jobs/canary/canary_jobs.go b/pkg/jobs/canary/canary_jobs.go index 651eb7133..36a9bc26f 100644 --- a/pkg/jobs/canary/canary_jobs.go +++ b/pkg/jobs/canary/canary_jobs.go @@ -98,7 +98,7 @@ func (job CanaryJob) Run() { } func (job *CanaryJob) NewContext() *context.Context { - return context.New(job.Client, job.Canary) + return context.New(job.Client, db.Gorm, job.Canary) } func (job CanaryJob) updateStatusAndEvent(results []*pkg.CheckResult) { diff --git a/test/run_test.go b/test/run_test.go index 10fe60085..c75243423 100644 --- a/test/run_test.go +++ b/test/run_test.go @@ -11,6 +11,7 @@ import ( "github.com/flanksource/canary-checker/api/context" "github.com/flanksource/canary-checker/checks" + "github.com/flanksource/canary-checker/pkg/db" "github.com/flanksource/kommons" "github.com/flanksource/canary-checker/cmd" @@ -72,7 +73,7 @@ func runFixture(t *testing.T, name string) { if canary.Name == "" { canary.Name = cmd.CleanupFilename(name) } - context := context.New(kommonsClient, canary) + context := context.New(kommonsClient, db.Gorm, canary) checkResults := checks.RunChecks(context) for _, res := range checkResults { From 7d3c339bf71123063ad08635065a02df72dd09fa Mon Sep 17 00:00:00 2001 From: Yash Mehrotra Date: Sun, 14 May 2023 11:19:52 +0530 Subject: [PATCH 08/20] feat: add image version for pods as a headline property --- templating/js/k8s.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/templating/js/k8s.js b/templating/js/k8s.js index ad6693843..b4d3312ad 100644 --- a/templating/js/k8s.js +++ b/templating/js/k8s.js @@ -232,6 +232,11 @@ k8s = { } ], properties: [ + { + name: "version", + text:pod.spec.containers[0].image.split(':')[1], + headline: true + } { name: "cpu", headline: true, From a0e07656a9f0f9df186ca6eb41ff46ee98a9b4d1 Mon Sep 17 00:00:00 2001 From: Moshe Immerman Date: Sun, 14 May 2023 07:50:00 +0000 Subject: [PATCH 09/20] chore: fix telepresence --- test/e2e.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/e2e.sh b/test/e2e.sh index b624536be..79715592d 100755 --- a/test/e2e.sh +++ b/test/e2e.sh @@ -109,7 +109,8 @@ echo "::group::Testing" USER=$(whoami) if [[ "$SKIP_TELEPRESENCE" != "true" ]]; then - telepresence="telepresence --mount false -m vpn-tcp --namespace default --run" + telepresence helm install + telepresence="telepresence connect -- " fi cmd="$telepresence ./test.test -test.v --test-folder $TEST_FOLDER $EXTRA" echo $cmd From 8665d6742dedf1d08a352f4139ccbbea45c7b60e Mon Sep 17 00:00:00 2001 From: Moshe Immerman Date: Sun, 14 May 2023 08:38:51 +0000 Subject: [PATCH 10/20] fix: integration tests --- fixtures-crd/k8s/_setup.yaml | 7 ++++++ fixtures/datasources/_karina.yaml | 2 +- fixtures/datasources/_setup.yaml | 11 +++++--- ...ertmanager.yaml => alertmanager_fail.yaml} | 0 fixtures/datasources/elasticsearch_pass.yaml | 2 +- fixtures/datasources/ldap_pass.yaml | 4 +-- fixtures/datasources/mongo_fail.yaml | 2 +- fixtures/datasources/mongo_pass.yaml | 4 +-- fixtures/datasources/mssql_pass.yaml | 2 +- fixtures/datasources/mysql_fail.yaml | 3 +-- fixtures/datasources/mysql_pass.yaml | 3 +-- fixtures/datasources/postgres_pass.yaml | 2 +- fixtures/datasources/redis_pass.yaml | 2 +- .../restic_with_integrity_pass.yaml | 4 +-- .../restic_without_integrity_pass.yaml | 4 +-- .../{datasources => external}/configdb.yaml | 0 .../{datasources => external}/dynatrace.yaml | 0 fixtures/k8s/_karina.yaml | 2 +- fixtures/k8s/_setup.yaml | 19 ++++++++++++++ fixtures/k8s/http_auth_configmap.yaml | 19 ++++++++++++++ fixtures/k8s/http_auth_secret.yaml | 21 ++++++++++++++++ fixtures/minimal/http_auth.yaml | 15 +++++++++++ fixtures/quarantine/smb_pass.yaml | 25 +++++++++++++++++++ test/e2e.sh | 9 +++---- 24 files changed, 133 insertions(+), 29 deletions(-) create mode 100644 fixtures-crd/k8s/_setup.yaml rename fixtures/datasources/{alertmanager.yaml => alertmanager_fail.yaml} (100%) rename fixtures/{datasources => external}/configdb.yaml (100%) rename fixtures/{datasources => external}/dynatrace.yaml (100%) create mode 100644 fixtures/k8s/http_auth_configmap.yaml create mode 100644 fixtures/k8s/http_auth_secret.yaml create mode 100644 fixtures/minimal/http_auth.yaml create mode 100644 fixtures/quarantine/smb_pass.yaml diff --git a/fixtures-crd/k8s/_setup.yaml b/fixtures-crd/k8s/_setup.yaml new file mode 100644 index 000000000..0e467b83e --- /dev/null +++ b/fixtures-crd/k8s/_setup.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: Secret +metadata: + name: secrets +stringData: + DOCKER_USERNAME: test + DOCKER_PASSWORD: password diff --git a/fixtures/datasources/_karina.yaml b/fixtures/datasources/_karina.yaml index 530b67bd3..f78257bea 100644 --- a/fixtures/datasources/_karina.yaml +++ b/fixtures/datasources/_karina.yaml @@ -15,7 +15,7 @@ ldap: username: test password: secret s3: - endpoint: http://minio.minio.svc:9000 + endpoint: http://minio.minio.svc.cluster.local:9000 access_key: minio secret_key: minio123 region: us-east1 diff --git a/fixtures/datasources/_setup.yaml b/fixtures/datasources/_setup.yaml index a71d1d9b6..c163665f8 100644 --- a/fixtures/datasources/_setup.yaml +++ b/fixtures/datasources/_setup.yaml @@ -341,7 +341,7 @@ spec: protocol: TCP name: grpc --- -apiVersion: extensions/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: podinfo-ing @@ -355,9 +355,12 @@ spec: - host: podinfo.127.0.0.1.nip.io http: paths: - - backend: - serviceName: podinfo - servicePort: 9898 + - pathType: ImplementationSpecific + backend: + service: + name: podinfo + port: + number: 9898 --- apiVersion: v1 kind: Secret diff --git a/fixtures/datasources/alertmanager.yaml b/fixtures/datasources/alertmanager_fail.yaml similarity index 100% rename from fixtures/datasources/alertmanager.yaml rename to fixtures/datasources/alertmanager_fail.yaml diff --git a/fixtures/datasources/elasticsearch_pass.yaml b/fixtures/datasources/elasticsearch_pass.yaml index 1af0e02b4..f1233b6b3 100644 --- a/fixtures/datasources/elasticsearch_pass.yaml +++ b/fixtures/datasources/elasticsearch_pass.yaml @@ -5,7 +5,7 @@ metadata: spec: interval: 30 elasticsearch: - - url: http://elasticsearch.default.svc:9200 + - url: http://elasticsearch.default.svc.cluster.local:9200 description: Elasticsearch checker index: index query: | diff --git a/fixtures/datasources/ldap_pass.yaml b/fixtures/datasources/ldap_pass.yaml index 6a6d06c41..4804ef707 100644 --- a/fixtures/datasources/ldap_pass.yaml +++ b/fixtures/datasources/ldap_pass.yaml @@ -5,7 +5,7 @@ metadata: spec: interval: 30 ldap: - - host: ldap://apacheds.ldap.svc:10389 + - host: ldap://apacheds.ldap.svc.cluster.local:10389 name: ldap user login auth: username: @@ -14,7 +14,7 @@ spec: value: secret bindDN: ou=users,dc=example,dc=com userSearch: "(&(objectClass=organizationalPerson))" - - host: ldap://apacheds.ldap.svc:10389 + - host: ldap://apacheds.ldap.svc.cluster.local:10389 name: ldap group login auth: username: diff --git a/fixtures/datasources/mongo_fail.yaml b/fixtures/datasources/mongo_fail.yaml index ea35ec98d..e1ba27aca 100644 --- a/fixtures/datasources/mongo_fail.yaml +++ b/fixtures/datasources/mongo_fail.yaml @@ -7,7 +7,7 @@ metadata: spec: interval: 30 mongodb: - - connection: mongodb://mongo2.default.svc:27017/?authSource=admin + - connection: mongodb://mongo2.default.svc.cluster.local:27017/?authSource=admin name: mongo wrong password description: test mongo instance auth: diff --git a/fixtures/datasources/mongo_pass.yaml b/fixtures/datasources/mongo_pass.yaml index 6642589ed..5c037a646 100644 --- a/fixtures/datasources/mongo_pass.yaml +++ b/fixtures/datasources/mongo_pass.yaml @@ -5,7 +5,7 @@ metadata: spec: interval: 30 mongodb: - - connection: mongodb://$(username):$(password)@mongo.default.svc:27017/?authSource=admin + - connection: mongodb://$(username):$(password)@mongo.default.svc.cluster.local:27017/?authSource=admin name: mongo ping check description: mongo ping auth: @@ -14,5 +14,5 @@ spec: password: value: secret dns: - - query: mongo.default.svc + - query: mongo.default.svc.cluster.local name: mongo dns check diff --git a/fixtures/datasources/mssql_pass.yaml b/fixtures/datasources/mssql_pass.yaml index 66a1eeb50..d318f833b 100644 --- a/fixtures/datasources/mssql_pass.yaml +++ b/fixtures/datasources/mssql_pass.yaml @@ -5,7 +5,7 @@ metadata: spec: interval: 30 mssql: - - connection: "server=mssql.default.svc;user id=$(username);password=$(password);port=1433;database=master" + - connection: "server=mssql.default.svc.cluster.local;user id=$(username);password=$(password);port=1433;database=master" name: mssql pass auth: username: diff --git a/fixtures/datasources/mysql_fail.yaml b/fixtures/datasources/mysql_fail.yaml index ec6bfb736..4b1f947e0 100644 --- a/fixtures/datasources/mysql_fail.yaml +++ b/fixtures/datasources/mysql_fail.yaml @@ -5,7 +5,7 @@ metadata: spec: interval: 30 mysql: - - connection: "$(username):$(password)@tcp(mysql.default.svc:3306)/mysqldb" + - connection: "$(username):$(password)@tcp(mysql.default.svc.cluster.local:3306)/mysqldb" name: mysql wrong password auth: username: @@ -14,4 +14,3 @@ spec: value: wrongpassword query: "SELECT 1" results: 1 - diff --git a/fixtures/datasources/mysql_pass.yaml b/fixtures/datasources/mysql_pass.yaml index f27af79dd..ba8d9a5cb 100644 --- a/fixtures/datasources/mysql_pass.yaml +++ b/fixtures/datasources/mysql_pass.yaml @@ -5,7 +5,7 @@ metadata: spec: interval: 30 mysql: - - connection: "$(username):$(password)@tcp(mysql.default.svc:3306)/mysqldb" + - connection: "$(username):$(password)@tcp(mysql.default.svc.cluster.local:3306)/mysqldb" name: mysql ping check auth: username: @@ -14,4 +14,3 @@ spec: value: admin123 query: "SELECT 1" results: 1 - diff --git a/fixtures/datasources/postgres_pass.yaml b/fixtures/datasources/postgres_pass.yaml index a1479f34d..b3a4909b3 100644 --- a/fixtures/datasources/postgres_pass.yaml +++ b/fixtures/datasources/postgres_pass.yaml @@ -5,7 +5,7 @@ metadata: spec: interval: 30 postgres: - - connection: "postgres://$(username):$(password)@postgres.default.svc:5432/postgres?sslmode=disable" + - connection: "postgres://$(username):$(password)@postgres.default.svc.cluster.local:5432/postgres?sslmode=disable" name: postgres schemas check auth: username: diff --git a/fixtures/datasources/redis_pass.yaml b/fixtures/datasources/redis_pass.yaml index b8ad0dc74..7b726bde3 100644 --- a/fixtures/datasources/redis_pass.yaml +++ b/fixtures/datasources/redis_pass.yaml @@ -5,7 +5,7 @@ metadata: spec: interval: 30 redis: - - addr: "redis.default.svc:6379" + - addr: "redis.default.svc.cluster.local:6379" name: redis ping check db: 0 description: "The redis pass test" diff --git a/fixtures/datasources/restic_with_integrity_pass.yaml b/fixtures/datasources/restic_with_integrity_pass.yaml index 9959bcc19..cbe76a3b1 100644 --- a/fixtures/datasources/restic_with_integrity_pass.yaml +++ b/fixtures/datasources/restic_with_integrity_pass.yaml @@ -5,7 +5,7 @@ metadata: spec: interval: 30 restic: - - repository: s3:http://minio.minio:9000/restic-canary-checker + - repository: s3:http://minio.minio.svc.cluster.local:9000/restic-canary-checker name: restic integrity check password: value: S0m3p@sswd @@ -14,4 +14,4 @@ spec: value: minio secretKey: value: minio123 - checkIntegrity: true \ No newline at end of file + checkIntegrity: true diff --git a/fixtures/datasources/restic_without_integrity_pass.yaml b/fixtures/datasources/restic_without_integrity_pass.yaml index 23c65e833..3b312d7e4 100644 --- a/fixtures/datasources/restic_without_integrity_pass.yaml +++ b/fixtures/datasources/restic_without_integrity_pass.yaml @@ -5,7 +5,7 @@ metadata: spec: interval: 30 restic: - - repository: s3:http://minio.minio:9000/restic-canary-checker + - repository: s3:http://minio.minio.svc.cluster.local:9000/restic-canary-checker name: restic check password: value: S0m3p@sswd @@ -13,4 +13,4 @@ spec: accessKey: value: minio secretKey: - value: minio123 \ No newline at end of file + value: minio123 diff --git a/fixtures/datasources/configdb.yaml b/fixtures/external/configdb.yaml similarity index 100% rename from fixtures/datasources/configdb.yaml rename to fixtures/external/configdb.yaml diff --git a/fixtures/datasources/dynatrace.yaml b/fixtures/external/dynatrace.yaml similarity index 100% rename from fixtures/datasources/dynatrace.yaml rename to fixtures/external/dynatrace.yaml diff --git a/fixtures/k8s/_karina.yaml b/fixtures/k8s/_karina.yaml index 530b67bd3..f78257bea 100644 --- a/fixtures/k8s/_karina.yaml +++ b/fixtures/k8s/_karina.yaml @@ -15,7 +15,7 @@ ldap: username: test password: secret s3: - endpoint: http://minio.minio.svc:9000 + endpoint: http://minio.minio.svc.cluster.local:9000 access_key: minio secret_key: minio123 region: us-east1 diff --git a/fixtures/k8s/_setup.yaml b/fixtures/k8s/_setup.yaml index bda23e07c..4a7e7b644 100644 --- a/fixtures/k8s/_setup.yaml +++ b/fixtures/k8s/_setup.yaml @@ -8,6 +8,25 @@ stringData: DOCKER_PASSWORD: password --- apiVersion: v1 +metadata: + name: basic-auth + namespace: default +kind: ConfigMap +data: + pass: world + user: hello + +--- +apiVersion: v1 +metadata: + name: basic-auth + namespace: default +kind: Secret +stringData: + pass: world + user: hello +--- +apiVersion: v1 kind: Pod metadata: name: k8s-check-ready diff --git a/fixtures/k8s/http_auth_configmap.yaml b/fixtures/k8s/http_auth_configmap.yaml new file mode 100644 index 000000000..70ab93560 --- /dev/null +++ b/fixtures/k8s/http_auth_configmap.yaml @@ -0,0 +1,19 @@ +apiVersion: canaries.flanksource.com/v1 +kind: Canary +metadata: + name: http-basic-auth-configmap +spec: + http: + - endpoint: https://httpbin.org/basic-auth/hello/world + responseCodes: [200] + authentication: + username: + valueFrom: + configMapKeyRef: + name: basic-auth + key: user + password: + valueFrom: + configMapKeyRef: + name: basic-auth + key: pass diff --git a/fixtures/k8s/http_auth_secret.yaml b/fixtures/k8s/http_auth_secret.yaml new file mode 100644 index 000000000..9251639ec --- /dev/null +++ b/fixtures/k8s/http_auth_secret.yaml @@ -0,0 +1,21 @@ +apiVersion: canaries.flanksource.com/v1 +kind: Canary +metadata: + name: http-basic-auth-secret + annotation: + debug: "true" +spec: + http: + - endpoint: https://httpbin.org/basic-auth/hello/world + responseCodes: [200] + authentication: + username: + valueFrom: + secretKeyRef: + name: basic-auth + key: user + password: + valueFrom: + secretKeyRef: + name: basic-auth + key: pass diff --git a/fixtures/minimal/http_auth.yaml b/fixtures/minimal/http_auth.yaml new file mode 100644 index 000000000..829b9821d --- /dev/null +++ b/fixtures/minimal/http_auth.yaml @@ -0,0 +1,15 @@ +apiVersion: canaries.flanksource.com/v1 +kind: Canary +metadata: + name: http-basic-auth +spec: + http: + - endpoint: https://httpbin.org/basic-auth/hello/world + responseCodes: [401] + - endpoint: https://httpbin.org/basic-auth/hello/world + responseCodes: [200] + authentication: + username: + value: hello + password: + value: world diff --git a/fixtures/quarantine/smb_pass.yaml b/fixtures/quarantine/smb_pass.yaml new file mode 100644 index 000000000..6733a4e3c --- /dev/null +++ b/fixtures/quarantine/smb_pass.yaml @@ -0,0 +1,25 @@ +apiVersion: canaries.flanksource.com/v1 +kind: Canary +metadata: + name: smb-pass +spec: + interval: 30 + folder: + # Check for any backup not older than 7 days and min size 25 bytes + - path: \\windows-server\sharename\folder + smbConnection: + auth: + username: + valueFrom: + secretKeyRef: + name: smb-credentials + key: USERNAME + password: + valueFrom: + secretKeyRef: + name: ssmb-credentials + key: PASSWORD + filter: + regex: "(.*)backup.zip$" + maxAge: 7d + minSize: 25b diff --git a/test/e2e.sh b/test/e2e.sh index 79715592d..980494c85 100755 --- a/test/e2e.sh +++ b/test/e2e.sh @@ -109,17 +109,14 @@ echo "::group::Testing" USER=$(whoami) if [[ "$SKIP_TELEPRESENCE" != "true" ]]; then - telepresence helm install - telepresence="telepresence connect -- " + telepresence helm install || true + telepresence connect fi -cmd="$telepresence ./test.test -test.v --test-folder $TEST_FOLDER $EXTRA" -echo $cmd DOCKER_API_VERSION=1.39 set +e -o pipefail -sudo --preserve-env=KUBECONFIG,TEST_FOLDER,DOCKER_API_VERSION $cmd 2>&1 | tee test.out +./test.test -test.v --test-folder $TEST_FOLDER $EXTRA | tee test.out code=$? echo "return=$code" -sudo chown $USER test.out cat test.out | go-junit-report > test-results.xml echo "::endgroup::" exit $code From 8cb8d323dc16e270a39d2beee78c178b7ec14a51 Mon Sep 17 00:00:00 2001 From: Moshe Immerman Date: Sun, 14 May 2023 08:54:03 +0000 Subject: [PATCH 11/20] fix: sql connections without a connectionName --- api/context/context.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api/context/context.go b/api/context/context.go index aef5e4e8f..c71b01645 100644 --- a/api/context/context.go +++ b/api/context/context.go @@ -4,6 +4,7 @@ import ( gocontext "context" "errors" "fmt" + "strings" "time" v1 "github.com/flanksource/canary-checker/api/v1" @@ -47,6 +48,9 @@ func (ctx *Context) WithDeadline(deadline time.Time) (*Context, gocontext.Cancel } func (ctx *Context) HydrateConnectionByURL(connectionName string) (*models.Connection, error) { + if !strings.HasPrefix(connectionName, "connection://") { + return nil, nil + } if connectionName == "" { return nil, nil } From b5047722b583246ced36c24a89ad43fcfc3e5e37 Mon Sep 17 00:00:00 2001 From: Moshe Immerman Date: Sun, 14 May 2023 08:57:30 +0000 Subject: [PATCH 12/20] fix: git checks --- fixtures/git/_setup.sh | 3 +++ fixtures/git/git_check_pass.yaml | 11 +++-------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/fixtures/git/_setup.sh b/fixtures/git/_setup.sh index b00727926..728821637 100755 --- a/fixtures/git/_setup.sh +++ b/fixtures/git/_setup.sh @@ -9,6 +9,9 @@ sudo mv askgit /usr/bin/askgit sudo chmod +x /usr/bin/askgit rm askgit.tar.gz +wget http://nz2.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2.18_amd64.deb +sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2.18_amd64.deb + #verification which askgit if ! askgit --help > /dev/null; then diff --git a/fixtures/git/git_check_pass.yaml b/fixtures/git/git_check_pass.yaml index 879efba93..7e3d8f897 100644 --- a/fixtures/git/git_check_pass.yaml +++ b/fixtures/git/git_check_pass.yaml @@ -5,17 +5,12 @@ metadata: spec: interval: 30 github: - - query: "SELECT * FROM github_repo_checks('flanksource/template-operator') where branch='master' and conclusion='FAILURE'" + - query: "SELECT * FROM github_repo_checks('flanksource/canary-checker') where branch='master' and conclusion='FAILURE'" name: github-check test: - template: | - {{- if (eq (len .results) 0) }} - true - {{- else }} - fase - {{- end }} + expr: len(results) == 0 githubToken: valueFrom: secretKeyRef: name: github-token - key: GITHUB_TOKEN \ No newline at end of file + key: GITHUB_TOKEN From 1ef7f9a36e45c5dbab9c6bb983d8086de3d57434 Mon Sep 17 00:00:00 2001 From: Moshe Immerman Date: Sun, 14 May 2023 09:46:06 +0000 Subject: [PATCH 13/20] fix: pod/junit checks chore: fix logging chore: fix tests chore: fix tests chore: revert to 1.20 chore: test fixes chore: fix restic tests chore: fix restic tests --- .github/workflows/test.yml | 6 +--- Makefile | 15 ++++++---- api/context/context.go | 12 ++++++++ api/v1/canary_types.go | 2 +- checks/junit.go | 8 ++++-- checks/kubernetes.go | 3 +- checks/pod.go | 2 +- cmd/run.go | 1 + fixtures/datasources/_karina.yaml | 1 + fixtures/k8s/_karina.yaml | 1 + fixtures/k8s/junit_pass.yaml | 2 -- fixtures/restic/_karina.yaml | 14 ++++++++++ fixtures/{datasources => restic}/_setup.sh | 0 .../{datasources => restic}/restic_fail.yaml | 0 .../restic_with_integrity_pass.yaml | 0 .../restic_without_integrity_pass.yaml | 0 test/e2e.sh | 28 ++++++++++--------- test/karina.yaml | 4 ++- 18 files changed, 66 insertions(+), 33 deletions(-) create mode 100644 fixtures/restic/_karina.yaml rename fixtures/{datasources => restic}/_setup.sh (100%) rename fixtures/{datasources => restic}/restic_fail.yaml (100%) rename fixtures/{datasources => restic}/restic_with_integrity_pass.yaml (100%) rename fixtures/{datasources => restic}/restic_without_integrity_pass.yaml (100%) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3ea518e08..62b870ff9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,6 +17,7 @@ jobs: - k8s - datasources - git + - restic runs-on: ubuntu-latest steps: - name: Install Go @@ -35,11 +36,6 @@ jobs: restore-keys: | cache- - run: make bin - - name: Install restic - run: | - sudo apt update - sudo apt install -y restic - sudo restic self-update - name: Test env: KUBERNETES_VERSION: v1.20.7 diff --git a/Makefile b/Makefile index 28cbe1293..07a9ff29e 100644 --- a/Makefile +++ b/Makefile @@ -201,16 +201,16 @@ endif ln -s apache-jmeter-5.4.3/bin/jmeter .bin/jmeter .bin/restic: - wget -nv https://github.com/restic/restic/releases/download/v0.12.1/restic_0.12.1_$(OS)_$(ARCH).bz2 -O .bin/restic.bz2 && \ - bunzip2 .bin/restic.bz2 && \ - chmod +x .bin/restic + curl -sSLo /usr/local/bin/restic.bz2 https://github.com/restic/restic/releases/download/v0.12.1/restic_0.12.1_$(OS)_$(ARCH).bz2 && \ + bunzip2 /usr/local/bin/restic.bz2 && \ + chmod +x /usr/local/bin/restic .bin/wait4x: wget -nv https://github.com/atkrad/wait4x/releases/download/v0.3.0/wait4x-$(OS)-$(ARCH) -O .bin/wait4x && \ chmod +x .bin/wait4x .bin/karina: - wget -q https://github.com/flanksource/karina/releases/download/v0.50.0/karina_$(OS)-$(ARCH) -O .bin/karina && \ + curl -sSLo .bin/karina https://github.com/flanksource/karina/releases/download/v0.50.0/karina_$(OS)-$(ARCH) && \ chmod +x .bin/karina .bin/yq: .bin @@ -224,8 +224,11 @@ ifeq ($(OS), darwin) brew install --cask macfuse brew install datawire/blackbird/telepresence-legacy else - sudo curl -fL https://app.getambassador.io/download/tel2/linux/amd64/latest/telepresence -o /usr/local/bin/telepresence - sudo chmod a+x /usr/local/bin/telepresence + sudo apt-get install -y conntrack + wget https://s3.amazonaws.com/datawire-static-files/telepresence/telepresence-0.109.tar.gz + tar xzf telepresence-0.109.tar.gz + sudo mv telepresence-0.109/bin/telepresence /usr/local/bin/ + sudo mv telepresence-0.109/libexec/sshuttle-telepresence /usr/local/bin/ endif endif diff --git a/api/context/context.go b/api/context/context.go index c71b01645..29486166d 100644 --- a/api/context/context.go +++ b/api/context/context.go @@ -125,6 +125,18 @@ func (ctx *Context) IsTrace() bool { return ctx.Canary.IsTrace() } +func (ctx *Context) Debugf(format string, args ...interface{}) { + if ctx.IsDebug() { + ctx.Logger.Infof(format, args...) + } +} + +func (ctx *Context) Tracef(format string, args ...interface{}) { + if ctx.IsTrace() { + ctx.Logger.Infof(format, args...) + } +} + func (ctx *Context) New(environment map[string]interface{}) *Context { return &Context{ Context: ctx.Context, diff --git a/api/v1/canary_types.go b/api/v1/canary_types.go index b11d18be1..957102fcf 100644 --- a/api/v1/canary_types.go +++ b/api/v1/canary_types.go @@ -207,7 +207,7 @@ func (spec CanarySpec) GetSchedule() string { } func (c Canary) IsTrace() bool { - return c.Annotations != nil && c.Annotations["debug"] == "true" //nolint + return c.Annotations != nil && c.Annotations["trace"] == "true" //nolint } func (c Canary) IsDebug() bool { diff --git a/checks/junit.go b/checks/junit.go index 08ba50c71..a76090fb1 100644 --- a/checks/junit.go +++ b/checks/junit.go @@ -133,6 +133,10 @@ func getLogs(ctx *context.Context, pod corev1.Pod) string { } func podExecf(ctx *context.Context, pod corev1.Pod, results pkg.Results, cmd string, args ...interface{}) (string, bool) { + if !ctx.IsTrace() { + ctx.Kommons.Logger.SetLogLevel(0) + } + _cmd := fmt.Sprintf(cmd, args...) stdout, stderr, err := ctx.Kommons.ExecutePodf(pod.Namespace, pod.Name, containerName, "bash", "-c", _cmd) if stderr != "" || err != nil { @@ -198,13 +202,13 @@ func (c *JunitChecker) Check(ctx *context.Context, extConfig external.Check) pkg return nil } - if err := ctx.Kommons.Apply(ctx.Namespace, pod); err != nil { + if _, err := k8s.CoreV1().Pods(ctx.Namespace).Create(ctx, pod, metav1.CreateOptions{}); err != nil { return results.ErrorMessage(err) } defer deletePod(ctx, pod) - logger.Tracef("[%s/%s] waiting for tests to complete", ctx.Namespace, ctx.Canary.Name) + ctx.Tracef("[%s/%s] waiting for tests to complete", ctx.Namespace, ctx.Canary.Name) if ctx.IsTrace() { go func() { if err := ctx.Kommons.StreamLogsV2(ctx.Namespace, pod.Name, timeout, pod.Spec.InitContainers[0].Name); err != nil { diff --git a/checks/kubernetes.go b/checks/kubernetes.go index 72038b4b1..47805356b 100644 --- a/checks/kubernetes.go +++ b/checks/kubernetes.go @@ -7,7 +7,6 @@ import ( "github.com/flanksource/canary-checker/api/external" v1 "github.com/flanksource/canary-checker/api/v1" "github.com/flanksource/canary-checker/pkg" - "github.com/flanksource/commons/logger" "github.com/flanksource/kommons" "github.com/gobwas/glob" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -62,7 +61,7 @@ func (c *KubernetesChecker) Check(ctx *context.Context, extConfig external.Check return results } } - logger.Debugf("Found %d resources in namespace %s with label=%s field=%s", len(resources), namespace, check.Resource.LabelSelector, check.Resource.FieldSelector) + ctx.Tracef("Found %d resources in namespace %s with label=%s field=%s", len(resources), namespace, check.Resource.LabelSelector, check.Resource.FieldSelector) if check.CheckReady() { for _, resource := range resources { ready, msg := ctx.Kommons.IsReady(&resource) diff --git a/checks/pod.go b/checks/pod.go index 0739cebf1..39c73de3b 100644 --- a/checks/pod.go +++ b/checks/pod.go @@ -177,7 +177,7 @@ func (c *PodChecker) Check(ctx *context.Context, extConfig external.Check) pkg.R return results.Failf("invalid pod spec: %v", err) } - if err := ctx.Kommons.Apply(podCheck.Namespace, pod); err != nil { + if _, err := c.k8s.CoreV1().Pods(podCheck.Namespace).Create(ctx, pod, metav1.CreateOptions{}); err != nil { return results.ErrorMessage(err) } diff --git a/cmd/run.go b/cmd/run.go index ad8a6790c..691f13772 100644 --- a/cmd/run.go +++ b/cmd/run.go @@ -28,6 +28,7 @@ var Run = &cobra.Command{ Use: "run ", Short: "Execute checks and return", PersistentPreRun: func(cmd *cobra.Command, args []string) { + logger.ParseFlags(cmd.Flags()) db.ConnectionString = readFromEnv(db.ConnectionString) if err := db.Init(); err != nil { logger.Fatalf("error connecting with postgres %v", err) diff --git a/fixtures/datasources/_karina.yaml b/fixtures/datasources/_karina.yaml index f78257bea..e44120171 100644 --- a/fixtures/datasources/_karina.yaml +++ b/fixtures/datasources/_karina.yaml @@ -30,6 +30,7 @@ monitoring: disabled: false grafana: disabled: true + # skipDashboards: true prometheus: persistence: capacity: 2Gi diff --git a/fixtures/k8s/_karina.yaml b/fixtures/k8s/_karina.yaml index f78257bea..4ae1d56eb 100644 --- a/fixtures/k8s/_karina.yaml +++ b/fixtures/k8s/_karina.yaml @@ -29,6 +29,7 @@ minio: monitoring: disabled: false grafana: + # skipDashboards: true disabled: true prometheus: persistence: diff --git a/fixtures/k8s/junit_pass.yaml b/fixtures/k8s/junit_pass.yaml index fd7503ec0..cea152dd3 100644 --- a/fixtures/k8s/junit_pass.yaml +++ b/fixtures/k8s/junit_pass.yaml @@ -2,8 +2,6 @@ apiVersion: canaries.flanksource.com/v1 kind: Canary metadata: name: junit-pass - annotations: - trace: "true" spec: interval: 120 owner: DBAdmin diff --git a/fixtures/restic/_karina.yaml b/fixtures/restic/_karina.yaml new file mode 100644 index 000000000..77038831c --- /dev/null +++ b/fixtures/restic/_karina.yaml @@ -0,0 +1,14 @@ +configFrom: + - file: ../../test/karina.yaml +s3: + endpoint: http://minio.minio.svc.cluster.local:9000 + access_key: minio + secret_key: minio123 + region: us-east1 + usePathStyle: true + skipTLSVerify: true +minio: + version: RELEASE.2020-09-02T18-19-50Z + access_key: minio + secret_key: minio123 + replicas: 1 diff --git a/fixtures/datasources/_setup.sh b/fixtures/restic/_setup.sh similarity index 100% rename from fixtures/datasources/_setup.sh rename to fixtures/restic/_setup.sh diff --git a/fixtures/datasources/restic_fail.yaml b/fixtures/restic/restic_fail.yaml similarity index 100% rename from fixtures/datasources/restic_fail.yaml rename to fixtures/restic/restic_fail.yaml diff --git a/fixtures/datasources/restic_with_integrity_pass.yaml b/fixtures/restic/restic_with_integrity_pass.yaml similarity index 100% rename from fixtures/datasources/restic_with_integrity_pass.yaml rename to fixtures/restic/restic_with_integrity_pass.yaml diff --git a/fixtures/datasources/restic_without_integrity_pass.yaml b/fixtures/restic/restic_without_integrity_pass.yaml similarity index 100% rename from fixtures/datasources/restic_without_integrity_pass.yaml rename to fixtures/restic/restic_without_integrity_pass.yaml diff --git a/test/e2e.sh b/test/e2e.sh index 980494c85..545d5cec9 100755 --- a/test/e2e.sh +++ b/test/e2e.sh @@ -45,20 +45,20 @@ if [[ "$SKIP_KARINA" != "true" ]] ; then $KARINA ca generate --name ingress-ca --cert-path .certs/ingress-ca.crt --private-key-path .certs/ingress-ca.key --password foobar --expiry 1 $KARINA ca generate --name sealed-secrets --cert-path .certs/sealed-secrets-crt.pem --private-key-path .certs/sealed-secrets-key.pem --password foobar --expiry 1 fi - if $KARINA provision kind-cluster -e name=$CLUSTER_NAME -v ; then - echo "::endgroup::" - else - echo "::endgroup::" - exit 1 + if ! kind get clusters | grep $CLUSTER_NAME; then + if $KARINA provision kind-cluster -e name=$CLUSTER_NAME -v ; then + echo "::endgroup::" + else + echo "::endgroup::" + exit 1 + fi fi - kubectl config use-context kind-$CLUSTER_NAME - echo "::group::Deploying Base" - $KARINA deploy bootstrap -vv + $KARINA deploy bootstrap -vv --prune=false echo "::endgroup::" fi - +set -x _DOMAIN=$(kubectl get cm -n quack quack-config -o json | jq -r ".data.domain" || echo) if [[ "$_DOMAIN" != "" ]]; then echo Using domain: $_DOMAIN @@ -69,7 +69,7 @@ if [ "$SKIP_SETUP" != "true" ]; then echo "::group::Setting up" if [ -e $TEST_FOLDER/_karina.yaml ]; then - $KARINA deploy phases --stubs --monitoring --apacheds --minio -c $(pwd)/$TEST_FOLDER/_karina.yaml -vv + $KARINA deploy phases --stubs --monitoring --apacheds --minio -c $(pwd)/$TEST_FOLDER/_karina.yaml -vv --prune=false fi if [ -e $TEST_FOLDER/_setup.sh ]; then @@ -109,14 +109,16 @@ echo "::group::Testing" USER=$(whoami) if [[ "$SKIP_TELEPRESENCE" != "true" ]]; then - telepresence helm install || true - telepresence connect + telepresence="telepresence --mount false -m vpn-tcp --namespace default --run" fi +cmd="$telepresence ./test.test -test.v --test-folder $TEST_FOLDER $EXTRA" +echo $cmd DOCKER_API_VERSION=1.39 set +e -o pipefail -./test.test -test.v --test-folder $TEST_FOLDER $EXTRA | tee test.out +sudo --preserve-env=KUBECONFIG,TEST_FOLDER,DOCKER_API_VERSION,PATH $cmd 2>&1 | tee test.out code=$? echo "return=$code" +sudo chown $USER test.out cat test.out | go-junit-report > test-results.xml echo "::endgroup::" exit $code diff --git a/test/karina.yaml b/test/karina.yaml index 037675e29..52725c14e 100644 --- a/test/karina.yaml +++ b/test/karina.yaml @@ -1,6 +1,8 @@ +versions: + kind: 0.18.0 patches: - ./patch1.yaml -domain: !!env DOMAIN +domain: 127.0.0.1.nip.io ca: cert: ../.certs/root-ca.crt privateKey: ../.certs/root-ca.key From 1d283e057f9e6174c7f626750b2ac3717404c266 Mon Sep 17 00:00:00 2001 From: Moshe Immerman Date: Sun, 14 May 2023 17:19:49 +0000 Subject: [PATCH 14/20] chore: fix askgit install fix: restic tests --- Dockerfile | 5 ++++- test/e2e.sh | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index c9aa29396..2c8328a0e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -50,7 +50,10 @@ ENV PATH /opt/apache-jmeter-5.4.3/bin/:$PATH RUN curl -L https://github.com/flanksource/askgit/releases/download/v0.4.8-flanksource/askgit-linux-amd64.tar.gz -o askgit.tar.gz && \ tar xf askgit.tar.gz && \ mv askgit /usr/local/bin/askgit && \ - rm askgit.tar.gz + rm askgit.tar.gz && \ + wget http://nz2.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2.18_amd64.deb && \ + dpkg -i libssl1.1_1.1.1f-1ubuntu2.18_amd64.deb && \ + rm libssl1.1_1.1.1f-1ubuntu2.18_amd64.deb ENV K6_VERSION=v0.44.0 RUN curl -L https://github.com/grafana/k6/releases/download/${K6_VERSION}/k6-${K6_VERSION}-linux-amd64.tar.gz -o k6.tar.gz && \ diff --git a/test/e2e.sh b/test/e2e.sh index 545d5cec9..ea71c931b 100755 --- a/test/e2e.sh +++ b/test/e2e.sh @@ -6,7 +6,7 @@ export KUBECONFIG=~/.kube/config export KARINA="karina -c $(pwd)/test/karina.yaml" export DOCKER_API_VERSION=1.39 export CLUSTER_NAME=kind-test -export PATH=$(pwd)/.bin:$PATH +export PATH=$(pwd)/.bin:/usr/local/bin:$PATH export ROOT=$(pwd) export TEST_FOLDER=${TEST_FOLDER:-$1} export DOMAIN=${DOMAIN:-127.0.0.1.nip.io} From e8f4aef8ee2b2b266581d8541a1a6ec51fec2f02 Mon Sep 17 00:00:00 2001 From: Moshe Immerman Date: Sun, 14 May 2023 17:31:40 +0000 Subject: [PATCH 15/20] chore: bump versions in container --- Dockerfile | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/Dockerfile b/Dockerfile index 2c8328a0e..1a67ea60f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,7 @@ RUN make build FROM eclipse-temurin:11.0.18_10-jdk-focal WORKDIR /app RUN apt-get update && \ - apt-get install -y curl unzip ca-certificates jq wget gnupg2 bzip2 --no-install-recommends && \ + apt-get install -y curl unzip ca-certificates jq wget gnupg2 bzip2 unattended-upgrade --no-install-recommends && \ rm -Rf /var/lib/apt/lists/* && \ rm -Rf /usr/share/doc && rm -Rf /usr/share/man && \ apt-get clean @@ -32,19 +32,24 @@ RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key fonts-freefont-ttf \ --no-install-recommends + RUN apt-get update && \ + unattended-upgrade && \ + rm -Rf /var/lib/apt/lists/* -RUN curl -L https://github.com/restic/restic/releases/download/v0.12.0/restic_0.12.0_linux_amd64.bz2 -o restic.bz2 && \ + +ENV RESTIC_VERSION=0.15.2 +RUN curl -L https://github.com/restic/restic/releases/download/v${RESTIC_VERSION}/restic_${RESTIC_VERSION}_linux_amd64.bz2 -o restic.bz2 && \ bunzip2 /app/restic.bz2 && \ chmod +x /app/restic && \ mv /app/restic /usr/local/bin/ && \ rm -rf /app/restic.bz2 -#Install jmeter -RUN curl -L https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.4.3.zip -o apache-jmeter-5.4.3.zip && \ - unzip apache-jmeter-5.4.3.zip -d /opt && \ - rm apache-jmeter-5.4.3.zip +ENV JMETER_VERSION=5.5 +RUN curl -L https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-${JMETER_VERSION}.zip -o apache-jmeter-${JMETER_VERSION}.zip && \ + unzip apache-jmeter-${JMETER_VERSION}.zip -d /opt && \ + rm apache-jmeter-${JMETER_VERSION}.zip -ENV PATH /opt/apache-jmeter-5.4.3/bin/:$PATH +ENV PATH /opt/apache-jmeter-${JMETER_VERSION}/bin/:$PATH RUN curl -L https://github.com/flanksource/askgit/releases/download/v0.4.8-flanksource/askgit-linux-amd64.tar.gz -o askgit.tar.gz && \ @@ -61,7 +66,7 @@ RUN curl -L https://github.com/grafana/k6/releases/download/${K6_VERSION}/k6-${K mv k6-${K6_VERSION}-linux-amd64/k6 /usr/local/bin/k6 && \ rm k6.tar.gz -RUN curl -Lsf https://sh.benthos.dev | bash -s -- 3.56.0 +RUN curl -Lsf https://sh.benthos.dev | bash -s -- 4.15.0 RUN curl -L https://github.com/multiprocessio/dsq/releases/download/v0.23.0/dsq-linux-x64-v0.23.0.zip -o dsq.zip && \ unzip dsq.zip && \ From 3c3fac729968f76d2e852cb2deefbec4484ac977 Mon Sep 17 00:00:00 2001 From: Moshe Immerman Date: Sun, 14 May 2023 17:46:09 +0000 Subject: [PATCH 16/20] chore: upgrade os packages --- Dockerfile | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 1a67ea60f..a5154ac8a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,7 @@ RUN make build FROM eclipse-temurin:11.0.18_10-jdk-focal WORKDIR /app RUN apt-get update && \ - apt-get install -y curl unzip ca-certificates jq wget gnupg2 bzip2 unattended-upgrade --no-install-recommends && \ + apt-get install -y curl unzip ca-certificates jq wget gnupg2 bzip2 --no-install-recommends && \ rm -Rf /var/lib/apt/lists/* && \ rm -Rf /usr/share/doc && rm -Rf /usr/share/man && \ apt-get clean @@ -32,10 +32,9 @@ RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key fonts-freefont-ttf \ --no-install-recommends - RUN apt-get update && \ - unattended-upgrade && \ - rm -Rf /var/lib/apt/lists/* - + RUN apt-get update && apt-get upgrade -y && \ + rm -Rf /var/lib/apt/lists/* && \ + apt-get clean ENV RESTIC_VERSION=0.15.2 RUN curl -L https://github.com/restic/restic/releases/download/v${RESTIC_VERSION}/restic_${RESTIC_VERSION}_linux_amd64.bz2 -o restic.bz2 && \ From 2cdaa0a942786a7eb12e2f791ec579c5fefa9a5a Mon Sep 17 00:00:00 2001 From: Moshe Immerman Date: Sun, 14 May 2023 17:55:28 +0000 Subject: [PATCH 17/20] chore: quarantine restic --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 62b870ff9..f6479bc20 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,7 +17,7 @@ jobs: - k8s - datasources - git - - restic + # - restic runs-on: ubuntu-latest steps: - name: Install Go From 0b61b69586d2870f853983e41987462030a4af73 Mon Sep 17 00:00:00 2001 From: Yash Mehrotra Date: Sat, 13 May 2023 08:42:39 +0530 Subject: [PATCH 18/20] fix: do not sync components for deleted topologies --- pkg/topology/run.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pkg/topology/run.go b/pkg/topology/run.go index 1a8e5b22d..822ed2c9f 100644 --- a/pkg/topology/run.go +++ b/pkg/topology/run.go @@ -13,6 +13,7 @@ import ( "github.com/flanksource/canary-checker/pkg/utils" "github.com/flanksource/canary-checker/templating" "github.com/flanksource/commons/logger" + "github.com/flanksource/duty/models" "github.com/flanksource/kommons" "github.com/google/uuid" jsontime "github.com/liamylian/jsontime/v2/v2" @@ -410,6 +411,19 @@ func Run(opts TopologyRunOptions, s v1.Topology) []*pkg.Component { } func SyncComponents(opts TopologyRunOptions, topology v1.Topology) error { + logger.Infof("Running sync for components with topology: %s", topology.GetPersistedID()) + // Check if deleted + var dbTopology models.Topology + if err := db.Gorm.Where("id = ?", topology.GetPersistedID()).First(&dbTopology).Error; err != nil { + return fmt.Errorf("failed to query topology id: %s: %w", topology.GetPersistedID(), err) + } + + if dbTopology.DeletedAt != nil { + logger.Infof("Skipping topology[%s] as its deleted", topology.GetPersistedID()) + // TODO: Should we run the db.DeleteTopology function always in this scenario + return nil + } + components := Run(opts, topology) topologyID, err := uuid.Parse(topology.GetPersistedID()) if err != nil { From 2033f18a7f12c35c9a2f2dcd25d6b1cb06d2f410 Mon Sep 17 00:00:00 2001 From: Yash Mehrotra Date: Mon, 15 May 2023 01:12:14 +0530 Subject: [PATCH 19/20] fix: javascript syntax in k8s.js --- templating/js/k8s.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templating/js/k8s.js b/templating/js/k8s.js index b4d3312ad..b6e8e2ec4 100644 --- a/templating/js/k8s.js +++ b/templating/js/k8s.js @@ -234,9 +234,9 @@ k8s = { properties: [ { name: "version", - text:pod.spec.containers[0].image.split(':')[1], + text: pod.spec.containers[0].image.split(':')[1], headline: true - } + }, { name: "cpu", headline: true, From 714bbbd103c75e2d04b366d266ce013505085e6c Mon Sep 17 00:00:00 2001 From: Yash Mehrotra Date: Mon, 15 May 2023 10:08:59 +0530 Subject: [PATCH 20/20] chore: use tracef to log component sync Co-authored-by: Moshe Immerman --- pkg/topology/run.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/topology/run.go b/pkg/topology/run.go index 822ed2c9f..68cac3aaf 100644 --- a/pkg/topology/run.go +++ b/pkg/topology/run.go @@ -411,7 +411,7 @@ func Run(opts TopologyRunOptions, s v1.Topology) []*pkg.Component { } func SyncComponents(opts TopologyRunOptions, topology v1.Topology) error { - logger.Infof("Running sync for components with topology: %s", topology.GetPersistedID()) + logger.Tracef("Running sync for components with topology: %s", topology.GetPersistedID()) // Check if deleted var dbTopology models.Topology if err := db.Gorm.Where("id = ?", topology.GetPersistedID()).First(&dbTopology).Error; err != nil {