From 0bc769cd29fb8c9bd0591062c8c08fec60f7f165 Mon Sep 17 00:00:00 2001 From: SpiritZhou Date: Mon, 20 Jan 2025 10:11:58 +0800 Subject: [PATCH 01/23] update Signed-off-by: SpiritZhou --- Makefile | 4 + pkg/scalers/scalersconfig/typed_config.go | 80 +- schema/triggerMetadata.yaml | 1297 +++++++++++++++++++++ schema/trigger_schema.go | 471 ++++++++ 4 files changed, 1812 insertions(+), 40 deletions(-) create mode 100644 schema/triggerMetadata.yaml create mode 100644 schema/trigger_schema.go diff --git a/Makefile b/Makefile index b1d6e561d2f..cd81780d43f 100644 --- a/Makefile +++ b/Makefile @@ -382,3 +382,7 @@ docker-build-dev-containers: ## Build dev-containers image .PHONY: validate-changelog validate-changelog: ## Validate changelog ./hack/validate-changelog.sh + +.PHONY: generate-trigger-schemas +generate-trigger-schemas: ## Generate trigger shcemas + GOBIN=$(LOCALBIN) go run ./schema/trigger_schema.go --keda-version $(VERSION) --scalers-builder-file "pkg/scaling/scalers_builder.go" --scalers-files-dir "pkg/scalers" --output-file-path "schema/" diff --git a/pkg/scalers/scalersconfig/typed_config.go b/pkg/scalers/scalersconfig/typed_config.go index ac485fe91f2..040d46f74c8 100644 --- a/pkg/scalers/scalersconfig/typed_config.go +++ b/pkg/scalers/scalersconfig/typed_config.go @@ -48,8 +48,8 @@ const ( AuthParams ParsingOrder = "authParams" ) -// allowedParsingOrderMap is a map with set of valid parsing orders -var allowedParsingOrderMap = map[ParsingOrder]bool{ +// AllowedParsingOrderMap is a map with set of valid parsing orders +var AllowedParsingOrderMap = map[ParsingOrder]bool{ TriggerMetadata: true, ResolvedEnv: true, AuthParams: true, @@ -58,28 +58,28 @@ var allowedParsingOrderMap = map[ParsingOrder]bool{ // separators for field tag structure // e.g. name=stringVal,order=triggerMetadata;resolvedEnv;authParams,optional const ( - tagSeparator = "," - tagKeySeparator = "=" - tagValueSeparator = ";" + TagSeparator = "," + TagKeySeparator = "=" + TagValueSeparator = ";" ) // separators for map and slice elements const ( - elemKeyValSeparator = "=" + ElemKeyValSeparator = "=" ) // field tag parameters const ( - optionalTag = "optional" - deprecatedTag = "deprecated" - deprecatedAnnounceTag = "deprecatedAnnounce" - defaultTag = "default" - orderTag = "order" - nameTag = "name" - enumTag = "enum" - exclusiveSetTag = "exclusiveSet" - rangeTag = "range" - separatorTag = "separator" + OptionalTag = "optional" + DeprecatedTag = "deprecated" + DeprecatedAnnounceTag = "deprecatedAnnounce" + DefaultTag = "default" + OrderTag = "order" + NameTag = "name" + EnumTag = "enum" + ExclusiveSetTag = "exclusiveSet" + RangeTag = "range" + SeparatorTag = "separator" ) // Params is a struct that represents the parameter list that can be used in the keda tag @@ -139,7 +139,7 @@ func (p Params) IsDeprecated() bool { // DeprecatedMessage is a function that returns the optional deprecated message if the parameter is deprecated func (p Params) DeprecatedMessage() string { - if p.Deprecated == deprecatedTag { + if p.Deprecated == DeprecatedTag { return "" } return fmt.Sprintf(": %s", p.Deprecated) @@ -219,7 +219,7 @@ func (sc *ScalerConfig) setValue(field reflect.Value, params Params) error { } if !exists && !(params.Optional || params.IsDeprecated()) { if len(params.Order) == 0 { - apo := slices.Sorted(maps.Keys(allowedParsingOrderMap)) + apo := slices.Sorted(maps.Keys(AllowedParsingOrderMap)) return fmt.Errorf("missing required parameter %q, no 'order' tag, provide any from %v", params.Name(), apo) } return fmt.Errorf("missing required parameter %q in %v", params.Name(), params.Order) @@ -301,9 +301,9 @@ func setConfigValueMap(params Params, valFromConfig string, field reflect.Value) split := splitWithSeparator(valFromConfig, params.Separator) for _, s := range split { s := strings.TrimSpace(s) - kv := strings.Split(s, elemKeyValSeparator) + kv := strings.Split(s, ElemKeyValSeparator) if len(kv) != 2 { - return fmt.Errorf("expected format key%vvalue, got %q", elemKeyValSeparator, s) + return fmt.Errorf("expected format key%vvalue, got %q", ElemKeyValSeparator, s) } key := strings.TrimSpace(kv[0]) val := strings.TrimSpace(kv[1]) @@ -459,66 +459,66 @@ func (sc *ScalerConfig) configParamValue(params Params) (string, bool) { // paramsFromTag is a function that returns the Params struct based on the field tag func paramsFromTag(tag string, field reflect.StructField) (Params, error) { params := Params{FieldName: field.Name} - tagSplit := strings.Split(tag, tagSeparator) + tagSplit := strings.Split(tag, TagSeparator) for _, ts := range tagSplit { - tsplit := strings.Split(ts, tagKeySeparator) + tsplit := strings.Split(ts, TagKeySeparator) tsplit[0] = strings.TrimSpace(tsplit[0]) switch tsplit[0] { - case optionalTag: + case OptionalTag: if len(tsplit) == 1 { params.Optional = true } if len(tsplit) > 1 { params.Optional, _ = strconv.ParseBool(strings.TrimSpace(tsplit[1])) } - case orderTag: + case OrderTag: if len(tsplit) > 1 { - order := strings.Split(tsplit[1], tagValueSeparator) + order := strings.Split(tsplit[1], TagValueSeparator) for _, po := range order { poTyped := ParsingOrder(strings.TrimSpace(po)) - if !allowedParsingOrderMap[poTyped] { - apo := slices.Sorted(maps.Keys(allowedParsingOrderMap)) + if !AllowedParsingOrderMap[poTyped] { + apo := slices.Sorted(maps.Keys(AllowedParsingOrderMap)) return params, fmt.Errorf("unknown parsing order value %s, has to be one of %s", po, apo) } params.Order = append(params.Order, poTyped) } } - case nameTag: + case NameTag: if len(tsplit) > 1 { - params.Names = strings.Split(strings.TrimSpace(tsplit[1]), tagValueSeparator) + params.Names = strings.Split(strings.TrimSpace(tsplit[1]), TagValueSeparator) } - case deprecatedTag: + case DeprecatedTag: if len(tsplit) == 1 { - params.Deprecated = deprecatedTag + params.Deprecated = DeprecatedTag } else { params.Deprecated = strings.TrimSpace(tsplit[1]) } - case deprecatedAnnounceTag: + case DeprecatedAnnounceTag: if len(tsplit) == 1 { - params.DeprecatedAnnounce = deprecatedAnnounceTag + params.DeprecatedAnnounce = DeprecatedAnnounceTag } else { params.DeprecatedAnnounce = strings.TrimSpace(tsplit[1]) } - case defaultTag: + case DefaultTag: if len(tsplit) > 1 { params.Default = strings.TrimSpace(tsplit[1]) } - case enumTag: + case EnumTag: if len(tsplit) > 1 { - params.Enum = strings.Split(tsplit[1], tagValueSeparator) + params.Enum = strings.Split(tsplit[1], TagValueSeparator) } - case exclusiveSetTag: + case ExclusiveSetTag: if len(tsplit) > 1 { - params.ExclusiveSet = strings.Split(tsplit[1], tagValueSeparator) + params.ExclusiveSet = strings.Split(tsplit[1], TagValueSeparator) } - case rangeTag: + case RangeTag: if len(tsplit) == 1 { params.RangeSeparator = "-" } if len(tsplit) == 2 { params.RangeSeparator = strings.TrimSpace(tsplit[1]) } - case separatorTag: + case SeparatorTag: if len(tsplit) > 1 { params.Separator = strings.TrimSpace(tsplit[1]) } diff --git a/schema/triggerMetadata.yaml b/schema/triggerMetadata.yaml new file mode 100644 index 00000000000..74da374be13 --- /dev/null +++ b/schema/triggerMetadata.yaml @@ -0,0 +1,1297 @@ +kedaVersion: main +schemaVersion: 1 +triggers: + - type: prometheus + metadata: + - name: serverAddress + type: string + - name: query + type: string + - name: queryParameters + type: string + optional: true + - name: threshold + type: string + - name: activationThreshold + type: string + optional: true + - name: namespace + type: string + optional: true + - name: customHeaders + type: string + optional: true + - name: ignoreNullValues + type: string + optional: true + default: "true" + - name: unsafeSsl + type: string + optional: true + - name: awsRegion + type: string + optional: true + canReadFromAuth: true + - type: redis-sentinel-streams + metadata: + - name: pendingEntriesCount + type: string + optional: true + default: "5" + - name: streamLength + type: string + optional: true + default: "5" + - name: lagCount + type: string + optional: true + - name: stream + type: string + - name: consumerGroup + type: string + optional: true + - name: databaseIndex + type: string + optional: true + - name: address + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: addresses + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: username + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: password + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: sentinelUsername + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: sentinelPassword + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: sentinelMaster + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: host + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: hosts + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: port + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: ports + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: unsafeSsl + type: string + optional: true + default: "false" + - name: Cert + type: string + canReadFromAuth: true + - name: cert + type: string + canReadFromAuth: true + - name: key + type: string + canReadFromAuth: true + - name: keyPassword + type: string + canReadFromAuth: true + - name: ca + type: string + canReadFromAuth: true + - name: activationLagCount + type: string + optional: true + - name: enableTLS + type: string + optional: true + - name: tls + type: string + optional: true + canReadFromAuth: true + - type: redis-streams + metadata: + - name: pendingEntriesCount + type: string + optional: true + default: "5" + - name: streamLength + type: string + optional: true + default: "5" + - name: lagCount + type: string + optional: true + - name: stream + type: string + - name: consumerGroup + type: string + optional: true + - name: databaseIndex + type: string + optional: true + - name: address + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: addresses + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: username + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: password + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: sentinelUsername + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: sentinelPassword + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: sentinelMaster + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: host + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: hosts + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: port + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: ports + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: unsafeSsl + type: string + optional: true + default: "false" + - name: Cert + type: string + canReadFromAuth: true + - name: cert + type: string + canReadFromAuth: true + - name: key + type: string + canReadFromAuth: true + - name: keyPassword + type: string + canReadFromAuth: true + - name: ca + type: string + canReadFromAuth: true + - name: activationLagCount + type: string + optional: true + - name: enableTLS + type: string + optional: true + - name: tls + type: string + optional: true + canReadFromAuth: true + - type: redis-cluster-streams + metadata: + - name: pendingEntriesCount + type: string + optional: true + default: "5" + - name: streamLength + type: string + optional: true + default: "5" + - name: lagCount + type: string + optional: true + - name: stream + type: string + - name: consumerGroup + type: string + optional: true + - name: databaseIndex + type: string + optional: true + - name: address + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: addresses + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: username + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: password + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: sentinelUsername + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: sentinelPassword + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: sentinelMaster + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: host + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: hosts + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: port + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: ports + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: unsafeSsl + type: string + optional: true + default: "false" + - name: Cert + type: string + canReadFromAuth: true + - name: cert + type: string + canReadFromAuth: true + - name: key + type: string + canReadFromAuth: true + - name: keyPassword + type: string + canReadFromAuth: true + - name: ca + type: string + canReadFromAuth: true + - name: activationLagCount + type: string + optional: true + - name: enableTLS + type: string + optional: true + - name: tls + type: string + optional: true + canReadFromAuth: true + - type: solr + metadata: + - name: host + type: string + - name: collection + type: string + - name: targetQueryValue + type: string + - name: activationTargetQueryValue + type: string + optional: true + default: "0" + - name: query + type: string + optional: true + - name: username + type: string + canReadFromAuth: true + - name: password + type: string + canReadFromAuth: true + - type: splunk + metadata: + - name: apiToken + type: string + optional: true + canReadFromAuth: true + - name: password + type: string + optional: true + canReadFromAuth: true + - name: username + type: string + canReadFromAuth: true + - name: host + type: string + - name: unsafeSsl + type: string + optional: true + - name: targetValue + type: string + - name: activationValue + type: string + - name: savedSearchName + type: string + - name: valueField + type: string + - type: apache-kafka + metadata: + - name: bootstrapServers + type: string + canReadFromEnv: true + - name: consumerGroup + type: string + canReadFromEnv: true + - name: topic + type: string + optional: true + canReadFromEnv: true + - name: partitionLimitation + type: string + optional: true + rangeSeparator: '-' + - name: lagThreshold + type: string + default: "10" + - name: activationLagThreshold + type: string + default: "0" + - name: offsetResetPolicy + type: string + default: latest + allowedValue: + - earliest + - latest + - name: allowIdleConsumers + type: string + optional: true + - name: excludePersistentLag + type: string + optional: true + - name: scaleToZeroOnInvalidOffset + type: string + optional: true + - name: limitToPartitionsWithLag + type: string + optional: true + - name: sasl + type: string + default: none + allowedValue: + - none + - plaintext + - scram_sha256 + - scram_sha512 + - gssapi + - aws_msk_iam + canReadFromAuth: true + - name: username + type: string + optional: true + canReadFromAuth: true + - name: password + type: string + optional: true + canReadFromAuth: true + - name: awsRegion + type: string + optional: true + - name: awsEndpoint + type: string + optional: true + - name: tls + type: string + default: disable + allowedValue: + - enable + - disable + canReadFromAuth: true + - name: cert + type: string + optional: true + canReadFromAuth: true + - name: key + type: string + optional: true + canReadFromAuth: true + - name: keyPassword + type: string + optional: true + canReadFromAuth: true + - name: ca + type: string + optional: true + canReadFromAuth: true + - type: etcd + metadata: + - name: endpoints + type: string + - name: watchKey + type: string + - name: value + type: string + - name: activationValue + type: string + optional: true + default: "0" + - name: watchProgressNotifyInterval + type: string + optional: true + default: "600" + - name: username + type: string + optional: true + canReadFromEnv: true + canReadFromAuth: true + - name: password + type: string + optional: true + canReadFromEnv: true + canReadFromAuth: true + - name: tls + type: string + optional: true + default: disable + canReadFromAuth: true + - name: cert + type: string + optional: true + canReadFromAuth: true + - name: key + type: string + optional: true + canReadFromAuth: true + - name: keyPassword + type: string + optional: true + canReadFromAuth: true + - name: ca + type: string + optional: true + canReadFromAuth: true + - type: gcp-cloudtasks + metadata: + - name: value + type: string + optional: true + default: "100" + - name: activationValue + type: string + optional: true + default: "0" + - name: filterDuration + type: string + optional: true + - name: queueName + type: string + - name: projectID + type: string + - type: influxdb + metadata: + - name: authToken + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: organizationName + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: query + type: string + - name: serverURL + type: string + canReadFromAuth: true + - name: unsafeSsl + type: string + optional: true + - name: thresholdValue + type: string + optional: true + - name: activationThresholdValue + type: string + optional: true + - type: kubernetes-workload + metadata: + - name: podSelector + type: string + - name: value + type: string + default: "0" + - name: activationValue + type: string + default: "0" + - type: selenium-grid + metadata: + - name: url + type: string + canReadFromAuth: true + - name: authType + type: string + optional: true + canReadFromEnv: true + canReadFromAuth: true + - name: username + type: string + optional: true + canReadFromEnv: true + canReadFromAuth: true + - name: password + type: string + optional: true + canReadFromEnv: true + canReadFromAuth: true + - name: accessToken + type: string + optional: true + canReadFromEnv: true + canReadFromAuth: true + - name: browserName + type: string + optional: true + - name: sessionBrowserName + type: string + optional: true + - name: browserVersion + type: string + optional: true + - name: platformName + type: string + optional: true + - name: activationThreshold + type: string + optional: true + - name: unsafeSsl + type: string + default: "false" + - name: nodeMaxSessions + type: string + default: "1" + - type: postgresql + metadata: + - name: targetQueryValue + type: string + optional: true + - name: activationTargetQueryValue + type: string + optional: true + - name: connection + type: string + optional: true + canReadFromEnv: true + canReadFromAuth: true + - name: query + type: string + - name: host + type: string + optional: true + canReadFromAuth: true + - name: port + type: string + optional: true + canReadFromAuth: true + - name: userName + type: string + optional: true + canReadFromAuth: true + - name: dbName + type: string + optional: true + canReadFromAuth: true + - name: sslmode + type: string + optional: true + canReadFromAuth: true + - name: password + type: string + optional: true + canReadFromEnv: true + canReadFromAuth: true + - type: solace-event-queue + metadata: + - name: solaceSempBaseURL + type: string + - name: messageVpn + type: string + - name: queueName + type: string + - name: username + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: password + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: messageCountTarget + type: string + optional: true + - name: messageSpoolUsageTarget + type: string + optional: true + - name: messageReceiveRateTarget + type: string + optional: true + - name: activationMessageCountTarget + type: string + optional: true + default: "0" + - name: activationMessageSpoolUsageTarget + type: string + optional: true + default: "0" + - name: activationMessageReceiveRateTarget + type: string + optional: true + default: "0" + - type: arangodb + metadata: + - name: endpoints + type: string + canReadFromAuth: true + - name: collection + type: string + - name: query + type: string + - name: queryValue + type: string + default: "0" + - name: activationQueryValue + type: string + default: "0" + - name: unsafeSsl + type: string + default: "false" + - name: connectionLimit + type: string + optional: true + - type: aws-kinesis-stream + metadata: + - name: shardCount + type: string + default: "2" + - name: activationShardCount + type: string + default: "0" + - name: streamName + type: string + - name: awsRegion + type: string + canReadFromAuth: true + - name: awsEndpoint + type: string + optional: true + - type: aws-sqs-queue + metadata: + - name: queueLength + type: string + default: "5" + - name: activationQueueLength + type: string + default: "0" + - name: queueURL + type: string + canReadFromEnv: true + - name: queueURLFromEnv + type: string + canReadFromEnv: true + - name: awsRegion + type: string + canReadFromAuth: true + - name: awsEndpoint + type: string + optional: true + - name: scaleOnInFlight + type: string + default: "true" + - name: scaleOnDelayed + type: string + default: "false" + - type: ibmmq + metadata: + - name: host + type: string + - name: queueName + type: string + - name: queueNames + type: string + - name: queueDepth + type: string + default: "20" + - name: activationQueueDepth + type: string + default: "0" + - name: operation + type: string + default: max + allowedValue: + - max + - avg + - sum + - name: username + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: password + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: unsafeSsl + type: string + default: "false" + - name: tls + type: string + default: "false" + deprecatedAnnounce: The 'tls' setting is DEPRECATED and will be removed in v2.18 - Use 'unsafeSsl' instead + - name: ca + type: string + optional: true + canReadFromAuth: true + - name: cert + type: string + optional: true + canReadFromAuth: true + - name: key + type: string + optional: true + canReadFromAuth: true + - name: keyPassword + type: string + optional: true + canReadFromAuth: true + - type: nsq + metadata: + - name: nsqLookupdHTTPAddresses + type: string + canReadFromEnv: true + - name: topic + type: string + canReadFromEnv: true + - name: channel + type: string + canReadFromEnv: true + - name: depthThreshold + type: string + default: "10" + canReadFromEnv: true + - name: activationDepthThreshold + type: string + default: "0" + canReadFromEnv: true + - name: useHttps + type: string + default: "false" + canReadFromEnv: true + - name: unsafeSsl + type: string + default: "false" + canReadFromEnv: true + - type: predictkube + metadata: + - name: prometheusAddress + type: string + - name: query + type: string + - name: predictHorizon + type: string + - name: queryStep + type: string + - name: historyTimeWindow + type: string + - name: apiKey + type: string + canReadFromAuth: true + - name: threshold + type: string + optional: true + - name: activationThreshold + type: string + optional: true + - type: rabbitmq + metadata: + - name: queueName + type: string + - name: mode + type: string + optional: true + default: Unknown + - name: queueLength + type: string + optional: true + - name: value + type: string + optional: true + - name: activationValue + type: string + optional: true + - name: host + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: protocol + type: string + optional: true + default: auto + canReadFromAuth: true + - name: vhostName + type: string + optional: true + - name: useRegex + type: string + optional: true + - name: excludeUnacknowledged + type: string + optional: true + - name: pageSize + type: string + optional: true + default: "100" + - name: operation + type: string + optional: true + default: sum + - name: timeout + type: string + optional: true + - name: username + type: string + optional: true + canReadFromEnv: true + canReadFromAuth: true + - name: password + type: string + optional: true + canReadFromEnv: true + canReadFromAuth: true + - name: ca + type: string + optional: true + canReadFromAuth: true + - name: cert + type: string + optional: true + canReadFromAuth: true + - name: key + type: string + optional: true + canReadFromAuth: true + - name: keyPassword + type: string + optional: true + canReadFromAuth: true + - name: tls + type: string + optional: true + default: disable + canReadFromAuth: true + - name: unsafeSsl + type: string + optional: true + - name: workloadIdentityResource + type: string + optional: true + canReadFromAuth: true + - type: redis-cluster + metadata: + - name: listLength + type: string + optional: true + default: "5" + - name: activationListLength + type: string + optional: true + - name: listName + type: string + - name: databaseIndex + type: string + optional: true + - name: enableTLS + type: string + optional: true + - name: tls + type: string + optional: true + canReadFromAuth: true + - name: address + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: addresses + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: username + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: password + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: sentinelUsername + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: sentinelPassword + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: sentinelMaster + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: host + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: hosts + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: port + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: ports + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: unsafeSsl + type: string + optional: true + default: "false" + - name: Cert + type: string + canReadFromAuth: true + - name: cert + type: string + canReadFromAuth: true + - name: key + type: string + canReadFromAuth: true + - name: keyPassword + type: string + canReadFromAuth: true + - name: ca + type: string + canReadFromAuth: true + - type: redis-sentinel + metadata: + - name: listLength + type: string + optional: true + default: "5" + - name: activationListLength + type: string + optional: true + - name: listName + type: string + - name: databaseIndex + type: string + optional: true + - name: enableTLS + type: string + optional: true + - name: tls + type: string + optional: true + canReadFromAuth: true + - name: address + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: addresses + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: username + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: password + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: sentinelUsername + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: sentinelPassword + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: sentinelMaster + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: host + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: hosts + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: port + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: ports + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: unsafeSsl + type: string + optional: true + default: "false" + - name: Cert + type: string + canReadFromAuth: true + - name: cert + type: string + canReadFromAuth: true + - name: key + type: string + canReadFromAuth: true + - name: keyPassword + type: string + canReadFromAuth: true + - name: ca + type: string + canReadFromAuth: true + - type: redis + metadata: + - name: listLength + type: string + optional: true + default: "5" + - name: activationListLength + type: string + optional: true + - name: listName + type: string + - name: databaseIndex + type: string + optional: true + - name: enableTLS + type: string + optional: true + - name: tls + type: string + optional: true + canReadFromAuth: true + - name: address + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: addresses + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: username + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: password + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: sentinelUsername + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: sentinelPassword + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: sentinelMaster + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: host + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: hosts + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: port + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: ports + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: unsafeSsl + type: string + optional: true + default: "false" + - name: Cert + type: string + canReadFromAuth: true + - name: cert + type: string + canReadFromAuth: true + - name: key + type: string + canReadFromAuth: true + - name: keyPassword + type: string + canReadFromAuth: true + - name: ca + type: string + canReadFromAuth: true + - type: activemq + metadata: + - name: managementEndpoint + type: string + optional: true + - name: destinationName + type: string + optional: true + - name: brokerName + type: string + optional: true + - name: username + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: password + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: corsHeader + type: string + optional: true + - name: restAPITemplate + type: string + optional: true + - name: targetQueueSize + type: string + optional: true + default: "10" + - name: activationTargetQueueSize + type: string + optional: true + default: "0" + - type: aws-cloudwatch + metadata: + - name: namespace + type: string + optional: true + - name: metricName + type: string + optional: true + - name: dimensionName + type: string + optional: true + separator: ; + - name: dimensionValue + type: string + optional: true + separator: ; + - name: expression + type: string + optional: true + - name: targetMetricValue + type: string + - name: activationTargetMetricValue + type: string + optional: true + - name: minMetricValue + type: string + - name: ignoreNullValues + type: string + optional: true + default: "true" + - name: metricCollectionTime + type: string + optional: true + default: "300" + - name: metricStat + type: string + optional: true + default: Average + - name: metricUnit + type: string + optional: true + - name: metricStatPeriod + type: string + optional: true + default: "300" + - name: metricEndTimeOffset + type: string + optional: true + default: "0" + - name: awsRegion + type: string + canReadFromAuth: true + - name: awsEndpoint + type: string + optional: true + - type: aws-dynamodb + metadata: + - name: tableName + type: string + - name: awsRegion + type: string + canReadFromAuth: true + - name: awsEndpoint + type: string + optional: true + - name: keyConditionExpression + type: string + - name: indexName + type: string + optional: true + - name: targetValue + type: string + optional: true + default: "-1" + - name: activationTargetValue + type: string + default: "0" + - type: aws-dynamodb-streams + metadata: + - name: shardCount + type: string + default: "2" + - name: activationShardCount + type: string + default: "0" + - name: tableName + type: string + - name: awsRegion + type: string + canReadFromAuth: true + - name: awsEndpoint + type: string + optional: true diff --git a/schema/trigger_schema.go b/schema/trigger_schema.go new file mode 100644 index 00000000000..d99e4ea12c5 --- /dev/null +++ b/schema/trigger_schema.go @@ -0,0 +1,471 @@ +/* +Copyright 2024 The KEDA Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "flag" + "fmt" + "go/ast" + "go/parser" + "go/token" + "log" + "os" + "strconv" + "strings" + + "github.com/kedacore/keda/v2/pkg/scalers/scalersconfig" + "github.com/spf13/pflag" + + "golang.org/x/exp/maps" + "golang.org/x/exp/slices" + "gopkg.in/yaml.v3" +) + +var ( + kedaVersion = "1.0" + schemaVersion = 1.0 +) + +// Identifier for the creator function of the scaler +// e.g. NewRedisScaler, NewSeleniumGridScaler +const ( + creatorSymbol = "New" +) + +// Metadata is a struct that represents each field of the trigger metadata +type Metadata struct { + // Name is the name of the field + Name string `json:"name,omitempty" yaml:"name,omitempty"` + + // Type is the variable type of the field + Type string `json:"type,omitempty" yaml:"type,omitempty"` + + // Optional is a boolean that indicates if the field is optional + Optional bool `json:"optional,omitempty" yaml:"optional,omitempty"` + + // Default is the default value of the field if exists + Default string `json:"default,omitempty" yaml:"default,omitempty"` + + // AllowedValue is a list of allowed values for the field + AllowedValue []string `json:"allowedValue,omitempty" yaml:"allowedValue,omitempty"` + + // Deprecated is a string that indicates if the field is deprecated + Deprecated string `json:"deprecated,omitempty" yaml:"deprecated,omitempty"` + + // DeprecatedAnnounce is a string that indicates the deprecation message + DeprecatedAnnounce string `json:"deprecatedAnnounce,omitempty" yaml:"deprecatedAnnounce,omitempty"` + + // Separator is the symbol that separates the value of the field + Separator string `json:"separator,omitempty" yaml:"separator,omitempty"` + + // ExclusiveSet is a list of fields that are exclusive with the field + ExclusiveSet []string `json:"exclusiveSet,omitempty" yaml:"exclusiveSet,omitempty"` + + // RangeSeparator is the symbol that indicates the range of the field + RangeSeparator string `json:"rangeSeparator,omitempty" yaml:"rangeSeparator,omitempty"` + + // CanReadFromEnv is a boolean that indicates if the field can be read from the environment + CanReadFromEnv bool `json:"canReadFromEnv,omitempty" yaml:"canReadFromEnv,omitempty"` + + // CanReadFromAuth is a boolean that indicates if the field can be read from the TriggerAuthentication + CanReadFromAuth bool `json:"canReadFromTAuthe,omitempty" yaml:"canReadFromAuth,omitempty"` +} + +// TriggerMetadataSchema is a struct that represents the metadata of a trigger +type TriggerMetadataSchema struct { + // Type is the name of the trigger + Type string `json:"type,omitempty" yaml:"type,omitempty"` + + // Metadata is a list of fields of the trigger + Metadata []Metadata `json:"metadata,omitempty" yaml:"metadata,omitempty"` +} + +// FullMetadataSchema is a complete schema of the trigger metadata +type FullMetadataSchema struct { + // KedaVersion is the version of the current KEDA + KedaVersion string `json:"kedaVersion,omitempty" yaml:"kedaVersion,omitempty"` + + // SchemaVersion is the version of the schema + SchemaVersion float64 `json:"schemaVersion,omitempty" yaml:"schemaVersion,omitempty"` + + // Triggers is a list of triggers + Triggers []TriggerMetadataSchema `json:"triggers,omitempty" yaml:"triggers,omitempty"` +} + +// aggregateSchemaStruct is a function that aggregates the info from different scaler structs and generates a schema +// scalersSelectors is a map that contains the name of the scaler and the name of the scaler creator function from the scalers_builder file +// kedaScalerStructs is the structs of the scalers that are tagged with `keda` +// kedaReferenceKedaTagStructs is the sub structs that are referenced by the keda tagged structs +func aggregateSchemaStruct(scalerSelectors map[string]string, kedaScalerStructs map[string]*ast.StructType, otherReferenceKedaTagStructs map[string]*ast.StructType, outputFilePath string) (err error) { + + triggerMetadataSchemas := []TriggerMetadataSchema{} + + for creatorName, scalerStructs := range kedaScalerStructs { + metadataFields, err := generateMetadataFields(scalerStructs, otherReferenceKedaTagStructs) + if err != nil { + fmt.Printf("Error generating metadata fields with creator %s: %s\n", creatorName, err) + continue + } + + // Find which trigger names the creator is called by and construct the metadata schema + for triggerName, selectorName := range scalerSelectors { + if selectorName == creatorName { + triggerMetadataSchema := TriggerMetadataSchema{} + triggerMetadataSchema.Type = triggerName + triggerMetadataSchema.Metadata = metadataFields + triggerMetadataSchemas = append(triggerMetadataSchemas, triggerMetadataSchema) + fmt.Printf("Scaler Metadata Schema Added: %s\n", triggerName) + } + + } + } + + // Combine all the metadata schemas into a complete schema + fullMetadataSchema := FullMetadataSchema{ + KedaVersion: kedaVersion, + SchemaVersion: schemaVersion, + Triggers: triggerMetadataSchemas, + } + + yamlData, err := yaml.Marshal(fullMetadataSchema) + if err != nil { + return err + } + + fileName := outputFilePath + "triggerMetadata.yaml" + err = os.WriteFile(fileName, yamlData, 0644) + if err != nil { + return err + } + return nil +} + +// generateMetadataFields is a function that generates the metadata fields of a scaler struct +func generateMetadataFields(structType *ast.StructType, otherReferenceKedaTagStructs map[string]*ast.StructType) ([]Metadata, error) { + + triggerMetadata := []Metadata{} + + // get the tag of each field and generate the metadata + for _, commentGroup := range structType.Fields.List { + if commentGroup.Tag == nil || commentGroup.Tag.Value == "" { + continue + } + metadataList, hasSubstruct, err := generateMetadatasFromTag(commentGroup.Tag.Value) + + if err != nil { + fmt.Printf("Error generating metadata fields from tag value: %s, err: %s\n", commentGroup.Tag.Value, err) + continue + } + + if !hasSubstruct { + triggerMetadata = append(triggerMetadata, metadataList...) + continue + } + + // If the field has a substruct, try to find substruct from reference structs + s, ok := commentGroup.Type.(*ast.Ident) + if !ok { + continue + } + if otherReferenceKedaTagStructs[s.Name] != nil { + subStructMetadataField, err := generateMetadataFields(otherReferenceKedaTagStructs[s.Name], otherReferenceKedaTagStructs) + if err == nil { + triggerMetadata = append(triggerMetadata, subStructMetadataField...) + } + } + } + + return triggerMetadata, nil +} + +// generateMetadatasFromTag is a function that generates the metadata field from tag +func generateMetadatasFromTag(tag string) ([]Metadata, bool, error) { + var fieldNames []string + metadata := Metadata{Type: "string"} + tagSplit := strings.Split(strings.Trim(strings.Split(strings.Trim(tag, "`"), ":")[1], "\""), scalersconfig.TagSeparator) + + if len(tagSplit) == 1 && tagSplit[0] == scalersconfig.OptionalTag { + return nil, true, nil + } + + for _, ts := range tagSplit { + tsplit := strings.Split(ts, scalersconfig.TagKeySeparator) + tsplit[0] = strings.TrimSpace(tsplit[0]) + switch tsplit[0] { + case scalersconfig.OptionalTag: + if len(tsplit) == 1 { + metadata.Optional = true + } + if len(tsplit) > 1 { + optional, err := strconv.ParseBool(strings.TrimSpace(tsplit[1])) + if err != nil { + return nil, false, fmt.Errorf("error parsing optional value %s: %w", tsplit[1], err) + } + metadata.Optional = optional + } + case scalersconfig.OrderTag: + if len(tsplit) > 1 { + order := strings.Split(tsplit[1], scalersconfig.TagValueSeparator) + for _, po := range order { + poTyped := scalersconfig.ParsingOrder(strings.TrimSpace(po)) + if !scalersconfig.AllowedParsingOrderMap[poTyped] { + apo := maps.Keys(scalersconfig.AllowedParsingOrderMap) + slices.Sort(apo) + return nil, false, fmt.Errorf("unknown parsing order value %s, has to be one of %s", po, apo) + } + if poTyped == scalersconfig.ResolvedEnv { + metadata.CanReadFromEnv = true + } else if poTyped == scalersconfig.AuthParams { + metadata.CanReadFromAuth = true + } + } + } + case scalersconfig.NameTag: + if len(tsplit) > 1 { + fieldNames = strings.Split(strings.TrimSpace(tsplit[1]), scalersconfig.TagValueSeparator) + } + case scalersconfig.DeprecatedTag: + if len(tsplit) == 1 { + metadata.Deprecated = scalersconfig.DeprecatedTag + } else { + metadata.Deprecated = strings.TrimSpace(tsplit[1]) + } + case scalersconfig.DeprecatedAnnounceTag: + if len(tsplit) == 1 { + metadata.DeprecatedAnnounce = scalersconfig.DeprecatedAnnounceTag + } else { + metadata.DeprecatedAnnounce = strings.TrimSpace(tsplit[1]) + } + case scalersconfig.DefaultTag: + if len(tsplit) > 1 { + metadata.Default = strings.TrimSpace(tsplit[1]) + } + case scalersconfig.EnumTag: + if len(tsplit) > 1 { + metadata.AllowedValue = strings.Split(tsplit[1], scalersconfig.TagValueSeparator) + } + case scalersconfig.ExclusiveSetTag: + if len(tsplit) > 1 { + metadata.ExclusiveSet = strings.Split(tsplit[1], scalersconfig.TagValueSeparator) + } + case scalersconfig.RangeTag: + if len(tsplit) == 1 { + metadata.RangeSeparator = "-" + } + if len(tsplit) == 2 { + metadata.RangeSeparator = strings.TrimSpace(tsplit[1]) + } + case scalersconfig.SeparatorTag: + if len(tsplit) > 1 { + metadata.Separator = strings.TrimSpace(tsplit[1]) + } + case "": + continue + default: + return nil, false, fmt.Errorf("unknown tag param %s: %s", tsplit[0], tag) + } + } + + if len(fieldNames) == 0 { + return nil, false, fmt.Errorf("Fieldname doesn't exist in tag value") + } + + metadatas := []Metadata{} + for _, fieldName := range fieldNames { + metadata.Name = fieldName + metadatas = append(metadatas, metadata) + } + + return metadatas, false, nil +} + +// getBuildScalerCalls is a function that gets the map of trigger names and the creator function names from the scalers_builder file +func getBuildScalerCalls(fileName string) (map[string]string, error) { + scalerCallers := map[string]string{} + data, err := os.ReadFile(fileName) + if err != nil { + return nil, err + } + + fset := token.NewFileSet() + f, err := parser.ParseFile(fset, "", string(data), 0) + if err != nil { + return nil, err + } + + // Try to find the "triggerType" switch statement and get the trigger names and creator function names + ast.Inspect(f, func(n ast.Node) bool { + switch t := n.(type) { + case *ast.SwitchStmt: + s, ok := t.Tag.(*ast.Ident) + if !ok || s.Name != "triggerType" { + break + } + // retrieve the creator function name from each case statment + for _, casesAst := range t.Body.List { + c, ok := casesAst.(*ast.CaseClause) + + if !ok || len(c.List) == 0 || len(c.Body) == 0 { + continue + } + + basic, ok := c.List[0].(*ast.BasicLit) + if !ok { + continue + } + + r, ok := c.Body[0].(*ast.ReturnStmt) + if !ok { + continue + } + + if len(r.Results) == 0 { + continue + } + caller, ok := r.Results[0].(*ast.CallExpr) + if !ok { + continue + } + + expr, ok := caller.Fun.(*ast.SelectorExpr) + if !ok { + continue + } + + scalerCallers[strings.Trim(basic.Value, "\"")] = expr.Sel.Name + } + + } + return true + }) + return scalerCallers, nil +} + +// getAllKedaTagedStructs is a function that gets all the structs that are tagged with `keda` from the scalers files +func getAllKedaTagedStructs(dir string) (map[string]*ast.StructType, map[string]*ast.StructType) { + // loop all files in the scalers directory and get the structs that are tagged with `keda` + entries, err := os.ReadDir(dir) + if err != nil { + log.Fatal(err) + } + + kedaScalerStructs := map[string]*ast.StructType{} + kedaTagStructs := map[string]*ast.StructType{} + + for _, e := range entries { + if e.IsDir() { + getAllKedaTagedStructs(dir + "/" + e.Name()) + continue + } + + data, err := os.ReadFile(dir + "/" + e.Name()) + if err != nil { + continue + } + + fset := token.NewFileSet() + f, err := parser.ParseFile(fset, "", string(data), 0) + if err != nil { + continue + } + + var scalerStructs *ast.StructType + + for _, decl := range f.Decls { + + switch v := decl.(type) { + case *ast.GenDecl: + for _, spec := range v.Specs { + ts, ok := spec.(*ast.TypeSpec) + if !ok { + continue + } + + structType, ok := ts.Type.(*ast.StructType) + if !ok { + continue + } + + hasTriggerIndex := false + for _, v := range structType.Fields.List { + // Find `triggerIndex` field and identify the struct as a scaler struct, otherwise identify the struct as an abstract substruct + if len(v.Names) > 0 && v.Names[0].Name == "triggerIndex" { + hasTriggerIndex = true + continue + } + + if v.Tag == nil || v.Tag.Value == "" { + continue + } + + tagvalue := strings.Split(strings.Trim(v.Tag.Value, "`"), ":") + + // if the tag is `keda`, add the struct to the kedaTagStructs map + if len(tagvalue) > 0 && tagvalue[0] == "keda" { + kedaTagStructs[ts.Name.Name] = structType + } + } + + if hasTriggerIndex { + scalerStructs = kedaTagStructs[ts.Name.Name] + delete(kedaTagStructs, ts.Name.Name) + } + } + case *ast.FuncDecl: + if strings.HasPrefix(v.Name.Name, creatorSymbol) && scalerStructs != nil { + kedaScalerStructs[v.Name.Name] = scalerStructs + } + } + } + } + + return kedaScalerStructs, kedaTagStructs +} + +func main() { + var builderFilePath string + var scalersFilesDirPath string + var specifyScaler string + var outputFilePath string + pflag.StringVar(&kedaVersion, "keda-version", "1.0", "Set the version of current KEDA in schema.") + pflag.StringVar(&builderFilePath, "scalers-builder-file", "../pkg/scaling/scalers_builder.go", "The file that exists `buildScaler` func.") + pflag.StringVar(&scalersFilesDirPath, "scalers-files-dir", "../pkg/scalers", "The directory that exists all scalers' files.") + pflag.StringVar(&specifyScaler, "specify-scaler", "", "Specify scaler name.") + pflag.StringVar(&outputFilePath, "output-file-path", "./", "triggerMetadata.yaml output file path.") + pflag.CommandLine.AddGoFlagSet(flag.CommandLine) + pflag.Parse() + + scalerSelectors, err := getBuildScalerCalls(builderFilePath) + if err != nil { + fmt.Print("error") + } + + if specifyScaler != "" { + if scalerSelectors[specifyScaler] != "" { + scalerSelectors = map[string]string{specifyScaler: scalerSelectors[specifyScaler]} + } else { + fmt.Println("Cannot find the specified scaler") + os.Exit(0) + } + } + + kedaTagStructs, otherReferenceStructs := getAllKedaTagedStructs(scalersFilesDirPath) + err = aggregateSchemaStruct(scalerSelectors, kedaTagStructs, otherReferenceStructs, outputFilePath) + if err != nil { + fmt.Print("error") + } +} From 1c30fedab5088b0e1ae23de5e99f5151af5c2105 Mon Sep 17 00:00:00 2001 From: SpiritZhou Date: Mon, 20 Jan 2025 10:18:24 +0800 Subject: [PATCH 02/23] Update Signed-off-by: SpiritZhou --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 963665fd4b7..8666f925670 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,6 +62,7 @@ To learn more about active deprecations, we recommend checking [GitHub Discussio - **General**: Enable OpenSSF Scorecard to enhance security practices across the project ([#5913](https://github.com/kedacore/keda/issues/5913)) - **General**: Introduce new NSQ scaler ([#3281](https://github.com/kedacore/keda/issues/3281)) - **General**: Operator flag to control patching of webhook resources certificates ([#6184](https://github.com/kedacore/keda/issues/6184)) +- **General**: Trigger Schema Generated Tool ([#6345](https://github.com/kedacore/keda/issues/6345)) #### Experimental From c432c0bf440799b19207f7a2ed2b1313f941dda5 Mon Sep 17 00:00:00 2001 From: SpiritZhou Date: Mon, 20 Jan 2025 10:36:32 +0800 Subject: [PATCH 03/23] Update Signed-off-by: SpiritZhou --- Makefile | 6 +- ...er_schema.go => generate_scaler_schema.go} | 2 +- ...data.yaml => scaler-metadata-schemas.yaml} | 716 +++++++++--------- 3 files changed, 362 insertions(+), 362 deletions(-) rename schema/{trigger_schema.go => generate_scaler_schema.go} (99%) rename schema/{triggerMetadata.yaml => scaler-metadata-schemas.yaml} (100%) diff --git a/Makefile b/Makefile index cd81780d43f..3f99c486dec 100644 --- a/Makefile +++ b/Makefile @@ -383,6 +383,6 @@ docker-build-dev-containers: ## Build dev-containers image validate-changelog: ## Validate changelog ./hack/validate-changelog.sh -.PHONY: generate-trigger-schemas -generate-trigger-schemas: ## Generate trigger shcemas - GOBIN=$(LOCALBIN) go run ./schema/trigger_schema.go --keda-version $(VERSION) --scalers-builder-file "pkg/scaling/scalers_builder.go" --scalers-files-dir "pkg/scalers" --output-file-path "schema/" +.PHONY: generate-scaler-schemas +generate-scaler-schemas: ## Generate scaler shcemas + GOBIN=$(LOCALBIN) go run ./schema/generate_scaler_schema.go --keda-version $(VERSION) --scalers-builder-file "pkg/scaling/scalers_builder.go" --scalers-files-dir "pkg/scalers" --output-file-path "schema/" diff --git a/schema/trigger_schema.go b/schema/generate_scaler_schema.go similarity index 99% rename from schema/trigger_schema.go rename to schema/generate_scaler_schema.go index d99e4ea12c5..c0a400b105d 100644 --- a/schema/trigger_schema.go +++ b/schema/generate_scaler_schema.go @@ -146,7 +146,7 @@ func aggregateSchemaStruct(scalerSelectors map[string]string, kedaScalerStructs return err } - fileName := outputFilePath + "triggerMetadata.yaml" + fileName := outputFilePath + "scaler-metadata-schemas.yaml" err = os.WriteFile(fileName, yamlData, 0644) if err != nil { return err diff --git a/schema/triggerMetadata.yaml b/schema/scaler-metadata-schemas.yaml similarity index 100% rename from schema/triggerMetadata.yaml rename to schema/scaler-metadata-schemas.yaml index 74da374be13..63f2bb0a4bd 100644 --- a/schema/triggerMetadata.yaml +++ b/schema/scaler-metadata-schemas.yaml @@ -1,38 +1,195 @@ kedaVersion: main schemaVersion: 1 triggers: - - type: prometheus + - type: apache-kafka metadata: - - name: serverAddress + - name: bootstrapServers type: string - - name: query + canReadFromEnv: true + - name: consumerGroup type: string - - name: queryParameters + canReadFromEnv: true + - name: topic type: string optional: true - - name: threshold + canReadFromEnv: true + - name: partitionLimitation type: string - - name: activationThreshold + optional: true + rangeSeparator: '-' + - name: lagThreshold + type: string + default: "10" + - name: activationLagThreshold + type: string + default: "0" + - name: offsetResetPolicy + type: string + default: latest + allowedValue: + - earliest + - latest + - name: allowIdleConsumers type: string optional: true + - name: excludePersistentLag + type: string + optional: true + - name: scaleToZeroOnInvalidOffset + type: string + optional: true + - name: limitToPartitionsWithLag + type: string + optional: true + - name: sasl + type: string + default: none + allowedValue: + - none + - plaintext + - scram_sha256 + - scram_sha512 + - gssapi + - aws_msk_iam + canReadFromAuth: true + - name: username + type: string + optional: true + canReadFromAuth: true + - name: password + type: string + optional: true + canReadFromAuth: true + - name: awsRegion + type: string + optional: true + - name: awsEndpoint + type: string + optional: true + - name: tls + type: string + default: disable + allowedValue: + - enable + - disable + canReadFromAuth: true + - name: cert + type: string + optional: true + canReadFromAuth: true + - name: key + type: string + optional: true + canReadFromAuth: true + - name: keyPassword + type: string + optional: true + canReadFromAuth: true + - name: ca + type: string + optional: true + canReadFromAuth: true + - type: solr + metadata: + - name: host + type: string + - name: collection + type: string + - name: targetQueryValue + type: string + - name: activationTargetQueryValue + type: string + optional: true + default: "0" + - name: query + type: string + optional: true + - name: username + type: string + canReadFromAuth: true + - name: password + type: string + canReadFromAuth: true + - type: aws-cloudwatch + metadata: - name: namespace type: string optional: true - - name: customHeaders + - name: metricName + type: string + optional: true + - name: dimensionName + type: string + optional: true + separator: ; + - name: dimensionValue + type: string + optional: true + separator: ; + - name: expression type: string optional: true + - name: targetMetricValue + type: string + - name: activationTargetMetricValue + type: string + optional: true + - name: minMetricValue + type: string - name: ignoreNullValues type: string optional: true default: "true" - - name: unsafeSsl + - name: metricCollectionTime + type: string + optional: true + default: "300" + - name: metricStat + type: string + optional: true + default: Average + - name: metricUnit + type: string + optional: true + - name: metricStatPeriod + type: string + optional: true + default: "300" + - name: metricEndTimeOffset type: string optional: true + default: "0" - name: awsRegion + type: string + canReadFromAuth: true + - name: awsEndpoint type: string optional: true + - type: influxdb + metadata: + - name: authToken + type: string + canReadFromEnv: true canReadFromAuth: true - - type: redis-sentinel-streams + - name: organizationName + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: query + type: string + - name: serverURL + type: string + canReadFromAuth: true + - name: unsafeSsl + type: string + optional: true + - name: thresholdValue + type: string + optional: true + - name: activationThresholdValue + type: string + optional: true + - type: redis-cluster-streams metadata: - name: pendingEntriesCount type: string @@ -126,7 +283,7 @@ triggers: type: string optional: true canReadFromAuth: true - - type: redis-streams + - type: redis-sentinel-streams metadata: - name: pendingEntriesCount type: string @@ -220,7 +377,7 @@ triggers: type: string optional: true canReadFromAuth: true - - type: redis-cluster-streams + - type: redis-streams metadata: - name: pendingEntriesCount type: string @@ -314,188 +471,60 @@ triggers: type: string optional: true canReadFromAuth: true - - type: solr + - type: activemq metadata: - - name: host - type: string - - name: collection - type: string - - name: targetQueryValue - type: string - - name: activationTargetQueryValue - type: string - optional: true - default: "0" - - name: query + - name: managementEndpoint type: string optional: true - - name: username - type: string - canReadFromAuth: true - - name: password - type: string - canReadFromAuth: true - - type: splunk - metadata: - - name: apiToken + - name: destinationName type: string optional: true - canReadFromAuth: true - - name: password + - name: brokerName type: string optional: true - canReadFromAuth: true - name: username type: string - canReadFromAuth: true - - name: host - type: string - - name: unsafeSsl - type: string - optional: true - - name: targetValue - type: string - - name: activationValue - type: string - - name: savedSearchName - type: string - - name: valueField - type: string - - type: apache-kafka - metadata: - - name: bootstrapServers - type: string - canReadFromEnv: true - - name: consumerGroup - type: string - canReadFromEnv: true - - name: topic - type: string - optional: true canReadFromEnv: true - - name: partitionLimitation - type: string - optional: true - rangeSeparator: '-' - - name: lagThreshold - type: string - default: "10" - - name: activationLagThreshold - type: string - default: "0" - - name: offsetResetPolicy - type: string - default: latest - allowedValue: - - earliest - - latest - - name: allowIdleConsumers - type: string - optional: true - - name: excludePersistentLag - type: string - optional: true - - name: scaleToZeroOnInvalidOffset - type: string - optional: true - - name: limitToPartitionsWithLag - type: string - optional: true - - name: sasl - type: string - default: none - allowedValue: - - none - - plaintext - - scram_sha256 - - scram_sha512 - - gssapi - - aws_msk_iam - canReadFromAuth: true - - name: username - type: string - optional: true canReadFromAuth: true - name: password type: string - optional: true - canReadFromAuth: true - - name: awsRegion - type: string - optional: true - - name: awsEndpoint - type: string - optional: true - - name: tls - type: string - default: disable - allowedValue: - - enable - - disable + canReadFromEnv: true canReadFromAuth: true - - name: cert + - name: corsHeader type: string optional: true - canReadFromAuth: true - - name: key + - name: restAPITemplate type: string optional: true - canReadFromAuth: true - - name: keyPassword + - name: targetQueueSize type: string optional: true - canReadFromAuth: true - - name: ca + default: "10" + - name: activationTargetQueueSize type: string optional: true - canReadFromAuth: true - - type: etcd + default: "0" + - type: arangodb metadata: - name: endpoints type: string - - name: watchKey - type: string - - name: value - type: string - - name: activationValue - type: string - optional: true - default: "0" - - name: watchProgressNotifyInterval - type: string - optional: true - default: "600" - - name: username - type: string - optional: true - canReadFromEnv: true canReadFromAuth: true - - name: password + - name: collection type: string - optional: true - canReadFromEnv: true - canReadFromAuth: true - - name: tls + - name: query type: string - optional: true - default: disable - canReadFromAuth: true - - name: cert + - name: queryValue type: string - optional: true - canReadFromAuth: true - - name: key + default: "0" + - name: activationQueryValue type: string - optional: true - canReadFromAuth: true - - name: keyPassword + default: "0" + - name: unsafeSsl type: string - optional: true - canReadFromAuth: true - - name: ca + default: "false" + - name: connectionLimit type: string optional: true - canReadFromAuth: true - type: gcp-cloudtasks metadata: - name: value @@ -513,40 +542,46 @@ triggers: type: string - name: projectID type: string - - type: influxdb + - type: postgresql metadata: - - name: authToken + - name: targetQueryValue type: string - canReadFromEnv: true - canReadFromAuth: true - - name: organizationName + optional: true + - name: activationTargetQueryValue type: string + optional: true + - name: connection + type: string + optional: true canReadFromEnv: true canReadFromAuth: true - name: query type: string - - name: serverURL + - name: host type: string + optional: true canReadFromAuth: true - - name: unsafeSsl + - name: port type: string optional: true - - name: thresholdValue + canReadFromAuth: true + - name: userName type: string optional: true - - name: activationThresholdValue + canReadFromAuth: true + - name: dbName type: string optional: true - - type: kubernetes-workload - metadata: - - name: podSelector - type: string - - name: value + canReadFromAuth: true + - name: sslmode type: string - default: "0" - - name: activationValue + optional: true + canReadFromAuth: true + - name: password type: string - default: "0" + optional: true + canReadFromEnv: true + canReadFromAuth: true - type: selenium-grid metadata: - name: url @@ -593,102 +628,95 @@ triggers: - name: nodeMaxSessions type: string default: "1" - - type: postgresql + - type: splunk metadata: - - name: targetQueryValue - type: string - optional: true - - name: activationTargetQueryValue + - name: apiToken type: string optional: true - - name: connection + canReadFromAuth: true + - name: password type: string optional: true - canReadFromEnv: true canReadFromAuth: true - - name: query + - name: username type: string + canReadFromAuth: true - name: host type: string - optional: true - canReadFromAuth: true - - name: port + - name: unsafeSsl type: string optional: true - canReadFromAuth: true - - name: userName + - name: targetValue type: string - optional: true - canReadFromAuth: true - - name: dbName + - name: activationValue type: string - optional: true - canReadFromAuth: true - - name: sslmode + - name: savedSearchName type: string - optional: true - canReadFromAuth: true - - name: password + - name: valueField type: string - optional: true - canReadFromEnv: true - canReadFromAuth: true - - type: solace-event-queue + - type: nsq metadata: - - name: solaceSempBaseURL + - name: nsqLookupdHTTPAddresses type: string - - name: messageVpn + canReadFromEnv: true + - name: topic type: string - - name: queueName + canReadFromEnv: true + - name: channel type: string - - name: username + canReadFromEnv: true + - name: depthThreshold type: string + default: "10" canReadFromEnv: true - canReadFromAuth: true - - name: password + - name: activationDepthThreshold type: string + default: "0" canReadFromEnv: true - canReadFromAuth: true - - name: messageCountTarget + - name: useHttps type: string - optional: true - - name: messageSpoolUsageTarget + default: "false" + canReadFromEnv: true + - name: unsafeSsl + type: string + default: "false" + canReadFromEnv: true + - type: aws-dynamodb + metadata: + - name: tableName + type: string + - name: awsRegion + type: string + canReadFromAuth: true + - name: awsEndpoint type: string optional: true - - name: messageReceiveRateTarget + - name: keyConditionExpression type: string - optional: true - - name: activationMessageCountTarget + - name: indexName type: string optional: true - default: "0" - - name: activationMessageSpoolUsageTarget + - name: targetValue type: string optional: true - default: "0" - - name: activationMessageReceiveRateTarget + default: "-1" + - name: activationTargetValue type: string - optional: true default: "0" - - type: arangodb + - type: aws-dynamodb-streams metadata: - - name: endpoints - type: string - canReadFromAuth: true - - name: collection - type: string - - name: query + - name: shardCount type: string - - name: queryValue + default: "2" + - name: activationShardCount type: string default: "0" - - name: activationQueryValue + - name: tableName type: string - default: "0" - - name: unsafeSsl + - name: awsRegion type: string - default: "false" - - name: connectionLimit + canReadFromAuth: true + - name: awsEndpoint type: string optional: true - type: aws-kinesis-stream @@ -733,6 +761,53 @@ triggers: - name: scaleOnDelayed type: string default: "false" + - type: etcd + metadata: + - name: endpoints + type: string + - name: watchKey + type: string + - name: value + type: string + - name: activationValue + type: string + optional: true + default: "0" + - name: watchProgressNotifyInterval + type: string + optional: true + default: "600" + - name: username + type: string + optional: true + canReadFromEnv: true + canReadFromAuth: true + - name: password + type: string + optional: true + canReadFromEnv: true + canReadFromAuth: true + - name: tls + type: string + optional: true + default: disable + canReadFromAuth: true + - name: cert + type: string + optional: true + canReadFromAuth: true + - name: key + type: string + optional: true + canReadFromAuth: true + - name: keyPassword + type: string + optional: true + canReadFromAuth: true + - name: ca + type: string + optional: true + canReadFromAuth: true - type: ibmmq metadata: - name: host @@ -785,33 +860,16 @@ triggers: type: string optional: true canReadFromAuth: true - - type: nsq + - type: kubernetes-workload metadata: - - name: nsqLookupdHTTPAddresses - type: string - canReadFromEnv: true - - name: topic - type: string - canReadFromEnv: true - - name: channel - type: string - canReadFromEnv: true - - name: depthThreshold + - name: podSelector type: string - default: "10" - canReadFromEnv: true - - name: activationDepthThreshold + - name: value type: string default: "0" - canReadFromEnv: true - - name: useHttps - type: string - default: "false" - canReadFromEnv: true - - name: unsafeSsl + - name: activationValue type: string - default: "false" - canReadFromEnv: true + default: "0" - type: predictkube metadata: - name: prometheusAddress @@ -833,6 +891,37 @@ triggers: - name: activationThreshold type: string optional: true + - type: prometheus + metadata: + - name: serverAddress + type: string + - name: query + type: string + - name: queryParameters + type: string + optional: true + - name: threshold + type: string + - name: activationThreshold + type: string + optional: true + - name: namespace + type: string + optional: true + - name: customHeaders + type: string + optional: true + - name: ignoreNullValues + type: string + optional: true + default: "true" + - name: unsafeSsl + type: string + optional: true + - name: awsRegion + type: string + optional: true + canReadFromAuth: true - type: rabbitmq metadata: - name: queueName @@ -917,7 +1006,7 @@ triggers: type: string optional: true canReadFromAuth: true - - type: redis-cluster + - type: redis metadata: - name: listLength type: string @@ -1001,7 +1090,7 @@ triggers: - name: ca type: string canReadFromAuth: true - - type: redis-sentinel + - type: redis-cluster metadata: - name: listLength type: string @@ -1085,7 +1174,7 @@ triggers: - name: ca type: string canReadFromAuth: true - - type: redis + - type: redis-sentinel metadata: - name: listLength type: string @@ -1169,17 +1258,14 @@ triggers: - name: ca type: string canReadFromAuth: true - - type: activemq + - type: solace-event-queue metadata: - - name: managementEndpoint + - name: solaceSempBaseURL type: string - optional: true - - name: destinationName + - name: messageVpn type: string - optional: true - - name: brokerName + - name: queueName type: string - optional: true - name: username type: string canReadFromEnv: true @@ -1188,110 +1274,24 @@ triggers: type: string canReadFromEnv: true canReadFromAuth: true - - name: corsHeader + - name: messageCountTarget type: string optional: true - - name: restAPITemplate + - name: messageSpoolUsageTarget type: string optional: true - - name: targetQueueSize + - name: messageReceiveRateTarget type: string optional: true - default: "10" - - name: activationTargetQueueSize + - name: activationMessageCountTarget type: string optional: true default: "0" - - type: aws-cloudwatch - metadata: - - name: namespace - type: string - optional: true - - name: metricName - type: string - optional: true - - name: dimensionName - type: string - optional: true - separator: ; - - name: dimensionValue - type: string - optional: true - separator: ; - - name: expression - type: string - optional: true - - name: targetMetricValue - type: string - - name: activationTargetMetricValue - type: string - optional: true - - name: minMetricValue - type: string - - name: ignoreNullValues - type: string - optional: true - default: "true" - - name: metricCollectionTime - type: string - optional: true - default: "300" - - name: metricStat - type: string - optional: true - default: Average - - name: metricUnit - type: string - optional: true - - name: metricStatPeriod - type: string - optional: true - default: "300" - - name: metricEndTimeOffset + - name: activationMessageSpoolUsageTarget type: string optional: true default: "0" - - name: awsRegion - type: string - canReadFromAuth: true - - name: awsEndpoint - type: string - optional: true - - type: aws-dynamodb - metadata: - - name: tableName - type: string - - name: awsRegion - type: string - canReadFromAuth: true - - name: awsEndpoint - type: string - optional: true - - name: keyConditionExpression - type: string - - name: indexName - type: string - optional: true - - name: targetValue + - name: activationMessageReceiveRateTarget type: string optional: true - default: "-1" - - name: activationTargetValue - type: string default: "0" - - type: aws-dynamodb-streams - metadata: - - name: shardCount - type: string - default: "2" - - name: activationShardCount - type: string - default: "0" - - name: tableName - type: string - - name: awsRegion - type: string - canReadFromAuth: true - - name: awsEndpoint - type: string - optional: true From 8bca0d84ad07f7d19d1e1c9e23ef12f004f60c51 Mon Sep 17 00:00:00 2001 From: SpiritZhou Date: Mon, 20 Jan 2025 10:43:42 +0800 Subject: [PATCH 04/23] Update Signed-off-by: SpiritZhou --- schema/generate_scaler_schema.go | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/schema/generate_scaler_schema.go b/schema/generate_scaler_schema.go index c0a400b105d..198f728b035 100644 --- a/schema/generate_scaler_schema.go +++ b/schema/generate_scaler_schema.go @@ -148,10 +148,7 @@ func aggregateSchemaStruct(scalerSelectors map[string]string, kedaScalerStructs fileName := outputFilePath + "scaler-metadata-schemas.yaml" err = os.WriteFile(fileName, yamlData, 0644) - if err != nil { - return err - } - return nil + return err } // generateMetadataFields is a function that generates the metadata fields of a scaler struct @@ -451,7 +448,7 @@ func main() { scalerSelectors, err := getBuildScalerCalls(builderFilePath) if err != nil { - fmt.Print("error") + fmt.Printf("get build scaler calls error: %s\n", err) } if specifyScaler != "" { @@ -466,6 +463,6 @@ func main() { kedaTagStructs, otherReferenceStructs := getAllKedaTagedStructs(scalersFilesDirPath) err = aggregateSchemaStruct(scalerSelectors, kedaTagStructs, otherReferenceStructs, outputFilePath) if err != nil { - fmt.Print("error") + fmt.Print("Error aggregating schema struct: %s\n", err) } } From 08945c7147345c0f321421c617d5882d1266b545 Mon Sep 17 00:00:00 2001 From: SpiritZhou Date: Mon, 20 Jan 2025 10:50:40 +0800 Subject: [PATCH 05/23] fix Signed-off-by: SpiritZhou --- schema/generate_scaler_schema.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schema/generate_scaler_schema.go b/schema/generate_scaler_schema.go index 198f728b035..4b9047a9cb3 100644 --- a/schema/generate_scaler_schema.go +++ b/schema/generate_scaler_schema.go @@ -463,6 +463,6 @@ func main() { kedaTagStructs, otherReferenceStructs := getAllKedaTagedStructs(scalersFilesDirPath) err = aggregateSchemaStruct(scalerSelectors, kedaTagStructs, otherReferenceStructs, outputFilePath) if err != nil { - fmt.Print("Error aggregating schema struct: %s\n", err) + fmt.Printf("Error aggregating schema struct: %s\n", err) } } From d985fbf10d48dce007d87c72b2f6e4d02d21be0e Mon Sep 17 00:00:00 2001 From: SpiritZhou Date: Mon, 20 Jan 2025 11:03:11 +0800 Subject: [PATCH 06/23] Fix Signed-off-by: SpiritZhou --- schema/generate_scaler_schema.go | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/schema/generate_scaler_schema.go b/schema/generate_scaler_schema.go index 4b9047a9cb3..747ebab1da2 100644 --- a/schema/generate_scaler_schema.go +++ b/schema/generate_scaler_schema.go @@ -27,12 +27,12 @@ import ( "strconv" "strings" - "github.com/kedacore/keda/v2/pkg/scalers/scalersconfig" "github.com/spf13/pflag" - "golang.org/x/exp/maps" "golang.org/x/exp/slices" "gopkg.in/yaml.v3" + + "github.com/kedacore/keda/v2/pkg/scalers/scalersconfig" ) var ( @@ -111,12 +111,11 @@ type FullMetadataSchema struct { // kedaScalerStructs is the structs of the scalers that are tagged with `keda` // kedaReferenceKedaTagStructs is the sub structs that are referenced by the keda tagged structs func aggregateSchemaStruct(scalerSelectors map[string]string, kedaScalerStructs map[string]*ast.StructType, otherReferenceKedaTagStructs map[string]*ast.StructType, outputFilePath string) (err error) { - triggerMetadataSchemas := []TriggerMetadataSchema{} for creatorName, scalerStructs := range kedaScalerStructs { - metadataFields, err := generateMetadataFields(scalerStructs, otherReferenceKedaTagStructs) - if err != nil { + metadataFields := generateMetadataFields(scalerStructs, otherReferenceKedaTagStructs) + if len(metadataFields) == 0 { fmt.Printf("Error generating metadata fields with creator %s: %s\n", creatorName, err) continue } @@ -130,7 +129,6 @@ func aggregateSchemaStruct(scalerSelectors map[string]string, kedaScalerStructs triggerMetadataSchemas = append(triggerMetadataSchemas, triggerMetadataSchema) fmt.Printf("Scaler Metadata Schema Added: %s\n", triggerName) } - } } @@ -152,7 +150,7 @@ func aggregateSchemaStruct(scalerSelectors map[string]string, kedaScalerStructs } // generateMetadataFields is a function that generates the metadata fields of a scaler struct -func generateMetadataFields(structType *ast.StructType, otherReferenceKedaTagStructs map[string]*ast.StructType) ([]Metadata, error) { +func generateMetadataFields(structType *ast.StructType, otherReferenceKedaTagStructs map[string]*ast.StructType) []Metadata { triggerMetadata := []Metadata{} @@ -161,7 +159,7 @@ func generateMetadataFields(structType *ast.StructType, otherReferenceKedaTagStr if commentGroup.Tag == nil || commentGroup.Tag.Value == "" { continue } - metadataList, hasSubstruct, err := generateMetadatasFromTag(commentGroup.Tag.Value) + metadataList, hasSubstruct, err := generateMetadatas(commentGroup.Tag.Value) if err != nil { fmt.Printf("Error generating metadata fields from tag value: %s, err: %s\n", commentGroup.Tag.Value, err) @@ -179,18 +177,18 @@ func generateMetadataFields(structType *ast.StructType, otherReferenceKedaTagStr continue } if otherReferenceKedaTagStructs[s.Name] != nil { - subStructMetadataField, err := generateMetadataFields(otherReferenceKedaTagStructs[s.Name], otherReferenceKedaTagStructs) - if err == nil { + subStructMetadataField := generateMetadataFields(otherReferenceKedaTagStructs[s.Name], otherReferenceKedaTagStructs) + if len(subStructMetadataField) > 0 { triggerMetadata = append(triggerMetadata, subStructMetadataField...) } } } - return triggerMetadata, nil + return triggerMetadata } -// generateMetadatasFromTag is a function that generates the metadata field from tag -func generateMetadatasFromTag(tag string) ([]Metadata, bool, error) { +// generateMetadatas is a function that generates the metadata field from tag +func generateMetadatas(tag string) ([]Metadata, bool, error) { var fieldNames []string metadata := Metadata{Type: "string"} tagSplit := strings.Split(strings.Trim(strings.Split(strings.Trim(tag, "`"), ":")[1], "\""), scalersconfig.TagSeparator) @@ -278,7 +276,7 @@ func generateMetadatasFromTag(tag string) ([]Metadata, bool, error) { } if len(fieldNames) == 0 { - return nil, false, fmt.Errorf("Fieldname doesn't exist in tag value") + return nil, false, fmt.Errorf("fieldname doesn't exist in tag value") } metadatas := []Metadata{} @@ -312,7 +310,7 @@ func getBuildScalerCalls(fileName string) (map[string]string, error) { if !ok || s.Name != "triggerType" { break } - // retrieve the creator function name from each case statment + // retrieve the creator function name from each case statement for _, casesAst := range t.Body.List { c, ok := casesAst.(*ast.CaseClause) @@ -345,7 +343,6 @@ func getBuildScalerCalls(fileName string) (map[string]string, error) { scalerCallers[strings.Trim(basic.Value, "\"")] = expr.Sel.Name } - } return true }) @@ -383,7 +380,6 @@ func getAllKedaTagedStructs(dir string) (map[string]*ast.StructType, map[string] var scalerStructs *ast.StructType for _, decl := range f.Decls { - switch v := decl.(type) { case *ast.GenDecl: for _, spec := range v.Specs { From 106347d4f515444ba6ce0cd310b9e663a23aa2c4 Mon Sep 17 00:00:00 2001 From: SpiritZhou Date: Mon, 20 Jan 2025 11:17:25 +0800 Subject: [PATCH 07/23] Update Signed-off-by: SpiritZhou --- schema/generate_scaler_schema.go | 56 +- schema/scaler-metadata-schemas.yaml | 1070 +++++++++++++-------------- 2 files changed, 566 insertions(+), 560 deletions(-) diff --git a/schema/generate_scaler_schema.go b/schema/generate_scaler_schema.go index 747ebab1da2..456f3c35c60 100644 --- a/schema/generate_scaler_schema.go +++ b/schema/generate_scaler_schema.go @@ -24,6 +24,7 @@ import ( "go/token" "log" "os" + "sort" "strconv" "strings" @@ -46,7 +47,7 @@ const ( creatorSymbol = "New" ) -// Metadata is a struct that represents each field of the trigger metadata +// Metadata is a struct that represents each field of the scaler metadata type Metadata struct { // Name is the name of the field Name string `json:"name,omitempty" yaml:"name,omitempty"` @@ -85,16 +86,16 @@ type Metadata struct { CanReadFromAuth bool `json:"canReadFromTAuthe,omitempty" yaml:"canReadFromAuth,omitempty"` } -// TriggerMetadataSchema is a struct that represents the metadata of a trigger -type TriggerMetadataSchema struct { - // Type is the name of the trigger +// ScalerMetadataSchema is a struct that represents the metadata of a scler +type ScalerMetadataSchema struct { + // Type is the name of the scaler Type string `json:"type,omitempty" yaml:"type,omitempty"` - // Metadata is a list of fields of the trigger + // Metadata is a list of fields of the scaler Metadata []Metadata `json:"metadata,omitempty" yaml:"metadata,omitempty"` } -// FullMetadataSchema is a complete schema of the trigger metadata +// FullMetadataSchema is a complete schema of the scaler metadata type FullMetadataSchema struct { // KedaVersion is the version of the current KEDA KedaVersion string `json:"kedaVersion,omitempty" yaml:"kedaVersion,omitempty"` @@ -102,8 +103,8 @@ type FullMetadataSchema struct { // SchemaVersion is the version of the schema SchemaVersion float64 `json:"schemaVersion,omitempty" yaml:"schemaVersion,omitempty"` - // Triggers is a list of triggers - Triggers []TriggerMetadataSchema `json:"triggers,omitempty" yaml:"triggers,omitempty"` + // Scalers is a list of scalers + Scalers []ScalerMetadataSchema `json:"scalers,omitempty" yaml:"scalers,omitempty"` } // aggregateSchemaStruct is a function that aggregates the info from different scaler structs and generates a schema @@ -111,23 +112,28 @@ type FullMetadataSchema struct { // kedaScalerStructs is the structs of the scalers that are tagged with `keda` // kedaReferenceKedaTagStructs is the sub structs that are referenced by the keda tagged structs func aggregateSchemaStruct(scalerSelectors map[string]string, kedaScalerStructs map[string]*ast.StructType, otherReferenceKedaTagStructs map[string]*ast.StructType, outputFilePath string) (err error) { - triggerMetadataSchemas := []TriggerMetadataSchema{} + scalerMetadataSchemas := []ScalerMetadataSchema{} + sortedScalerCreatorNames := []string{} + for k := range kedaScalerStructs { + sortedScalerCreatorNames = append(sortedScalerCreatorNames, k) + } + sort.Strings(sortedScalerCreatorNames) - for creatorName, scalerStructs := range kedaScalerStructs { - metadataFields := generateMetadataFields(scalerStructs, otherReferenceKedaTagStructs) + for _, creatorName := range sortedScalerCreatorNames { + metadataFields := generateMetadataFields(kedaScalerStructs[creatorName], otherReferenceKedaTagStructs) if len(metadataFields) == 0 { fmt.Printf("Error generating metadata fields with creator %s: %s\n", creatorName, err) continue } - // Find which trigger names the creator is called by and construct the metadata schema - for triggerName, selectorName := range scalerSelectors { + // Find which scaler names the creator is called by and construct the metadata schema + for scalerName, selectorName := range scalerSelectors { if selectorName == creatorName { - triggerMetadataSchema := TriggerMetadataSchema{} - triggerMetadataSchema.Type = triggerName - triggerMetadataSchema.Metadata = metadataFields - triggerMetadataSchemas = append(triggerMetadataSchemas, triggerMetadataSchema) - fmt.Printf("Scaler Metadata Schema Added: %s\n", triggerName) + scalerMetadataSchema := ScalerMetadataSchema{} + scalerMetadataSchema.Type = scalerName + scalerMetadataSchema.Metadata = metadataFields + scalerMetadataSchemas = append(scalerMetadataSchemas, scalerMetadataSchema) + fmt.Printf("Scaler Metadata Schema Added: %s\n", scalerName) } } } @@ -136,7 +142,7 @@ func aggregateSchemaStruct(scalerSelectors map[string]string, kedaScalerStructs fullMetadataSchema := FullMetadataSchema{ KedaVersion: kedaVersion, SchemaVersion: schemaVersion, - Triggers: triggerMetadataSchemas, + Scalers: scalerMetadataSchemas, } yamlData, err := yaml.Marshal(fullMetadataSchema) @@ -152,7 +158,7 @@ func aggregateSchemaStruct(scalerSelectors map[string]string, kedaScalerStructs // generateMetadataFields is a function that generates the metadata fields of a scaler struct func generateMetadataFields(structType *ast.StructType, otherReferenceKedaTagStructs map[string]*ast.StructType) []Metadata { - triggerMetadata := []Metadata{} + scalerMetadata := []Metadata{} // get the tag of each field and generate the metadata for _, commentGroup := range structType.Fields.List { @@ -167,7 +173,7 @@ func generateMetadataFields(structType *ast.StructType, otherReferenceKedaTagStr } if !hasSubstruct { - triggerMetadata = append(triggerMetadata, metadataList...) + scalerMetadata = append(scalerMetadata, metadataList...) continue } @@ -179,12 +185,12 @@ func generateMetadataFields(structType *ast.StructType, otherReferenceKedaTagStr if otherReferenceKedaTagStructs[s.Name] != nil { subStructMetadataField := generateMetadataFields(otherReferenceKedaTagStructs[s.Name], otherReferenceKedaTagStructs) if len(subStructMetadataField) > 0 { - triggerMetadata = append(triggerMetadata, subStructMetadataField...) + scalerMetadata = append(scalerMetadata, subStructMetadataField...) } } } - return triggerMetadata + return scalerMetadata } // generateMetadatas is a function that generates the metadata field from tag @@ -288,7 +294,7 @@ func generateMetadatas(tag string) ([]Metadata, bool, error) { return metadatas, false, nil } -// getBuildScalerCalls is a function that gets the map of trigger names and the creator function names from the scalers_builder file +// getBuildScalerCalls is a function that gets the map of scaler names and the creator function names from the scalers_builder file func getBuildScalerCalls(fileName string) (map[string]string, error) { scalerCallers := map[string]string{} data, err := os.ReadFile(fileName) @@ -438,7 +444,7 @@ func main() { pflag.StringVar(&builderFilePath, "scalers-builder-file", "../pkg/scaling/scalers_builder.go", "The file that exists `buildScaler` func.") pflag.StringVar(&scalersFilesDirPath, "scalers-files-dir", "../pkg/scalers", "The directory that exists all scalers' files.") pflag.StringVar(&specifyScaler, "specify-scaler", "", "Specify scaler name.") - pflag.StringVar(&outputFilePath, "output-file-path", "./", "triggerMetadata.yaml output file path.") + pflag.StringVar(&outputFilePath, "output-file-path", "./", "scaler-metadata-schemas.yaml output file path.") pflag.CommandLine.AddGoFlagSet(flag.CommandLine) pflag.Parse() diff --git a/schema/scaler-metadata-schemas.yaml b/schema/scaler-metadata-schemas.yaml index 63f2bb0a4bd..e0c888c92f3 100644 --- a/schema/scaler-metadata-schemas.yaml +++ b/schema/scaler-metadata-schemas.yaml @@ -1,6 +1,39 @@ kedaVersion: main schemaVersion: 1 -triggers: +scalers: + - type: activemq + metadata: + - name: managementEndpoint + type: string + optional: true + - name: destinationName + type: string + optional: true + - name: brokerName + type: string + optional: true + - name: username + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: password + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: corsHeader + type: string + optional: true + - name: restAPITemplate + type: string + optional: true + - name: targetQueueSize + type: string + optional: true + default: "10" + - name: activationTargetQueueSize + type: string + optional: true + default: "0" - type: apache-kafka metadata: - name: bootstrapServers @@ -89,27 +122,27 @@ triggers: type: string optional: true canReadFromAuth: true - - type: solr + - type: arangodb metadata: - - name: host + - name: endpoints type: string + canReadFromAuth: true - name: collection type: string - - name: targetQueryValue + - name: query type: string - - name: activationTargetQueryValue + - name: queryValue type: string - optional: true default: "0" - - name: query + - name: activationQueryValue type: string - optional: true - - name: username + default: "0" + - name: unsafeSsl type: string - canReadFromAuth: true - - name: password + default: "false" + - name: connectionLimit type: string - canReadFromAuth: true + optional: true - type: aws-cloudwatch metadata: - name: namespace @@ -165,153 +198,171 @@ triggers: - name: awsEndpoint type: string optional: true - - type: influxdb + - type: aws-dynamodb metadata: - - name: authToken + - name: tableName type: string - canReadFromEnv: true - canReadFromAuth: true - - name: organizationName + - name: awsRegion type: string - canReadFromEnv: true canReadFromAuth: true - - name: query + - name: awsEndpoint type: string - - name: serverURL + optional: true + - name: keyConditionExpression type: string - canReadFromAuth: true - - name: unsafeSsl + - name: indexName type: string optional: true - - name: thresholdValue + - name: targetValue type: string optional: true - - name: activationThresholdValue + default: "-1" + - name: activationTargetValue type: string - optional: true - - type: redis-cluster-streams + default: "0" + - type: aws-dynamodb-streams metadata: - - name: pendingEntriesCount + - name: shardCount type: string - optional: true - default: "5" - - name: streamLength + default: "2" + - name: activationShardCount type: string - optional: true - default: "5" - - name: lagCount + default: "0" + - name: tableName type: string - optional: true - - name: stream + - name: awsRegion type: string - - name: consumerGroup + canReadFromAuth: true + - name: awsEndpoint type: string optional: true - - name: databaseIndex + - type: aws-kinesis-stream + metadata: + - name: shardCount type: string - optional: true - - name: address + default: "2" + - name: activationShardCount type: string - canReadFromEnv: true - canReadFromAuth: true - - name: addresses + default: "0" + - name: streamName type: string - canReadFromEnv: true - canReadFromAuth: true - - name: username + - name: awsRegion type: string - canReadFromEnv: true canReadFromAuth: true - - name: password + - name: awsEndpoint type: string - canReadFromEnv: true - canReadFromAuth: true - - name: sentinelUsername + optional: true + - type: aws-sqs-queue + metadata: + - name: queueLength type: string - canReadFromEnv: true - canReadFromAuth: true - - name: sentinelPassword + default: "5" + - name: activationQueueLength type: string - canReadFromEnv: true - canReadFromAuth: true - - name: sentinelMaster + default: "0" + - name: queueURL type: string canReadFromEnv: true - canReadFromAuth: true - - name: host + - name: queueURLFromEnv type: string canReadFromEnv: true - canReadFromAuth: true - - name: hosts + - name: awsRegion type: string - canReadFromEnv: true canReadFromAuth: true - - name: port + - name: awsEndpoint + type: string + optional: true + - name: scaleOnInFlight + type: string + default: "true" + - name: scaleOnDelayed + type: string + default: "false" + - type: etcd + metadata: + - name: endpoints + type: string + - name: watchKey + type: string + - name: value type: string + - name: activationValue + type: string + optional: true + default: "0" + - name: watchProgressNotifyInterval + type: string + optional: true + default: "600" + - name: username + type: string + optional: true canReadFromEnv: true canReadFromAuth: true - - name: ports + - name: password type: string + optional: true canReadFromEnv: true canReadFromAuth: true - - name: unsafeSsl + - name: tls type: string optional: true - default: "false" - - name: Cert - type: string + default: disable canReadFromAuth: true - name: cert type: string + optional: true canReadFromAuth: true - name: key type: string + optional: true canReadFromAuth: true - name: keyPassword type: string + optional: true canReadFromAuth: true - name: ca type: string + optional: true canReadFromAuth: true - - name: activationLagCount + - type: gcp-cloudtasks + metadata: + - name: value type: string optional: true - - name: enableTLS + default: "100" + - name: activationValue type: string optional: true - - name: tls + default: "0" + - name: filterDuration type: string optional: true - canReadFromAuth: true - - type: redis-sentinel-streams - metadata: - - name: pendingEntriesCount + - name: queueName type: string - optional: true - default: "5" - - name: streamLength + - name: projectID type: string - optional: true - default: "5" - - name: lagCount + - type: ibmmq + metadata: + - name: host type: string - optional: true - - name: stream + - name: queueName type: string - - name: consumerGroup + - name: queueNames type: string - optional: true - - name: databaseIndex + - name: queueDepth type: string - optional: true - - name: address + default: "20" + - name: activationQueueDepth type: string - canReadFromEnv: true - canReadFromAuth: true - - name: addresses + default: "0" + - name: operation type: string - canReadFromEnv: true - canReadFromAuth: true + default: max + allowedValue: + - max + - avg + - sum - name: username type: string canReadFromEnv: true @@ -320,278 +371,228 @@ triggers: type: string canReadFromEnv: true canReadFromAuth: true - - name: sentinelUsername + - name: unsafeSsl type: string - canReadFromEnv: true - canReadFromAuth: true - - name: sentinelPassword + default: "false" + - name: tls type: string - canReadFromEnv: true - canReadFromAuth: true - - name: sentinelMaster + default: "false" + deprecatedAnnounce: The 'tls' setting is DEPRECATED and will be removed in v2.18 - Use 'unsafeSsl' instead + - name: ca type: string - canReadFromEnv: true + optional: true canReadFromAuth: true - - name: host + - name: cert type: string - canReadFromEnv: true + optional: true canReadFromAuth: true - - name: hosts + - name: key type: string - canReadFromEnv: true + optional: true canReadFromAuth: true - - name: port - type: string - canReadFromEnv: true - canReadFromAuth: true - - name: ports - type: string - canReadFromEnv: true - canReadFromAuth: true - - name: unsafeSsl + - name: keyPassword type: string optional: true - default: "false" - - name: Cert - type: string canReadFromAuth: true - - name: cert + - type: influxdb + metadata: + - name: authToken type: string + canReadFromEnv: true canReadFromAuth: true - - name: key + - name: organizationName type: string + canReadFromEnv: true canReadFromAuth: true - - name: keyPassword + - name: query type: string - canReadFromAuth: true - - name: ca + - name: serverURL type: string canReadFromAuth: true - - name: activationLagCount + - name: unsafeSsl type: string optional: true - - name: enableTLS + - name: thresholdValue type: string optional: true - - name: tls + - name: activationThresholdValue type: string optional: true - canReadFromAuth: true - - type: redis-streams + - type: kubernetes-workload metadata: - - name: pendingEntriesCount - type: string - optional: true - default: "5" - - name: streamLength - type: string - optional: true - default: "5" - - name: lagCount - type: string - optional: true - - name: stream + - name: podSelector type: string - - name: consumerGroup + - name: value type: string - optional: true - - name: databaseIndex + default: "0" + - name: activationValue type: string - optional: true - - name: address + default: "0" + - type: nsq + metadata: + - name: nsqLookupdHTTPAddresses type: string canReadFromEnv: true - canReadFromAuth: true - - name: addresses + - name: topic type: string canReadFromEnv: true - canReadFromAuth: true - - name: username + - name: channel type: string canReadFromEnv: true - canReadFromAuth: true - - name: password + - name: depthThreshold type: string + default: "10" canReadFromEnv: true - canReadFromAuth: true - - name: sentinelUsername + - name: activationDepthThreshold type: string + default: "0" canReadFromEnv: true - canReadFromAuth: true - - name: sentinelPassword + - name: useHttps type: string + default: "false" canReadFromEnv: true - canReadFromAuth: true - - name: sentinelMaster + - name: unsafeSsl type: string + default: "false" canReadFromEnv: true - canReadFromAuth: true - - name: host + - type: postgresql + metadata: + - name: targetQueryValue type: string - canReadFromEnv: true - canReadFromAuth: true - - name: hosts + optional: true + - name: activationTargetQueryValue type: string - canReadFromEnv: true - canReadFromAuth: true - - name: port + optional: true + - name: connection type: string + optional: true canReadFromEnv: true canReadFromAuth: true - - name: ports + - name: query type: string - canReadFromEnv: true - canReadFromAuth: true - - name: unsafeSsl + - name: host type: string optional: true - default: "false" - - name: Cert - type: string - canReadFromAuth: true - - name: cert - type: string - canReadFromAuth: true - - name: key - type: string canReadFromAuth: true - - name: keyPassword + - name: port type: string + optional: true canReadFromAuth: true - - name: ca + - name: userName type: string + optional: true canReadFromAuth: true - - name: activationLagCount + - name: dbName type: string optional: true - - name: enableTLS + canReadFromAuth: true + - name: sslmode type: string optional: true - - name: tls + canReadFromAuth: true + - name: password type: string optional: true + canReadFromEnv: true canReadFromAuth: true - - type: activemq + - type: predictkube metadata: - - name: managementEndpoint - type: string - optional: true - - name: destinationName + - name: prometheusAddress type: string - optional: true - - name: brokerName + - name: query type: string - optional: true - - name: username + - name: predictHorizon type: string - canReadFromEnv: true - canReadFromAuth: true - - name: password + - name: queryStep type: string - canReadFromEnv: true - canReadFromAuth: true - - name: corsHeader + - name: historyTimeWindow type: string - optional: true - - name: restAPITemplate + - name: apiKey type: string - optional: true - - name: targetQueueSize + canReadFromAuth: true + - name: threshold type: string optional: true - default: "10" - - name: activationTargetQueueSize + - name: activationThreshold type: string optional: true - default: "0" - - type: arangodb + - type: prometheus metadata: - - name: endpoints - type: string - canReadFromAuth: true - - name: collection + - name: serverAddress type: string - name: query type: string - - name: queryValue - type: string - default: "0" - - name: activationQueryValue + - name: queryParameters type: string - default: "0" - - name: unsafeSsl + optional: true + - name: threshold type: string - default: "false" - - name: connectionLimit + - name: activationThreshold type: string optional: true - - type: gcp-cloudtasks - metadata: - - name: value + - name: namespace type: string optional: true - default: "100" - - name: activationValue + - name: customHeaders type: string optional: true - default: "0" - - name: filterDuration + - name: ignoreNullValues type: string optional: true - - name: queueName + default: "true" + - name: unsafeSsl type: string - - name: projectID + optional: true + - name: awsRegion type: string - - type: postgresql + optional: true + canReadFromAuth: true + - type: rabbitmq metadata: - - name: targetQueryValue + - name: queueName + type: string + - name: mode type: string optional: true - - name: activationTargetQueryValue + default: Unknown + - name: queueLength type: string optional: true - - name: connection + - name: value type: string optional: true - canReadFromEnv: true - canReadFromAuth: true - - name: query + - name: activationValue type: string + optional: true - name: host type: string - optional: true + canReadFromEnv: true canReadFromAuth: true - - name: port + - name: protocol type: string optional: true + default: auto canReadFromAuth: true - - name: userName + - name: vhostName type: string optional: true - canReadFromAuth: true - - name: dbName + - name: useRegex type: string optional: true - canReadFromAuth: true - - name: sslmode + - name: excludeUnacknowledged type: string optional: true - canReadFromAuth: true - - name: password + - name: pageSize type: string optional: true - canReadFromEnv: true - canReadFromAuth: true - - type: selenium-grid - metadata: - - name: url + default: "100" + - name: operation type: string - canReadFromAuth: true - - name: authType + optional: true + default: sum + - name: timeout type: string optional: true - canReadFromEnv: true - canReadFromAuth: true - name: username type: string optional: true @@ -602,431 +603,307 @@ triggers: optional: true canReadFromEnv: true canReadFromAuth: true - - name: accessToken + - name: ca type: string optional: true - canReadFromEnv: true canReadFromAuth: true - - name: browserName + - name: cert type: string optional: true - - name: sessionBrowserName + canReadFromAuth: true + - name: key type: string optional: true - - name: browserVersion + canReadFromAuth: true + - name: keyPassword type: string optional: true - - name: platformName - type: string - optional: true - - name: activationThreshold + canReadFromAuth: true + - name: tls type: string optional: true + default: disable + canReadFromAuth: true - name: unsafeSsl - type: string - default: "false" - - name: nodeMaxSessions - type: string - default: "1" - - type: splunk - metadata: - - name: apiToken type: string optional: true - canReadFromAuth: true - - name: password + - name: workloadIdentityResource type: string optional: true canReadFromAuth: true - - name: username - type: string - canReadFromAuth: true - - name: host + - type: redis + metadata: + - name: listLength type: string - - name: unsafeSsl + optional: true + default: "5" + - name: activationListLength type: string optional: true - - name: targetValue + - name: listName type: string - - name: activationValue + - name: databaseIndex type: string - - name: savedSearchName + optional: true + - name: enableTLS type: string - - name: valueField + optional: true + - name: tls type: string - - type: nsq - metadata: - - name: nsqLookupdHTTPAddresses + optional: true + canReadFromAuth: true + - name: address type: string canReadFromEnv: true - - name: topic + canReadFromAuth: true + - name: addresses type: string canReadFromEnv: true - - name: channel + canReadFromAuth: true + - name: username type: string canReadFromEnv: true - - name: depthThreshold + canReadFromAuth: true + - name: password type: string - default: "10" canReadFromEnv: true - - name: activationDepthThreshold + canReadFromAuth: true + - name: sentinelUsername type: string - default: "0" canReadFromEnv: true - - name: useHttps + canReadFromAuth: true + - name: sentinelPassword type: string - default: "false" canReadFromEnv: true - - name: unsafeSsl + canReadFromAuth: true + - name: sentinelMaster type: string - default: "false" canReadFromEnv: true - - type: aws-dynamodb - metadata: - - name: tableName - type: string - - name: awsRegion - type: string canReadFromAuth: true - - name: awsEndpoint - type: string - optional: true - - name: keyConditionExpression - type: string - - name: indexName - type: string - optional: true - - name: targetValue - type: string - optional: true - default: "-1" - - name: activationTargetValue - type: string - default: "0" - - type: aws-dynamodb-streams - metadata: - - name: shardCount + - name: host type: string - default: "2" - - name: activationShardCount + canReadFromEnv: true + canReadFromAuth: true + - name: hosts type: string - default: "0" - - name: tableName + canReadFromEnv: true + canReadFromAuth: true + - name: port type: string - - name: awsRegion + canReadFromEnv: true + canReadFromAuth: true + - name: ports type: string + canReadFromEnv: true canReadFromAuth: true - - name: awsEndpoint + - name: unsafeSsl type: string optional: true - - type: aws-kinesis-stream - metadata: - - name: shardCount + default: "false" + - name: Cert type: string - default: "2" - - name: activationShardCount + canReadFromAuth: true + - name: cert type: string - default: "0" - - name: streamName + canReadFromAuth: true + - name: key type: string - - name: awsRegion + canReadFromAuth: true + - name: keyPassword type: string canReadFromAuth: true - - name: awsEndpoint + - name: ca type: string - optional: true - - type: aws-sqs-queue + canReadFromAuth: true + - type: redis-cluster metadata: - - name: queueLength + - name: listLength type: string + optional: true default: "5" - - name: activationQueueLength - type: string - default: "0" - - name: queueURL - type: string - canReadFromEnv: true - - name: queueURLFromEnv - type: string - canReadFromEnv: true - - name: awsRegion - type: string - canReadFromAuth: true - - name: awsEndpoint + - name: activationListLength type: string optional: true - - name: scaleOnInFlight - type: string - default: "true" - - name: scaleOnDelayed - type: string - default: "false" - - type: etcd - metadata: - - name: endpoints - type: string - - name: watchKey - type: string - - name: value + - name: listName type: string - - name: activationValue + - name: databaseIndex type: string optional: true - default: "0" - - name: watchProgressNotifyInterval + - name: enableTLS type: string optional: true - default: "600" - - name: username + - name: tls type: string optional: true + canReadFromAuth: true + - name: address + type: string canReadFromEnv: true canReadFromAuth: true - - name: password + - name: addresses type: string - optional: true canReadFromEnv: true canReadFromAuth: true - - name: tls + - name: username type: string - optional: true - default: disable + canReadFromEnv: true canReadFromAuth: true - - name: cert + - name: password type: string - optional: true + canReadFromEnv: true canReadFromAuth: true - - name: key + - name: sentinelUsername type: string - optional: true + canReadFromEnv: true canReadFromAuth: true - - name: keyPassword + - name: sentinelPassword type: string - optional: true + canReadFromEnv: true canReadFromAuth: true - - name: ca + - name: sentinelMaster type: string - optional: true + canReadFromEnv: true canReadFromAuth: true - - type: ibmmq - metadata: - name: host type: string - - name: queueName - type: string - - name: queueNames - type: string - - name: queueDepth - type: string - default: "20" - - name: activationQueueDepth - type: string - default: "0" - - name: operation + canReadFromEnv: true + canReadFromAuth: true + - name: hosts type: string - default: max - allowedValue: - - max - - avg - - sum - - name: username + canReadFromEnv: true + canReadFromAuth: true + - name: port type: string canReadFromEnv: true canReadFromAuth: true - - name: password + - name: ports type: string canReadFromEnv: true canReadFromAuth: true - name: unsafeSsl type: string + optional: true default: "false" - - name: tls - type: string - default: "false" - deprecatedAnnounce: The 'tls' setting is DEPRECATED and will be removed in v2.18 - Use 'unsafeSsl' instead - - name: ca + - name: Cert type: string - optional: true canReadFromAuth: true - name: cert type: string - optional: true canReadFromAuth: true - name: key type: string - optional: true canReadFromAuth: true - name: keyPassword type: string - optional: true canReadFromAuth: true - - type: kubernetes-workload - metadata: - - name: podSelector - type: string - - name: value - type: string - default: "0" - - name: activationValue - type: string - default: "0" - - type: predictkube - metadata: - - name: prometheusAddress - type: string - - name: query - type: string - - name: predictHorizon - type: string - - name: queryStep - type: string - - name: historyTimeWindow - type: string - - name: apiKey + - name: ca type: string canReadFromAuth: true - - name: threshold - type: string - optional: true - - name: activationThreshold - type: string - optional: true - - type: prometheus + - type: redis-sentinel metadata: - - name: serverAddress - type: string - - name: query - type: string - - name: queryParameters - type: string - optional: true - - name: threshold - type: string - - name: activationThreshold - type: string - optional: true - - name: namespace - type: string - optional: true - - name: customHeaders - type: string - optional: true - - name: ignoreNullValues - type: string - optional: true - default: "true" - - name: unsafeSsl - type: string - optional: true - - name: awsRegion + - name: listLength type: string optional: true - canReadFromAuth: true - - type: rabbitmq - metadata: - - name: queueName - type: string - - name: mode + default: "5" + - name: activationListLength type: string optional: true - default: Unknown - - name: queueLength + - name: listName + type: string + - name: databaseIndex type: string optional: true - - name: value + - name: enableTLS type: string optional: true - - name: activationValue + - name: tls type: string optional: true - - name: host + canReadFromAuth: true + - name: address type: string canReadFromEnv: true canReadFromAuth: true - - name: protocol + - name: addresses type: string - optional: true - default: auto + canReadFromEnv: true canReadFromAuth: true - - name: vhostName + - name: username type: string - optional: true - - name: useRegex + canReadFromEnv: true + canReadFromAuth: true + - name: password type: string - optional: true - - name: excludeUnacknowledged + canReadFromEnv: true + canReadFromAuth: true + - name: sentinelUsername type: string - optional: true - - name: pageSize + canReadFromEnv: true + canReadFromAuth: true + - name: sentinelPassword type: string - optional: true - default: "100" - - name: operation + canReadFromEnv: true + canReadFromAuth: true + - name: sentinelMaster type: string - optional: true - default: sum - - name: timeout + canReadFromEnv: true + canReadFromAuth: true + - name: host type: string - optional: true - - name: username + canReadFromEnv: true + canReadFromAuth: true + - name: hosts type: string - optional: true canReadFromEnv: true canReadFromAuth: true - - name: password + - name: port type: string - optional: true canReadFromEnv: true canReadFromAuth: true - - name: ca + - name: ports + type: string + canReadFromEnv: true + canReadFromAuth: true + - name: unsafeSsl type: string optional: true + default: "false" + - name: Cert + type: string canReadFromAuth: true - name: cert type: string - optional: true canReadFromAuth: true - name: key type: string - optional: true canReadFromAuth: true - name: keyPassword type: string - optional: true - canReadFromAuth: true - - name: tls - type: string - optional: true - default: disable canReadFromAuth: true - - name: unsafeSsl - type: string - optional: true - - name: workloadIdentityResource + - name: ca type: string - optional: true canReadFromAuth: true - - type: redis + - type: redis-cluster-streams metadata: - - name: listLength + - name: pendingEntriesCount type: string optional: true default: "5" - - name: activationListLength + - name: streamLength type: string optional: true - - name: listName - type: string - - name: databaseIndex + default: "5" + - name: lagCount type: string optional: true - - name: enableTLS + - name: stream + type: string + - name: consumerGroup type: string optional: true - - name: tls + - name: databaseIndex type: string optional: true - canReadFromAuth: true - name: address type: string canReadFromEnv: true @@ -1090,27 +967,37 @@ triggers: - name: ca type: string canReadFromAuth: true - - type: redis-cluster + - name: activationLagCount + type: string + optional: true + - name: enableTLS + type: string + optional: true + - name: tls + type: string + optional: true + canReadFromAuth: true + - type: redis-sentinel-streams metadata: - - name: listLength + - name: pendingEntriesCount type: string optional: true default: "5" - - name: activationListLength + - name: streamLength type: string optional: true - - name: listName - type: string - - name: databaseIndex + default: "5" + - name: lagCount type: string optional: true - - name: enableTLS + - name: stream + type: string + - name: consumerGroup type: string optional: true - - name: tls + - name: databaseIndex type: string optional: true - canReadFromAuth: true - name: address type: string canReadFromEnv: true @@ -1174,27 +1061,37 @@ triggers: - name: ca type: string canReadFromAuth: true - - type: redis-sentinel + - name: activationLagCount + type: string + optional: true + - name: enableTLS + type: string + optional: true + - name: tls + type: string + optional: true + canReadFromAuth: true + - type: redis-streams metadata: - - name: listLength + - name: pendingEntriesCount type: string optional: true default: "5" - - name: activationListLength + - name: streamLength type: string optional: true - - name: listName - type: string - - name: databaseIndex + default: "5" + - name: lagCount type: string optional: true - - name: enableTLS + - name: stream + type: string + - name: consumerGroup type: string optional: true - - name: tls + - name: databaseIndex type: string optional: true - canReadFromAuth: true - name: address type: string canReadFromEnv: true @@ -1258,6 +1155,62 @@ triggers: - name: ca type: string canReadFromAuth: true + - name: activationLagCount + type: string + optional: true + - name: enableTLS + type: string + optional: true + - name: tls + type: string + optional: true + canReadFromAuth: true + - type: selenium-grid + metadata: + - name: url + type: string + canReadFromAuth: true + - name: authType + type: string + optional: true + canReadFromEnv: true + canReadFromAuth: true + - name: username + type: string + optional: true + canReadFromEnv: true + canReadFromAuth: true + - name: password + type: string + optional: true + canReadFromEnv: true + canReadFromAuth: true + - name: accessToken + type: string + optional: true + canReadFromEnv: true + canReadFromAuth: true + - name: browserName + type: string + optional: true + - name: sessionBrowserName + type: string + optional: true + - name: browserVersion + type: string + optional: true + - name: platformName + type: string + optional: true + - name: activationThreshold + type: string + optional: true + - name: unsafeSsl + type: string + default: "false" + - name: nodeMaxSessions + type: string + default: "1" - type: solace-event-queue metadata: - name: solaceSempBaseURL @@ -1295,3 +1248,50 @@ triggers: type: string optional: true default: "0" + - type: solr + metadata: + - name: host + type: string + - name: collection + type: string + - name: targetQueryValue + type: string + - name: activationTargetQueryValue + type: string + optional: true + default: "0" + - name: query + type: string + optional: true + - name: username + type: string + canReadFromAuth: true + - name: password + type: string + canReadFromAuth: true + - type: splunk + metadata: + - name: apiToken + type: string + optional: true + canReadFromAuth: true + - name: password + type: string + optional: true + canReadFromAuth: true + - name: username + type: string + canReadFromAuth: true + - name: host + type: string + - name: unsafeSsl + type: string + optional: true + - name: targetValue + type: string + - name: activationValue + type: string + - name: savedSearchName + type: string + - name: valueField + type: string From dc66155fe02342d2768aec082815bfc861be3400 Mon Sep 17 00:00:00 2001 From: SpiritZhou Date: Mon, 20 Jan 2025 11:45:07 +0800 Subject: [PATCH 08/23] Update Signed-off-by: SpiritZhou --- schema/generate_scaler_schema.go | 45 ++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/schema/generate_scaler_schema.go b/schema/generate_scaler_schema.go index 456f3c35c60..5702c68b893 100644 --- a/schema/generate_scaler_schema.go +++ b/schema/generate_scaler_schema.go @@ -221,19 +221,12 @@ func generateMetadatas(tag string) ([]Metadata, bool, error) { case scalersconfig.OrderTag: if len(tsplit) > 1 { order := strings.Split(tsplit[1], scalersconfig.TagValueSeparator) - for _, po := range order { - poTyped := scalersconfig.ParsingOrder(strings.TrimSpace(po)) - if !scalersconfig.AllowedParsingOrderMap[poTyped] { - apo := maps.Keys(scalersconfig.AllowedParsingOrderMap) - slices.Sort(apo) - return nil, false, fmt.Errorf("unknown parsing order value %s, has to be one of %s", po, apo) - } - if poTyped == scalersconfig.ResolvedEnv { - metadata.CanReadFromEnv = true - } else if poTyped == scalersconfig.AuthParams { - metadata.CanReadFromAuth = true - } + canReadFromEnv, canReadFromAuth, err := retrieveDataFromOrder(order) + if err != nil { + return nil, false, err } + metadata.CanReadFromEnv = canReadFromEnv + metadata.CanReadFromAuth = canReadFromAuth } case scalersconfig.NameTag: if len(tsplit) > 1 { @@ -285,13 +278,37 @@ func generateMetadatas(tag string) ([]Metadata, bool, error) { return nil, false, fmt.Errorf("fieldname doesn't exist in tag value") } + metadatas := createMetadatas(metadata, fieldNames) + return metadatas, false, nil +} + +// retrieveDataFromOrder is a function that retrieves the data from the order tag +func retrieveDataFromOrder(orders []string) (bool, bool, error) { + var canReadFromEnv, canReadFromAuth = false, false + for _, po := range orders { + poTyped := scalersconfig.ParsingOrder(strings.TrimSpace(po)) + if !scalersconfig.AllowedParsingOrderMap[poTyped] { + apo := maps.Keys(scalersconfig.AllowedParsingOrderMap) + slices.Sort(apo) + return false, false, fmt.Errorf("unknown parsing order value %s, has to be one of %s", po, apo) + } + if poTyped == scalersconfig.ResolvedEnv { + canReadFromEnv = true + } else if poTyped == scalersconfig.AuthParams { + canReadFromAuth = true + } + } + return canReadFromEnv, canReadFromAuth, nil +} + +// createMetadatas is a function that creates the metadata with the field names +func createMetadatas(metadata Metadata, fieldNames []string) []Metadata { metadatas := []Metadata{} for _, fieldName := range fieldNames { metadata.Name = fieldName metadatas = append(metadatas, metadata) } - - return metadatas, false, nil + return metadatas } // getBuildScalerCalls is a function that gets the map of scaler names and the creator function names from the scalers_builder file From 46487088718605264c1213649d1ebadb8dafe3a3 Mon Sep 17 00:00:00 2001 From: SpiritZhou Date: Mon, 20 Jan 2025 12:46:45 +0800 Subject: [PATCH 09/23] Update Signed-off-by: SpiritZhou --- schema/generate_scaler_schema.go | 1 - 1 file changed, 1 deletion(-) diff --git a/schema/generate_scaler_schema.go b/schema/generate_scaler_schema.go index 5702c68b893..2fd45343d8f 100644 --- a/schema/generate_scaler_schema.go +++ b/schema/generate_scaler_schema.go @@ -157,7 +157,6 @@ func aggregateSchemaStruct(scalerSelectors map[string]string, kedaScalerStructs // generateMetadataFields is a function that generates the metadata fields of a scaler struct func generateMetadataFields(structType *ast.StructType, otherReferenceKedaTagStructs map[string]*ast.StructType) []Metadata { - scalerMetadata := []Metadata{} // get the tag of each field and generate the metadata From b0b68dcbc5e4c7fcd33ea1d6109450bc57bcb836 Mon Sep 17 00:00:00 2001 From: SpiritZhou Date: Tue, 21 Jan 2025 11:46:41 +0800 Subject: [PATCH 10/23] Update Signed-off-by: SpiritZhou --- Makefile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 3f99c486dec..57895a1d4b4 100644 --- a/Makefile +++ b/Makefile @@ -60,6 +60,11 @@ ENVTEST_K8S_VERSION = 1.31 SHELL = /usr/bin/env bash -o pipefail .SHELLFLAGS = -ec +# Scaler schema generation parameters + SCALERS_BUILDER_FILE ?= "pkg/scaling/scalers_builder.go" + SCALERS_FILES_DIR ?= "pkg/scalers" + OUTPUT_FILE_PATH ?= "schema/" + ################################################## # All # ################################################## @@ -385,4 +390,4 @@ validate-changelog: ## Validate changelog .PHONY: generate-scaler-schemas generate-scaler-schemas: ## Generate scaler shcemas - GOBIN=$(LOCALBIN) go run ./schema/generate_scaler_schema.go --keda-version $(VERSION) --scalers-builder-file "pkg/scaling/scalers_builder.go" --scalers-files-dir "pkg/scalers" --output-file-path "schema/" + GOBIN=$(LOCALBIN) go run ./schema/generate_scaler_schema.go --keda-version $(VERSION) --scalers-builder-file $(SCALERS_BUILDER_FILE) --scalers-files-dir $(SCALERS_FILES_DIR) --output-file-path $(OUTPUT_FILE_PATH) \ No newline at end of file From 286de8f4f424e95fa9946ea4ef7fc3ef91a04f61 Mon Sep 17 00:00:00 2001 From: SpiritZhou Date: Tue, 21 Jan 2025 13:40:27 +0800 Subject: [PATCH 11/23] Update Signed-off-by: SpiritZhou --- Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 57895a1d4b4..4218902423b 100644 --- a/Makefile +++ b/Makefile @@ -390,4 +390,5 @@ validate-changelog: ## Validate changelog .PHONY: generate-scaler-schemas generate-scaler-schemas: ## Generate scaler shcemas - GOBIN=$(LOCALBIN) go run ./schema/generate_scaler_schema.go --keda-version $(VERSION) --scalers-builder-file $(SCALERS_BUILDER_FILE) --scalers-files-dir $(SCALERS_FILES_DIR) --output-file-path $(OUTPUT_FILE_PATH) \ No newline at end of file + GOBIN=$(LOCALBIN) go run ./schema/generate_scaler_schema.go --keda-version $(VERSION) --scalers-builder-file $(SCALERS_BUILDER_FILE) --scalers-files-dir $(SCALERS_FILES_DIR) --output-file-path $(OUTPUT_FILE_PATH) + \ No newline at end of file From 3e2b4e4c5750eac6120125ce5a0047241ac3e48e Mon Sep 17 00:00:00 2001 From: SpiritZhou Date: Tue, 21 Jan 2025 15:27:46 +0800 Subject: [PATCH 12/23] Update Signed-off-by: SpiritZhou --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 4218902423b..c907d22dbb3 100644 --- a/Makefile +++ b/Makefile @@ -61,8 +61,8 @@ SHELL = /usr/bin/env bash -o pipefail .SHELLFLAGS = -ec # Scaler schema generation parameters - SCALERS_BUILDER_FILE ?= "pkg/scaling/scalers_builder.go" - SCALERS_FILES_DIR ?= "pkg/scalers" + SCALERS_BUILDER_FILE ?= "pkg/scaling/scalers_builder.go" + SCALERS_FILES_DIR ?= "pkg/scalers" OUTPUT_FILE_PATH ?= "schema/" ################################################## From 06661d54bf3fe475a64c071a0e9036fa0157ec99 Mon Sep 17 00:00:00 2001 From: SpiritZhou Date: Tue, 21 Jan 2025 15:45:55 +0800 Subject: [PATCH 13/23] Update Signed-off-by: SpiritZhou --- schema/generate_scaler_schema.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/schema/generate_scaler_schema.go b/schema/generate_scaler_schema.go index 2fd45343d8f..505534764b3 100644 --- a/schema/generate_scaler_schema.go +++ b/schema/generate_scaler_schema.go @@ -119,6 +119,12 @@ func aggregateSchemaStruct(scalerSelectors map[string]string, kedaScalerStructs } sort.Strings(sortedScalerCreatorNames) + sortedScalerNames := []string{} + for k := range scalerSelectors { + sortedScalerNames = append(sortedScalerNames, k) + } + sort.Strings(sortedScalerNames) + for _, creatorName := range sortedScalerCreatorNames { metadataFields := generateMetadataFields(kedaScalerStructs[creatorName], otherReferenceKedaTagStructs) if len(metadataFields) == 0 { @@ -127,8 +133,8 @@ func aggregateSchemaStruct(scalerSelectors map[string]string, kedaScalerStructs } // Find which scaler names the creator is called by and construct the metadata schema - for scalerName, selectorName := range scalerSelectors { - if selectorName == creatorName { + for _, scalerName := range sortedScalerNames { + if scalerSelectors[scalerName] == creatorName { scalerMetadataSchema := ScalerMetadataSchema{} scalerMetadataSchema.Type = scalerName scalerMetadataSchema.Metadata = metadataFields From dcbdc45329b2070600d5ed7e6383167f8d9c9903 Mon Sep 17 00:00:00 2001 From: SpiritZhou Date: Thu, 23 Jan 2025 16:20:06 +0800 Subject: [PATCH 14/23] Update Signed-off-by: SpiritZhou --- Makefile | 3 +- schema/generate_scaler_schema.go | 31 +- schema/scaler-metadata-schemas.json | 2112 +++++++++++++++++++++++++++ schema/scaler-metadata-schemas.yaml | 2 +- 4 files changed, 2137 insertions(+), 11 deletions(-) create mode 100644 schema/scaler-metadata-schemas.json diff --git a/Makefile b/Makefile index c907d22dbb3..806e975f5a3 100644 --- a/Makefile +++ b/Makefile @@ -390,5 +390,4 @@ validate-changelog: ## Validate changelog .PHONY: generate-scaler-schemas generate-scaler-schemas: ## Generate scaler shcemas - GOBIN=$(LOCALBIN) go run ./schema/generate_scaler_schema.go --keda-version $(VERSION) --scalers-builder-file $(SCALERS_BUILDER_FILE) --scalers-files-dir $(SCALERS_FILES_DIR) --output-file-path $(OUTPUT_FILE_PATH) - \ No newline at end of file + GOBIN=$(LOCALBIN) go run ./schema/generate_scaler_schema.go --keda-version $(VERSION) --scalers-builder-file $(SCALERS_BUILDER_FILE) --scalers-files-dir $(SCALERS_FILES_DIR) --output-file-path $(OUTPUT_FILE_PATH) \ No newline at end of file diff --git a/schema/generate_scaler_schema.go b/schema/generate_scaler_schema.go index 505534764b3..6bace5ee790 100644 --- a/schema/generate_scaler_schema.go +++ b/schema/generate_scaler_schema.go @@ -17,6 +17,7 @@ limitations under the License. package main import ( + "encoding/json" "flag" "fmt" "go/ast" @@ -111,7 +112,7 @@ type FullMetadataSchema struct { // scalersSelectors is a map that contains the name of the scaler and the name of the scaler creator function from the scalers_builder file // kedaScalerStructs is the structs of the scalers that are tagged with `keda` // kedaReferenceKedaTagStructs is the sub structs that are referenced by the keda tagged structs -func aggregateSchemaStruct(scalerSelectors map[string]string, kedaScalerStructs map[string]*ast.StructType, otherReferenceKedaTagStructs map[string]*ast.StructType, outputFilePath string) (err error) { +func aggregateSchemaStruct(scalerSelectors map[string]string, kedaScalerStructs map[string]*ast.StructType, otherReferenceKedaTagStructs map[string]*ast.StructType, outputFileName string, outputFilePath string, outputFileFormat string) (err error) { scalerMetadataSchemas := []ScalerMetadataSchema{} sortedScalerCreatorNames := []string{} for k := range kedaScalerStructs { @@ -151,13 +152,23 @@ func aggregateSchemaStruct(scalerSelectors map[string]string, kedaScalerStructs Scalers: scalerMetadataSchemas, } - yamlData, err := yaml.Marshal(fullMetadataSchema) - if err != nil { - return err + filedata := []byte{} + if outputFileFormat == "yaml" { + filedata, err = yaml.Marshal(fullMetadataSchema) + if err != nil { + return err + } + } else if outputFileFormat == "json" { + filedata, err = json.MarshalIndent(fullMetadataSchema, "", " ") + if err != nil { + return err + } + } else { + return fmt.Errorf("output file format %s is not supported", outputFileFormat) } - fileName := outputFilePath + "scaler-metadata-schemas.yaml" - err = os.WriteFile(fileName, yamlData, 0644) + fileName := outputFilePath + outputFileName + "." + outputFileFormat + err = os.WriteFile(fileName, filedata, 0644) return err } @@ -461,12 +472,16 @@ func main() { var builderFilePath string var scalersFilesDirPath string var specifyScaler string + var outputFileName string var outputFilePath string + var outputFormat string pflag.StringVar(&kedaVersion, "keda-version", "1.0", "Set the version of current KEDA in schema.") pflag.StringVar(&builderFilePath, "scalers-builder-file", "../pkg/scaling/scalers_builder.go", "The file that exists `buildScaler` func.") pflag.StringVar(&scalersFilesDirPath, "scalers-files-dir", "../pkg/scalers", "The directory that exists all scalers' files.") pflag.StringVar(&specifyScaler, "specify-scaler", "", "Specify scaler name.") - pflag.StringVar(&outputFilePath, "output-file-path", "./", "scaler-metadata-schemas.yaml output file path.") + pflag.StringVar(&outputFileName, "output-file-name", "scaler-metadata-schemas", "Output file name.") + pflag.StringVar(&outputFilePath, "output-file-path", "./", "Output file path.") + pflag.StringVar(&outputFormat, "output-file-format", "json", "Output file format. support json and yaml.") pflag.CommandLine.AddGoFlagSet(flag.CommandLine) pflag.Parse() @@ -485,7 +500,7 @@ func main() { } kedaTagStructs, otherReferenceStructs := getAllKedaTagedStructs(scalersFilesDirPath) - err = aggregateSchemaStruct(scalerSelectors, kedaTagStructs, otherReferenceStructs, outputFilePath) + err = aggregateSchemaStruct(scalerSelectors, kedaTagStructs, otherReferenceStructs, outputFileName, outputFilePath, outputFormat) if err != nil { fmt.Printf("Error aggregating schema struct: %s\n", err) } diff --git a/schema/scaler-metadata-schemas.json b/schema/scaler-metadata-schemas.json new file mode 100644 index 00000000000..0dd082866fe --- /dev/null +++ b/schema/scaler-metadata-schemas.json @@ -0,0 +1,2112 @@ +{ + "kedaVersion": "1.0", + "schemaVersion": 1, + "scalers": [ + { + "type": "activemq", + "metadata": [ + { + "name": "managementEndpoint", + "type": "string", + "optional": true + }, + { + "name": "destinationName", + "type": "string", + "optional": true + }, + { + "name": "brokerName", + "type": "string", + "optional": true + }, + { + "name": "username", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "password", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "corsHeader", + "type": "string", + "optional": true + }, + { + "name": "restAPITemplate", + "type": "string", + "optional": true + }, + { + "name": "targetQueueSize", + "type": "string", + "optional": true, + "default": "10" + }, + { + "name": "activationTargetQueueSize", + "type": "string", + "optional": true, + "default": "0" + } + ] + }, + { + "type": "apache-kafka", + "metadata": [ + { + "name": "bootstrapServers", + "type": "string", + "canReadFromEnv": true + }, + { + "name": "consumerGroup", + "type": "string", + "canReadFromEnv": true + }, + { + "name": "topic", + "type": "string", + "optional": true, + "canReadFromEnv": true + }, + { + "name": "partitionLimitation", + "type": "string", + "optional": true, + "rangeSeparator": "-" + }, + { + "name": "lagThreshold", + "type": "string", + "default": "10" + }, + { + "name": "activationLagThreshold", + "type": "string", + "default": "0" + }, + { + "name": "offsetResetPolicy", + "type": "string", + "default": "latest", + "allowedValue": [ + "earliest", + "latest" + ] + }, + { + "name": "allowIdleConsumers", + "type": "string", + "optional": true + }, + { + "name": "excludePersistentLag", + "type": "string", + "optional": true + }, + { + "name": "scaleToZeroOnInvalidOffset", + "type": "string", + "optional": true + }, + { + "name": "limitToPartitionsWithLag", + "type": "string", + "optional": true + }, + { + "name": "sasl", + "type": "string", + "default": "none", + "allowedValue": [ + "none", + "plaintext", + "scram_sha256", + "scram_sha512", + "gssapi", + "aws_msk_iam" + ], + "canReadFromTAuthe": true + }, + { + "name": "username", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + }, + { + "name": "password", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + }, + { + "name": "awsRegion", + "type": "string", + "optional": true + }, + { + "name": "awsEndpoint", + "type": "string", + "optional": true + }, + { + "name": "tls", + "type": "string", + "default": "disable", + "allowedValue": [ + "enable", + "disable" + ], + "canReadFromTAuthe": true + }, + { + "name": "cert", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + }, + { + "name": "key", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + }, + { + "name": "keyPassword", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + }, + { + "name": "ca", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + } + ] + }, + { + "type": "arangodb", + "metadata": [ + { + "name": "endpoints", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "collection", + "type": "string" + }, + { + "name": "query", + "type": "string" + }, + { + "name": "queryValue", + "type": "string", + "default": "0" + }, + { + "name": "activationQueryValue", + "type": "string", + "default": "0" + }, + { + "name": "unsafeSsl", + "type": "string", + "default": "false" + }, + { + "name": "connectionLimit", + "type": "string", + "optional": true + } + ] + }, + { + "type": "aws-cloudwatch", + "metadata": [ + { + "name": "namespace", + "type": "string", + "optional": true + }, + { + "name": "metricName", + "type": "string", + "optional": true + }, + { + "name": "dimensionName", + "type": "string", + "optional": true, + "separator": ";" + }, + { + "name": "dimensionValue", + "type": "string", + "optional": true, + "separator": ";" + }, + { + "name": "expression", + "type": "string", + "optional": true + }, + { + "name": "targetMetricValue", + "type": "string" + }, + { + "name": "activationTargetMetricValue", + "type": "string", + "optional": true + }, + { + "name": "minMetricValue", + "type": "string" + }, + { + "name": "ignoreNullValues", + "type": "string", + "optional": true, + "default": "true" + }, + { + "name": "metricCollectionTime", + "type": "string", + "optional": true, + "default": "300" + }, + { + "name": "metricStat", + "type": "string", + "optional": true, + "default": "Average" + }, + { + "name": "metricUnit", + "type": "string", + "optional": true + }, + { + "name": "metricStatPeriod", + "type": "string", + "optional": true, + "default": "300" + }, + { + "name": "metricEndTimeOffset", + "type": "string", + "optional": true, + "default": "0" + }, + { + "name": "awsRegion", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "awsEndpoint", + "type": "string", + "optional": true + } + ] + }, + { + "type": "aws-dynamodb", + "metadata": [ + { + "name": "tableName", + "type": "string" + }, + { + "name": "awsRegion", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "awsEndpoint", + "type": "string", + "optional": true + }, + { + "name": "keyConditionExpression", + "type": "string" + }, + { + "name": "indexName", + "type": "string", + "optional": true + }, + { + "name": "targetValue", + "type": "string", + "optional": true, + "default": "-1" + }, + { + "name": "activationTargetValue", + "type": "string", + "default": "0" + } + ] + }, + { + "type": "aws-dynamodb-streams", + "metadata": [ + { + "name": "shardCount", + "type": "string", + "default": "2" + }, + { + "name": "activationShardCount", + "type": "string", + "default": "0" + }, + { + "name": "tableName", + "type": "string" + }, + { + "name": "awsRegion", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "awsEndpoint", + "type": "string", + "optional": true + } + ] + }, + { + "type": "aws-kinesis-stream", + "metadata": [ + { + "name": "shardCount", + "type": "string", + "default": "2" + }, + { + "name": "activationShardCount", + "type": "string", + "default": "0" + }, + { + "name": "streamName", + "type": "string" + }, + { + "name": "awsRegion", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "awsEndpoint", + "type": "string", + "optional": true + } + ] + }, + { + "type": "aws-sqs-queue", + "metadata": [ + { + "name": "queueLength", + "type": "string", + "default": "5" + }, + { + "name": "activationQueueLength", + "type": "string", + "default": "0" + }, + { + "name": "queueURL", + "type": "string", + "canReadFromEnv": true + }, + { + "name": "queueURLFromEnv", + "type": "string", + "canReadFromEnv": true + }, + { + "name": "awsRegion", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "awsEndpoint", + "type": "string", + "optional": true + }, + { + "name": "scaleOnInFlight", + "type": "string", + "default": "true" + }, + { + "name": "scaleOnDelayed", + "type": "string", + "default": "false" + } + ] + }, + { + "type": "etcd", + "metadata": [ + { + "name": "endpoints", + "type": "string" + }, + { + "name": "watchKey", + "type": "string" + }, + { + "name": "value", + "type": "string" + }, + { + "name": "activationValue", + "type": "string", + "optional": true, + "default": "0" + }, + { + "name": "watchProgressNotifyInterval", + "type": "string", + "optional": true, + "default": "600" + }, + { + "name": "username", + "type": "string", + "optional": true, + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "password", + "type": "string", + "optional": true, + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "tls", + "type": "string", + "optional": true, + "default": "disable", + "canReadFromTAuthe": true + }, + { + "name": "cert", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + }, + { + "name": "key", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + }, + { + "name": "keyPassword", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + }, + { + "name": "ca", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + } + ] + }, + { + "type": "gcp-cloudtasks", + "metadata": [ + { + "name": "value", + "type": "string", + "optional": true, + "default": "100" + }, + { + "name": "activationValue", + "type": "string", + "optional": true, + "default": "0" + }, + { + "name": "filterDuration", + "type": "string", + "optional": true + }, + { + "name": "queueName", + "type": "string" + }, + { + "name": "projectID", + "type": "string" + } + ] + }, + { + "type": "ibmmq", + "metadata": [ + { + "name": "host", + "type": "string" + }, + { + "name": "queueName", + "type": "string" + }, + { + "name": "queueNames", + "type": "string" + }, + { + "name": "queueDepth", + "type": "string", + "default": "20" + }, + { + "name": "activationQueueDepth", + "type": "string", + "default": "0" + }, + { + "name": "operation", + "type": "string", + "default": "max", + "allowedValue": [ + "max", + "avg", + "sum" + ] + }, + { + "name": "username", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "password", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "unsafeSsl", + "type": "string", + "default": "false" + }, + { + "name": "tls", + "type": "string", + "default": "false", + "deprecatedAnnounce": "The 'tls' setting is DEPRECATED and will be removed in v2.18 - Use 'unsafeSsl' instead" + }, + { + "name": "ca", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + }, + { + "name": "cert", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + }, + { + "name": "key", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + }, + { + "name": "keyPassword", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + } + ] + }, + { + "type": "influxdb", + "metadata": [ + { + "name": "authToken", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "organizationName", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "query", + "type": "string" + }, + { + "name": "serverURL", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "unsafeSsl", + "type": "string", + "optional": true + }, + { + "name": "thresholdValue", + "type": "string", + "optional": true + }, + { + "name": "activationThresholdValue", + "type": "string", + "optional": true + } + ] + }, + { + "type": "kubernetes-workload", + "metadata": [ + { + "name": "podSelector", + "type": "string" + }, + { + "name": "value", + "type": "string", + "default": "0" + }, + { + "name": "activationValue", + "type": "string", + "default": "0" + } + ] + }, + { + "type": "nsq", + "metadata": [ + { + "name": "nsqLookupdHTTPAddresses", + "type": "string", + "canReadFromEnv": true + }, + { + "name": "topic", + "type": "string", + "canReadFromEnv": true + }, + { + "name": "channel", + "type": "string", + "canReadFromEnv": true + }, + { + "name": "depthThreshold", + "type": "string", + "default": "10", + "canReadFromEnv": true + }, + { + "name": "activationDepthThreshold", + "type": "string", + "default": "0", + "canReadFromEnv": true + }, + { + "name": "useHttps", + "type": "string", + "default": "false", + "canReadFromEnv": true + }, + { + "name": "unsafeSsl", + "type": "string", + "default": "false", + "canReadFromEnv": true + } + ] + }, + { + "type": "postgresql", + "metadata": [ + { + "name": "targetQueryValue", + "type": "string", + "optional": true + }, + { + "name": "activationTargetQueryValue", + "type": "string", + "optional": true + }, + { + "name": "connection", + "type": "string", + "optional": true, + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "query", + "type": "string" + }, + { + "name": "host", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + }, + { + "name": "port", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + }, + { + "name": "userName", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + }, + { + "name": "dbName", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + }, + { + "name": "sslmode", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + }, + { + "name": "password", + "type": "string", + "optional": true, + "canReadFromEnv": true, + "canReadFromTAuthe": true + } + ] + }, + { + "type": "predictkube", + "metadata": [ + { + "name": "prometheusAddress", + "type": "string" + }, + { + "name": "query", + "type": "string" + }, + { + "name": "predictHorizon", + "type": "string" + }, + { + "name": "queryStep", + "type": "string" + }, + { + "name": "historyTimeWindow", + "type": "string" + }, + { + "name": "apiKey", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "threshold", + "type": "string", + "optional": true + }, + { + "name": "activationThreshold", + "type": "string", + "optional": true + } + ] + }, + { + "type": "prometheus", + "metadata": [ + { + "name": "serverAddress", + "type": "string" + }, + { + "name": "query", + "type": "string" + }, + { + "name": "queryParameters", + "type": "string", + "optional": true + }, + { + "name": "threshold", + "type": "string" + }, + { + "name": "activationThreshold", + "type": "string", + "optional": true + }, + { + "name": "namespace", + "type": "string", + "optional": true + }, + { + "name": "customHeaders", + "type": "string", + "optional": true + }, + { + "name": "ignoreNullValues", + "type": "string", + "optional": true, + "default": "true" + }, + { + "name": "unsafeSsl", + "type": "string", + "optional": true + }, + { + "name": "awsRegion", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + } + ] + }, + { + "type": "rabbitmq", + "metadata": [ + { + "name": "queueName", + "type": "string" + }, + { + "name": "mode", + "type": "string", + "optional": true, + "default": "Unknown" + }, + { + "name": "queueLength", + "type": "string", + "optional": true + }, + { + "name": "value", + "type": "string", + "optional": true + }, + { + "name": "activationValue", + "type": "string", + "optional": true + }, + { + "name": "host", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "protocol", + "type": "string", + "optional": true, + "default": "auto", + "canReadFromTAuthe": true + }, + { + "name": "vhostName", + "type": "string", + "optional": true + }, + { + "name": "useRegex", + "type": "string", + "optional": true + }, + { + "name": "excludeUnacknowledged", + "type": "string", + "optional": true + }, + { + "name": "pageSize", + "type": "string", + "optional": true, + "default": "100" + }, + { + "name": "operation", + "type": "string", + "optional": true, + "default": "sum" + }, + { + "name": "timeout", + "type": "string", + "optional": true + }, + { + "name": "username", + "type": "string", + "optional": true, + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "password", + "type": "string", + "optional": true, + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "ca", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + }, + { + "name": "cert", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + }, + { + "name": "key", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + }, + { + "name": "keyPassword", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + }, + { + "name": "tls", + "type": "string", + "optional": true, + "default": "disable", + "canReadFromTAuthe": true + }, + { + "name": "unsafeSsl", + "type": "string", + "optional": true + }, + { + "name": "workloadIdentityResource", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + } + ] + }, + { + "type": "redis", + "metadata": [ + { + "name": "listLength", + "type": "string", + "optional": true, + "default": "5" + }, + { + "name": "activationListLength", + "type": "string", + "optional": true + }, + { + "name": "listName", + "type": "string" + }, + { + "name": "databaseIndex", + "type": "string", + "optional": true + }, + { + "name": "enableTLS", + "type": "string", + "optional": true + }, + { + "name": "tls", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + }, + { + "name": "address", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "addresses", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "username", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "password", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "sentinelUsername", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "sentinelPassword", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "sentinelMaster", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "host", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "hosts", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "port", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "ports", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "unsafeSsl", + "type": "string", + "optional": true, + "default": "false" + }, + { + "name": "Cert", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "cert", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "key", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "keyPassword", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "ca", + "type": "string", + "canReadFromTAuthe": true + } + ] + }, + { + "type": "redis-cluster", + "metadata": [ + { + "name": "listLength", + "type": "string", + "optional": true, + "default": "5" + }, + { + "name": "activationListLength", + "type": "string", + "optional": true + }, + { + "name": "listName", + "type": "string" + }, + { + "name": "databaseIndex", + "type": "string", + "optional": true + }, + { + "name": "enableTLS", + "type": "string", + "optional": true + }, + { + "name": "tls", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + }, + { + "name": "address", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "addresses", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "username", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "password", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "sentinelUsername", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "sentinelPassword", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "sentinelMaster", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "host", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "hosts", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "port", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "ports", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "unsafeSsl", + "type": "string", + "optional": true, + "default": "false" + }, + { + "name": "Cert", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "cert", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "key", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "keyPassword", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "ca", + "type": "string", + "canReadFromTAuthe": true + } + ] + }, + { + "type": "redis-sentinel", + "metadata": [ + { + "name": "listLength", + "type": "string", + "optional": true, + "default": "5" + }, + { + "name": "activationListLength", + "type": "string", + "optional": true + }, + { + "name": "listName", + "type": "string" + }, + { + "name": "databaseIndex", + "type": "string", + "optional": true + }, + { + "name": "enableTLS", + "type": "string", + "optional": true + }, + { + "name": "tls", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + }, + { + "name": "address", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "addresses", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "username", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "password", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "sentinelUsername", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "sentinelPassword", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "sentinelMaster", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "host", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "hosts", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "port", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "ports", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "unsafeSsl", + "type": "string", + "optional": true, + "default": "false" + }, + { + "name": "Cert", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "cert", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "key", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "keyPassword", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "ca", + "type": "string", + "canReadFromTAuthe": true + } + ] + }, + { + "type": "redis-cluster-streams", + "metadata": [ + { + "name": "pendingEntriesCount", + "type": "string", + "optional": true, + "default": "5" + }, + { + "name": "streamLength", + "type": "string", + "optional": true, + "default": "5" + }, + { + "name": "lagCount", + "type": "string", + "optional": true + }, + { + "name": "stream", + "type": "string" + }, + { + "name": "consumerGroup", + "type": "string", + "optional": true + }, + { + "name": "databaseIndex", + "type": "string", + "optional": true + }, + { + "name": "address", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "addresses", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "username", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "password", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "sentinelUsername", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "sentinelPassword", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "sentinelMaster", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "host", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "hosts", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "port", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "ports", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "unsafeSsl", + "type": "string", + "optional": true, + "default": "false" + }, + { + "name": "Cert", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "cert", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "key", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "keyPassword", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "ca", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "activationLagCount", + "type": "string", + "optional": true + }, + { + "name": "enableTLS", + "type": "string", + "optional": true + }, + { + "name": "tls", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + } + ] + }, + { + "type": "redis-sentinel-streams", + "metadata": [ + { + "name": "pendingEntriesCount", + "type": "string", + "optional": true, + "default": "5" + }, + { + "name": "streamLength", + "type": "string", + "optional": true, + "default": "5" + }, + { + "name": "lagCount", + "type": "string", + "optional": true + }, + { + "name": "stream", + "type": "string" + }, + { + "name": "consumerGroup", + "type": "string", + "optional": true + }, + { + "name": "databaseIndex", + "type": "string", + "optional": true + }, + { + "name": "address", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "addresses", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "username", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "password", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "sentinelUsername", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "sentinelPassword", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "sentinelMaster", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "host", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "hosts", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "port", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "ports", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "unsafeSsl", + "type": "string", + "optional": true, + "default": "false" + }, + { + "name": "Cert", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "cert", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "key", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "keyPassword", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "ca", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "activationLagCount", + "type": "string", + "optional": true + }, + { + "name": "enableTLS", + "type": "string", + "optional": true + }, + { + "name": "tls", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + } + ] + }, + { + "type": "redis-streams", + "metadata": [ + { + "name": "pendingEntriesCount", + "type": "string", + "optional": true, + "default": "5" + }, + { + "name": "streamLength", + "type": "string", + "optional": true, + "default": "5" + }, + { + "name": "lagCount", + "type": "string", + "optional": true + }, + { + "name": "stream", + "type": "string" + }, + { + "name": "consumerGroup", + "type": "string", + "optional": true + }, + { + "name": "databaseIndex", + "type": "string", + "optional": true + }, + { + "name": "address", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "addresses", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "username", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "password", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "sentinelUsername", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "sentinelPassword", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "sentinelMaster", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "host", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "hosts", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "port", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "ports", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "unsafeSsl", + "type": "string", + "optional": true, + "default": "false" + }, + { + "name": "Cert", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "cert", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "key", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "keyPassword", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "ca", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "activationLagCount", + "type": "string", + "optional": true + }, + { + "name": "enableTLS", + "type": "string", + "optional": true + }, + { + "name": "tls", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + } + ] + }, + { + "type": "selenium-grid", + "metadata": [ + { + "name": "url", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "authType", + "type": "string", + "optional": true, + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "username", + "type": "string", + "optional": true, + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "password", + "type": "string", + "optional": true, + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "accessToken", + "type": "string", + "optional": true, + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "browserName", + "type": "string", + "optional": true + }, + { + "name": "sessionBrowserName", + "type": "string", + "optional": true + }, + { + "name": "browserVersion", + "type": "string", + "optional": true + }, + { + "name": "platformName", + "type": "string", + "optional": true + }, + { + "name": "activationThreshold", + "type": "string", + "optional": true + }, + { + "name": "unsafeSsl", + "type": "string", + "default": "false" + }, + { + "name": "nodeMaxSessions", + "type": "string", + "default": "1" + } + ] + }, + { + "type": "solace-event-queue", + "metadata": [ + { + "name": "solaceSempBaseURL", + "type": "string" + }, + { + "name": "messageVpn", + "type": "string" + }, + { + "name": "queueName", + "type": "string" + }, + { + "name": "username", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "password", + "type": "string", + "canReadFromEnv": true, + "canReadFromTAuthe": true + }, + { + "name": "messageCountTarget", + "type": "string", + "optional": true + }, + { + "name": "messageSpoolUsageTarget", + "type": "string", + "optional": true + }, + { + "name": "messageReceiveRateTarget", + "type": "string", + "optional": true + }, + { + "name": "activationMessageCountTarget", + "type": "string", + "optional": true, + "default": "0" + }, + { + "name": "activationMessageSpoolUsageTarget", + "type": "string", + "optional": true, + "default": "0" + }, + { + "name": "activationMessageReceiveRateTarget", + "type": "string", + "optional": true, + "default": "0" + } + ] + }, + { + "type": "solr", + "metadata": [ + { + "name": "host", + "type": "string" + }, + { + "name": "collection", + "type": "string" + }, + { + "name": "targetQueryValue", + "type": "string" + }, + { + "name": "activationTargetQueryValue", + "type": "string", + "optional": true, + "default": "0" + }, + { + "name": "query", + "type": "string", + "optional": true + }, + { + "name": "username", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "password", + "type": "string", + "canReadFromTAuthe": true + } + ] + }, + { + "type": "splunk", + "metadata": [ + { + "name": "apiToken", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + }, + { + "name": "password", + "type": "string", + "optional": true, + "canReadFromTAuthe": true + }, + { + "name": "username", + "type": "string", + "canReadFromTAuthe": true + }, + { + "name": "host", + "type": "string" + }, + { + "name": "unsafeSsl", + "type": "string", + "optional": true + }, + { + "name": "targetValue", + "type": "string" + }, + { + "name": "activationValue", + "type": "string" + }, + { + "name": "savedSearchName", + "type": "string" + }, + { + "name": "valueField", + "type": "string" + } + ] + } + ] +} \ No newline at end of file diff --git a/schema/scaler-metadata-schemas.yaml b/schema/scaler-metadata-schemas.yaml index e0c888c92f3..d96815d5cb9 100644 --- a/schema/scaler-metadata-schemas.yaml +++ b/schema/scaler-metadata-schemas.yaml @@ -1,4 +1,4 @@ -kedaVersion: main +kedaVersion: "1.0" schemaVersion: 1 scalers: - type: activemq From e6f0a0fadad24978e2d208125ff64fec4c03c923 Mon Sep 17 00:00:00 2001 From: SpiritZhou Date: Thu, 6 Feb 2025 16:21:04 +0800 Subject: [PATCH 15/23] Update Signed-off-by: SpiritZhou --- Makefile | 3 ++- schema/generate_scaler_schema.go | 8 +++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 806e975f5a3..c907d22dbb3 100644 --- a/Makefile +++ b/Makefile @@ -390,4 +390,5 @@ validate-changelog: ## Validate changelog .PHONY: generate-scaler-schemas generate-scaler-schemas: ## Generate scaler shcemas - GOBIN=$(LOCALBIN) go run ./schema/generate_scaler_schema.go --keda-version $(VERSION) --scalers-builder-file $(SCALERS_BUILDER_FILE) --scalers-files-dir $(SCALERS_FILES_DIR) --output-file-path $(OUTPUT_FILE_PATH) \ No newline at end of file + GOBIN=$(LOCALBIN) go run ./schema/generate_scaler_schema.go --keda-version $(VERSION) --scalers-builder-file $(SCALERS_BUILDER_FILE) --scalers-files-dir $(SCALERS_FILES_DIR) --output-file-path $(OUTPUT_FILE_PATH) + \ No newline at end of file diff --git a/schema/generate_scaler_schema.go b/schema/generate_scaler_schema.go index 6bace5ee790..c031c2e89b2 100644 --- a/schema/generate_scaler_schema.go +++ b/schema/generate_scaler_schema.go @@ -153,17 +153,19 @@ func aggregateSchemaStruct(scalerSelectors map[string]string, kedaScalerStructs } filedata := []byte{} - if outputFileFormat == "yaml" { + + switch outputFileFormat { + case "yaml": filedata, err = yaml.Marshal(fullMetadataSchema) if err != nil { return err } - } else if outputFileFormat == "json" { + case "json": filedata, err = json.MarshalIndent(fullMetadataSchema, "", " ") if err != nil { return err } - } else { + default: return fmt.Errorf("output file format %s is not supported", outputFileFormat) } From 9b4b80fc1bccccc43ebd17948b1a4fd24633e426 Mon Sep 17 00:00:00 2001 From: SpiritZhou Date: Fri, 7 Feb 2025 11:09:35 +0800 Subject: [PATCH 16/23] Update Signed-off-by: SpiritZhou --- schema/generate_scaler_schema.go | 3 +-- schema/scaler-metadata-schemas.json | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/schema/generate_scaler_schema.go b/schema/generate_scaler_schema.go index c031c2e89b2..ed25ba84945 100644 --- a/schema/generate_scaler_schema.go +++ b/schema/generate_scaler_schema.go @@ -152,8 +152,7 @@ func aggregateSchemaStruct(scalerSelectors map[string]string, kedaScalerStructs Scalers: scalerMetadataSchemas, } - filedata := []byte{} - + var filedata []byte switch outputFileFormat { case "yaml": filedata, err = yaml.Marshal(fullMetadataSchema) diff --git a/schema/scaler-metadata-schemas.json b/schema/scaler-metadata-schemas.json index 0dd082866fe..75aa90d0e2e 100644 --- a/schema/scaler-metadata-schemas.json +++ b/schema/scaler-metadata-schemas.json @@ -2109,4 +2109,4 @@ ] } ] -} \ No newline at end of file +} From 2c3381e230dc535b871bc8b7bdb25a5488a85b04 Mon Sep 17 00:00:00 2001 From: SpiritZhou Date: Fri, 7 Feb 2025 11:31:37 +0800 Subject: [PATCH 17/23] Update Signed-off-by: SpiritZhou --- Makefile | 7 +- schema/generate_scaler_schema.go | 14 +- .../scalers-metadata-schema.json} | 334 +++++++++--------- .../scalers-metadata-schema.yaml} | 2 +- 4 files changed, 182 insertions(+), 175 deletions(-) rename schema/{scaler-metadata-schemas.json => generated/scalers-metadata-schema.json} (88%) rename schema/{scaler-metadata-schemas.yaml => generated/scalers-metadata-schema.yaml} (99%) diff --git a/Makefile b/Makefile index c907d22dbb3..1ddff516aad 100644 --- a/Makefile +++ b/Makefile @@ -63,7 +63,7 @@ SHELL = /usr/bin/env bash -o pipefail # Scaler schema generation parameters SCALERS_BUILDER_FILE ?= "pkg/scaling/scalers_builder.go" SCALERS_FILES_DIR ?= "pkg/scalers" - OUTPUT_FILE_PATH ?= "schema/" + OUTPUT_FILE_PATH ?= "schema/generated/" ################################################## # All # @@ -388,7 +388,6 @@ docker-build-dev-containers: ## Build dev-containers image validate-changelog: ## Validate changelog ./hack/validate-changelog.sh -.PHONY: generate-scaler-schemas -generate-scaler-schemas: ## Generate scaler shcemas +.PHONY: generate-scalers-schema +generate-scalers-schema: ## Generate scalers shcema GOBIN=$(LOCALBIN) go run ./schema/generate_scaler_schema.go --keda-version $(VERSION) --scalers-builder-file $(SCALERS_BUILDER_FILE) --scalers-files-dir $(SCALERS_FILES_DIR) --output-file-path $(OUTPUT_FILE_PATH) - \ No newline at end of file diff --git a/schema/generate_scaler_schema.go b/schema/generate_scaler_schema.go index ed25ba84945..3ef8b5a0193 100644 --- a/schema/generate_scaler_schema.go +++ b/schema/generate_scaler_schema.go @@ -18,6 +18,7 @@ package main import ( "encoding/json" + "errors" "flag" "fmt" "go/ast" @@ -84,7 +85,7 @@ type Metadata struct { CanReadFromEnv bool `json:"canReadFromEnv,omitempty" yaml:"canReadFromEnv,omitempty"` // CanReadFromAuth is a boolean that indicates if the field can be read from the TriggerAuthentication - CanReadFromAuth bool `json:"canReadFromTAuthe,omitempty" yaml:"canReadFromAuth,omitempty"` + CanReadFromAuth bool `json:"canReadFromAuth,omitempty" yaml:"canReadFromAuth,omitempty"` } // ScalerMetadataSchema is a struct that represents the metadata of a scler @@ -168,7 +169,14 @@ func aggregateSchemaStruct(scalerSelectors map[string]string, kedaScalerStructs return fmt.Errorf("output file format %s is not supported", outputFileFormat) } - fileName := outputFilePath + outputFileName + "." + outputFileFormat + if _, err := os.Stat(outputFilePath); errors.Is(err, os.ErrNotExist) { + err := os.Mkdir(outputFilePath, os.ModePerm) + if err != nil { + return err + } + } + + fileName := outputFilePath + "/" + outputFileName + "." + outputFileFormat err = os.WriteFile(fileName, filedata, 0644) return err } @@ -480,7 +488,7 @@ func main() { pflag.StringVar(&builderFilePath, "scalers-builder-file", "../pkg/scaling/scalers_builder.go", "The file that exists `buildScaler` func.") pflag.StringVar(&scalersFilesDirPath, "scalers-files-dir", "../pkg/scalers", "The directory that exists all scalers' files.") pflag.StringVar(&specifyScaler, "specify-scaler", "", "Specify scaler name.") - pflag.StringVar(&outputFileName, "output-file-name", "scaler-metadata-schemas", "Output file name.") + pflag.StringVar(&outputFileName, "output-file-name", "scalers-metadata-schema", "Output file name.") pflag.StringVar(&outputFilePath, "output-file-path", "./", "Output file path.") pflag.StringVar(&outputFormat, "output-file-format", "json", "Output file format. support json and yaml.") pflag.CommandLine.AddGoFlagSet(flag.CommandLine) diff --git a/schema/scaler-metadata-schemas.json b/schema/generated/scalers-metadata-schema.json similarity index 88% rename from schema/scaler-metadata-schemas.json rename to schema/generated/scalers-metadata-schema.json index 75aa90d0e2e..ca9e29468b5 100644 --- a/schema/scaler-metadata-schemas.json +++ b/schema/generated/scalers-metadata-schema.json @@ -1,5 +1,5 @@ { - "kedaVersion": "1.0", + "kedaVersion": "main", "schemaVersion": 1, "scalers": [ { @@ -24,13 +24,13 @@ "name": "username", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "password", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "corsHeader", @@ -132,19 +132,19 @@ "gssapi", "aws_msk_iam" ], - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "username", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "password", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "awsRegion", @@ -164,31 +164,31 @@ "enable", "disable" ], - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "cert", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "key", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "keyPassword", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "ca", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true } ] }, @@ -198,7 +198,7 @@ { "name": "endpoints", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "collection", @@ -311,7 +311,7 @@ { "name": "awsRegion", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "awsEndpoint", @@ -330,7 +330,7 @@ { "name": "awsRegion", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "awsEndpoint", @@ -379,7 +379,7 @@ { "name": "awsRegion", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "awsEndpoint", @@ -408,7 +408,7 @@ { "name": "awsRegion", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "awsEndpoint", @@ -443,7 +443,7 @@ { "name": "awsRegion", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "awsEndpoint", @@ -494,45 +494,45 @@ "type": "string", "optional": true, "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "password", "type": "string", "optional": true, "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "tls", "type": "string", "optional": true, "default": "disable", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "cert", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "key", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "keyPassword", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "ca", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true } ] }, @@ -605,13 +605,13 @@ "name": "username", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "password", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "unsafeSsl", @@ -628,25 +628,25 @@ "name": "ca", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "cert", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "key", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "keyPassword", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true } ] }, @@ -657,13 +657,13 @@ "name": "authToken", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "organizationName", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "query", @@ -672,7 +672,7 @@ { "name": "serverURL", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "unsafeSsl", @@ -772,7 +772,7 @@ "type": "string", "optional": true, "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "query", @@ -782,38 +782,38 @@ "name": "host", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "port", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "userName", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "dbName", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "sslmode", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "password", "type": "string", "optional": true, "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true } ] }, @@ -843,7 +843,7 @@ { "name": "apiKey", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "threshold", @@ -907,7 +907,7 @@ "name": "awsRegion", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true } ] }, @@ -943,14 +943,14 @@ "name": "host", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "protocol", "type": "string", "optional": true, "default": "auto", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "vhostName", @@ -989,45 +989,45 @@ "type": "string", "optional": true, "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "password", "type": "string", "optional": true, "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "ca", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "cert", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "key", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "keyPassword", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "tls", "type": "string", "optional": true, "default": "disable", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "unsafeSsl", @@ -1038,7 +1038,7 @@ "name": "workloadIdentityResource", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true } ] }, @@ -1074,73 +1074,73 @@ "name": "tls", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "address", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "addresses", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "username", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "password", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "sentinelUsername", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "sentinelPassword", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "sentinelMaster", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "host", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "hosts", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "port", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "ports", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "unsafeSsl", @@ -1151,27 +1151,27 @@ { "name": "Cert", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "cert", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "key", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "keyPassword", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "ca", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true } ] }, @@ -1207,73 +1207,73 @@ "name": "tls", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "address", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "addresses", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "username", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "password", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "sentinelUsername", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "sentinelPassword", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "sentinelMaster", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "host", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "hosts", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "port", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "ports", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "unsafeSsl", @@ -1284,27 +1284,27 @@ { "name": "Cert", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "cert", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "key", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "keyPassword", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "ca", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true } ] }, @@ -1340,73 +1340,73 @@ "name": "tls", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "address", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "addresses", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "username", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "password", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "sentinelUsername", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "sentinelPassword", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "sentinelMaster", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "host", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "hosts", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "port", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "ports", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "unsafeSsl", @@ -1417,27 +1417,27 @@ { "name": "Cert", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "cert", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "key", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "keyPassword", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "ca", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true } ] }, @@ -1479,67 +1479,67 @@ "name": "address", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "addresses", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "username", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "password", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "sentinelUsername", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "sentinelPassword", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "sentinelMaster", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "host", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "hosts", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "port", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "ports", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "unsafeSsl", @@ -1550,27 +1550,27 @@ { "name": "Cert", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "cert", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "key", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "keyPassword", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "ca", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "activationLagCount", @@ -1586,7 +1586,7 @@ "name": "tls", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true } ] }, @@ -1628,67 +1628,67 @@ "name": "address", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "addresses", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "username", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "password", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "sentinelUsername", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "sentinelPassword", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "sentinelMaster", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "host", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "hosts", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "port", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "ports", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "unsafeSsl", @@ -1699,27 +1699,27 @@ { "name": "Cert", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "cert", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "key", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "keyPassword", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "ca", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "activationLagCount", @@ -1735,7 +1735,7 @@ "name": "tls", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true } ] }, @@ -1777,67 +1777,67 @@ "name": "address", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "addresses", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "username", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "password", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "sentinelUsername", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "sentinelPassword", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "sentinelMaster", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "host", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "hosts", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "port", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "ports", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "unsafeSsl", @@ -1848,27 +1848,27 @@ { "name": "Cert", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "cert", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "key", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "keyPassword", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "ca", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "activationLagCount", @@ -1884,7 +1884,7 @@ "name": "tls", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true } ] }, @@ -1894,35 +1894,35 @@ { "name": "url", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "authType", "type": "string", "optional": true, "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "username", "type": "string", "optional": true, "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "password", "type": "string", "optional": true, "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "accessToken", "type": "string", "optional": true, "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "browserName", @@ -1980,13 +1980,13 @@ "name": "username", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "password", "type": "string", "canReadFromEnv": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "messageCountTarget", @@ -2052,12 +2052,12 @@ { "name": "username", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "password", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true } ] }, @@ -2068,18 +2068,18 @@ "name": "apiToken", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "password", "type": "string", "optional": true, - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "username", "type": "string", - "canReadFromTAuthe": true + "canReadFromAuth": true }, { "name": "host", @@ -2109,4 +2109,4 @@ ] } ] -} +} \ No newline at end of file diff --git a/schema/scaler-metadata-schemas.yaml b/schema/generated/scalers-metadata-schema.yaml similarity index 99% rename from schema/scaler-metadata-schemas.yaml rename to schema/generated/scalers-metadata-schema.yaml index d96815d5cb9..e0c888c92f3 100644 --- a/schema/scaler-metadata-schemas.yaml +++ b/schema/generated/scalers-metadata-schema.yaml @@ -1,4 +1,4 @@ -kedaVersion: "1.0" +kedaVersion: main schemaVersion: 1 scalers: - type: activemq From 0f8cc85606c8357b3d6731d38c609053d92c85ab Mon Sep 17 00:00:00 2001 From: SpiritZhou Date: Wed, 12 Feb 2025 14:06:47 +0800 Subject: [PATCH 18/23] Update Signed-off-by: SpiritZhou --- Makefile | 24 ++++-- hack/verify-schema.sh | 77 +++++++++++++++++++ schema/generate_scaler_schema.go | 40 +++++++--- ...n => scalers-metadata-schema_v2.16.1.json} | 4 +- ...l => scalers-metadata-schema_v2.16.1.yaml} | 2 +- 5 files changed, 126 insertions(+), 21 deletions(-) create mode 100755 hack/verify-schema.sh rename schema/generated/{scalers-metadata-schema.json => scalers-metadata-schema_v2.16.1.json} (99%) rename schema/generated/{scalers-metadata-schema.yaml => scalers-metadata-schema_v2.16.1.yaml} (99%) diff --git a/Makefile b/Makefile index 1ddff516aad..33858fea3e2 100644 --- a/Makefile +++ b/Makefile @@ -61,9 +61,15 @@ SHELL = /usr/bin/env bash -o pipefail .SHELLFLAGS = -ec # Scaler schema generation parameters - SCALERS_BUILDER_FILE ?= "pkg/scaling/scalers_builder.go" - SCALERS_FILES_DIR ?= "pkg/scalers" - OUTPUT_FILE_PATH ?= "schema/generated/" +SCALERS_BUILDER_FILE ?= "pkg/scaling/scalers_builder.go" +SCALERS_FILES_DIR ?= "pkg/scalers" +OUTPUT_FILE_PATH ?= "schema/generated/" +OUTPUT_FILE_NAME ?= "scalers-metadata-schema" + +ifneq '${VERSION}' 'main' + OUTPUT_FILE_NAME :="${OUTPUT_FILE_NAME}_v${VERSION}" +endif + ################################################## # All # @@ -262,6 +268,14 @@ set-version: @sed -i".out" -e 's@Version[ ]*=.*@Version = "$(VERSION)"@g' ./version/version.go; rm -rf ./version/version.go.out +.PHONY: generate-scalers-schema +generate-scalers-schema: ## Generate scalers shcema + GOBIN=$(LOCALBIN) go run ./schema/generate_scaler_schema.go --keda-version $(VERSION) --scalers-builder-file $(SCALERS_BUILDER_FILE) --scalers-files-dir $(SCALERS_FILES_DIR) --output-file-path $(OUTPUT_FILE_PATH) --output-file-name $(OUTPUT_FILE_NAME) --output-file-format both + +.PHONY: verify-scalers-schema +verify-scalers-schema: ## Verify scalers shcema + ./hack/verify-schema.sh + ################################################## # Deployment # ################################################## @@ -387,7 +401,3 @@ docker-build-dev-containers: ## Build dev-containers image .PHONY: validate-changelog validate-changelog: ## Validate changelog ./hack/validate-changelog.sh - -.PHONY: generate-scalers-schema -generate-scalers-schema: ## Generate scalers shcema - GOBIN=$(LOCALBIN) go run ./schema/generate_scaler_schema.go --keda-version $(VERSION) --scalers-builder-file $(SCALERS_BUILDER_FILE) --scalers-files-dir $(SCALERS_FILES_DIR) --output-file-path $(OUTPUT_FILE_PATH) diff --git a/hack/verify-schema.sh b/hack/verify-schema.sh new file mode 100755 index 00000000000..2263287aff7 --- /dev/null +++ b/hack/verify-schema.sh @@ -0,0 +1,77 @@ +#!/usr/bin/env bash + +# Copyright 2025 The KEDA Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# set -o errexit +set -o nounset +set -o pipefail + +SCRIPT_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. + +SCHEMAROOT="${SCRIPT_ROOT}/schema/generated" +TMP_DIFFROOT="${SCRIPT_ROOT}/_tmp/schema" +_tmp="${SCRIPT_ROOT}/_tmp" + +cleanup() { + rm -rf "${_tmp}" +} +trap "cleanup" EXIT SIGINT + +# Make sure schema json file has correct format +find $SCHEMAROOT -name "*.json" | while read file; do + if jq -e . $file >/dev/null 2>&1; then + echo "Parsed JSON successfully and got something other than false/null" + else + echo "Failed to parse JSON, or got false/null from $file" + break + fi + + err_line_content=$(grep -vE '"kedaVersion":.+|"schemaVersion":.+|"scalers": \[|"metadata": \[|"optional":.+|"default":.+|"canReadFromEnv":.+|"canReadFromAuth":.+|"type":.+|"name":.+|"rangeSeparator":.+|"separator":.+|"allowedValue": \[|"deprecatedAnnounce":.+|^[^:]*$' "$file") + + if [ ! -z "$err_line_content" ]; then + echo "ERROR: error schema format founded: $err_line_content in $file" + exit 1 + fi +done +echo "Schema json files are in correct format" + +# Make sure schema yaml file has correct format +find $SCHEMAROOT -name "*.yaml" | while read file; do + err_line_content=$(grep -vE "kedaVersion:.+|schemaVersion:.+|scalers:|metadata:|optional:.+|default:.+|canReadFromEnv:.+|canReadFromAuth:.+|type:.+|name:.+|rangeSeparator:.+|separator:.+|allowedValue:|deprecatedAnnounce:.+|^[^:]*$" "$file") + if [ ! -z "$err_line_content" ]; then + echo "ERROR: error schema format founded: $err_line_content in $file" + exit 1 + fi +done +echo "Schema yaml files are in correct format" + +cleanup + +mkdir -p "${TMP_DIFFROOT}" +cp -a "${SCHEMAROOT}"/* "${TMP_DIFFROOT}" + +make generate-scalers-schema +echo "diffing ${SCHEMAROOT} against freshly generated scalers schema" +ret=0 +diff -Naup "${SCHEMAROOT}" "${TMP_DIFFROOT}" || ret=$? +cp -a "${TMP_DIFFROOT}"/* "${SCHEMAROOT}" +if [[ $ret -eq 0 ]] +then + echo "${SCHEMAROOT} up to date." +else + echo "${SCHEMAROOT} is out of date. Please run 'make generate-scalers-schema'" + exit 1 +fi + diff --git a/schema/generate_scaler_schema.go b/schema/generate_scaler_schema.go index 3ef8b5a0193..79f2a774164 100644 --- a/schema/generate_scaler_schema.go +++ b/schema/generate_scaler_schema.go @@ -153,31 +153,49 @@ func aggregateSchemaStruct(scalerSelectors map[string]string, kedaScalerStructs Scalers: scalerMetadataSchemas, } - var filedata []byte + if _, err := os.Stat(outputFilePath); errors.Is(err, os.ErrNotExist) { + err := os.Mkdir(outputFilePath, os.ModePerm) + if err != nil { + return err + } + } + switch outputFileFormat { case "yaml": - filedata, err = yaml.Marshal(fullMetadataSchema) + filedata, err := yaml.Marshal(fullMetadataSchema) if err != nil { return err } + fileName := outputFilePath + "/" + outputFileName + ".yaml" + err = os.WriteFile(fileName, filedata, 0644) case "json": - filedata, err = json.MarshalIndent(fullMetadataSchema, "", " ") + filedata, err := json.MarshalIndent(fullMetadataSchema, "", " ") if err != nil { return err } - default: - return fmt.Errorf("output file format %s is not supported", outputFileFormat) - } + filedata = append(filedata, '\n') + fileName := outputFilePath + "/" + outputFileName + ".json" + err = os.WriteFile(fileName, filedata, 0644) + case "both": - if _, err := os.Stat(outputFilePath); errors.Is(err, os.ErrNotExist) { - err := os.Mkdir(outputFilePath, os.ModePerm) + filedata, err := yaml.Marshal(fullMetadataSchema) + if err != nil { + return err + } + fileName := outputFilePath + "/" + outputFileName + ".yaml" + err = os.WriteFile(fileName, filedata, 0644) + + filedata, err = json.MarshalIndent(fullMetadataSchema, "", " ") if err != nil { return err } + filedata = append(filedata, '\n') + fileName = outputFilePath + "/" + outputFileName + ".json" + err = os.WriteFile(fileName, filedata, 0644) + default: + return fmt.Errorf("output file format %s is not supported", outputFileFormat) } - fileName := outputFilePath + "/" + outputFileName + "." + outputFileFormat - err = os.WriteFile(fileName, filedata, 0644) return err } @@ -490,7 +508,7 @@ func main() { pflag.StringVar(&specifyScaler, "specify-scaler", "", "Specify scaler name.") pflag.StringVar(&outputFileName, "output-file-name", "scalers-metadata-schema", "Output file name.") pflag.StringVar(&outputFilePath, "output-file-path", "./", "Output file path.") - pflag.StringVar(&outputFormat, "output-file-format", "json", "Output file format. support json and yaml.") + pflag.StringVar(&outputFormat, "output-file-format", "both", "Output file format. support json and yaml.") pflag.CommandLine.AddGoFlagSet(flag.CommandLine) pflag.Parse() diff --git a/schema/generated/scalers-metadata-schema.json b/schema/generated/scalers-metadata-schema_v2.16.1.json similarity index 99% rename from schema/generated/scalers-metadata-schema.json rename to schema/generated/scalers-metadata-schema_v2.16.1.json index ca9e29468b5..b6a09172fb9 100644 --- a/schema/generated/scalers-metadata-schema.json +++ b/schema/generated/scalers-metadata-schema_v2.16.1.json @@ -1,5 +1,5 @@ { - "kedaVersion": "main", + "kedaVersion": "2.16.1", "schemaVersion": 1, "scalers": [ { @@ -2109,4 +2109,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/schema/generated/scalers-metadata-schema.yaml b/schema/generated/scalers-metadata-schema_v2.16.1.yaml similarity index 99% rename from schema/generated/scalers-metadata-schema.yaml rename to schema/generated/scalers-metadata-schema_v2.16.1.yaml index e0c888c92f3..2008717955b 100644 --- a/schema/generated/scalers-metadata-schema.yaml +++ b/schema/generated/scalers-metadata-schema_v2.16.1.yaml @@ -1,4 +1,4 @@ -kedaVersion: main +kedaVersion: 2.16.1 schemaVersion: 1 scalers: - type: activemq From e726f61252535748f3730ade445de65b63a26bdf Mon Sep 17 00:00:00 2001 From: SpiritZhou Date: Fri, 14 Feb 2025 10:13:01 +0800 Subject: [PATCH 19/23] Fix Signed-off-by: SpiritZhou --- hack/verify-schema.sh | 20 ++++++++++---------- schema/generate_scaler_schema.go | 16 ++++++++++++++++ 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/hack/verify-schema.sh b/hack/verify-schema.sh index 2263287aff7..20555473b38 100755 --- a/hack/verify-schema.sh +++ b/hack/verify-schema.sh @@ -30,7 +30,7 @@ cleanup() { trap "cleanup" EXIT SIGINT # Make sure schema json file has correct format -find $SCHEMAROOT -name "*.json" | while read file; do +find $SCHEMAROOT -name "*.json" | while read file; do if jq -e . $file >/dev/null 2>&1; then echo "Parsed JSON successfully and got something other than false/null" else @@ -40,21 +40,21 @@ find $SCHEMAROOT -name "*.json" | while read file; do err_line_content=$(grep -vE '"kedaVersion":.+|"schemaVersion":.+|"scalers": \[|"metadata": \[|"optional":.+|"default":.+|"canReadFromEnv":.+|"canReadFromAuth":.+|"type":.+|"name":.+|"rangeSeparator":.+|"separator":.+|"allowedValue": \[|"deprecatedAnnounce":.+|^[^:]*$' "$file") - if [ ! -z "$err_line_content" ]; then - echo "ERROR: error schema format founded: $err_line_content in $file" + if [ ! -z "$err_line_content" ]; then + echo "ERROR: error schema format founded: $err_line_content in $file" exit 1 - fi -done + fi +done echo "Schema json files are in correct format" # Make sure schema yaml file has correct format -find $SCHEMAROOT -name "*.yaml" | while read file; do +find $SCHEMAROOT -name "*.yaml" | while read file; do err_line_content=$(grep -vE "kedaVersion:.+|schemaVersion:.+|scalers:|metadata:|optional:.+|default:.+|canReadFromEnv:.+|canReadFromAuth:.+|type:.+|name:.+|rangeSeparator:.+|separator:.+|allowedValue:|deprecatedAnnounce:.+|^[^:]*$" "$file") - if [ ! -z "$err_line_content" ]; then - echo "ERROR: error schema format founded: $err_line_content in $file" + if [ ! -z "$err_line_content" ]; then + echo "ERROR: error schema format founded: $err_line_content in $file" exit 1 - fi -done + fi +done echo "Schema yaml files are in correct format" cleanup diff --git a/schema/generate_scaler_schema.go b/schema/generate_scaler_schema.go index 79f2a774164..8578ab934ee 100644 --- a/schema/generate_scaler_schema.go +++ b/schema/generate_scaler_schema.go @@ -166,32 +166,48 @@ func aggregateSchemaStruct(scalerSelectors map[string]string, kedaScalerStructs if err != nil { return err } + fileName := outputFilePath + "/" + outputFileName + ".yaml" err = os.WriteFile(fileName, filedata, 0644) + if err != nil { + return err + } case "json": filedata, err := json.MarshalIndent(fullMetadataSchema, "", " ") if err != nil { return err } + filedata = append(filedata, '\n') fileName := outputFilePath + "/" + outputFileName + ".json" err = os.WriteFile(fileName, filedata, 0644) + if err != nil { + return err + } case "both": filedata, err := yaml.Marshal(fullMetadataSchema) if err != nil { return err } + fileName := outputFilePath + "/" + outputFileName + ".yaml" err = os.WriteFile(fileName, filedata, 0644) + if err != nil { + return err + } filedata, err = json.MarshalIndent(fullMetadataSchema, "", " ") if err != nil { return err } + filedata = append(filedata, '\n') fileName = outputFilePath + "/" + outputFileName + ".json" err = os.WriteFile(fileName, filedata, 0644) + if err != nil { + return err + } default: return fmt.Errorf("output file format %s is not supported", outputFileFormat) } From dd7798f5a65c68b0f00eb0ddad74b014f229daa8 Mon Sep 17 00:00:00 2001 From: SpiritZhou Date: Fri, 14 Feb 2025 11:01:21 +0800 Subject: [PATCH 20/23] Fix Signed-off-by: SpiritZhou --- Makefile | 2 +- hack/verify-schema.sh | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index a99c8e5224c..4aee245eb58 100644 --- a/Makefile +++ b/Makefile @@ -71,7 +71,7 @@ OUTPUT_FILE_PATH ?= "schema/generated/" OUTPUT_FILE_NAME ?= "scalers-metadata-schema" ifneq '${VERSION}' 'main' - OUTPUT_FILE_NAME :="${OUTPUT_FILE_NAME}_v${VERSION}" + OUTPUT_FILE_NAME :="${OUTPUT_FILE_NAME}_v${VERSION}" endif diff --git a/hack/verify-schema.sh b/hack/verify-schema.sh index 20555473b38..6d44c3834f1 100755 --- a/hack/verify-schema.sh +++ b/hack/verify-schema.sh @@ -30,7 +30,7 @@ cleanup() { trap "cleanup" EXIT SIGINT # Make sure schema json file has correct format -find $SCHEMAROOT -name "*.json" | while read file; do +find $SCHEMAROOT -name "*.json" | while read file; do if jq -e . $file >/dev/null 2>&1; then echo "Parsed JSON successfully and got something other than false/null" else @@ -40,20 +40,20 @@ find $SCHEMAROOT -name "*.json" | while read file; do err_line_content=$(grep -vE '"kedaVersion":.+|"schemaVersion":.+|"scalers": \[|"metadata": \[|"optional":.+|"default":.+|"canReadFromEnv":.+|"canReadFromAuth":.+|"type":.+|"name":.+|"rangeSeparator":.+|"separator":.+|"allowedValue": \[|"deprecatedAnnounce":.+|^[^:]*$' "$file") - if [ ! -z "$err_line_content" ]; then - echo "ERROR: error schema format founded: $err_line_content in $file" + if [ ! -z "$err_line_content" ]; then + echo "ERROR: error schema format founded: $err_line_content in $file" exit 1 - fi -done + fi +done echo "Schema json files are in correct format" # Make sure schema yaml file has correct format -find $SCHEMAROOT -name "*.yaml" | while read file; do +find $SCHEMAROOT -name "*.yaml" | while read file; do err_line_content=$(grep -vE "kedaVersion:.+|schemaVersion:.+|scalers:|metadata:|optional:.+|default:.+|canReadFromEnv:.+|canReadFromAuth:.+|type:.+|name:.+|rangeSeparator:.+|separator:.+|allowedValue:|deprecatedAnnounce:.+|^[^:]*$" "$file") - if [ ! -z "$err_line_content" ]; then - echo "ERROR: error schema format founded: $err_line_content in $file" + if [ ! -z "$err_line_content" ]; then + echo "ERROR: error schema format founded: $err_line_content in $file" exit 1 - fi + fi done echo "Schema yaml files are in correct format" From a7aa86d233ca49701a9c9c929c4b9539ecb37997 Mon Sep 17 00:00:00 2001 From: SpiritZhou Date: Fri, 14 Feb 2025 11:18:14 +0800 Subject: [PATCH 21/23] Fix Signed-off-by: SpiritZhou --- Makefile | 6 +++--- hack/verify-schema.sh | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 4aee245eb58..99311cd82d9 100644 --- a/Makefile +++ b/Makefile @@ -70,9 +70,9 @@ SCALERS_FILES_DIR ?= "pkg/scalers" OUTPUT_FILE_PATH ?= "schema/generated/" OUTPUT_FILE_NAME ?= "scalers-metadata-schema" -ifneq '${VERSION}' 'main' - OUTPUT_FILE_NAME :="${OUTPUT_FILE_NAME}_v${VERSION}" -endif +ifneq '${VERSION}' 'main' + OUTPUT_FILE_NAME :="${OUTPUT_FILE_NAME}_v${VERSION}" +endif ################################################## diff --git a/hack/verify-schema.sh b/hack/verify-schema.sh index 6d44c3834f1..7234c1f86ba 100755 --- a/hack/verify-schema.sh +++ b/hack/verify-schema.sh @@ -42,7 +42,7 @@ find $SCHEMAROOT -name "*.json" | while read file; do if [ ! -z "$err_line_content" ]; then echo "ERROR: error schema format founded: $err_line_content in $file" - exit 1 + exit 1 fi done echo "Schema json files are in correct format" @@ -54,7 +54,7 @@ find $SCHEMAROOT -name "*.yaml" | while read file; do echo "ERROR: error schema format founded: $err_line_content in $file" exit 1 fi -done +done echo "Schema yaml files are in correct format" cleanup From a6f27e6f01dec8b549e2c8d24f67117b6889b7be Mon Sep 17 00:00:00 2001 From: SpiritZhou Date: Fri, 14 Feb 2025 11:54:44 +0800 Subject: [PATCH 22/23] fix Signed-off-by: SpiritZhou --- Makefile | 3 +-- hack/verify-schema.sh | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 99311cd82d9..a345aeccb5a 100644 --- a/Makefile +++ b/Makefile @@ -69,11 +69,10 @@ SCALERS_BUILDER_FILE ?= "pkg/scaling/scalers_builder.go" SCALERS_FILES_DIR ?= "pkg/scalers" OUTPUT_FILE_PATH ?= "schema/generated/" OUTPUT_FILE_NAME ?= "scalers-metadata-schema" - + ifneq '${VERSION}' 'main' OUTPUT_FILE_NAME :="${OUTPUT_FILE_NAME}_v${VERSION}" endif - ################################################## # All # diff --git a/hack/verify-schema.sh b/hack/verify-schema.sh index 7234c1f86ba..e8cbc29611a 100755 --- a/hack/verify-schema.sh +++ b/hack/verify-schema.sh @@ -74,4 +74,3 @@ else echo "${SCHEMAROOT} is out of date. Please run 'make generate-scalers-schema'" exit 1 fi - From 5986674eac009ab4d4f1421beb5fd5debf504ba9 Mon Sep 17 00:00:00 2001 From: SpiritZhou Date: Tue, 18 Feb 2025 10:53:03 +0800 Subject: [PATCH 23/23] Update Signed-off-by: SpiritZhou --- .github/workflows/pr-validation.yml | 3 + .github/workflows/release-build.yml | 24 +++ Makefile | 4 +- ...16.1.json => scalers-metadata-schema.json} | 175 ++++++++++++++---- ...16.1.yaml => scalers-metadata-schema.yaml} | 121 ++++++++---- 5 files changed, 248 insertions(+), 79 deletions(-) rename schema/generated/{scalers-metadata-schema_v2.16.1.json => scalers-metadata-schema.json} (94%) rename schema/generated/{scalers-metadata-schema_v2.16.1.yaml => scalers-metadata-schema.yaml} (94%) diff --git a/.github/workflows/pr-validation.yml b/.github/workflows/pr-validation.yml index 2f108384e32..cf0e1f6a132 100644 --- a/.github/workflows/pr-validation.yml +++ b/.github/workflows/pr-validation.yml @@ -62,6 +62,9 @@ jobs: - name: Verify generated Manifests are up to date run: make verify-manifests + - name: Verify generated Scalers schema is up to date + run: make verify-scalers-schema + - name: Build run: make build diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index 836e3bdb6bf..c83d0288d4b 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -130,3 +130,27 @@ jobs: asset_path: keda-${{ steps.get_version.outputs.VERSION }}-crds.yaml asset_name: keda-${{ steps.get_version.outputs.VERSION }}-crds.yaml asset_content_type: application/x-yaml + + # Upload scalers schema YAML file to GitHub release + - name: Upload scalers schema YAML file + id: upload-scalers-schema-yaml + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: https://uploads.github.com/repos/kedacore/keda/releases/${{ steps.get-release-info.outputs.id }}/assets?name=keda-scalers-schema-${{ steps.get_version.outputs.VERSION }}.yaml + asset_path: schema/generated/scalers-metadata-schema-${{ steps.get_version.outputs.VERSION }}.yaml + asset_name: keda-scalers-schema-${{ steps.get_version.outputs.VERSION }}.yaml + asset_content_type: application/x-yaml + + # Upload scalers schema JSON file to GitHub release + - name: Upload scalers schema JSON file + id: upload-scalers-schema-json + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: https://uploads.github.com/repos/kedacore/keda/releases/${{ steps.get-release-info.outputs.id }}/assets?name=keda-scalers-schema-${{ steps.get_version.outputs.VERSION }}.json + asset_path: schema/generated/scalers-metadata-schema-${{ steps.get_version.outputs.VERSION }}.json + asset_name: keda-scalers-schema-${{ steps.get_version.outputs.VERSION }}.json + asset_content_type: application/json diff --git a/Makefile b/Makefile index a345aeccb5a..5be75e12bfa 100644 --- a/Makefile +++ b/Makefile @@ -71,7 +71,7 @@ OUTPUT_FILE_PATH ?= "schema/generated/" OUTPUT_FILE_NAME ?= "scalers-metadata-schema" ifneq '${VERSION}' 'main' - OUTPUT_FILE_NAME :="${OUTPUT_FILE_NAME}_v${VERSION}" + OUTPUT_FILE_NAME :="${OUTPUT_FILE_NAME}-${VERSION}" endif ################################################## @@ -250,7 +250,7 @@ publish-webhooks-multiarch: ## Build and push multi-arch Docker image for KEDA H publish-multiarch: publish-controller-multiarch publish-adapter-multiarch publish-webhooks-multiarch ## Push multi-arch Docker images on to Container Registry (default: ghcr.io). -release: manifests kustomize set-version ## Produce new KEDA release in keda-$(VERSION).yaml file. +release: manifests kustomize set-version generate-scalers-schema## Produce new KEDA release in keda-$(VERSION).yaml file. cd config/manager && \ $(KUSTOMIZE) edit set image ghcr.io/kedacore/keda=${IMAGE_CONTROLLER} cd config/metrics-server && \ diff --git a/schema/generated/scalers-metadata-schema_v2.16.1.json b/schema/generated/scalers-metadata-schema.json similarity index 94% rename from schema/generated/scalers-metadata-schema_v2.16.1.json rename to schema/generated/scalers-metadata-schema.json index b6a09172fb9..9b8f3158505 100644 --- a/schema/generated/scalers-metadata-schema_v2.16.1.json +++ b/schema/generated/scalers-metadata-schema.json @@ -1,5 +1,5 @@ { - "kedaVersion": "2.16.1", + "kedaVersion": "main", "schemaVersion": 1, "scalers": [ { @@ -45,13 +45,11 @@ { "name": "targetQueueSize", "type": "string", - "optional": true, "default": "10" }, { "name": "activationTargetQueueSize", "type": "string", - "optional": true, "default": "0" } ] @@ -276,19 +274,16 @@ { "name": "ignoreNullValues", "type": "string", - "optional": true, "default": "true" }, { "name": "metricCollectionTime", "type": "string", - "optional": true, "default": "300" }, { "name": "metricStat", "type": "string", - "optional": true, "default": "Average" }, { @@ -299,13 +294,11 @@ { "name": "metricStatPeriod", "type": "string", - "optional": true, "default": "300" }, { "name": "metricEndTimeOffset", "type": "string", - "optional": true, "default": "0" }, { @@ -480,13 +473,11 @@ { "name": "activationValue", "type": "string", - "optional": true, "default": "0" }, { "name": "watchProgressNotifyInterval", "type": "string", - "optional": true, "default": "600" }, { @@ -506,7 +497,6 @@ { "name": "tls", "type": "string", - "optional": true, "default": "disable", "canReadFromAuth": true }, @@ -710,6 +700,38 @@ } ] }, + { + "type": "liiklus", + "metadata": [ + { + "name": "lagThreshold", + "type": "string", + "default": "10" + }, + { + "name": "activationLagThreshold", + "type": "string", + "default": "0" + }, + { + "name": "address", + "type": "string" + }, + { + "name": "topic", + "type": "string" + }, + { + "name": "group", + "type": "string" + }, + { + "name": "groupVersion", + "type": "string", + "default": "0" + } + ] + }, { "type": "nsq", "metadata": [ @@ -895,7 +917,6 @@ { "name": "ignoreNullValues", "type": "string", - "optional": true, "default": "true" }, { @@ -948,14 +969,14 @@ { "name": "protocol", "type": "string", - "optional": true, "default": "auto", "canReadFromAuth": true }, { "name": "vhostName", "type": "string", - "optional": true + "optional": true, + "canReadFromAuth": true }, { "name": "useRegex", @@ -970,13 +991,11 @@ { "name": "pageSize", "type": "string", - "optional": true, "default": "100" }, { "name": "operation", "type": "string", - "optional": true, "default": "sum" }, { @@ -1025,7 +1044,6 @@ { "name": "tls", "type": "string", - "optional": true, "default": "disable", "canReadFromAuth": true }, @@ -1048,7 +1066,6 @@ { "name": "listLength", "type": "string", - "optional": true, "default": "5" }, { @@ -1145,7 +1162,6 @@ { "name": "unsafeSsl", "type": "string", - "optional": true, "default": "false" }, { @@ -1181,7 +1197,6 @@ { "name": "listLength", "type": "string", - "optional": true, "default": "5" }, { @@ -1278,7 +1293,6 @@ { "name": "unsafeSsl", "type": "string", - "optional": true, "default": "false" }, { @@ -1314,7 +1328,6 @@ { "name": "listLength", "type": "string", - "optional": true, "default": "5" }, { @@ -1411,7 +1424,6 @@ { "name": "unsafeSsl", "type": "string", - "optional": true, "default": "false" }, { @@ -1447,13 +1459,11 @@ { "name": "pendingEntriesCount", "type": "string", - "optional": true, "default": "5" }, { "name": "streamLength", "type": "string", - "optional": true, "default": "5" }, { @@ -1544,7 +1554,6 @@ { "name": "unsafeSsl", "type": "string", - "optional": true, "default": "false" }, { @@ -1575,7 +1584,7 @@ { "name": "activationLagCount", "type": "string", - "optional": true + "default": "0" }, { "name": "enableTLS", @@ -1596,13 +1605,11 @@ { "name": "pendingEntriesCount", "type": "string", - "optional": true, "default": "5" }, { "name": "streamLength", "type": "string", - "optional": true, "default": "5" }, { @@ -1693,7 +1700,6 @@ { "name": "unsafeSsl", "type": "string", - "optional": true, "default": "false" }, { @@ -1724,7 +1730,7 @@ { "name": "activationLagCount", "type": "string", - "optional": true + "default": "0" }, { "name": "enableTLS", @@ -1745,13 +1751,11 @@ { "name": "pendingEntriesCount", "type": "string", - "optional": true, "default": "5" }, { "name": "streamLength", "type": "string", - "optional": true, "default": "5" }, { @@ -1842,7 +1846,6 @@ { "name": "unsafeSsl", "type": "string", - "optional": true, "default": "false" }, { @@ -1873,7 +1876,7 @@ { "name": "activationLagCount", "type": "string", - "optional": true + "default": "0" }, { "name": "enableTLS", @@ -1958,6 +1961,11 @@ "name": "nodeMaxSessions", "type": "string", "default": "1" + }, + { + "name": "capabilities", + "type": "string", + "optional": true } ] }, @@ -2006,19 +2014,16 @@ { "name": "activationMessageCountTarget", "type": "string", - "optional": true, "default": "0" }, { "name": "activationMessageSpoolUsageTarget", "type": "string", - "optional": true, "default": "0" }, { "name": "activationMessageReceiveRateTarget", "type": "string", - "optional": true, "default": "0" } ] @@ -2041,7 +2046,6 @@ { "name": "activationTargetQueryValue", "type": "string", - "optional": true, "default": "0" }, { @@ -2107,6 +2111,99 @@ "type": "string" } ] + }, + { + "type": "temporal", + "metadata": [ + { + "name": "endpoint", + "type": "string", + "canReadFromEnv": true + }, + { + "name": "namespace", + "type": "string", + "default": "default", + "canReadFromEnv": true + }, + { + "name": "activationTargetQueueSize", + "type": "string", + "default": "0" + }, + { + "name": "targetQueueSize", + "type": "string", + "default": "5" + }, + { + "name": "taskQueue", + "type": "string", + "canReadFromEnv": true + }, + { + "name": "queueTypes", + "type": "string", + "optional": true + }, + { + "name": "buildId", + "type": "string", + "optional": true, + "canReadFromEnv": true + }, + { + "name": "selectAllActive", + "type": "string", + "default": "false" + }, + { + "name": "selectUnversioned", + "type": "string", + "default": "false" + }, + { + "name": "apiKey", + "type": "string", + "optional": true, + "canReadFromEnv": true, + "canReadFromAuth": true + }, + { + "name": "minConnectTimeout", + "type": "string", + "default": "5" + }, + { + "name": "unsafeSsl", + "type": "string", + "optional": true + }, + { + "name": "cert", + "type": "string", + "optional": true, + "canReadFromAuth": true + }, + { + "name": "key", + "type": "string", + "optional": true, + "canReadFromAuth": true + }, + { + "name": "keyPassword", + "type": "string", + "optional": true, + "canReadFromAuth": true + }, + { + "name": "ca", + "type": "string", + "optional": true, + "canReadFromAuth": true + } + ] } ] } diff --git a/schema/generated/scalers-metadata-schema_v2.16.1.yaml b/schema/generated/scalers-metadata-schema.yaml similarity index 94% rename from schema/generated/scalers-metadata-schema_v2.16.1.yaml rename to schema/generated/scalers-metadata-schema.yaml index 2008717955b..80877c59362 100644 --- a/schema/generated/scalers-metadata-schema_v2.16.1.yaml +++ b/schema/generated/scalers-metadata-schema.yaml @@ -1,4 +1,4 @@ -kedaVersion: 2.16.1 +kedaVersion: main schemaVersion: 1 scalers: - type: activemq @@ -28,11 +28,9 @@ scalers: optional: true - name: targetQueueSize type: string - optional: true default: "10" - name: activationTargetQueueSize type: string - optional: true default: "0" - type: apache-kafka metadata: @@ -171,26 +169,21 @@ scalers: type: string - name: ignoreNullValues type: string - optional: true default: "true" - name: metricCollectionTime type: string - optional: true default: "300" - name: metricStat type: string - optional: true default: Average - name: metricUnit type: string optional: true - name: metricStatPeriod type: string - optional: true default: "300" - name: metricEndTimeOffset type: string - optional: true default: "0" - name: awsRegion type: string @@ -288,11 +281,9 @@ scalers: type: string - name: activationValue type: string - optional: true default: "0" - name: watchProgressNotifyInterval type: string - optional: true default: "600" - name: username type: string @@ -306,7 +297,6 @@ scalers: canReadFromAuth: true - name: tls type: string - optional: true default: disable canReadFromAuth: true - name: cert @@ -428,6 +418,23 @@ scalers: - name: activationValue type: string default: "0" + - type: liiklus + metadata: + - name: lagThreshold + type: string + default: "10" + - name: activationLagThreshold + type: string + default: "0" + - name: address + type: string + - name: topic + type: string + - name: group + type: string + - name: groupVersion + type: string + default: "0" - type: nsq metadata: - name: nsqLookupdHTTPAddresses @@ -538,7 +545,6 @@ scalers: optional: true - name: ignoreNullValues type: string - optional: true default: "true" - name: unsafeSsl type: string @@ -570,12 +576,12 @@ scalers: canReadFromAuth: true - name: protocol type: string - optional: true default: auto canReadFromAuth: true - name: vhostName type: string optional: true + canReadFromAuth: true - name: useRegex type: string optional: true @@ -584,11 +590,9 @@ scalers: optional: true - name: pageSize type: string - optional: true default: "100" - name: operation type: string - optional: true default: sum - name: timeout type: string @@ -621,7 +625,6 @@ scalers: canReadFromAuth: true - name: tls type: string - optional: true default: disable canReadFromAuth: true - name: unsafeSsl @@ -635,7 +638,6 @@ scalers: metadata: - name: listLength type: string - optional: true default: "5" - name: activationListLength type: string @@ -698,7 +700,6 @@ scalers: canReadFromAuth: true - name: unsafeSsl type: string - optional: true default: "false" - name: Cert type: string @@ -719,7 +720,6 @@ scalers: metadata: - name: listLength type: string - optional: true default: "5" - name: activationListLength type: string @@ -782,7 +782,6 @@ scalers: canReadFromAuth: true - name: unsafeSsl type: string - optional: true default: "false" - name: Cert type: string @@ -803,7 +802,6 @@ scalers: metadata: - name: listLength type: string - optional: true default: "5" - name: activationListLength type: string @@ -866,7 +864,6 @@ scalers: canReadFromAuth: true - name: unsafeSsl type: string - optional: true default: "false" - name: Cert type: string @@ -887,11 +884,9 @@ scalers: metadata: - name: pendingEntriesCount type: string - optional: true default: "5" - name: streamLength type: string - optional: true default: "5" - name: lagCount type: string @@ -950,7 +945,6 @@ scalers: canReadFromAuth: true - name: unsafeSsl type: string - optional: true default: "false" - name: Cert type: string @@ -969,7 +963,7 @@ scalers: canReadFromAuth: true - name: activationLagCount type: string - optional: true + default: "0" - name: enableTLS type: string optional: true @@ -981,11 +975,9 @@ scalers: metadata: - name: pendingEntriesCount type: string - optional: true default: "5" - name: streamLength type: string - optional: true default: "5" - name: lagCount type: string @@ -1044,7 +1036,6 @@ scalers: canReadFromAuth: true - name: unsafeSsl type: string - optional: true default: "false" - name: Cert type: string @@ -1063,7 +1054,7 @@ scalers: canReadFromAuth: true - name: activationLagCount type: string - optional: true + default: "0" - name: enableTLS type: string optional: true @@ -1075,11 +1066,9 @@ scalers: metadata: - name: pendingEntriesCount type: string - optional: true default: "5" - name: streamLength type: string - optional: true default: "5" - name: lagCount type: string @@ -1138,7 +1127,6 @@ scalers: canReadFromAuth: true - name: unsafeSsl type: string - optional: true default: "false" - name: Cert type: string @@ -1157,7 +1145,7 @@ scalers: canReadFromAuth: true - name: activationLagCount type: string - optional: true + default: "0" - name: enableTLS type: string optional: true @@ -1211,6 +1199,9 @@ scalers: - name: nodeMaxSessions type: string default: "1" + - name: capabilities + type: string + optional: true - type: solace-event-queue metadata: - name: solaceSempBaseURL @@ -1238,15 +1229,12 @@ scalers: optional: true - name: activationMessageCountTarget type: string - optional: true default: "0" - name: activationMessageSpoolUsageTarget type: string - optional: true default: "0" - name: activationMessageReceiveRateTarget type: string - optional: true default: "0" - type: solr metadata: @@ -1258,7 +1246,6 @@ scalers: type: string - name: activationTargetQueryValue type: string - optional: true default: "0" - name: query type: string @@ -1295,3 +1282,61 @@ scalers: type: string - name: valueField type: string + - type: temporal + metadata: + - name: endpoint + type: string + canReadFromEnv: true + - name: namespace + type: string + default: default + canReadFromEnv: true + - name: activationTargetQueueSize + type: string + default: "0" + - name: targetQueueSize + type: string + default: "5" + - name: taskQueue + type: string + canReadFromEnv: true + - name: queueTypes + type: string + optional: true + - name: buildId + type: string + optional: true + canReadFromEnv: true + - name: selectAllActive + type: string + default: "false" + - name: selectUnversioned + type: string + default: "false" + - name: apiKey + type: string + optional: true + canReadFromEnv: true + canReadFromAuth: true + - name: minConnectTimeout + type: string + default: "5" + - name: unsafeSsl + type: string + optional: true + - name: cert + type: string + optional: true + canReadFromAuth: true + - name: key + type: string + optional: true + canReadFromAuth: true + - name: keyPassword + type: string + optional: true + canReadFromAuth: true + - name: ca + type: string + optional: true + canReadFromAuth: true