From 0d21eed5f8091dabe63e72f342fc4ac90c3d7758 Mon Sep 17 00:00:00 2001 From: Dexter Yan Date: Tue, 22 Oct 2024 13:07:44 +1300 Subject: [PATCH] fix(support): add missing host collectors for ParseSupportBundle (#1656) * fix(support): add missing host collectors for ParseSupportBundle * update * add host ananlyers --- config/crds/troubleshoot.sh_collectors.yaml | 534 +++++++++++++ .../troubleshoot/v1beta2/collector_types.go | 1 + .../v1beta2/zz_generated.deepcopy.go | 11 + pkg/supportbundle/load.go | 3 +- pkg/supportbundle/load_test.go | 94 +++ schemas/collector-troubleshoot-v1beta2.json | 754 ++++++++++++++++++ 6 files changed, 1396 insertions(+), 1 deletion(-) create mode 100644 pkg/supportbundle/load_test.go diff --git a/config/crds/troubleshoot.sh_collectors.yaml b/config/crds/troubleshoot.sh_collectors.yaml index 41665245c..d30a32fc2 100644 --- a/config/crds/troubleshoot.sh_collectors.yaml +++ b/config/crds/troubleshoot.sh_collectors.yaml @@ -16857,6 +16857,540 @@ spec: type: object type: object type: array + hostCollectors: + items: + properties: + blockDevices: + properties: + collectorName: + type: string + exclude: + type: BoolString + type: object + certificate: + properties: + certificatePath: + type: string + collectorName: + type: string + exclude: + type: BoolString + keyPath: + type: string + required: + - certificatePath + - keyPath + type: object + certificatesCollection: + properties: + collectorName: + type: string + exclude: + type: BoolString + paths: + items: + type: string + type: array + required: + - paths + type: object + cgroups: + properties: + collectorName: + type: string + exclude: + type: BoolString + mountPoint: + type: string + type: object + copy: + properties: + collectorName: + type: string + exclude: + type: BoolString + path: + type: string + required: + - path + type: object + cpu: + properties: + collectorName: + type: string + exclude: + type: BoolString + type: object + diskUsage: + properties: + collectorName: + type: string + exclude: + type: BoolString + path: + type: string + required: + - path + type: object + dns: + properties: + collectorName: + type: string + exclude: + type: BoolString + hostnames: + items: + type: string + type: array + required: + - hostnames + type: object + filesystemPerformance: + description: |- + FilesystemPerformance benchmarks sequential write latency on a single file. + The optional background IOPS feature attempts to mimic real-world conditions by running read and + write workloads prior to and during benchmark execution. + properties: + backgroundIOPSWarmupSeconds: + description: How long to run the background IOPS read and + write workloads prior to starting the benchmarks. + type: integer + backgroundReadIOPS: + description: |- + The target read IOPS to run while benchmarking. This is a limit and there is no guarantee + it will be reached. This is the total IOPS for all background read jobs. + type: integer + backgroundReadIOPSJobs: + description: |- + Number of threads to use for background read IOPS. This should be set high enough to reach + the target specified in BackgrounReadIOPS. + type: integer + backgroundWriteIOPS: + description: |- + The target write IOPS to run while benchmarking. This is a limit and there is no guarantee + it will be reached. This is the total IOPS for all background write jobs. + type: integer + backgroundWriteIOPSJobs: + description: |- + Number of threads to use for background write IOPS. This should be set high enough to reach + the target specified in BackgroundWriteIOPS. + Example: If BackgroundWriteIOPS is 100 and write latency is 10ms then a single job would + barely be able to reach 100 IOPS so this should be at least 2. + type: integer + collectorName: + type: string + datasync: + description: |- + Whether to call datasync on the file after each write. Skipped if Sync is also true. Does not + apply to background IOPS task. + type: boolean + directory: + description: The directory where the benchmark will create + files. + type: string + enableBackgroundIOPS: + description: Enable the background IOPS feature. + type: boolean + exclude: + type: BoolString + fileSize: + description: |- + The size of the file used in the benchmark. The number of IO operations for the benchmark + will be FileSize / OperationSizeBytes. Accepts valid Kubernetes resource units such as Mi. + type: string + operationSize: + description: |- + The size of each write operation performed while benchmarking. This does not apply to the + background IOPS feature if enabled, since those must be fixed at 4096. + format: int64 + type: integer + runTime: + description: |- + Limit runtime. The test will run until it completes the configured I/O workload or until it + has run for this specified amount of time, whichever occurs first. When the unit is omitted, + the value is interpreted in seconds. Defaults to 120 seconds. Set to "0" to disable. + type: string + sync: + description: Whether to call sync on the file after each + write. Does not apply to background IOPS task. + type: boolean + timeout: + description: Total timeout, including background IOPS setup + and warmup if enabled. + type: string + required: + - backgroundIOPSWarmupSeconds + - backgroundReadIOPS + - backgroundReadIOPSJobs + - backgroundWriteIOPS + - backgroundWriteIOPSJobs + - enableBackgroundIOPS + type: object + hostOS: + properties: + collectorName: + type: string + exclude: + type: BoolString + type: object + hostServices: + properties: + collectorName: + type: string + exclude: + type: BoolString + type: object + http: + properties: + collectorName: + type: string + exclude: + type: BoolString + get: + properties: + headers: + additionalProperties: + type: string + type: object + insecureSkipVerify: + type: boolean + timeout: + description: |- + Timeout is the time to wait for a server's response. Its a duration e.g 15s, 2h30m. + Missing value or empty string or means no timeout. + type: string + url: + type: string + required: + - url + type: object + post: + properties: + body: + type: string + headers: + additionalProperties: + type: string + type: object + insecureSkipVerify: + type: boolean + timeout: + description: |- + Timeout is the time to wait for a server's response. Its a duration e.g 15s, 2h30m. + Missing value or empty string or means no timeout. + type: string + url: + type: string + required: + - url + type: object + put: + properties: + body: + type: string + headers: + additionalProperties: + type: string + type: object + insecureSkipVerify: + type: boolean + timeout: + description: |- + Timeout is the time to wait for a server's response. Its a duration e.g 15s, 2h30m. + Missing value or empty string or means no timeout. + type: string + url: + type: string + required: + - url + type: object + type: object + httpLoadBalancer: + properties: + address: + type: string + collectorName: + type: string + exclude: + type: BoolString + path: + type: string + port: + type: integer + timeout: + type: string + required: + - address + - path + - port + type: object + ipv4Interfaces: + properties: + collectorName: + type: string + exclude: + type: BoolString + type: object + journald: + properties: + collectorName: + type: string + dmesg: + type: boolean + exclude: + type: BoolString + lines: + type: integer + output: + type: string + reverse: + type: boolean + since: + type: string + system: + type: boolean + timeout: + type: string + units: + items: + type: string + type: array + until: + type: string + utc: + type: boolean + type: object + kernelConfigs: + properties: + collectorName: + type: string + exclude: + type: BoolString + type: object + kernelModules: + properties: + collectorName: + type: string + exclude: + type: BoolString + type: object + kubernetes: + properties: + collectorName: + type: string + exclude: + type: BoolString + type: object + memory: + properties: + collectorName: + type: string + exclude: + type: BoolString + type: object + run: + properties: + args: + items: + type: string + type: array + collectorName: + type: string + command: + type: string + env: + items: + type: string + type: array + exclude: + type: BoolString + ignoreParentEnvs: + type: boolean + inheritEnvs: + items: + type: string + type: array + input: + additionalProperties: + type: string + type: object + outputDir: + type: string + timeout: + type: string + required: + - args + - command + type: object + subnetAvailable: + properties: + CIDRRangeAlloc: + type: string + collectorName: + type: string + desiredCIDR: + type: integer + exclude: + type: BoolString + required: + - CIDRRangeAlloc + - desiredCIDR + type: object + systemPackages: + properties: + amzn: + items: + type: string + type: array + amzn2: + items: + type: string + type: array + centos: + items: + type: string + type: array + centos7: + items: + type: string + type: array + centos8: + items: + type: string + type: array + centos9: + items: + type: string + type: array + collectorName: + type: string + exclude: + type: BoolString + ol: + items: + type: string + type: array + ol7: + items: + type: string + type: array + ol8: + items: + type: string + type: array + ol9: + items: + type: string + type: array + rhel: + items: + type: string + type: array + rhel7: + items: + type: string + type: array + rhel8: + items: + type: string + type: array + rhel9: + items: + type: string + type: array + rocky: + items: + type: string + type: array + rocky8: + items: + type: string + type: array + rocky9: + items: + type: string + type: array + ubuntu: + items: + type: string + type: array + ubuntu16: + items: + type: string + type: array + ubuntu18: + items: + type: string + type: array + ubuntu20: + items: + type: string + type: array + type: object + tcpConnect: + properties: + address: + type: string + collectorName: + type: string + exclude: + type: BoolString + timeout: + type: string + required: + - address + type: object + tcpLoadBalancer: + properties: + address: + type: string + collectorName: + type: string + exclude: + type: BoolString + port: + type: integer + timeout: + type: string + required: + - address + - port + type: object + tcpPortStatus: + properties: + collectorName: + type: string + exclude: + type: BoolString + interface: + type: string + port: + type: integer + required: + - port + type: object + time: + properties: + collectorName: + type: string + exclude: + type: BoolString + type: object + udpPortStatus: + properties: + collectorName: + type: string + exclude: + type: BoolString + interface: + type: string + port: + type: integer + required: + - port + type: object + type: object + type: array uri: type: string type: object diff --git a/pkg/apis/troubleshoot/v1beta2/collector_types.go b/pkg/apis/troubleshoot/v1beta2/collector_types.go index e95f51ce2..aac221f9e 100644 --- a/pkg/apis/troubleshoot/v1beta2/collector_types.go +++ b/pkg/apis/troubleshoot/v1beta2/collector_types.go @@ -34,6 +34,7 @@ type AfterCollection struct { // CollectorSpec defines the desired state of Collector type CollectorSpec struct { Collectors []*Collect `json:"collectors,omitempty" yaml:"collectors,omitempty"` + HostCollectors []*HostCollect `json:"hostCollectors,omitempty" yaml:"hostCollectors,omitempty"` AfterCollection []*AfterCollection `json:"afterCollection,omitempty" yaml:"afterCollection,omitempty"` Uri string `json:"uri,omitempty" yaml:"uri,omitempty"` } diff --git a/pkg/apis/troubleshoot/v1beta2/zz_generated.deepcopy.go b/pkg/apis/troubleshoot/v1beta2/zz_generated.deepcopy.go index 5b40aca8f..af210443e 100644 --- a/pkg/apis/troubleshoot/v1beta2/zz_generated.deepcopy.go +++ b/pkg/apis/troubleshoot/v1beta2/zz_generated.deepcopy.go @@ -1094,6 +1094,17 @@ func (in *CollectorSpec) DeepCopyInto(out *CollectorSpec) { } } } + if in.HostCollectors != nil { + in, out := &in.HostCollectors, &out.HostCollectors + *out = make([]*HostCollect, len(*in)) + for i := range *in { + if (*in)[i] != nil { + in, out := &(*in)[i], &(*out)[i] + *out = new(HostCollect) + (*in).DeepCopyInto(*out) + } + } + } if in.AfterCollection != nil { in, out := &in.AfterCollection, &out.AfterCollection *out = make([]*AfterCollection, len(*in)) diff --git a/pkg/supportbundle/load.go b/pkg/supportbundle/load.go index a5152cf3b..888110cc0 100644 --- a/pkg/supportbundle/load.go +++ b/pkg/supportbundle/load.go @@ -38,7 +38,6 @@ func GetSupportBundleFromURI(bundleURI string) (*troubleshootv1beta2.SupportBund } // ParseSupportBundle parses a support bundle from a byte array into a SupportBundle object -// We will deprecate this in favour of use loader.LoadSpecs once the new API is stable func ParseSupportBundle(doc []byte, followURI bool) (*troubleshootv1beta2.SupportBundle, error) { doc, err := docrewrite.ConvertToV1Beta2(doc) if err != nil { @@ -65,7 +64,9 @@ func ParseSupportBundle(doc []byte, followURI bool) (*troubleshootv1beta2.Suppor ObjectMeta: collector.ObjectMeta, Spec: troubleshootv1beta2.SupportBundleSpec{ Collectors: collector.Spec.Collectors, + HostCollectors: collector.Spec.HostCollectors, Analyzers: []*troubleshootv1beta2.Analyze{}, + HostAnalyzers: []*troubleshootv1beta2.HostAnalyze{}, AfterCollection: collector.Spec.AfterCollection, }, } diff --git a/pkg/supportbundle/load_test.go b/pkg/supportbundle/load_test.go new file mode 100644 index 000000000..e4d54911e --- /dev/null +++ b/pkg/supportbundle/load_test.go @@ -0,0 +1,94 @@ +package supportbundle + +import ( + "reflect" + "testing" + + troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func Test_ParseSupportBundle(t *testing.T) { + tests := []struct { + name string + doc []byte + followURI bool + want *troubleshootv1beta2.SupportBundle + wantErr bool + }{ + { + name: "Parse Host Collectors", + doc: []byte(` +apiVersion: troubleshoot.sh/v1beta2 +kind: SupportBundle +metadata: + name: test +spec: + hostCollectors: + - hostOS: {} +`), + followURI: false, + want: &troubleshootv1beta2.SupportBundle{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "troubleshoot.sh/v1beta2", + Kind: "SupportBundle", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "test", + }, + Spec: troubleshootv1beta2.SupportBundleSpec{ + HostCollectors: []*troubleshootv1beta2.HostCollect{ + { + HostOS: &troubleshootv1beta2.HostOS{}, + }, + }, + }, + }, + wantErr: false, + }, + { + name: "Parse Collectors", + doc: []byte(` +apiVersion: troubleshoot.sh/v1beta2 +kind: SupportBundle +metadata: + name: test +spec: + collectors: + - clusterInfo: {} +`), + followURI: false, + want: &troubleshootv1beta2.SupportBundle{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "troubleshoot.sh/v1beta2", + Kind: "SupportBundle", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "test", + }, + Spec: troubleshootv1beta2.SupportBundleSpec{ + Collectors: []*troubleshootv1beta2.Collect{ + { + ClusterInfo: &troubleshootv1beta2.ClusterInfo{}, + }, + }, + }, + }, + wantErr: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := ParseSupportBundle(tt.doc, tt.followURI) + if (err != nil) != tt.wantErr { + t.Errorf("ParseSupportBundle() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("ParseSupportBundle() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/schemas/collector-troubleshoot-v1beta2.json b/schemas/collector-troubleshoot-v1beta2.json index a539ae297..c6b6105a8 100644 --- a/schemas/collector-troubleshoot-v1beta2.json +++ b/schemas/collector-troubleshoot-v1beta2.json @@ -14367,6 +14367,760 @@ } } }, + "hostCollectors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "blockDevices": { + "type": "object", + "properties": { + "collectorName": { + "type": "string" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + } + } + }, + "certificate": { + "type": "object", + "required": [ + "certificatePath", + "keyPath" + ], + "properties": { + "certificatePath": { + "type": "string" + }, + "collectorName": { + "type": "string" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + }, + "keyPath": { + "type": "string" + } + } + }, + "certificatesCollection": { + "type": "object", + "required": [ + "paths" + ], + "properties": { + "collectorName": { + "type": "string" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "cgroups": { + "type": "object", + "properties": { + "collectorName": { + "type": "string" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + }, + "mountPoint": { + "type": "string" + } + } + }, + "copy": { + "type": "object", + "required": [ + "path" + ], + "properties": { + "collectorName": { + "type": "string" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + }, + "path": { + "type": "string" + } + } + }, + "cpu": { + "type": "object", + "properties": { + "collectorName": { + "type": "string" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + } + } + }, + "diskUsage": { + "type": "object", + "required": [ + "path" + ], + "properties": { + "collectorName": { + "type": "string" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + }, + "path": { + "type": "string" + } + } + }, + "dns": { + "type": "object", + "required": [ + "hostnames" + ], + "properties": { + "collectorName": { + "type": "string" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + }, + "hostnames": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "filesystemPerformance": { + "description": "FilesystemPerformance benchmarks sequential write latency on a single file.\nThe optional background IOPS feature attempts to mimic real-world conditions by running read and\nwrite workloads prior to and during benchmark execution.", + "type": "object", + "required": [ + "backgroundIOPSWarmupSeconds", + "backgroundReadIOPS", + "backgroundReadIOPSJobs", + "backgroundWriteIOPS", + "backgroundWriteIOPSJobs", + "enableBackgroundIOPS" + ], + "properties": { + "backgroundIOPSWarmupSeconds": { + "description": "How long to run the background IOPS read and write workloads prior to starting the benchmarks.", + "type": "integer" + }, + "backgroundReadIOPS": { + "description": "The target read IOPS to run while benchmarking. This is a limit and there is no guarantee\nit will be reached. This is the total IOPS for all background read jobs.", + "type": "integer" + }, + "backgroundReadIOPSJobs": { + "description": "Number of threads to use for background read IOPS. This should be set high enough to reach\nthe target specified in BackgrounReadIOPS.", + "type": "integer" + }, + "backgroundWriteIOPS": { + "description": "The target write IOPS to run while benchmarking. This is a limit and there is no guarantee\nit will be reached. This is the total IOPS for all background write jobs.", + "type": "integer" + }, + "backgroundWriteIOPSJobs": { + "description": "Number of threads to use for background write IOPS. This should be set high enough to reach\nthe target specified in BackgroundWriteIOPS.\nExample: If BackgroundWriteIOPS is 100 and write latency is 10ms then a single job would\nbarely be able to reach 100 IOPS so this should be at least 2.", + "type": "integer" + }, + "collectorName": { + "type": "string" + }, + "datasync": { + "description": "Whether to call datasync on the file after each write. Skipped if Sync is also true. Does not\napply to background IOPS task.", + "type": "boolean" + }, + "directory": { + "description": "The directory where the benchmark will create files.", + "type": "string" + }, + "enableBackgroundIOPS": { + "description": "Enable the background IOPS feature.", + "type": "boolean" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + }, + "fileSize": { + "description": "The size of the file used in the benchmark. The number of IO operations for the benchmark\nwill be FileSize / OperationSizeBytes. Accepts valid Kubernetes resource units such as Mi.", + "type": "string" + }, + "operationSize": { + "description": "The size of each write operation performed while benchmarking. This does not apply to the\nbackground IOPS feature if enabled, since those must be fixed at 4096.", + "type": "integer", + "format": "int64" + }, + "runTime": { + "description": "Limit runtime. The test will run until it completes the configured I/O workload or until it\nhas run for this specified amount of time, whichever occurs first. When the unit is omitted,\nthe value is interpreted in seconds. Defaults to 120 seconds. Set to \"0\" to disable.", + "type": "string" + }, + "sync": { + "description": "Whether to call sync on the file after each write. Does not apply to background IOPS task.", + "type": "boolean" + }, + "timeout": { + "description": "Total timeout, including background IOPS setup and warmup if enabled.", + "type": "string" + } + } + }, + "hostOS": { + "type": "object", + "properties": { + "collectorName": { + "type": "string" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + } + } + }, + "hostServices": { + "type": "object", + "properties": { + "collectorName": { + "type": "string" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + } + } + }, + "http": { + "type": "object", + "properties": { + "collectorName": { + "type": "string" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + }, + "get": { + "type": "object", + "required": [ + "url" + ], + "properties": { + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "insecureSkipVerify": { + "type": "boolean" + }, + "timeout": { + "description": "Timeout is the time to wait for a server's response. Its a duration e.g 15s, 2h30m.\nMissing value or empty string or means no timeout.", + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "post": { + "type": "object", + "required": [ + "url" + ], + "properties": { + "body": { + "type": "string" + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "insecureSkipVerify": { + "type": "boolean" + }, + "timeout": { + "description": "Timeout is the time to wait for a server's response. Its a duration e.g 15s, 2h30m.\nMissing value or empty string or means no timeout.", + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "put": { + "type": "object", + "required": [ + "url" + ], + "properties": { + "body": { + "type": "string" + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "insecureSkipVerify": { + "type": "boolean" + }, + "timeout": { + "description": "Timeout is the time to wait for a server's response. Its a duration e.g 15s, 2h30m.\nMissing value or empty string or means no timeout.", + "type": "string" + }, + "url": { + "type": "string" + } + } + } + } + }, + "httpLoadBalancer": { + "type": "object", + "required": [ + "address", + "path", + "port" + ], + "properties": { + "address": { + "type": "string" + }, + "collectorName": { + "type": "string" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + }, + "path": { + "type": "string" + }, + "port": { + "type": "integer" + }, + "timeout": { + "type": "string" + } + } + }, + "ipv4Interfaces": { + "type": "object", + "properties": { + "collectorName": { + "type": "string" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + } + } + }, + "journald": { + "type": "object", + "properties": { + "collectorName": { + "type": "string" + }, + "dmesg": { + "type": "boolean" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + }, + "lines": { + "type": "integer" + }, + "output": { + "type": "string" + }, + "reverse": { + "type": "boolean" + }, + "since": { + "type": "string" + }, + "system": { + "type": "boolean" + }, + "timeout": { + "type": "string" + }, + "units": { + "type": "array", + "items": { + "type": "string" + } + }, + "until": { + "type": "string" + }, + "utc": { + "type": "boolean" + } + } + }, + "kernelConfigs": { + "type": "object", + "properties": { + "collectorName": { + "type": "string" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + } + } + }, + "kernelModules": { + "type": "object", + "properties": { + "collectorName": { + "type": "string" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + } + } + }, + "kubernetes": { + "type": "object", + "properties": { + "collectorName": { + "type": "string" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + } + } + }, + "memory": { + "type": "object", + "properties": { + "collectorName": { + "type": "string" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + } + } + }, + "run": { + "type": "object", + "required": [ + "args", + "command" + ], + "properties": { + "args": { + "type": "array", + "items": { + "type": "string" + } + }, + "collectorName": { + "type": "string" + }, + "command": { + "type": "string" + }, + "env": { + "type": "array", + "items": { + "type": "string" + } + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + }, + "ignoreParentEnvs": { + "type": "boolean" + }, + "inheritEnvs": { + "type": "array", + "items": { + "type": "string" + } + }, + "input": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "outputDir": { + "type": "string" + }, + "timeout": { + "type": "string" + } + } + }, + "subnetAvailable": { + "type": "object", + "required": [ + "CIDRRangeAlloc", + "desiredCIDR" + ], + "properties": { + "CIDRRangeAlloc": { + "type": "string" + }, + "collectorName": { + "type": "string" + }, + "desiredCIDR": { + "type": "integer" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + } + } + }, + "systemPackages": { + "type": "object", + "properties": { + "amzn": { + "type": "array", + "items": { + "type": "string" + } + }, + "amzn2": { + "type": "array", + "items": { + "type": "string" + } + }, + "centos": { + "type": "array", + "items": { + "type": "string" + } + }, + "centos7": { + "type": "array", + "items": { + "type": "string" + } + }, + "centos8": { + "type": "array", + "items": { + "type": "string" + } + }, + "centos9": { + "type": "array", + "items": { + "type": "string" + } + }, + "collectorName": { + "type": "string" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + }, + "ol": { + "type": "array", + "items": { + "type": "string" + } + }, + "ol7": { + "type": "array", + "items": { + "type": "string" + } + }, + "ol8": { + "type": "array", + "items": { + "type": "string" + } + }, + "ol9": { + "type": "array", + "items": { + "type": "string" + } + }, + "rhel": { + "type": "array", + "items": { + "type": "string" + } + }, + "rhel7": { + "type": "array", + "items": { + "type": "string" + } + }, + "rhel8": { + "type": "array", + "items": { + "type": "string" + } + }, + "rhel9": { + "type": "array", + "items": { + "type": "string" + } + }, + "rocky": { + "type": "array", + "items": { + "type": "string" + } + }, + "rocky8": { + "type": "array", + "items": { + "type": "string" + } + }, + "rocky9": { + "type": "array", + "items": { + "type": "string" + } + }, + "ubuntu": { + "type": "array", + "items": { + "type": "string" + } + }, + "ubuntu16": { + "type": "array", + "items": { + "type": "string" + } + }, + "ubuntu18": { + "type": "array", + "items": { + "type": "string" + } + }, + "ubuntu20": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "tcpConnect": { + "type": "object", + "required": [ + "address" + ], + "properties": { + "address": { + "type": "string" + }, + "collectorName": { + "type": "string" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + }, + "timeout": { + "type": "string" + } + } + }, + "tcpLoadBalancer": { + "type": "object", + "required": [ + "address", + "port" + ], + "properties": { + "address": { + "type": "string" + }, + "collectorName": { + "type": "string" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + }, + "port": { + "type": "integer" + }, + "timeout": { + "type": "string" + } + } + }, + "tcpPortStatus": { + "type": "object", + "required": [ + "port" + ], + "properties": { + "collectorName": { + "type": "string" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + }, + "interface": { + "type": "string" + }, + "port": { + "type": "integer" + } + } + }, + "time": { + "type": "object", + "properties": { + "collectorName": { + "type": "string" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + } + } + }, + "udpPortStatus": { + "type": "object", + "required": [ + "port" + ], + "properties": { + "collectorName": { + "type": "string" + }, + "exclude": { + "oneOf": [{"type": "string"},{"type": "boolean"}] + }, + "interface": { + "type": "string" + }, + "port": { + "type": "integer" + } + } + } + } + } + }, "uri": { "type": "string" }