From 1b033ab2d25b0c590a13c565d5278abebfd21cce Mon Sep 17 00:00:00 2001 From: Steven Borrelli Date: Tue, 8 Oct 2024 12:32:41 +0200 Subject: [PATCH] fix linting issues Signed-off-by: Steven Borrelli --- .golangci.yaml | 320 ++++++++++++++ filter.go | 967 +---------------------------------------- filter_aws.go | 965 ++++++++++++++++++++++++++++++++++++++++ filter_test.go | 112 ++--- fn.go | 29 +- fn_test.go | 58 +-- input/v1beta1/input.go | 51 +-- main.go | 1 - tags.go | 31 +- tags_test.go | 270 ++++++------ 10 files changed, 1576 insertions(+), 1228 deletions(-) create mode 100644 .golangci.yaml create mode 100644 filter_aws.go diff --git a/.golangci.yaml b/.golangci.yaml new file mode 100644 index 0000000..8dbaf61 --- /dev/null +++ b/.golangci.yaml @@ -0,0 +1,320 @@ +run: + timeout: 10m + +output: + # colored-line-number|line-number|json|tab|checkstyle|code-climate, default is "colored-line-number" + formats: + - format: colored-line-number + path: stderr + +linters: + enable-all: true + fast: false + + disable: + # These linters are all deprecated. We disable them explicitly to avoid the + # linter logging deprecation warnings. + - execinquery + + # These are linters we'd like to enable, but that will be labor intensive to + # make existing code compliant. + - wrapcheck + - varnamelen + - testpackage + - paralleltest + - nilnil + - gomnd + + # Below are linters that lint for things we don't value. Each entry below + # this line must have a comment explaining the rationale. + + # These linters add whitespace in an attempt to make code more readable. + # This isn't a widely accepted Go best practice, and would be laborious to + # apply to existing code. + - wsl + - nlreturn + + # Warns about uses of fmt.Sprintf that are less performant than alternatives + # such as string concatenation. We value readability more than performance + # unless performance is measured to be an issue. + - perfsprint + + # This linter: + # + # 1. Requires errors.Is/errors.As to test equality. + # 2. Requires all errors be wrapped with fmt.Errorf specifically. + # 3. Disallows errors.New inline - requires package level errors. + # + # 1 is covered by other linters. 2 is covered by wrapcheck, which can also + # handle our use of crossplane-runtime's errors package. 3 is more strict + # than we need. Not every error needs to be tested for equality. + - err113 + + # These linters duplicate gocognit, but calculate complexity differently. + - gocyclo + - cyclop + - nestif + - funlen + - maintidx + + # Enforces max line length. It's not idiomatic to enforce a strict limit on + # line length in Go. We'd prefer to lint for things that often cause long + # lines, like functions with too many parameters or long parameter names + # that duplicate their types. + - lll + + # Warns about struct instantiations that don't specify every field. Could be + # useful in theory to catch fields that are accidentally omitted. Seems like + # it would have many more false positives than useful catches, though. + - exhaustruct + + # Warns about TODO comments. The rationale being they should be issues + # instead. We're okay with using TODO to track minor cleanups for next time + # we touch a particular file. + - godox + + # Warns about duplicated code blocks within the same file. Could be useful + # to prompt folks to think about whether code should be broken out into a + # function, but generally we're less worried about DRY and fine with a + # little copying. We don't want to give folks the impression that we require + # every duplicated code block to be factored out into a function. + - dupl + + # Warns about returning interfaces rather than concrete types. We do think + # it's best to avoid returning interfaces where possible. However, at the + # time of writing enabling this linter would only catch the (many) cases + # where we must return an interface. + - ireturn + + # Warns about returning named variables. We do think it's best to avoid + # returning named variables where possible. However, at the time of writing + # enabling this linter would only catch the (many) cases where returning + # named variables is useful to document what the variables are. For example + # we believe it makes sense to return (ready bool) rather than just (bool) + # to communicate what the bool means. + - nonamedreturns + + # Warns about taking the address of a range variable. This isn't an issue in + # Go v1.22 and above: https://tip.golang.org/doc/go1.22 + - exportloopref + + # Warns about using magic numbers. We do think it's best to avoid magic + # numbers, but we should not be strict about it. + - mnd + + # Rewrites struct tag in main, dropping fields. + - tagalign + +linters-settings: + errcheck: + # report about not checking of errors in type assetions: `a := b.(MyStruct)`; + # default is false: such cases aren't reported by default. + check-type-assertions: false + + # report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`; + # default is false: such cases aren't reported by default. + check-blank: false + + govet: + # report about shadowed variables + disable: + - shadow + + gofmt: + # simplify code: gofmt with `-s` option, true by default + simplify: true + + gci: + custom-order: true + sections: + - standard + - default + - prefix(github.com/crossplane/crossplane-runtime) + - prefix(github.com/crossplane/crossplane) + - prefix(github.com/crossplane/crossplane-contrib) + - blank + - dot + + dupl: + # tokens count to trigger issue, 150 by default + threshold: 100 + + goconst: + # minimal length of string constant, 3 by default + min-len: 3 + # minimal occurrences count to trigger, 3 by default + min-occurrences: 5 + + lll: + # tab width in spaces. Default to 1. + tab-width: 1 + + unused: + # treat code as a program (not a library) and report unused exported identifiers; default is false. + # XXX: if you enable this setting, unused will report a lot of false-positives in text editors: + # if it's called for subdir of a project it can't find funcs usages. All text editor integrations + # with golangci-lint call it on a directory with the changed file. + #exported-is-used: true + exported-fields-are-used: true + + unparam: + # Inspect exported functions, default is false. Set to true if no external program/library imports your code. + # XXX: if you enable this setting, unparam will report a lot of false-positives in text editors: + # if it's called for subdir of a project it can't find external interfaces. All text editor integrations + # with golangci-lint call it on a directory with the changed file. + check-exported: false + + nakedret: + # make an issue if func has more lines of code than this setting and it has naked returns; default is 30 + max-func-lines: 30 + + prealloc: + # XXX: we don't recommend using this linter before doing performance profiling. + # For most programs usage of prealloc will be a premature optimization. + + # Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them. + # True by default. + simple: true + range-loops: true # Report preallocation suggestions on range loops, true by default + for-loops: false # Report preallocation suggestions on for loops, false by default + + gocritic: + # Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint` run to see all tags and checks. + # Empty list by default. See https://github.com/go-critic/go-critic#usage -> section "Tags". + enabled-tags: + - performance + + settings: # settings passed to gocritic + captLocal: # must be valid enabled check name + paramsOnly: true + rangeValCopy: + sizeThreshold: 32 + + nolintlint: + require-explanation: true + require-specific: true + + depguard: + rules: + no_third_party_test_libraries: + list-mode: lax + files: + - $test + deny: + - pkg: github.com/stretchr/testify + desc: "See https://go.dev/wiki/TestComments#assert-libraries" + - pkg: github.com/onsi/ginkgo + desc: "See https://go.dev/wiki/TestComments#assert-libraries" + - pkg: github.com/onsi/gomega + desc: "See https://go.dev/wiki/TestComments#assert-libraries" + + interfacebloat: + max: 5 + + tagliatelle: + case: + rules: + json: goCamel + +issues: + # Excluding generated files. + exclude-files: + - "zz_generated\\..+\\.go$" + - ".+\\.pb.go$" + # Excluding configuration per-path and per-linter. + exclude-rules: + # Exclude some linters from running on tests files. + - path: _test(ing)?\.go + linters: + - gocognit + - errcheck + - gosec + - scopelint + - unparam + - gochecknoinits + - gochecknoglobals + - containedctx + - forcetypeassert + + # Ease some gocritic warnings on test files. + - path: _test\.go + text: "(unnamedResult|exitAfterDefer)" + linters: + - gocritic + + # It's idiomatic to register Kubernetes types with a package scoped + # SchemeBuilder using an init function. + - path: apis/ + linters: + - gochecknoinits + - gochecknoglobals + + # These are performance optimisations rather than style issues per se. + # They warn when function arguments or range values copy a lot of memory + # rather than using a pointer. + - text: "(hugeParam|rangeValCopy):" + linters: + - gocritic + + # This "TestMain should call os.Exit to set exit code" warning is not clever + # enough to notice that we call a helper method that calls os.Exit. + - text: "SA3000:" + linters: + - staticcheck + + - text: "k8s.io/api/core/v1" + linters: + - goimports + + # This is a "potential hardcoded credentials" warning. It's triggered by + # any variable with 'secret' in the same, and thus hits a lot of false + # positives in Kubernetes land where a Secret is an object type. + - text: "G101:" + linters: + - gosec + - gas + + # This is an 'errors unhandled' warning that duplicates errcheck. + - text: "G104:" + linters: + - gosec + - gas + + # This is about implicit memory aliasing in a range loop. + # This is a false positive with Go v1.22 and above. + - text: "G601:" + linters: + - gosec + - gas + + # Some k8s dependencies do not have JSON tags on all fields in structs. + - path: k8s.io/ + linters: + - musttag + + # Various fields related to native patch and transform Composition are + # deprecated, but we can't drop support from Crossplane 1.x. We ignore the + # warnings globally instead of suppressing them with comments everywhere. + - text: "SA1019: .+ is deprecated: Use Composition Functions instead." + linters: + - staticcheck + + # Independently from option `exclude` we use default exclude patterns, + # it can be disabled by this option. To list all + # excluded by default patterns execute `golangci-lint run --help`. + # Default value for this option is true. + exclude-use-default: false + + # Show only new issues: if there are unstaged changes or untracked files, + # only those changes are analyzed, else only changes in HEAD~ are analyzed. + # It's a super-useful option for integration of golangci-lint into existing + # large codebase. It's not practical to fix all existing issues at the moment + # of integration: much better don't allow issues in new code. + # Default is false. + new: false + + # Maximum issues count per one linter. Set to 0 to disable. Default is 50. + max-issues-per-linter: 0 + + # Maximum count of issues with the same text. Set to 0 to disable. Default is 3. + max-same-issues: 0 diff --git a/filter.go b/filter.go index 3602100..c415b7c 100644 --- a/filter.go +++ b/filter.go @@ -4,975 +4,14 @@ import ( "github.com/crossplane/function-sdk-go/resource" ) +// ResourceFilter is a map indicating whether a resource supports tags. type ResourceFilter map[string]bool -// ManagedResourceFilter is a map of Managed Resources -// these values were generated by querying the AWS CRDs for `spec.forProvider.tags` support. -var ManagedResourceFilter = ResourceFilter{ - "accessanalyzer.aws.upbound.io/Analyzer": true, - "accessanalyzer.aws.upbound.io/ArchiveRule": false, - "account.aws.upbound.io/AlternateContact": false, - "account.aws.upbound.io/Region": false, - "acm.aws.upbound.io/Certificate": true, - "acm.aws.upbound.io/CertificateValidation": false, - "acmpca.aws.upbound.io/CertificateAuthority": true, - "acmpca.aws.upbound.io/CertificateAuthorityCertificate": false, - "acmpca.aws.upbound.io/Certificate": false, - "acmpca.aws.upbound.io/Permission": false, - "acmpca.aws.upbound.io/Policy": false, - "amp.aws.upbound.io/AlertManagerDefinition": false, - "amp.aws.upbound.io/RuleGroupNamespace": false, - "amp.aws.upbound.io/Workspace": true, - "amplify.aws.upbound.io/App": true, - "amplify.aws.upbound.io/BackendEnvironment": false, - "amplify.aws.upbound.io/Branch": true, - "amplify.aws.upbound.io/Webhook": false, - "apigateway.aws.upbound.io/Account": false, - "apigateway.aws.upbound.io/APIKey": true, - "apigateway.aws.upbound.io/Authorizer": false, - "apigateway.aws.upbound.io/BasePathMapping": false, - "apigateway.aws.upbound.io/ClientCertificate": true, - "apigateway.aws.upbound.io/Deployment": false, - "apigateway.aws.upbound.io/DocumentationPart": false, - "apigateway.aws.upbound.io/DocumentationVersion": false, - "apigateway.aws.upbound.io/DomainName": true, - "apigateway.aws.upbound.io/GatewayResponse": false, - "apigateway.aws.upbound.io/IntegrationResponse": false, - "apigateway.aws.upbound.io/Integration": false, - "apigateway.aws.upbound.io/MethodResponse": false, - "apigateway.aws.upbound.io/Method": false, - "apigateway.aws.upbound.io/MethodSettings": false, - "apigateway.aws.upbound.io/Model": false, - "apigateway.aws.upbound.io/RequestValidator": false, - "apigateway.aws.upbound.io/Resource": false, - "apigateway.aws.upbound.io/RestAPIPolicy": false, - "apigateway.aws.upbound.io/RestAPI": true, - "apigateway.aws.upbound.io/Stage": true, - "apigateway.aws.upbound.io/UsagePlanKey": false, - "apigateway.aws.upbound.io/UsagePlan": true, - "apigateway.aws.upbound.io/VPCLink": true, - "apigatewayv2.aws.upbound.io/APIMapping": false, - "apigatewayv2.aws.upbound.io/API": true, - "apigatewayv2.aws.upbound.io/Authorizer": false, - "apigatewayv2.aws.upbound.io/Deployment": false, - "apigatewayv2.aws.upbound.io/DomainName": true, - "apigatewayv2.aws.upbound.io/IntegrationResponse": false, - "apigatewayv2.aws.upbound.io/Integration": false, - "apigatewayv2.aws.upbound.io/Model": false, - "apigatewayv2.aws.upbound.io/RouteResponse": false, - "apigatewayv2.aws.upbound.io/Route": false, - "apigatewayv2.aws.upbound.io/Stage": true, - "apigatewayv2.aws.upbound.io/VPCLink": true, - "appautoscaling.aws.upbound.io/Policy": false, - "appautoscaling.aws.upbound.io/ScheduledAction": false, - "appautoscaling.aws.upbound.io/Target": true, - "appconfig.aws.upbound.io/Application": true, - "appconfig.aws.upbound.io/ConfigurationProfile": true, - "appconfig.aws.upbound.io/Deployment": true, - "appconfig.aws.upbound.io/DeploymentStrategy": true, - "appconfig.aws.upbound.io/Environment": true, - "appconfig.aws.upbound.io/ExtensionAssociation": false, - "appconfig.aws.upbound.io/Extension": true, - "appconfig.aws.upbound.io/HostedConfigurationVersion": false, - "appflow.aws.upbound.io/Flow": true, - "appintegrations.aws.upbound.io/EventIntegration": true, - "applicationinsights.aws.upbound.io/Application": true, - "appmesh.aws.upbound.io/GatewayRoute": true, - "appmesh.aws.upbound.io/Mesh": true, - "appmesh.aws.upbound.io/Route": true, - "appmesh.aws.upbound.io/VirtualGateway": true, - "appmesh.aws.upbound.io/VirtualNode": true, - "appmesh.aws.upbound.io/VirtualRouter": true, - "appmesh.aws.upbound.io/VirtualService": true, - "apprunner.aws.upbound.io/AutoScalingConfigurationVersion": true, - "apprunner.aws.upbound.io/Connection": true, - "apprunner.aws.upbound.io/ObservabilityConfiguration": true, - "apprunner.aws.upbound.io/Service": true, - "apprunner.aws.upbound.io/VPCConnector": true, - "appstream.aws.upbound.io/DirectoryConfig": false, - "appstream.aws.upbound.io/Fleet": true, - "appstream.aws.upbound.io/FleetStackAssociation": false, - "appstream.aws.upbound.io/ImageBuilder": true, - "appstream.aws.upbound.io/Stack": true, - "appstream.aws.upbound.io/User": false, - "appstream.aws.upbound.io/UserStackAssociation": false, - "appsync.aws.upbound.io/APICache": false, - "appsync.aws.upbound.io/APIKey": false, - "appsync.aws.upbound.io/Datasource": false, - "appsync.aws.upbound.io/Function": false, - "appsync.aws.upbound.io/GraphQLAPI": true, - "appsync.aws.upbound.io/Resolver": false, - "athena.aws.upbound.io/Database": false, - "athena.aws.upbound.io/DataCatalog": true, - "athena.aws.upbound.io/NamedQuery": false, - "athena.aws.upbound.io/Workgroup": true, - "autoscaling.aws.upbound.io/Attachment": false, - "autoscaling.aws.upbound.io/AutoscalingGroup": true, - "autoscaling.aws.upbound.io/GroupTag": false, - "autoscaling.aws.upbound.io/LaunchConfiguration": false, - "autoscaling.aws.upbound.io/LifecycleHook": false, - "autoscaling.aws.upbound.io/Notification": false, - "autoscaling.aws.upbound.io/Policy": false, - "autoscaling.aws.upbound.io/Schedule": false, - "autoscalingplans.aws.upbound.io/ScalingPlan": false, - "aws.upbound.io/ProviderConfig": false, - "aws.upbound.io/ProviderConfigUsage": false, - "aws.upbound.io/StoreConfig": false, - "backup.aws.upbound.io/Framework": true, - "backup.aws.upbound.io/GlobalSettings": false, - "backup.aws.upbound.io/Plan": true, - "backup.aws.upbound.io/RegionSettings": false, - "backup.aws.upbound.io/ReportPlan": true, - "backup.aws.upbound.io/Selection": false, - "backup.aws.upbound.io/VaultLockConfiguration": false, - "backup.aws.upbound.io/VaultNotifications": false, - "backup.aws.upbound.io/VaultPolicy": false, - "backup.aws.upbound.io/Vault": true, - "batch.aws.upbound.io/JobDefinition": true, - "batch.aws.upbound.io/SchedulingPolicy": true, - "budgets.aws.upbound.io/BudgetAction": true, - "budgets.aws.upbound.io/Budget": true, - "ce.aws.upbound.io/AnomalyMonitor": true, - "chime.aws.upbound.io/VoiceConnectorGroup": false, - "chime.aws.upbound.io/VoiceConnectorLogging": false, - "chime.aws.upbound.io/VoiceConnectorOrigination": false, - "chime.aws.upbound.io/VoiceConnector": true, - "chime.aws.upbound.io/VoiceConnectorStreaming": false, - "chime.aws.upbound.io/VoiceConnectorTerminationCredentials": false, - "chime.aws.upbound.io/VoiceConnectorTermination": false, - "cloud9.aws.upbound.io/EnvironmentEC2": true, - "cloud9.aws.upbound.io/EnvironmentMembership": false, - "cloudcontrol.aws.upbound.io/Resource": false, - "cloudformation.aws.upbound.io/Stack": true, - "cloudformation.aws.upbound.io/StackSetInstance": false, - "cloudformation.aws.upbound.io/StackSet": true, - "cloudfront.aws.upbound.io/CachePolicy": false, - "cloudfront.aws.upbound.io/Distribution": true, - "cloudfront.aws.upbound.io/FieldLevelEncryptionConfig": false, - "cloudfront.aws.upbound.io/FieldLevelEncryptionProfile": false, - "cloudfront.aws.upbound.io/Function": false, - "cloudfront.aws.upbound.io/KeyGroup": false, - "cloudfront.aws.upbound.io/MonitoringSubscription": false, - "cloudfront.aws.upbound.io/OriginAccessControl": false, - "cloudfront.aws.upbound.io/OriginAccessIdentity": false, - "cloudfront.aws.upbound.io/OriginRequestPolicy": false, - "cloudfront.aws.upbound.io/PublicKey": false, - "cloudfront.aws.upbound.io/RealtimeLogConfig": false, - "cloudfront.aws.upbound.io/ResponseHeadersPolicy": false, - "cloudsearch.aws.upbound.io/Domain": false, - "cloudsearch.aws.upbound.io/DomainServiceAccessPolicy": false, - "cloudtrail.aws.upbound.io/EventDataStore": true, - "cloudtrail.aws.upbound.io/Trail": true, - "cloudwatch.aws.upbound.io/CompositeAlarm": true, - "cloudwatch.aws.upbound.io/Dashboard": false, - "cloudwatch.aws.upbound.io/MetricAlarm": true, - "cloudwatch.aws.upbound.io/MetricStream": true, - "cloudwatchevents.aws.upbound.io/APIDestination": false, - "cloudwatchevents.aws.upbound.io/Archive": false, - "cloudwatchevents.aws.upbound.io/Bus": true, - "cloudwatchevents.aws.upbound.io/BusPolicy": false, - "cloudwatchevents.aws.upbound.io/Connection": false, - "cloudwatchevents.aws.upbound.io/Permission": false, - "cloudwatchevents.aws.upbound.io/Rule": true, - "cloudwatchevents.aws.upbound.io/Target": false, - "cloudwatchlogs.aws.upbound.io/Definition": false, - "cloudwatchlogs.aws.upbound.io/DestinationPolicy": false, - "cloudwatchlogs.aws.upbound.io/Destination": true, - "cloudwatchlogs.aws.upbound.io/Group": true, - "cloudwatchlogs.aws.upbound.io/MetricFilter": false, - "cloudwatchlogs.aws.upbound.io/ResourcePolicy": false, - "cloudwatchlogs.aws.upbound.io/Stream": false, - "cloudwatchlogs.aws.upbound.io/SubscriptionFilter": false, - "codeartifact.aws.upbound.io/DomainPermissionsPolicy": false, - "codeartifact.aws.upbound.io/Domain": true, - "codeartifact.aws.upbound.io/Repository": true, - "codeartifact.aws.upbound.io/RepositoryPermissionsPolicy": false, - "codecommit.aws.upbound.io/ApprovalRuleTemplateAssociation": false, - "codecommit.aws.upbound.io/ApprovalRuleTemplate": false, - "codecommit.aws.upbound.io/Repository": true, - "codecommit.aws.upbound.io/Trigger": false, - "codeguruprofiler.aws.upbound.io/ProfilingGroup": true, - "codepipeline.aws.upbound.io/Codepipeline": true, - "codepipeline.aws.upbound.io/CustomActionType": true, - "codepipeline.aws.upbound.io/Webhook": true, - "codestarconnections.aws.upbound.io/Connection": true, - "codestarconnections.aws.upbound.io/Host": false, - "codestarnotifications.aws.upbound.io/NotificationRule": true, - "cognitoidentity.aws.upbound.io/CognitoIdentityPoolProviderPrincipalTag": false, - "cognitoidentity.aws.upbound.io/PoolRolesAttachment": false, - "cognitoidentity.aws.upbound.io/Pool": true, - "cognitoidp.aws.upbound.io/IdentityProvider": false, - "cognitoidp.aws.upbound.io/ResourceServer": false, - "cognitoidp.aws.upbound.io/RiskConfiguration": false, - "cognitoidp.aws.upbound.io/UserGroup": false, - "cognitoidp.aws.upbound.io/UserInGroup": false, - "cognitoidp.aws.upbound.io/UserPoolClient": false, - "cognitoidp.aws.upbound.io/UserPoolDomain": false, - "cognitoidp.aws.upbound.io/UserPool": true, - "cognitoidp.aws.upbound.io/UserPoolUICustomization": false, - "cognitoidp.aws.upbound.io/User": false, - "configservice.aws.upbound.io/AWSConfigurationRecorderStatus": false, - "configservice.aws.upbound.io/ConfigRule": true, - "configservice.aws.upbound.io/ConfigurationAggregator": true, - "configservice.aws.upbound.io/ConfigurationRecorder": false, - "configservice.aws.upbound.io/ConformancePack": false, - "configservice.aws.upbound.io/DeliveryChannel": false, - "configservice.aws.upbound.io/RemediationConfiguration": false, - "connect.aws.upbound.io/BotAssociation": false, - "connect.aws.upbound.io/ContactFlowModule": true, - "connect.aws.upbound.io/ContactFlow": true, - "connect.aws.upbound.io/HoursOfOperation": true, - "connect.aws.upbound.io/Instance": false, - "connect.aws.upbound.io/InstanceStorageConfig": false, - "connect.aws.upbound.io/LambdaFunctionAssociation": false, - "connect.aws.upbound.io/PhoneNumber": true, - "connect.aws.upbound.io/Queue": true, - "connect.aws.upbound.io/QuickConnect": true, - "connect.aws.upbound.io/RoutingProfile": true, - "connect.aws.upbound.io/SecurityProfile": true, - "connect.aws.upbound.io/UserHierarchyStructure": false, - "connect.aws.upbound.io/User": true, - "connect.aws.upbound.io/Vocabulary": true, - "cur.aws.upbound.io/ReportDefinition": false, - "dataexchange.aws.upbound.io/DataSet": true, - "dataexchange.aws.upbound.io/Revision": true, - "datapipeline.aws.upbound.io/Pipeline": true, - "datasync.aws.upbound.io/LocationS3": true, - "datasync.aws.upbound.io/Task": true, - "dax.aws.upbound.io/Cluster": true, - "dax.aws.upbound.io/ParameterGroup": false, - "dax.aws.upbound.io/SubnetGroup": false, - "deploy.aws.upbound.io/App": true, - "deploy.aws.upbound.io/DeploymentConfig": false, - "deploy.aws.upbound.io/DeploymentGroup": true, - "detective.aws.upbound.io/Graph": true, - "detective.aws.upbound.io/InvitationAccepter": false, - "detective.aws.upbound.io/Member": false, - "devicefarm.aws.upbound.io/DevicePool": true, - "devicefarm.aws.upbound.io/InstanceProfile": true, - "devicefarm.aws.upbound.io/NetworkProfile": true, - "devicefarm.aws.upbound.io/Project": true, - "devicefarm.aws.upbound.io/TestGridProject": true, - "devicefarm.aws.upbound.io/Upload": false, - "directconnect.aws.upbound.io/BGPPeer": false, - "directconnect.aws.upbound.io/ConnectionAssociation": false, - "directconnect.aws.upbound.io/Connection": true, - "directconnect.aws.upbound.io/GatewayAssociationProposal": false, - "directconnect.aws.upbound.io/GatewayAssociation": false, - "directconnect.aws.upbound.io/Gateway": false, - "directconnect.aws.upbound.io/HostedPrivateVirtualInterfaceAccepter": true, - "directconnect.aws.upbound.io/HostedPrivateVirtualInterface": false, - "directconnect.aws.upbound.io/HostedPublicVirtualInterfaceAccepter": true, - "directconnect.aws.upbound.io/HostedPublicVirtualInterface": false, - "directconnect.aws.upbound.io/HostedTransitVirtualInterfaceAccepter": true, - "directconnect.aws.upbound.io/HostedTransitVirtualInterface": false, - "directconnect.aws.upbound.io/Lag": true, - "directconnect.aws.upbound.io/PrivateVirtualInterface": true, - "directconnect.aws.upbound.io/PublicVirtualInterface": true, - "directconnect.aws.upbound.io/TransitVirtualInterface": true, - "dlm.aws.upbound.io/LifecyclePolicy": true, - "dms.aws.upbound.io/Certificate": true, - "dms.aws.upbound.io/Endpoint": true, - "dms.aws.upbound.io/EventSubscription": true, - "dms.aws.upbound.io/ReplicationInstance": true, - "dms.aws.upbound.io/ReplicationSubnetGroup": true, - "dms.aws.upbound.io/ReplicationTask": true, - "dms.aws.upbound.io/S3Endpoint": true, - "docdb.aws.upbound.io/ClusterInstance": true, - "docdb.aws.upbound.io/ClusterParameterGroup": true, - "docdb.aws.upbound.io/Cluster": true, - "docdb.aws.upbound.io/ClusterSnapshot": false, - "docdb.aws.upbound.io/EventSubscription": true, - "docdb.aws.upbound.io/GlobalCluster": false, - "docdb.aws.upbound.io/SubnetGroup": true, - "ds.aws.upbound.io/ConditionalForwarder": false, - "ds.aws.upbound.io/Directory": true, - "ds.aws.upbound.io/SharedDirectory": false, - "dynamodb.aws.upbound.io/ContributorInsights": false, - "dynamodb.aws.upbound.io/GlobalTable": false, - "dynamodb.aws.upbound.io/KinesisStreamingDestination": false, - "dynamodb.aws.upbound.io/ResourcePolicy": false, - "dynamodb.aws.upbound.io/TableItem": false, - "dynamodb.aws.upbound.io/TableReplica": true, - "dynamodb.aws.upbound.io/Table": true, - "dynamodb.aws.upbound.io/Tag": false, - "ec2.aws.upbound.io/AMICopy": true, - "ec2.aws.upbound.io/AMILaunchPermission": false, - "ec2.aws.upbound.io/AMI": true, - "ec2.aws.upbound.io/AvailabilityZoneGroup": false, - "ec2.aws.upbound.io/CapacityReservation": true, - "ec2.aws.upbound.io/CarrierGateway": true, - "ec2.aws.upbound.io/CustomerGateway": true, - "ec2.aws.upbound.io/DefaultNetworkACL": true, - "ec2.aws.upbound.io/DefaultRouteTable": true, - "ec2.aws.upbound.io/DefaultSecurityGroup": true, - "ec2.aws.upbound.io/DefaultSubnet": true, - "ec2.aws.upbound.io/DefaultVPCDHCPOptions": true, - "ec2.aws.upbound.io/DefaultVPC": true, - "ec2.aws.upbound.io/EBSDefaultKMSKey": false, - "ec2.aws.upbound.io/EBSEncryptionByDefault": false, - "ec2.aws.upbound.io/EBSSnapshotCopy": true, - "ec2.aws.upbound.io/EBSSnapshotImport": true, - "ec2.aws.upbound.io/EBSSnapshot": true, - "ec2.aws.upbound.io/EBSVolume": true, - "ec2.aws.upbound.io/EgressOnlyInternetGateway": true, - "ec2.aws.upbound.io/EIPAssociation": false, - "ec2.aws.upbound.io/EIP": true, - "ec2.aws.upbound.io/Fleet": true, - "ec2.aws.upbound.io/FlowLog": true, - "ec2.aws.upbound.io/Host": true, - "ec2.aws.upbound.io/Instance": true, - "ec2.aws.upbound.io/InstanceState": false, - "ec2.aws.upbound.io/InternetGateway": true, - "ec2.aws.upbound.io/KeyPair": true, - "ec2.aws.upbound.io/LaunchTemplate": true, - "ec2.aws.upbound.io/MainRouteTableAssociation": false, - "ec2.aws.upbound.io/ManagedPrefixListEntry": false, - "ec2.aws.upbound.io/ManagedPrefixList": true, - "ec2.aws.upbound.io/NATGateway": true, - "ec2.aws.upbound.io/NetworkACLRule": false, - "ec2.aws.upbound.io/NetworkACL": true, - "ec2.aws.upbound.io/NetworkInsightsAnalysis": true, - "ec2.aws.upbound.io/NetworkInsightsPath": true, - "ec2.aws.upbound.io/NetworkInterfaceAttachment": false, - "ec2.aws.upbound.io/NetworkInterface": true, - "ec2.aws.upbound.io/NetworkInterfaceSgAttachment": false, - "ec2.aws.upbound.io/PlacementGroup": true, - "ec2.aws.upbound.io/Route": false, - "ec2.aws.upbound.io/RouteTableAssociation": false, - "ec2.aws.upbound.io/RouteTable": true, - "ec2.aws.upbound.io/SecurityGroupEgressRule": true, - "ec2.aws.upbound.io/SecurityGroupIngressRule": true, - "ec2.aws.upbound.io/SecurityGroupRule": false, - "ec2.aws.upbound.io/SecurityGroup": true, - "ec2.aws.upbound.io/SerialConsoleAccess": false, - "ec2.aws.upbound.io/SnapshotCreateVolumePermission": false, - "ec2.aws.upbound.io/SpotDatafeedSubscription": false, - "ec2.aws.upbound.io/SpotFleetRequest": true, - "ec2.aws.upbound.io/SpotInstanceRequest": true, - "ec2.aws.upbound.io/SubnetCidrReservation": false, - "ec2.aws.upbound.io/Subnet": true, - "ec2.aws.upbound.io/Tag": false, - "ec2.aws.upbound.io/TrafficMirrorFilterRule": false, - "ec2.aws.upbound.io/TrafficMirrorFilter": true, - "ec2.aws.upbound.io/TransitGatewayConnectPeer": true, - "ec2.aws.upbound.io/TransitGatewayConnect": true, - "ec2.aws.upbound.io/TransitGatewayMulticastDomainAssociation": false, - "ec2.aws.upbound.io/TransitGatewayMulticastDomain": true, - "ec2.aws.upbound.io/TransitGatewayMulticastGroupMember": false, - "ec2.aws.upbound.io/TransitGatewayMulticastGroupSource": false, - "ec2.aws.upbound.io/TransitGatewayPeeringAttachmentAccepter": true, - "ec2.aws.upbound.io/TransitGatewayPeeringAttachment": true, - "ec2.aws.upbound.io/TransitGatewayPolicyTable": true, - "ec2.aws.upbound.io/TransitGatewayPrefixListReference": false, - "ec2.aws.upbound.io/TransitGatewayRoute": false, - "ec2.aws.upbound.io/TransitGatewayRouteTableAssociation": false, - "ec2.aws.upbound.io/TransitGatewayRouteTablePropagation": false, - "ec2.aws.upbound.io/TransitGatewayRouteTable": true, - "ec2.aws.upbound.io/TransitGateway": true, - "ec2.aws.upbound.io/TransitGatewayVPCAttachmentAccepter": true, - "ec2.aws.upbound.io/TransitGatewayVPCAttachment": true, - "ec2.aws.upbound.io/VolumeAttachment": false, - "ec2.aws.upbound.io/VPCDHCPOptions": true, - "ec2.aws.upbound.io/VPCDHCPOptionsAssociation": false, - "ec2.aws.upbound.io/VPCEndpointConnectionNotification": false, - "ec2.aws.upbound.io/VPCEndpointRouteTableAssociation": false, - "ec2.aws.upbound.io/VPCEndpoint": true, - "ec2.aws.upbound.io/VPCEndpointSecurityGroupAssociation": false, - "ec2.aws.upbound.io/VPCEndpointServiceAllowedPrincipal": false, - "ec2.aws.upbound.io/VPCEndpointService": true, - "ec2.aws.upbound.io/VPCEndpointSubnetAssociation": false, - "ec2.aws.upbound.io/VPCIpamPoolCidrAllocation": false, - "ec2.aws.upbound.io/VPCIpamPoolCidr": false, - "ec2.aws.upbound.io/VPCIpamPool": true, - "ec2.aws.upbound.io/VPCIpam": true, - "ec2.aws.upbound.io/VPCIpamScope": true, - "ec2.aws.upbound.io/VPCIPv4CidrBlockAssociation": false, - "ec2.aws.upbound.io/VPCPeeringConnectionAccepter": true, - "ec2.aws.upbound.io/VPCPeeringConnectionOptions": false, - "ec2.aws.upbound.io/VPCPeeringConnection": true, - "ec2.aws.upbound.io/VPC": true, - "ec2.aws.upbound.io/VPNConnectionRoute": false, - "ec2.aws.upbound.io/VPNConnection": true, - "ec2.aws.upbound.io/VPNGatewayAttachment": false, - "ec2.aws.upbound.io/VPNGatewayRoutePropagation": false, - "ec2.aws.upbound.io/VPNGateway": true, - "ecr.aws.upbound.io/LifecyclePolicy": false, - "ecr.aws.upbound.io/PullThroughCacheRule": false, - "ecr.aws.upbound.io/RegistryPolicy": false, - "ecr.aws.upbound.io/RegistryScanningConfiguration": false, - "ecr.aws.upbound.io/ReplicationConfiguration": false, - "ecr.aws.upbound.io/Repository": true, - "ecr.aws.upbound.io/RepositoryPolicy": false, - "ecrpublic.aws.upbound.io/Repository": true, - "ecrpublic.aws.upbound.io/RepositoryPolicy": false, - "ecs.aws.upbound.io/AccountSettingDefault": false, - "ecs.aws.upbound.io/CapacityProvider": true, - "ecs.aws.upbound.io/ClusterCapacityProviders": false, - "ecs.aws.upbound.io/Cluster": true, - "ecs.aws.upbound.io/Service": true, - "ecs.aws.upbound.io/TaskDefinition": true, - "efs.aws.upbound.io/AccessPoint": true, - "efs.aws.upbound.io/BackupPolicy": false, - "efs.aws.upbound.io/FileSystemPolicy": false, - "efs.aws.upbound.io/FileSystem": true, - "efs.aws.upbound.io/MountTarget": false, - "efs.aws.upbound.io/ReplicationConfiguration": false, - "eks.aws.upbound.io/AccessEntry": true, - "eks.aws.upbound.io/AccessPolicyAssociation": false, - "eks.aws.upbound.io/Addon": true, - "eks.aws.upbound.io/ClusterAuth": false, - "eks.aws.upbound.io/Cluster": true, - "eks.aws.upbound.io/FargateProfile": true, - "eks.aws.upbound.io/IdentityProviderConfig": true, - "eks.aws.upbound.io/NodeGroup": true, - "eks.aws.upbound.io/PodIdentityAssociation": true, - "elasticache.aws.upbound.io/Cluster": true, - "elasticache.aws.upbound.io/GlobalReplicationGroup": false, - "elasticache.aws.upbound.io/ParameterGroup": true, - "elasticache.aws.upbound.io/ReplicationGroup": true, - "elasticache.aws.upbound.io/ServerlessCache": true, - "elasticache.aws.upbound.io/SubnetGroup": true, - "elasticache.aws.upbound.io/UserGroup": true, - "elasticache.aws.upbound.io/User": true, - "elasticbeanstalk.aws.upbound.io/Application": true, - "elasticbeanstalk.aws.upbound.io/ApplicationVersion": true, - "elasticbeanstalk.aws.upbound.io/ConfigurationTemplate": false, - "elasticsearch.aws.upbound.io/DomainPolicy": false, - "elasticsearch.aws.upbound.io/Domain": true, - "elasticsearch.aws.upbound.io/DomainSAMLOptions": false, - "elastictranscoder.aws.upbound.io/Pipeline": false, - "elastictranscoder.aws.upbound.io/Preset": false, - "elb.aws.upbound.io/AppCookieStickinessPolicy": false, - "elb.aws.upbound.io/Attachment": false, - "elb.aws.upbound.io/BackendServerPolicy": false, - "elb.aws.upbound.io/ELB": true, - "elb.aws.upbound.io/LBCookieStickinessPolicy": false, - "elb.aws.upbound.io/LBSSLNegotiationPolicy": false, - "elb.aws.upbound.io/ListenerPolicy": false, - "elb.aws.upbound.io/Policy": false, - "elb.aws.upbound.io/ProxyProtocolPolicy": false, - "elbv2.aws.upbound.io/LBListenerCertificate": false, - "elbv2.aws.upbound.io/LBListenerRule": true, - "elbv2.aws.upbound.io/LBListener": true, - "elbv2.aws.upbound.io/LB": true, - "elbv2.aws.upbound.io/LBTargetGroupAttachment": false, - "elbv2.aws.upbound.io/LBTargetGroup": true, - "elbv2.aws.upbound.io/LBTrustStore": true, - "emr.aws.upbound.io/SecurityConfiguration": false, - "emrserverless.aws.upbound.io/Application": true, - "evidently.aws.upbound.io/Feature": true, - "evidently.aws.upbound.io/Project": true, - "evidently.aws.upbound.io/Segment": true, - "firehose.aws.upbound.io/DeliveryStream": true, - "fis.aws.upbound.io/ExperimentTemplate": true, - "fsx.aws.upbound.io/Backup": true, - "fsx.aws.upbound.io/DataRepositoryAssociation": true, - "fsx.aws.upbound.io/LustreFileSystem": true, - "fsx.aws.upbound.io/OntapFileSystem": true, - "fsx.aws.upbound.io/OntapStorageVirtualMachine": true, - "fsx.aws.upbound.io/WindowsFileSystem": true, - "gamelift.aws.upbound.io/Alias": true, - "gamelift.aws.upbound.io/Build": true, - "gamelift.aws.upbound.io/Fleet": true, - "gamelift.aws.upbound.io/GameSessionQueue": true, - "gamelift.aws.upbound.io/Script": true, - "glacier.aws.upbound.io/VaultLock": false, - "glacier.aws.upbound.io/Vault": true, - "globalaccelerator.aws.upbound.io/Accelerator": true, - "globalaccelerator.aws.upbound.io/EndpointGroup": false, - "globalaccelerator.aws.upbound.io/Listener": false, - "glue.aws.upbound.io/CatalogDatabase": true, - "glue.aws.upbound.io/CatalogTable": false, - "glue.aws.upbound.io/Classifier": false, - "glue.aws.upbound.io/Connection": true, - "glue.aws.upbound.io/Crawler": true, - "glue.aws.upbound.io/DataCatalogEncryptionSettings": false, - "glue.aws.upbound.io/Job": true, - "glue.aws.upbound.io/Registry": true, - "glue.aws.upbound.io/ResourcePolicy": false, - "glue.aws.upbound.io/Schema": true, - "glue.aws.upbound.io/SecurityConfiguration": false, - "glue.aws.upbound.io/Trigger": true, - "glue.aws.upbound.io/UserDefinedFunction": false, - "glue.aws.upbound.io/Workflow": true, - "grafana.aws.upbound.io/LicenseAssociation": false, - "grafana.aws.upbound.io/RoleAssociation": false, - "grafana.aws.upbound.io/WorkspaceAPIKey": false, - "grafana.aws.upbound.io/Workspace": true, - "grafana.aws.upbound.io/WorkspaceSAMLConfiguration": false, - "guardduty.aws.upbound.io/Detector": true, - "guardduty.aws.upbound.io/Filter": true, - "guardduty.aws.upbound.io/Member": false, - "iam.aws.upbound.io/AccessKey": false, - "iam.aws.upbound.io/AccountAlias": false, - "iam.aws.upbound.io/AccountPasswordPolicy": false, - "iam.aws.upbound.io/GroupMembership": false, - "iam.aws.upbound.io/GroupPolicyAttachment": false, - "iam.aws.upbound.io/Group": false, - "iam.aws.upbound.io/InstanceProfile": true, - "iam.aws.upbound.io/OpenIDConnectProvider": true, - "iam.aws.upbound.io/Policy": true, - "iam.aws.upbound.io/RolePolicy": false, - "iam.aws.upbound.io/RolePolicyAttachment": false, - "iam.aws.upbound.io/Role": true, - "iam.aws.upbound.io/SAMLProvider": true, - "iam.aws.upbound.io/ServerCertificate": true, - "iam.aws.upbound.io/ServiceLinkedRole": true, - "iam.aws.upbound.io/ServiceSpecificCredential": false, - "iam.aws.upbound.io/SigningCertificate": false, - "iam.aws.upbound.io/UserGroupMembership": false, - "iam.aws.upbound.io/UserLoginProfile": false, - "iam.aws.upbound.io/UserPolicyAttachment": false, - "iam.aws.upbound.io/User": true, - "iam.aws.upbound.io/UserSSHKey": false, - "iam.aws.upbound.io/VirtualMfaDevice": true, - "identitystore.aws.upbound.io/GroupMembership": false, - "identitystore.aws.upbound.io/Group": false, - "identitystore.aws.upbound.io/User": false, - "imagebuilder.aws.upbound.io/Component": true, - "imagebuilder.aws.upbound.io/ContainerRecipe": true, - "imagebuilder.aws.upbound.io/DistributionConfiguration": true, - "imagebuilder.aws.upbound.io/ImagePipeline": true, - "imagebuilder.aws.upbound.io/ImageRecipe": true, - "imagebuilder.aws.upbound.io/Image": true, - "imagebuilder.aws.upbound.io/InfrastructureConfiguration": true, - "inspector.aws.upbound.io/AssessmentTarget": false, - "inspector.aws.upbound.io/AssessmentTemplate": true, - "inspector.aws.upbound.io/ResourceGroup": true, - "inspector2.aws.upbound.io/Enabler": false, - "iot.aws.upbound.io/Certificate": false, - "iot.aws.upbound.io/IndexingConfiguration": false, - "iot.aws.upbound.io/LoggingOptions": false, - "iot.aws.upbound.io/Policy": true, - "iot.aws.upbound.io/PolicyAttachment": false, - "iot.aws.upbound.io/ProvisioningTemplate": true, - "iot.aws.upbound.io/RoleAlias": true, - "iot.aws.upbound.io/ThingGroupMembership": false, - "iot.aws.upbound.io/ThingGroup": true, - "iot.aws.upbound.io/ThingPrincipalAttachment": false, - "iot.aws.upbound.io/Thing": false, - "iot.aws.upbound.io/ThingType": true, - "iot.aws.upbound.io/TopicRuleDestination": false, - "iot.aws.upbound.io/TopicRule": true, - "ivs.aws.upbound.io/Channel": true, - "ivs.aws.upbound.io/RecordingConfiguration": true, - "kafka.aws.upbound.io/Cluster": true, - "kafka.aws.upbound.io/Configuration": false, - "kafka.aws.upbound.io/ScramSecretAssociation": false, - "kafka.aws.upbound.io/ServerlessCluster": true, - "kafkaconnect.aws.upbound.io/Connector": true, - "kafkaconnect.aws.upbound.io/CustomPlugin": true, - "kafkaconnect.aws.upbound.io/WorkerConfiguration": true, - "kendra.aws.upbound.io/DataSource": true, - "kendra.aws.upbound.io/Experience": false, - "kendra.aws.upbound.io/Index": true, - "kendra.aws.upbound.io/QuerySuggestionsBlockList": true, - "kendra.aws.upbound.io/Thesaurus": true, - "keyspaces.aws.upbound.io/Keyspace": true, - "keyspaces.aws.upbound.io/Table": true, - "kinesis.aws.upbound.io/StreamConsumer": false, - "kinesis.aws.upbound.io/Stream": true, - "kinesisanalytics.aws.upbound.io/Application": true, - "kinesisanalyticsv2.aws.upbound.io/Application": true, - "kinesisanalyticsv2.aws.upbound.io/ApplicationSnapshot": false, - "kinesisvideo.aws.upbound.io/Stream": true, - "kms.aws.upbound.io/Alias": false, - "kms.aws.upbound.io/Ciphertext": false, - "kms.aws.upbound.io/ExternalKey": true, - "kms.aws.upbound.io/Grant": false, - "kms.aws.upbound.io/Key": true, - "kms.aws.upbound.io/ReplicaExternalKey": true, - "kms.aws.upbound.io/ReplicaKey": true, - "lakeformation.aws.upbound.io/DataLakeSettings": false, - "lakeformation.aws.upbound.io/Permissions": false, - "lakeformation.aws.upbound.io/Resource": false, - "lambda.aws.upbound.io/Alias": false, - "lambda.aws.upbound.io/CodeSigningConfig": false, - "lambda.aws.upbound.io/EventSourceMapping": false, - "lambda.aws.upbound.io/FunctionEventInvokeConfig": false, - "lambda.aws.upbound.io/Function": true, - "lambda.aws.upbound.io/FunctionURL": false, - "lambda.aws.upbound.io/Invocation": false, - "lambda.aws.upbound.io/LayerVersionPermission": false, - "lambda.aws.upbound.io/LayerVersion": false, - "lambda.aws.upbound.io/Permission": false, - "lambda.aws.upbound.io/ProvisionedConcurrencyConfig": false, - "lexmodels.aws.upbound.io/BotAlias": false, - "lexmodels.aws.upbound.io/Bot": false, - "lexmodels.aws.upbound.io/Intent": false, - "lexmodels.aws.upbound.io/SlotType": false, - "licensemanager.aws.upbound.io/Association": false, - "licensemanager.aws.upbound.io/LicenseConfiguration": true, - "lightsail.aws.upbound.io/Bucket": true, - "lightsail.aws.upbound.io/Certificate": true, - "lightsail.aws.upbound.io/ContainerService": true, - "lightsail.aws.upbound.io/DiskAttachment": false, - "lightsail.aws.upbound.io/Disk": true, - "lightsail.aws.upbound.io/DomainEntry": false, - "lightsail.aws.upbound.io/Domain": false, - "lightsail.aws.upbound.io/InstancePublicPorts": false, - "lightsail.aws.upbound.io/Instance": true, - "lightsail.aws.upbound.io/KeyPair": true, - "lightsail.aws.upbound.io/LBAttachment": false, - "lightsail.aws.upbound.io/LBCertificate": false, - "lightsail.aws.upbound.io/LB": true, - "lightsail.aws.upbound.io/LBStickinessPolicy": false, - "lightsail.aws.upbound.io/StaticIPAttachment": false, - "lightsail.aws.upbound.io/StaticIP": false, - "location.aws.upbound.io/GeofenceCollection": true, - "location.aws.upbound.io/PlaceIndex": true, - "location.aws.upbound.io/RouteCalculator": true, - "location.aws.upbound.io/TrackerAssociation": false, - "location.aws.upbound.io/Tracker": true, - "macie2.aws.upbound.io/Account": false, - "macie2.aws.upbound.io/ClassificationJob": true, - "macie2.aws.upbound.io/CustomDataIdentifier": true, - "macie2.aws.upbound.io/FindingsFilter": true, - "macie2.aws.upbound.io/InvitationAccepter": false, - "macie2.aws.upbound.io/Member": true, - "mediaconvert.aws.upbound.io/Queue": true, - "medialive.aws.upbound.io/Channel": true, - "medialive.aws.upbound.io/Input": true, - "medialive.aws.upbound.io/InputSecurityGroup": true, - "medialive.aws.upbound.io/Multiplex": true, - "mediapackage.aws.upbound.io/Channel": true, - "mediastore.aws.upbound.io/ContainerPolicy": false, - "mediastore.aws.upbound.io/Container": true, - "memorydb.aws.upbound.io/ACL": true, - "memorydb.aws.upbound.io/Cluster": true, - "memorydb.aws.upbound.io/ParameterGroup": true, - "memorydb.aws.upbound.io/Snapshot": true, - "memorydb.aws.upbound.io/SubnetGroup": true, - "memorydb.aws.upbound.io/User": true, - "mq.aws.upbound.io/Broker": true, - "mq.aws.upbound.io/Configuration": true, - "mq.aws.upbound.io/User": false, - "mwaa.aws.upbound.io/Environment": true, - "neptune.aws.upbound.io/ClusterEndpoint": true, - "neptune.aws.upbound.io/ClusterInstance": true, - "neptune.aws.upbound.io/ClusterParameterGroup": true, - "neptune.aws.upbound.io/Cluster": true, - "neptune.aws.upbound.io/ClusterSnapshot": false, - "neptune.aws.upbound.io/EventSubscription": true, - "neptune.aws.upbound.io/GlobalCluster": false, - "neptune.aws.upbound.io/ParameterGroup": true, - "neptune.aws.upbound.io/SubnetGroup": true, - "networkfirewall.aws.upbound.io/FirewallPolicy": true, - "networkfirewall.aws.upbound.io/Firewall": true, - "networkfirewall.aws.upbound.io/LoggingConfiguration": false, - "networkfirewall.aws.upbound.io/RuleGroup": true, - "networkmanager.aws.upbound.io/AttachmentAccepter": false, - "networkmanager.aws.upbound.io/ConnectAttachment": true, - "networkmanager.aws.upbound.io/Connection": true, - "networkmanager.aws.upbound.io/CoreNetwork": true, - "networkmanager.aws.upbound.io/CustomerGatewayAssociation": false, - "networkmanager.aws.upbound.io/Device": true, - "networkmanager.aws.upbound.io/GlobalNetwork": true, - "networkmanager.aws.upbound.io/LinkAssociation": false, - "networkmanager.aws.upbound.io/Link": true, - "networkmanager.aws.upbound.io/Site": true, - "networkmanager.aws.upbound.io/TransitGatewayConnectPeerAssociation": false, - "networkmanager.aws.upbound.io/TransitGatewayRegistration": false, - "networkmanager.aws.upbound.io/VPCAttachment": true, - "opensearch.aws.upbound.io/DomainPolicy": false, - "opensearch.aws.upbound.io/Domain": true, - "opensearch.aws.upbound.io/DomainSAMLOptions": false, - "opensearchserverless.aws.upbound.io/AccessPolicy": false, - "opensearchserverless.aws.upbound.io/Collection": true, - "opensearchserverless.aws.upbound.io/LifecyclePolicy": false, - "opensearchserverless.aws.upbound.io/SecurityConfig": false, - "opensearchserverless.aws.upbound.io/SecurityPolicy": false, - "opensearchserverless.aws.upbound.io/VPCEndpoint": false, - "opsworks.aws.upbound.io/Application": false, - "opsworks.aws.upbound.io/CustomLayer": true, - "opsworks.aws.upbound.io/EcsClusterLayer": true, - "opsworks.aws.upbound.io/GangliaLayer": true, - "opsworks.aws.upbound.io/HAProxyLayer": true, - "opsworks.aws.upbound.io/Instance": false, - "opsworks.aws.upbound.io/JavaAppLayer": true, - "opsworks.aws.upbound.io/MemcachedLayer": true, - "opsworks.aws.upbound.io/MySQLLayer": true, - "opsworks.aws.upbound.io/NodeJSAppLayer": true, - "opsworks.aws.upbound.io/Permission": false, - "opsworks.aws.upbound.io/PHPAppLayer": true, - "opsworks.aws.upbound.io/RailsAppLayer": true, - "opsworks.aws.upbound.io/RDSDBInstance": false, - "opsworks.aws.upbound.io/Stack": true, - "opsworks.aws.upbound.io/StaticWebLayer": true, - "opsworks.aws.upbound.io/UserProfile": false, - "organizations.aws.upbound.io/Account": true, - "organizations.aws.upbound.io/DelegatedAdministrator": false, - "organizations.aws.upbound.io/OrganizationalUnit": true, - "organizations.aws.upbound.io/Organization": false, - "organizations.aws.upbound.io/Policy": true, - "organizations.aws.upbound.io/PolicyAttachment": false, - "pinpoint.aws.upbound.io/App": true, - "pinpoint.aws.upbound.io/SMSChannel": false, - "pipes.aws.upbound.io/Pipe": true, - "qldb.aws.upbound.io/Ledger": true, - "qldb.aws.upbound.io/Stream": true, - "quicksight.aws.upbound.io/Group": false, - "quicksight.aws.upbound.io/User": false, - "ram.aws.upbound.io/PrincipalAssociation": false, - "ram.aws.upbound.io/ResourceAssociation": false, - "ram.aws.upbound.io/ResourceShareAccepter": false, - "ram.aws.upbound.io/ResourceShare": true, - "rds.aws.upbound.io/ClusterActivityStream": false, - "rds.aws.upbound.io/ClusterEndpoint": true, - "rds.aws.upbound.io/ClusterInstance": true, - "rds.aws.upbound.io/ClusterParameterGroup": true, - "rds.aws.upbound.io/ClusterRoleAssociation": false, - "rds.aws.upbound.io/Cluster": true, - "rds.aws.upbound.io/ClusterSnapshot": true, - "rds.aws.upbound.io/DBInstanceAutomatedBackupsReplication": false, - "rds.aws.upbound.io/DBSnapshotCopy": true, - "rds.aws.upbound.io/EventSubscription": true, - "rds.aws.upbound.io/GlobalCluster": false, - "rds.aws.upbound.io/InstanceRoleAssociation": false, - "rds.aws.upbound.io/Instance": true, - "rds.aws.upbound.io/OptionGroup": true, - "rds.aws.upbound.io/ParameterGroup": true, - "rds.aws.upbound.io/Proxy": true, - "rds.aws.upbound.io/ProxyDefaultTargetGroup": false, - "rds.aws.upbound.io/ProxyEndpoint": true, - "rds.aws.upbound.io/ProxyTarget": false, - "rds.aws.upbound.io/Snapshot": true, - "rds.aws.upbound.io/SubnetGroup": true, - "redshift.aws.upbound.io/AuthenticationProfile": false, - "redshift.aws.upbound.io/Cluster": true, - "redshift.aws.upbound.io/EndpointAccess": false, - "redshift.aws.upbound.io/EventSubscription": true, - "redshift.aws.upbound.io/HSMClientCertificate": true, - "redshift.aws.upbound.io/HSMConfiguration": true, - "redshift.aws.upbound.io/ParameterGroup": true, - "redshift.aws.upbound.io/ScheduledAction": false, - "redshift.aws.upbound.io/SnapshotCopyGrant": true, - "redshift.aws.upbound.io/SnapshotScheduleAssociation": false, - "redshift.aws.upbound.io/SnapshotSchedule": true, - "redshift.aws.upbound.io/SubnetGroup": true, - "redshift.aws.upbound.io/UsageLimit": true, - "redshiftserverless.aws.upbound.io/EndpointAccess": false, - "redshiftserverless.aws.upbound.io/RedshiftServerlessNamespace": true, - "redshiftserverless.aws.upbound.io/ResourcePolicy": false, - "redshiftserverless.aws.upbound.io/Snapshot": false, - "redshiftserverless.aws.upbound.io/UsageLimit": false, - "redshiftserverless.aws.upbound.io/Workgroup": true, - "resourcegroups.aws.upbound.io/Group": true, - "rolesanywhere.aws.upbound.io/Profile": true, - "route53.aws.upbound.io/DelegationSet": false, - "route53.aws.upbound.io/HealthCheck": true, - "route53.aws.upbound.io/HostedZoneDNSSEC": false, - "route53.aws.upbound.io/Record": false, - "route53.aws.upbound.io/ResolverConfig": false, - "route53.aws.upbound.io/TrafficPolicy": false, - "route53.aws.upbound.io/TrafficPolicyInstance": false, - "route53.aws.upbound.io/VPCAssociationAuthorization": false, - "route53.aws.upbound.io/ZoneAssociation": false, - "route53.aws.upbound.io/Zone": true, - "route53recoverycontrolconfig.aws.upbound.io/Cluster": false, - "route53recoverycontrolconfig.aws.upbound.io/ControlPanel": false, - "route53recoverycontrolconfig.aws.upbound.io/RoutingControl": false, - "route53recoverycontrolconfig.aws.upbound.io/SafetyRule": false, - "route53recoveryreadiness.aws.upbound.io/Cell": true, - "route53recoveryreadiness.aws.upbound.io/ReadinessCheck": true, - "route53recoveryreadiness.aws.upbound.io/RecoveryGroup": true, - "route53recoveryreadiness.aws.upbound.io/ResourceSet": true, - "route53resolver.aws.upbound.io/Endpoint": true, - "route53resolver.aws.upbound.io/RuleAssociation": false, - "route53resolver.aws.upbound.io/Rule": true, - "rum.aws.upbound.io/AppMonitor": true, - "rum.aws.upbound.io/MetricsDestination": false, - "s3.aws.upbound.io/BucketAccelerateConfiguration": false, - "s3.aws.upbound.io/BucketACL": false, - "s3.aws.upbound.io/BucketAnalyticsConfiguration": false, - "s3.aws.upbound.io/BucketCorsConfiguration": false, - "s3.aws.upbound.io/BucketIntelligentTieringConfiguration": false, - "s3.aws.upbound.io/BucketInventory": false, - "s3.aws.upbound.io/BucketLifecycleConfiguration": false, - "s3.aws.upbound.io/BucketLogging": false, - "s3.aws.upbound.io/BucketMetric": false, - "s3.aws.upbound.io/BucketNotification": false, - "s3.aws.upbound.io/BucketObjectLockConfiguration": false, - "s3.aws.upbound.io/BucketObject": true, - "s3.aws.upbound.io/BucketOwnershipControls": false, - "s3.aws.upbound.io/BucketPolicy": false, - "s3.aws.upbound.io/BucketPublicAccessBlock": false, - "s3.aws.upbound.io/BucketReplicationConfiguration": false, - "s3.aws.upbound.io/BucketRequestPaymentConfiguration": false, - "s3.aws.upbound.io/Bucket": true, - "s3.aws.upbound.io/BucketServerSideEncryptionConfiguration": false, - "s3.aws.upbound.io/BucketVersioning": false, - "s3.aws.upbound.io/BucketWebsiteConfiguration": false, - "s3.aws.upbound.io/DirectoryBucket": false, - "s3.aws.upbound.io/ObjectCopy": true, - "s3.aws.upbound.io/Object": true, - "s3control.aws.upbound.io/AccessPointPolicy": false, - "s3control.aws.upbound.io/AccessPoint": false, - "s3control.aws.upbound.io/AccountPublicAccessBlock": false, - "s3control.aws.upbound.io/MultiRegionAccessPointPolicy": false, - "s3control.aws.upbound.io/MultiRegionAccessPoint": false, - "s3control.aws.upbound.io/ObjectLambdaAccessPointPolicy": false, - "s3control.aws.upbound.io/ObjectLambdaAccessPoint": false, - "s3control.aws.upbound.io/StorageLensConfiguration": true, - "sagemaker.aws.upbound.io/AppImageConfig": true, - "sagemaker.aws.upbound.io/App": true, - "sagemaker.aws.upbound.io/CodeRepository": true, - "sagemaker.aws.upbound.io/DeviceFleet": true, - "sagemaker.aws.upbound.io/Device": false, - "sagemaker.aws.upbound.io/Domain": true, - "sagemaker.aws.upbound.io/EndpointConfiguration": true, - "sagemaker.aws.upbound.io/Endpoint": true, - "sagemaker.aws.upbound.io/FeatureGroup": true, - "sagemaker.aws.upbound.io/Image": true, - "sagemaker.aws.upbound.io/ImageVersion": false, - "sagemaker.aws.upbound.io/ModelPackageGroupPolicy": false, - "sagemaker.aws.upbound.io/ModelPackageGroup": true, - "sagemaker.aws.upbound.io/Model": true, - "sagemaker.aws.upbound.io/NotebookInstanceLifecycleConfiguration": false, - "sagemaker.aws.upbound.io/NotebookInstance": true, - "sagemaker.aws.upbound.io/ServicecatalogPortfolioStatus": false, - "sagemaker.aws.upbound.io/Space": true, - "sagemaker.aws.upbound.io/StudioLifecycleConfig": true, - "sagemaker.aws.upbound.io/UserProfile": true, - "sagemaker.aws.upbound.io/Workforce": false, - "sagemaker.aws.upbound.io/Workteam": true, - "scheduler.aws.upbound.io/ScheduleGroup": true, - "scheduler.aws.upbound.io/Schedule": false, - "schemas.aws.upbound.io/Discoverer": true, - "schemas.aws.upbound.io/Registry": true, - "schemas.aws.upbound.io/Schema": true, - "secretsmanager.aws.upbound.io/SecretPolicy": false, - "secretsmanager.aws.upbound.io/SecretRotation": false, - "secretsmanager.aws.upbound.io/Secret": true, - "secretsmanager.aws.upbound.io/SecretVersion": false, - "securityhub.aws.upbound.io/Account": false, - "securityhub.aws.upbound.io/ActionTarget": false, - "securityhub.aws.upbound.io/FindingAggregator": false, - "securityhub.aws.upbound.io/Insight": false, - "securityhub.aws.upbound.io/InviteAccepter": false, - "securityhub.aws.upbound.io/Member": false, - "securityhub.aws.upbound.io/ProductSubscription": false, - "securityhub.aws.upbound.io/StandardsSubscription": false, - "serverlessrepo.aws.upbound.io/CloudFormationStack": true, - "servicecatalog.aws.upbound.io/BudgetResourceAssociation": false, - "servicecatalog.aws.upbound.io/Constraint": false, - "servicecatalog.aws.upbound.io/Portfolio": true, - "servicecatalog.aws.upbound.io/PortfolioShare": false, - "servicecatalog.aws.upbound.io/PrincipalPortfolioAssociation": false, - "servicecatalog.aws.upbound.io/ProductPortfolioAssociation": false, - "servicecatalog.aws.upbound.io/Product": true, - "servicecatalog.aws.upbound.io/ProvisioningArtifact": false, - "servicecatalog.aws.upbound.io/ServiceAction": false, - "servicecatalog.aws.upbound.io/TagOptionResourceAssociation": false, - "servicecatalog.aws.upbound.io/TagOption": false, - "servicediscovery.aws.upbound.io/HTTPNamespace": true, - "servicediscovery.aws.upbound.io/PrivateDNSNamespace": true, - "servicediscovery.aws.upbound.io/PublicDNSNamespace": true, - "servicediscovery.aws.upbound.io/Service": true, - "servicequotas.aws.upbound.io/ServiceQuota": false, - "ses.aws.upbound.io/ActiveReceiptRuleSet": false, - "ses.aws.upbound.io/ConfigurationSet": false, - "ses.aws.upbound.io/DomainDKIM": false, - "ses.aws.upbound.io/DomainIdentity": false, - "ses.aws.upbound.io/DomainMailFrom": false, - "ses.aws.upbound.io/EmailIdentity": false, - "ses.aws.upbound.io/EventDestination": false, - "ses.aws.upbound.io/IdentityNotificationTopic": false, - "ses.aws.upbound.io/IdentityPolicy": false, - "ses.aws.upbound.io/ReceiptFilter": false, - "ses.aws.upbound.io/ReceiptRule": false, - "ses.aws.upbound.io/ReceiptRuleSet": false, - "ses.aws.upbound.io/Template": false, - "sesv2.aws.upbound.io/ConfigurationSetEventDestination": false, - "sesv2.aws.upbound.io/ConfigurationSet": true, - "sesv2.aws.upbound.io/DedicatedIPPool": true, - "sesv2.aws.upbound.io/EmailIdentity": true, - "sesv2.aws.upbound.io/EmailIdentityFeedbackAttributes": false, - "sesv2.aws.upbound.io/EmailIdentityMailFromAttributes": false, - "sfn.aws.upbound.io/Activity": true, - "sfn.aws.upbound.io/StateMachine": true, - "signer.aws.upbound.io/SigningJob": false, - "signer.aws.upbound.io/SigningProfilePermission": false, - "signer.aws.upbound.io/SigningProfile": true, - "simpledb.aws.upbound.io/Domain": false, - "sns.aws.upbound.io/PlatformApplication": false, - "sns.aws.upbound.io/SMSPreferences": false, - "sns.aws.upbound.io/TopicPolicy": false, - "sns.aws.upbound.io/Topic": true, - "sns.aws.upbound.io/TopicSubscription": false, - "sqs.aws.upbound.io/QueuePolicy": false, - "sqs.aws.upbound.io/QueueRedriveAllowPolicy": false, - "sqs.aws.upbound.io/QueueRedrivePolicy": false, - "sqs.aws.upbound.io/Queue": true, - "ssm.aws.upbound.io/Activation": true, - "ssm.aws.upbound.io/Association": true, - "ssm.aws.upbound.io/DefaultPatchBaseline": false, - "ssm.aws.upbound.io/Document": true, - "ssm.aws.upbound.io/MaintenanceWindow": true, - "ssm.aws.upbound.io/MaintenanceWindowTarget": false, - "ssm.aws.upbound.io/MaintenanceWindowTask": false, - "ssm.aws.upbound.io/Parameter": true, - "ssm.aws.upbound.io/PatchBaseline": true, - "ssm.aws.upbound.io/PatchGroup": false, - "ssm.aws.upbound.io/ResourceDataSync": false, - "ssm.aws.upbound.io/ServiceSetting": false, - "ssoadmin.aws.upbound.io/AccountAssignment": false, - "ssoadmin.aws.upbound.io/CustomerManagedPolicyAttachment": false, - "ssoadmin.aws.upbound.io/InstanceAccessControlAttributes": false, - "ssoadmin.aws.upbound.io/ManagedPolicyAttachment": false, - "ssoadmin.aws.upbound.io/PermissionsBoundaryAttachment": false, - "ssoadmin.aws.upbound.io/PermissionSetInlinePolicy": false, - "ssoadmin.aws.upbound.io/PermissionSet": true, - "swf.aws.upbound.io/Domain": true, - "timestreamwrite.aws.upbound.io/Database": true, - "timestreamwrite.aws.upbound.io/Table": true, - "transcribe.aws.upbound.io/LanguageModel": true, - "transcribe.aws.upbound.io/Vocabulary": true, - "transcribe.aws.upbound.io/VocabularyFilter": true, - "transfer.aws.upbound.io/Connector": true, - "transfer.aws.upbound.io/Server": true, - "transfer.aws.upbound.io/SSHKey": false, - "transfer.aws.upbound.io/Tag": false, - "transfer.aws.upbound.io/User": true, - "transfer.aws.upbound.io/Workflow": true, - "vpc.aws.upbound.io/NetworkPerformanceMetricSubscription": false, - "waf.aws.upbound.io/ByteMatchSet": false, - "waf.aws.upbound.io/GeoMatchSet": false, - "waf.aws.upbound.io/IPSet": false, - "waf.aws.upbound.io/RateBasedRule": true, - "waf.aws.upbound.io/RegexMatchSet": false, - "waf.aws.upbound.io/RegexPatternSet": false, - "waf.aws.upbound.io/Rule": true, - "waf.aws.upbound.io/SizeConstraintSet": false, - "waf.aws.upbound.io/SQLInjectionMatchSet": false, - "waf.aws.upbound.io/WebACL": true, - "waf.aws.upbound.io/XSSMatchSet": false, - "wafregional.aws.upbound.io/ByteMatchSet": false, - "wafregional.aws.upbound.io/GeoMatchSet": false, - "wafregional.aws.upbound.io/IPSet": false, - "wafregional.aws.upbound.io/RateBasedRule": true, - "wafregional.aws.upbound.io/RegexMatchSet": false, - "wafregional.aws.upbound.io/RegexPatternSet": false, - "wafregional.aws.upbound.io/Rule": true, - "wafregional.aws.upbound.io/SizeConstraintSet": false, - "wafregional.aws.upbound.io/SQLInjectionMatchSet": false, - "wafregional.aws.upbound.io/WebACL": true, - "wafregional.aws.upbound.io/XSSMatchSet": false, - "wafv2.aws.upbound.io/IPSet": true, - "wafv2.aws.upbound.io/RegexPatternSet": true, - "workspaces.aws.upbound.io/Directory": true, - "workspaces.aws.upbound.io/IPGroup": true, - "xray.aws.upbound.io/EncryptionConfig": false, - "xray.aws.upbound.io/Group": true, - "xray.aws.upbound.io/SamplingRule": true, -} - -// SupportedManagedResource returns true if a resource supports tags +// SupportedManagedResource returns true if a resource supports tags. func SupportedManagedResource(desired *resource.DesiredComposed, filter ResourceFilter) bool { gvk := desired.Resource.GroupVersionKind() resource := gvk.Group + "/" + gvk.Kind - if val, ok := ManagedResourceFilter[resource]; ok { + if val, ok := filter[resource]; ok { return val } diff --git a/filter_aws.go b/filter_aws.go new file mode 100644 index 0000000..eb371a6 --- /dev/null +++ b/filter_aws.go @@ -0,0 +1,965 @@ +package main + +// NewAWSResourceFilter returns a map of resources that support tags. +// these values were generated by querying the AWS CRDs for `spec.forProvider.tags` support. +func NewAWSResourceFilter() ResourceFilter { + return ResourceFilter{ + "accessanalyzer.aws.upbound.io/Analyzer": true, + "accessanalyzer.aws.upbound.io/ArchiveRule": false, + "account.aws.upbound.io/AlternateContact": false, + "account.aws.upbound.io/Region": false, + "acm.aws.upbound.io/Certificate": true, + "acm.aws.upbound.io/CertificateValidation": false, + "acmpca.aws.upbound.io/CertificateAuthority": true, + "acmpca.aws.upbound.io/CertificateAuthorityCertificate": false, + "acmpca.aws.upbound.io/Certificate": false, + "acmpca.aws.upbound.io/Permission": false, + "acmpca.aws.upbound.io/Policy": false, + "amp.aws.upbound.io/AlertManagerDefinition": false, + "amp.aws.upbound.io/RuleGroupNamespace": false, + "amp.aws.upbound.io/Workspace": true, + "amplify.aws.upbound.io/App": true, + "amplify.aws.upbound.io/BackendEnvironment": false, + "amplify.aws.upbound.io/Branch": true, + "amplify.aws.upbound.io/Webhook": false, + "apigateway.aws.upbound.io/Account": false, + "apigateway.aws.upbound.io/APIKey": true, + "apigateway.aws.upbound.io/Authorizer": false, + "apigateway.aws.upbound.io/BasePathMapping": false, + "apigateway.aws.upbound.io/ClientCertificate": true, + "apigateway.aws.upbound.io/Deployment": false, + "apigateway.aws.upbound.io/DocumentationPart": false, + "apigateway.aws.upbound.io/DocumentationVersion": false, + "apigateway.aws.upbound.io/DomainName": true, + "apigateway.aws.upbound.io/GatewayResponse": false, + "apigateway.aws.upbound.io/IntegrationResponse": false, + "apigateway.aws.upbound.io/Integration": false, + "apigateway.aws.upbound.io/MethodResponse": false, + "apigateway.aws.upbound.io/Method": false, + "apigateway.aws.upbound.io/MethodSettings": false, + "apigateway.aws.upbound.io/Model": false, + "apigateway.aws.upbound.io/RequestValidator": false, + "apigateway.aws.upbound.io/Resource": false, + "apigateway.aws.upbound.io/RestAPIPolicy": false, + "apigateway.aws.upbound.io/RestAPI": true, + "apigateway.aws.upbound.io/Stage": true, + "apigateway.aws.upbound.io/UsagePlanKey": false, + "apigateway.aws.upbound.io/UsagePlan": true, + "apigateway.aws.upbound.io/VPCLink": true, + "apigatewayv2.aws.upbound.io/APIMapping": false, + "apigatewayv2.aws.upbound.io/API": true, + "apigatewayv2.aws.upbound.io/Authorizer": false, + "apigatewayv2.aws.upbound.io/Deployment": false, + "apigatewayv2.aws.upbound.io/DomainName": true, + "apigatewayv2.aws.upbound.io/IntegrationResponse": false, + "apigatewayv2.aws.upbound.io/Integration": false, + "apigatewayv2.aws.upbound.io/Model": false, + "apigatewayv2.aws.upbound.io/RouteResponse": false, + "apigatewayv2.aws.upbound.io/Route": false, + "apigatewayv2.aws.upbound.io/Stage": true, + "apigatewayv2.aws.upbound.io/VPCLink": true, + "appautoscaling.aws.upbound.io/Policy": false, + "appautoscaling.aws.upbound.io/ScheduledAction": false, + "appautoscaling.aws.upbound.io/Target": true, + "appconfig.aws.upbound.io/Application": true, + "appconfig.aws.upbound.io/ConfigurationProfile": true, + "appconfig.aws.upbound.io/Deployment": true, + "appconfig.aws.upbound.io/DeploymentStrategy": true, + "appconfig.aws.upbound.io/Environment": true, + "appconfig.aws.upbound.io/ExtensionAssociation": false, + "appconfig.aws.upbound.io/Extension": true, + "appconfig.aws.upbound.io/HostedConfigurationVersion": false, + "appflow.aws.upbound.io/Flow": true, + "appintegrations.aws.upbound.io/EventIntegration": true, + "applicationinsights.aws.upbound.io/Application": true, + "appmesh.aws.upbound.io/GatewayRoute": true, + "appmesh.aws.upbound.io/Mesh": true, + "appmesh.aws.upbound.io/Route": true, + "appmesh.aws.upbound.io/VirtualGateway": true, + "appmesh.aws.upbound.io/VirtualNode": true, + "appmesh.aws.upbound.io/VirtualRouter": true, + "appmesh.aws.upbound.io/VirtualService": true, + "apprunner.aws.upbound.io/AutoScalingConfigurationVersion": true, + "apprunner.aws.upbound.io/Connection": true, + "apprunner.aws.upbound.io/ObservabilityConfiguration": true, + "apprunner.aws.upbound.io/Service": true, + "apprunner.aws.upbound.io/VPCConnector": true, + "appstream.aws.upbound.io/DirectoryConfig": false, + "appstream.aws.upbound.io/Fleet": true, + "appstream.aws.upbound.io/FleetStackAssociation": false, + "appstream.aws.upbound.io/ImageBuilder": true, + "appstream.aws.upbound.io/Stack": true, + "appstream.aws.upbound.io/User": false, + "appstream.aws.upbound.io/UserStackAssociation": false, + "appsync.aws.upbound.io/APICache": false, + "appsync.aws.upbound.io/APIKey": false, + "appsync.aws.upbound.io/Datasource": false, + "appsync.aws.upbound.io/Function": false, + "appsync.aws.upbound.io/GraphQLAPI": true, + "appsync.aws.upbound.io/Resolver": false, + "athena.aws.upbound.io/Database": false, + "athena.aws.upbound.io/DataCatalog": true, + "athena.aws.upbound.io/NamedQuery": false, + "athena.aws.upbound.io/Workgroup": true, + "autoscaling.aws.upbound.io/Attachment": false, + "autoscaling.aws.upbound.io/AutoscalingGroup": true, + "autoscaling.aws.upbound.io/GroupTag": false, + "autoscaling.aws.upbound.io/LaunchConfiguration": false, + "autoscaling.aws.upbound.io/LifecycleHook": false, + "autoscaling.aws.upbound.io/Notification": false, + "autoscaling.aws.upbound.io/Policy": false, + "autoscaling.aws.upbound.io/Schedule": false, + "autoscalingplans.aws.upbound.io/ScalingPlan": false, + "aws.upbound.io/ProviderConfig": false, + "aws.upbound.io/ProviderConfigUsage": false, + "aws.upbound.io/StoreConfig": false, + "backup.aws.upbound.io/Framework": true, + "backup.aws.upbound.io/GlobalSettings": false, + "backup.aws.upbound.io/Plan": true, + "backup.aws.upbound.io/RegionSettings": false, + "backup.aws.upbound.io/ReportPlan": true, + "backup.aws.upbound.io/Selection": false, + "backup.aws.upbound.io/VaultLockConfiguration": false, + "backup.aws.upbound.io/VaultNotifications": false, + "backup.aws.upbound.io/VaultPolicy": false, + "backup.aws.upbound.io/Vault": true, + "batch.aws.upbound.io/JobDefinition": true, + "batch.aws.upbound.io/SchedulingPolicy": true, + "budgets.aws.upbound.io/BudgetAction": true, + "budgets.aws.upbound.io/Budget": true, + "ce.aws.upbound.io/AnomalyMonitor": true, + "chime.aws.upbound.io/VoiceConnectorGroup": false, + "chime.aws.upbound.io/VoiceConnectorLogging": false, + "chime.aws.upbound.io/VoiceConnectorOrigination": false, + "chime.aws.upbound.io/VoiceConnector": true, + "chime.aws.upbound.io/VoiceConnectorStreaming": false, + "chime.aws.upbound.io/VoiceConnectorTerminationCredentials": false, + "chime.aws.upbound.io/VoiceConnectorTermination": false, + "cloud9.aws.upbound.io/EnvironmentEC2": true, + "cloud9.aws.upbound.io/EnvironmentMembership": false, + "cloudcontrol.aws.upbound.io/Resource": false, + "cloudformation.aws.upbound.io/Stack": true, + "cloudformation.aws.upbound.io/StackSetInstance": false, + "cloudformation.aws.upbound.io/StackSet": true, + "cloudfront.aws.upbound.io/CachePolicy": false, + "cloudfront.aws.upbound.io/Distribution": true, + "cloudfront.aws.upbound.io/FieldLevelEncryptionConfig": false, + "cloudfront.aws.upbound.io/FieldLevelEncryptionProfile": false, + "cloudfront.aws.upbound.io/Function": false, + "cloudfront.aws.upbound.io/KeyGroup": false, + "cloudfront.aws.upbound.io/MonitoringSubscription": false, + "cloudfront.aws.upbound.io/OriginAccessControl": false, + "cloudfront.aws.upbound.io/OriginAccessIdentity": false, + "cloudfront.aws.upbound.io/OriginRequestPolicy": false, + "cloudfront.aws.upbound.io/PublicKey": false, + "cloudfront.aws.upbound.io/RealtimeLogConfig": false, + "cloudfront.aws.upbound.io/ResponseHeadersPolicy": false, + "cloudsearch.aws.upbound.io/Domain": false, + "cloudsearch.aws.upbound.io/DomainServiceAccessPolicy": false, + "cloudtrail.aws.upbound.io/EventDataStore": true, + "cloudtrail.aws.upbound.io/Trail": true, + "cloudwatch.aws.upbound.io/CompositeAlarm": true, + "cloudwatch.aws.upbound.io/Dashboard": false, + "cloudwatch.aws.upbound.io/MetricAlarm": true, + "cloudwatch.aws.upbound.io/MetricStream": true, + "cloudwatchevents.aws.upbound.io/APIDestination": false, + "cloudwatchevents.aws.upbound.io/Archive": false, + "cloudwatchevents.aws.upbound.io/Bus": true, + "cloudwatchevents.aws.upbound.io/BusPolicy": false, + "cloudwatchevents.aws.upbound.io/Connection": false, + "cloudwatchevents.aws.upbound.io/Permission": false, + "cloudwatchevents.aws.upbound.io/Rule": true, + "cloudwatchevents.aws.upbound.io/Target": false, + "cloudwatchlogs.aws.upbound.io/Definition": false, + "cloudwatchlogs.aws.upbound.io/DestinationPolicy": false, + "cloudwatchlogs.aws.upbound.io/Destination": true, + "cloudwatchlogs.aws.upbound.io/Group": true, + "cloudwatchlogs.aws.upbound.io/MetricFilter": false, + "cloudwatchlogs.aws.upbound.io/ResourcePolicy": false, + "cloudwatchlogs.aws.upbound.io/Stream": false, + "cloudwatchlogs.aws.upbound.io/SubscriptionFilter": false, + "codeartifact.aws.upbound.io/DomainPermissionsPolicy": false, + "codeartifact.aws.upbound.io/Domain": true, + "codeartifact.aws.upbound.io/Repository": true, + "codeartifact.aws.upbound.io/RepositoryPermissionsPolicy": false, + "codecommit.aws.upbound.io/ApprovalRuleTemplateAssociation": false, + "codecommit.aws.upbound.io/ApprovalRuleTemplate": false, + "codecommit.aws.upbound.io/Repository": true, + "codecommit.aws.upbound.io/Trigger": false, + "codeguruprofiler.aws.upbound.io/ProfilingGroup": true, + "codepipeline.aws.upbound.io/Codepipeline": true, + "codepipeline.aws.upbound.io/CustomActionType": true, + "codepipeline.aws.upbound.io/Webhook": true, + "codestarconnections.aws.upbound.io/Connection": true, + "codestarconnections.aws.upbound.io/Host": false, + "codestarnotifications.aws.upbound.io/NotificationRule": true, + "cognitoidentity.aws.upbound.io/CognitoIdentityPoolProviderPrincipalTag": false, + "cognitoidentity.aws.upbound.io/PoolRolesAttachment": false, + "cognitoidentity.aws.upbound.io/Pool": true, + "cognitoidp.aws.upbound.io/IdentityProvider": false, + "cognitoidp.aws.upbound.io/ResourceServer": false, + "cognitoidp.aws.upbound.io/RiskConfiguration": false, + "cognitoidp.aws.upbound.io/UserGroup": false, + "cognitoidp.aws.upbound.io/UserInGroup": false, + "cognitoidp.aws.upbound.io/UserPoolClient": false, + "cognitoidp.aws.upbound.io/UserPoolDomain": false, + "cognitoidp.aws.upbound.io/UserPool": true, + "cognitoidp.aws.upbound.io/UserPoolUICustomization": false, + "cognitoidp.aws.upbound.io/User": false, + "configservice.aws.upbound.io/AWSConfigurationRecorderStatus": false, + "configservice.aws.upbound.io/ConfigRule": true, + "configservice.aws.upbound.io/ConfigurationAggregator": true, + "configservice.aws.upbound.io/ConfigurationRecorder": false, + "configservice.aws.upbound.io/ConformancePack": false, + "configservice.aws.upbound.io/DeliveryChannel": false, + "configservice.aws.upbound.io/RemediationConfiguration": false, + "connect.aws.upbound.io/BotAssociation": false, + "connect.aws.upbound.io/ContactFlowModule": true, + "connect.aws.upbound.io/ContactFlow": true, + "connect.aws.upbound.io/HoursOfOperation": true, + "connect.aws.upbound.io/Instance": false, + "connect.aws.upbound.io/InstanceStorageConfig": false, + "connect.aws.upbound.io/LambdaFunctionAssociation": false, + "connect.aws.upbound.io/PhoneNumber": true, + "connect.aws.upbound.io/Queue": true, + "connect.aws.upbound.io/QuickConnect": true, + "connect.aws.upbound.io/RoutingProfile": true, + "connect.aws.upbound.io/SecurityProfile": true, + "connect.aws.upbound.io/UserHierarchyStructure": false, + "connect.aws.upbound.io/User": true, + "connect.aws.upbound.io/Vocabulary": true, + "cur.aws.upbound.io/ReportDefinition": false, + "dataexchange.aws.upbound.io/DataSet": true, + "dataexchange.aws.upbound.io/Revision": true, + "datapipeline.aws.upbound.io/Pipeline": true, + "datasync.aws.upbound.io/LocationS3": true, + "datasync.aws.upbound.io/Task": true, + "dax.aws.upbound.io/Cluster": true, + "dax.aws.upbound.io/ParameterGroup": false, + "dax.aws.upbound.io/SubnetGroup": false, + "deploy.aws.upbound.io/App": true, + "deploy.aws.upbound.io/DeploymentConfig": false, + "deploy.aws.upbound.io/DeploymentGroup": true, + "detective.aws.upbound.io/Graph": true, + "detective.aws.upbound.io/InvitationAccepter": false, + "detective.aws.upbound.io/Member": false, + "devicefarm.aws.upbound.io/DevicePool": true, + "devicefarm.aws.upbound.io/InstanceProfile": true, + "devicefarm.aws.upbound.io/NetworkProfile": true, + "devicefarm.aws.upbound.io/Project": true, + "devicefarm.aws.upbound.io/TestGridProject": true, + "devicefarm.aws.upbound.io/Upload": false, + "directconnect.aws.upbound.io/BGPPeer": false, + "directconnect.aws.upbound.io/ConnectionAssociation": false, + "directconnect.aws.upbound.io/Connection": true, + "directconnect.aws.upbound.io/GatewayAssociationProposal": false, + "directconnect.aws.upbound.io/GatewayAssociation": false, + "directconnect.aws.upbound.io/Gateway": false, + "directconnect.aws.upbound.io/HostedPrivateVirtualInterfaceAccepter": true, + "directconnect.aws.upbound.io/HostedPrivateVirtualInterface": false, + "directconnect.aws.upbound.io/HostedPublicVirtualInterfaceAccepter": true, + "directconnect.aws.upbound.io/HostedPublicVirtualInterface": false, + "directconnect.aws.upbound.io/HostedTransitVirtualInterfaceAccepter": true, + "directconnect.aws.upbound.io/HostedTransitVirtualInterface": false, + "directconnect.aws.upbound.io/Lag": true, + "directconnect.aws.upbound.io/PrivateVirtualInterface": true, + "directconnect.aws.upbound.io/PublicVirtualInterface": true, + "directconnect.aws.upbound.io/TransitVirtualInterface": true, + "dlm.aws.upbound.io/LifecyclePolicy": true, + "dms.aws.upbound.io/Certificate": true, + "dms.aws.upbound.io/Endpoint": true, + "dms.aws.upbound.io/EventSubscription": true, + "dms.aws.upbound.io/ReplicationInstance": true, + "dms.aws.upbound.io/ReplicationSubnetGroup": true, + "dms.aws.upbound.io/ReplicationTask": true, + "dms.aws.upbound.io/S3Endpoint": true, + "docdb.aws.upbound.io/ClusterInstance": true, + "docdb.aws.upbound.io/ClusterParameterGroup": true, + "docdb.aws.upbound.io/Cluster": true, + "docdb.aws.upbound.io/ClusterSnapshot": false, + "docdb.aws.upbound.io/EventSubscription": true, + "docdb.aws.upbound.io/GlobalCluster": false, + "docdb.aws.upbound.io/SubnetGroup": true, + "ds.aws.upbound.io/ConditionalForwarder": false, + "ds.aws.upbound.io/Directory": true, + "ds.aws.upbound.io/SharedDirectory": false, + "dynamodb.aws.upbound.io/ContributorInsights": false, + "dynamodb.aws.upbound.io/GlobalTable": false, + "dynamodb.aws.upbound.io/KinesisStreamingDestination": false, + "dynamodb.aws.upbound.io/ResourcePolicy": false, + "dynamodb.aws.upbound.io/TableItem": false, + "dynamodb.aws.upbound.io/TableReplica": true, + "dynamodb.aws.upbound.io/Table": true, + "dynamodb.aws.upbound.io/Tag": false, + "ec2.aws.upbound.io/AMICopy": true, + "ec2.aws.upbound.io/AMILaunchPermission": false, + "ec2.aws.upbound.io/AMI": true, + "ec2.aws.upbound.io/AvailabilityZoneGroup": false, + "ec2.aws.upbound.io/CapacityReservation": true, + "ec2.aws.upbound.io/CarrierGateway": true, + "ec2.aws.upbound.io/CustomerGateway": true, + "ec2.aws.upbound.io/DefaultNetworkACL": true, + "ec2.aws.upbound.io/DefaultRouteTable": true, + "ec2.aws.upbound.io/DefaultSecurityGroup": true, + "ec2.aws.upbound.io/DefaultSubnet": true, + "ec2.aws.upbound.io/DefaultVPCDHCPOptions": true, + "ec2.aws.upbound.io/DefaultVPC": true, + "ec2.aws.upbound.io/EBSDefaultKMSKey": false, + "ec2.aws.upbound.io/EBSEncryptionByDefault": false, + "ec2.aws.upbound.io/EBSSnapshotCopy": true, + "ec2.aws.upbound.io/EBSSnapshotImport": true, + "ec2.aws.upbound.io/EBSSnapshot": true, + "ec2.aws.upbound.io/EBSVolume": true, + "ec2.aws.upbound.io/EgressOnlyInternetGateway": true, + "ec2.aws.upbound.io/EIPAssociation": false, + "ec2.aws.upbound.io/EIP": true, + "ec2.aws.upbound.io/Fleet": true, + "ec2.aws.upbound.io/FlowLog": true, + "ec2.aws.upbound.io/Host": true, + "ec2.aws.upbound.io/Instance": true, + "ec2.aws.upbound.io/InstanceState": false, + "ec2.aws.upbound.io/InternetGateway": true, + "ec2.aws.upbound.io/KeyPair": true, + "ec2.aws.upbound.io/LaunchTemplate": true, + "ec2.aws.upbound.io/MainRouteTableAssociation": false, + "ec2.aws.upbound.io/ManagedPrefixListEntry": false, + "ec2.aws.upbound.io/ManagedPrefixList": true, + "ec2.aws.upbound.io/NATGateway": true, + "ec2.aws.upbound.io/NetworkACLRule": false, + "ec2.aws.upbound.io/NetworkACL": true, + "ec2.aws.upbound.io/NetworkInsightsAnalysis": true, + "ec2.aws.upbound.io/NetworkInsightsPath": true, + "ec2.aws.upbound.io/NetworkInterfaceAttachment": false, + "ec2.aws.upbound.io/NetworkInterface": true, + "ec2.aws.upbound.io/NetworkInterfaceSgAttachment": false, + "ec2.aws.upbound.io/PlacementGroup": true, + "ec2.aws.upbound.io/Route": false, + "ec2.aws.upbound.io/RouteTableAssociation": false, + "ec2.aws.upbound.io/RouteTable": true, + "ec2.aws.upbound.io/SecurityGroupEgressRule": true, + "ec2.aws.upbound.io/SecurityGroupIngressRule": true, + "ec2.aws.upbound.io/SecurityGroupRule": false, + "ec2.aws.upbound.io/SecurityGroup": true, + "ec2.aws.upbound.io/SerialConsoleAccess": false, + "ec2.aws.upbound.io/SnapshotCreateVolumePermission": false, + "ec2.aws.upbound.io/SpotDatafeedSubscription": false, + "ec2.aws.upbound.io/SpotFleetRequest": true, + "ec2.aws.upbound.io/SpotInstanceRequest": true, + "ec2.aws.upbound.io/SubnetCidrReservation": false, + "ec2.aws.upbound.io/Subnet": true, + "ec2.aws.upbound.io/Tag": false, + "ec2.aws.upbound.io/TrafficMirrorFilterRule": false, + "ec2.aws.upbound.io/TrafficMirrorFilter": true, + "ec2.aws.upbound.io/TransitGatewayConnectPeer": true, + "ec2.aws.upbound.io/TransitGatewayConnect": true, + "ec2.aws.upbound.io/TransitGatewayMulticastDomainAssociation": false, + "ec2.aws.upbound.io/TransitGatewayMulticastDomain": true, + "ec2.aws.upbound.io/TransitGatewayMulticastGroupMember": false, + "ec2.aws.upbound.io/TransitGatewayMulticastGroupSource": false, + "ec2.aws.upbound.io/TransitGatewayPeeringAttachmentAccepter": true, + "ec2.aws.upbound.io/TransitGatewayPeeringAttachment": true, + "ec2.aws.upbound.io/TransitGatewayPolicyTable": true, + "ec2.aws.upbound.io/TransitGatewayPrefixListReference": false, + "ec2.aws.upbound.io/TransitGatewayRoute": false, + "ec2.aws.upbound.io/TransitGatewayRouteTableAssociation": false, + "ec2.aws.upbound.io/TransitGatewayRouteTablePropagation": false, + "ec2.aws.upbound.io/TransitGatewayRouteTable": true, + "ec2.aws.upbound.io/TransitGateway": true, + "ec2.aws.upbound.io/TransitGatewayVPCAttachmentAccepter": true, + "ec2.aws.upbound.io/TransitGatewayVPCAttachment": true, + "ec2.aws.upbound.io/VolumeAttachment": false, + "ec2.aws.upbound.io/VPCDHCPOptions": true, + "ec2.aws.upbound.io/VPCDHCPOptionsAssociation": false, + "ec2.aws.upbound.io/VPCEndpointConnectionNotification": false, + "ec2.aws.upbound.io/VPCEndpointRouteTableAssociation": false, + "ec2.aws.upbound.io/VPCEndpoint": true, + "ec2.aws.upbound.io/VPCEndpointSecurityGroupAssociation": false, + "ec2.aws.upbound.io/VPCEndpointServiceAllowedPrincipal": false, + "ec2.aws.upbound.io/VPCEndpointService": true, + "ec2.aws.upbound.io/VPCEndpointSubnetAssociation": false, + "ec2.aws.upbound.io/VPCIpamPoolCidrAllocation": false, + "ec2.aws.upbound.io/VPCIpamPoolCidr": false, + "ec2.aws.upbound.io/VPCIpamPool": true, + "ec2.aws.upbound.io/VPCIpam": true, + "ec2.aws.upbound.io/VPCIpamScope": true, + "ec2.aws.upbound.io/VPCIPv4CidrBlockAssociation": false, + "ec2.aws.upbound.io/VPCPeeringConnectionAccepter": true, + "ec2.aws.upbound.io/VPCPeeringConnectionOptions": false, + "ec2.aws.upbound.io/VPCPeeringConnection": true, + "ec2.aws.upbound.io/VPC": true, + "ec2.aws.upbound.io/VPNConnectionRoute": false, + "ec2.aws.upbound.io/VPNConnection": true, + "ec2.aws.upbound.io/VPNGatewayAttachment": false, + "ec2.aws.upbound.io/VPNGatewayRoutePropagation": false, + "ec2.aws.upbound.io/VPNGateway": true, + "ecr.aws.upbound.io/LifecyclePolicy": false, + "ecr.aws.upbound.io/PullThroughCacheRule": false, + "ecr.aws.upbound.io/RegistryPolicy": false, + "ecr.aws.upbound.io/RegistryScanningConfiguration": false, + "ecr.aws.upbound.io/ReplicationConfiguration": false, + "ecr.aws.upbound.io/Repository": true, + "ecr.aws.upbound.io/RepositoryPolicy": false, + "ecrpublic.aws.upbound.io/Repository": true, + "ecrpublic.aws.upbound.io/RepositoryPolicy": false, + "ecs.aws.upbound.io/AccountSettingDefault": false, + "ecs.aws.upbound.io/CapacityProvider": true, + "ecs.aws.upbound.io/ClusterCapacityProviders": false, + "ecs.aws.upbound.io/Cluster": true, + "ecs.aws.upbound.io/Service": true, + "ecs.aws.upbound.io/TaskDefinition": true, + "efs.aws.upbound.io/AccessPoint": true, + "efs.aws.upbound.io/BackupPolicy": false, + "efs.aws.upbound.io/FileSystemPolicy": false, + "efs.aws.upbound.io/FileSystem": true, + "efs.aws.upbound.io/MountTarget": false, + "efs.aws.upbound.io/ReplicationConfiguration": false, + "eks.aws.upbound.io/AccessEntry": true, + "eks.aws.upbound.io/AccessPolicyAssociation": false, + "eks.aws.upbound.io/Addon": true, + "eks.aws.upbound.io/ClusterAuth": false, + "eks.aws.upbound.io/Cluster": true, + "eks.aws.upbound.io/FargateProfile": true, + "eks.aws.upbound.io/IdentityProviderConfig": true, + "eks.aws.upbound.io/NodeGroup": true, + "eks.aws.upbound.io/PodIdentityAssociation": true, + "elasticache.aws.upbound.io/Cluster": true, + "elasticache.aws.upbound.io/GlobalReplicationGroup": false, + "elasticache.aws.upbound.io/ParameterGroup": true, + "elasticache.aws.upbound.io/ReplicationGroup": true, + "elasticache.aws.upbound.io/ServerlessCache": true, + "elasticache.aws.upbound.io/SubnetGroup": true, + "elasticache.aws.upbound.io/UserGroup": true, + "elasticache.aws.upbound.io/User": true, + "elasticbeanstalk.aws.upbound.io/Application": true, + "elasticbeanstalk.aws.upbound.io/ApplicationVersion": true, + "elasticbeanstalk.aws.upbound.io/ConfigurationTemplate": false, + "elasticsearch.aws.upbound.io/DomainPolicy": false, + "elasticsearch.aws.upbound.io/Domain": true, + "elasticsearch.aws.upbound.io/DomainSAMLOptions": false, + "elastictranscoder.aws.upbound.io/Pipeline": false, + "elastictranscoder.aws.upbound.io/Preset": false, + "elb.aws.upbound.io/AppCookieStickinessPolicy": false, + "elb.aws.upbound.io/Attachment": false, + "elb.aws.upbound.io/BackendServerPolicy": false, + "elb.aws.upbound.io/ELB": true, + "elb.aws.upbound.io/LBCookieStickinessPolicy": false, + "elb.aws.upbound.io/LBSSLNegotiationPolicy": false, + "elb.aws.upbound.io/ListenerPolicy": false, + "elb.aws.upbound.io/Policy": false, + "elb.aws.upbound.io/ProxyProtocolPolicy": false, + "elbv2.aws.upbound.io/LBListenerCertificate": false, + "elbv2.aws.upbound.io/LBListenerRule": true, + "elbv2.aws.upbound.io/LBListener": true, + "elbv2.aws.upbound.io/LB": true, + "elbv2.aws.upbound.io/LBTargetGroupAttachment": false, + "elbv2.aws.upbound.io/LBTargetGroup": true, + "elbv2.aws.upbound.io/LBTrustStore": true, + "emr.aws.upbound.io/SecurityConfiguration": false, + "emrserverless.aws.upbound.io/Application": true, + "evidently.aws.upbound.io/Feature": true, + "evidently.aws.upbound.io/Project": true, + "evidently.aws.upbound.io/Segment": true, + "firehose.aws.upbound.io/DeliveryStream": true, + "fis.aws.upbound.io/ExperimentTemplate": true, + "fsx.aws.upbound.io/Backup": true, + "fsx.aws.upbound.io/DataRepositoryAssociation": true, + "fsx.aws.upbound.io/LustreFileSystem": true, + "fsx.aws.upbound.io/OntapFileSystem": true, + "fsx.aws.upbound.io/OntapStorageVirtualMachine": true, + "fsx.aws.upbound.io/WindowsFileSystem": true, + "gamelift.aws.upbound.io/Alias": true, + "gamelift.aws.upbound.io/Build": true, + "gamelift.aws.upbound.io/Fleet": true, + "gamelift.aws.upbound.io/GameSessionQueue": true, + "gamelift.aws.upbound.io/Script": true, + "glacier.aws.upbound.io/VaultLock": false, + "glacier.aws.upbound.io/Vault": true, + "globalaccelerator.aws.upbound.io/Accelerator": true, + "globalaccelerator.aws.upbound.io/EndpointGroup": false, + "globalaccelerator.aws.upbound.io/Listener": false, + "glue.aws.upbound.io/CatalogDatabase": true, + "glue.aws.upbound.io/CatalogTable": false, + "glue.aws.upbound.io/Classifier": false, + "glue.aws.upbound.io/Connection": true, + "glue.aws.upbound.io/Crawler": true, + "glue.aws.upbound.io/DataCatalogEncryptionSettings": false, + "glue.aws.upbound.io/Job": true, + "glue.aws.upbound.io/Registry": true, + "glue.aws.upbound.io/ResourcePolicy": false, + "glue.aws.upbound.io/Schema": true, + "glue.aws.upbound.io/SecurityConfiguration": false, + "glue.aws.upbound.io/Trigger": true, + "glue.aws.upbound.io/UserDefinedFunction": false, + "glue.aws.upbound.io/Workflow": true, + "grafana.aws.upbound.io/LicenseAssociation": false, + "grafana.aws.upbound.io/RoleAssociation": false, + "grafana.aws.upbound.io/WorkspaceAPIKey": false, + "grafana.aws.upbound.io/Workspace": true, + "grafana.aws.upbound.io/WorkspaceSAMLConfiguration": false, + "guardduty.aws.upbound.io/Detector": true, + "guardduty.aws.upbound.io/Filter": true, + "guardduty.aws.upbound.io/Member": false, + "iam.aws.upbound.io/AccessKey": false, + "iam.aws.upbound.io/AccountAlias": false, + "iam.aws.upbound.io/AccountPasswordPolicy": false, + "iam.aws.upbound.io/GroupMembership": false, + "iam.aws.upbound.io/GroupPolicyAttachment": false, + "iam.aws.upbound.io/Group": false, + "iam.aws.upbound.io/InstanceProfile": true, + "iam.aws.upbound.io/OpenIDConnectProvider": true, + "iam.aws.upbound.io/Policy": true, + "iam.aws.upbound.io/RolePolicy": false, + "iam.aws.upbound.io/RolePolicyAttachment": false, + "iam.aws.upbound.io/Role": true, + "iam.aws.upbound.io/SAMLProvider": true, + "iam.aws.upbound.io/ServerCertificate": true, + "iam.aws.upbound.io/ServiceLinkedRole": true, + "iam.aws.upbound.io/ServiceSpecificCredential": false, + "iam.aws.upbound.io/SigningCertificate": false, + "iam.aws.upbound.io/UserGroupMembership": false, + "iam.aws.upbound.io/UserLoginProfile": false, + "iam.aws.upbound.io/UserPolicyAttachment": false, + "iam.aws.upbound.io/User": true, + "iam.aws.upbound.io/UserSSHKey": false, + "iam.aws.upbound.io/VirtualMfaDevice": true, + "identitystore.aws.upbound.io/GroupMembership": false, + "identitystore.aws.upbound.io/Group": false, + "identitystore.aws.upbound.io/User": false, + "imagebuilder.aws.upbound.io/Component": true, + "imagebuilder.aws.upbound.io/ContainerRecipe": true, + "imagebuilder.aws.upbound.io/DistributionConfiguration": true, + "imagebuilder.aws.upbound.io/ImagePipeline": true, + "imagebuilder.aws.upbound.io/ImageRecipe": true, + "imagebuilder.aws.upbound.io/Image": true, + "imagebuilder.aws.upbound.io/InfrastructureConfiguration": true, + "inspector.aws.upbound.io/AssessmentTarget": false, + "inspector.aws.upbound.io/AssessmentTemplate": true, + "inspector.aws.upbound.io/ResourceGroup": true, + "inspector2.aws.upbound.io/Enabler": false, + "iot.aws.upbound.io/Certificate": false, + "iot.aws.upbound.io/IndexingConfiguration": false, + "iot.aws.upbound.io/LoggingOptions": false, + "iot.aws.upbound.io/Policy": true, + "iot.aws.upbound.io/PolicyAttachment": false, + "iot.aws.upbound.io/ProvisioningTemplate": true, + "iot.aws.upbound.io/RoleAlias": true, + "iot.aws.upbound.io/ThingGroupMembership": false, + "iot.aws.upbound.io/ThingGroup": true, + "iot.aws.upbound.io/ThingPrincipalAttachment": false, + "iot.aws.upbound.io/Thing": false, + "iot.aws.upbound.io/ThingType": true, + "iot.aws.upbound.io/TopicRuleDestination": false, + "iot.aws.upbound.io/TopicRule": true, + "ivs.aws.upbound.io/Channel": true, + "ivs.aws.upbound.io/RecordingConfiguration": true, + "kafka.aws.upbound.io/Cluster": true, + "kafka.aws.upbound.io/Configuration": false, + "kafka.aws.upbound.io/ScramSecretAssociation": false, + "kafka.aws.upbound.io/ServerlessCluster": true, + "kafkaconnect.aws.upbound.io/Connector": true, + "kafkaconnect.aws.upbound.io/CustomPlugin": true, + "kafkaconnect.aws.upbound.io/WorkerConfiguration": true, + "kendra.aws.upbound.io/DataSource": true, + "kendra.aws.upbound.io/Experience": false, + "kendra.aws.upbound.io/Index": true, + "kendra.aws.upbound.io/QuerySuggestionsBlockList": true, + "kendra.aws.upbound.io/Thesaurus": true, + "keyspaces.aws.upbound.io/Keyspace": true, + "keyspaces.aws.upbound.io/Table": true, + "kinesis.aws.upbound.io/StreamConsumer": false, + "kinesis.aws.upbound.io/Stream": true, + "kinesisanalytics.aws.upbound.io/Application": true, + "kinesisanalyticsv2.aws.upbound.io/Application": true, + "kinesisanalyticsv2.aws.upbound.io/ApplicationSnapshot": false, + "kinesisvideo.aws.upbound.io/Stream": true, + "kms.aws.upbound.io/Alias": false, + "kms.aws.upbound.io/Ciphertext": false, + "kms.aws.upbound.io/ExternalKey": true, + "kms.aws.upbound.io/Grant": false, + "kms.aws.upbound.io/Key": true, + "kms.aws.upbound.io/ReplicaExternalKey": true, + "kms.aws.upbound.io/ReplicaKey": true, + "lakeformation.aws.upbound.io/DataLakeSettings": false, + "lakeformation.aws.upbound.io/Permissions": false, + "lakeformation.aws.upbound.io/Resource": false, + "lambda.aws.upbound.io/Alias": false, + "lambda.aws.upbound.io/CodeSigningConfig": false, + "lambda.aws.upbound.io/EventSourceMapping": false, + "lambda.aws.upbound.io/FunctionEventInvokeConfig": false, + "lambda.aws.upbound.io/Function": true, + "lambda.aws.upbound.io/FunctionURL": false, + "lambda.aws.upbound.io/Invocation": false, + "lambda.aws.upbound.io/LayerVersionPermission": false, + "lambda.aws.upbound.io/LayerVersion": false, + "lambda.aws.upbound.io/Permission": false, + "lambda.aws.upbound.io/ProvisionedConcurrencyConfig": false, + "lexmodels.aws.upbound.io/BotAlias": false, + "lexmodels.aws.upbound.io/Bot": false, + "lexmodels.aws.upbound.io/Intent": false, + "lexmodels.aws.upbound.io/SlotType": false, + "licensemanager.aws.upbound.io/Association": false, + "licensemanager.aws.upbound.io/LicenseConfiguration": true, + "lightsail.aws.upbound.io/Bucket": true, + "lightsail.aws.upbound.io/Certificate": true, + "lightsail.aws.upbound.io/ContainerService": true, + "lightsail.aws.upbound.io/DiskAttachment": false, + "lightsail.aws.upbound.io/Disk": true, + "lightsail.aws.upbound.io/DomainEntry": false, + "lightsail.aws.upbound.io/Domain": false, + "lightsail.aws.upbound.io/InstancePublicPorts": false, + "lightsail.aws.upbound.io/Instance": true, + "lightsail.aws.upbound.io/KeyPair": true, + "lightsail.aws.upbound.io/LBAttachment": false, + "lightsail.aws.upbound.io/LBCertificate": false, + "lightsail.aws.upbound.io/LB": true, + "lightsail.aws.upbound.io/LBStickinessPolicy": false, + "lightsail.aws.upbound.io/StaticIPAttachment": false, + "lightsail.aws.upbound.io/StaticIP": false, + "location.aws.upbound.io/GeofenceCollection": true, + "location.aws.upbound.io/PlaceIndex": true, + "location.aws.upbound.io/RouteCalculator": true, + "location.aws.upbound.io/TrackerAssociation": false, + "location.aws.upbound.io/Tracker": true, + "macie2.aws.upbound.io/Account": false, + "macie2.aws.upbound.io/ClassificationJob": true, + "macie2.aws.upbound.io/CustomDataIdentifier": true, + "macie2.aws.upbound.io/FindingsFilter": true, + "macie2.aws.upbound.io/InvitationAccepter": false, + "macie2.aws.upbound.io/Member": true, + "mediaconvert.aws.upbound.io/Queue": true, + "medialive.aws.upbound.io/Channel": true, + "medialive.aws.upbound.io/Input": true, + "medialive.aws.upbound.io/InputSecurityGroup": true, + "medialive.aws.upbound.io/Multiplex": true, + "mediapackage.aws.upbound.io/Channel": true, + "mediastore.aws.upbound.io/ContainerPolicy": false, + "mediastore.aws.upbound.io/Container": true, + "memorydb.aws.upbound.io/ACL": true, + "memorydb.aws.upbound.io/Cluster": true, + "memorydb.aws.upbound.io/ParameterGroup": true, + "memorydb.aws.upbound.io/Snapshot": true, + "memorydb.aws.upbound.io/SubnetGroup": true, + "memorydb.aws.upbound.io/User": true, + "mq.aws.upbound.io/Broker": true, + "mq.aws.upbound.io/Configuration": true, + "mq.aws.upbound.io/User": false, + "mwaa.aws.upbound.io/Environment": true, + "neptune.aws.upbound.io/ClusterEndpoint": true, + "neptune.aws.upbound.io/ClusterInstance": true, + "neptune.aws.upbound.io/ClusterParameterGroup": true, + "neptune.aws.upbound.io/Cluster": true, + "neptune.aws.upbound.io/ClusterSnapshot": false, + "neptune.aws.upbound.io/EventSubscription": true, + "neptune.aws.upbound.io/GlobalCluster": false, + "neptune.aws.upbound.io/ParameterGroup": true, + "neptune.aws.upbound.io/SubnetGroup": true, + "networkfirewall.aws.upbound.io/FirewallPolicy": true, + "networkfirewall.aws.upbound.io/Firewall": true, + "networkfirewall.aws.upbound.io/LoggingConfiguration": false, + "networkfirewall.aws.upbound.io/RuleGroup": true, + "networkmanager.aws.upbound.io/AttachmentAccepter": false, + "networkmanager.aws.upbound.io/ConnectAttachment": true, + "networkmanager.aws.upbound.io/Connection": true, + "networkmanager.aws.upbound.io/CoreNetwork": true, + "networkmanager.aws.upbound.io/CustomerGatewayAssociation": false, + "networkmanager.aws.upbound.io/Device": true, + "networkmanager.aws.upbound.io/GlobalNetwork": true, + "networkmanager.aws.upbound.io/LinkAssociation": false, + "networkmanager.aws.upbound.io/Link": true, + "networkmanager.aws.upbound.io/Site": true, + "networkmanager.aws.upbound.io/TransitGatewayConnectPeerAssociation": false, + "networkmanager.aws.upbound.io/TransitGatewayRegistration": false, + "networkmanager.aws.upbound.io/VPCAttachment": true, + "opensearch.aws.upbound.io/DomainPolicy": false, + "opensearch.aws.upbound.io/Domain": true, + "opensearch.aws.upbound.io/DomainSAMLOptions": false, + "opensearchserverless.aws.upbound.io/AccessPolicy": false, + "opensearchserverless.aws.upbound.io/Collection": true, + "opensearchserverless.aws.upbound.io/LifecyclePolicy": false, + "opensearchserverless.aws.upbound.io/SecurityConfig": false, + "opensearchserverless.aws.upbound.io/SecurityPolicy": false, + "opensearchserverless.aws.upbound.io/VPCEndpoint": false, + "opsworks.aws.upbound.io/Application": false, + "opsworks.aws.upbound.io/CustomLayer": true, + "opsworks.aws.upbound.io/EcsClusterLayer": true, + "opsworks.aws.upbound.io/GangliaLayer": true, + "opsworks.aws.upbound.io/HAProxyLayer": true, + "opsworks.aws.upbound.io/Instance": false, + "opsworks.aws.upbound.io/JavaAppLayer": true, + "opsworks.aws.upbound.io/MemcachedLayer": true, + "opsworks.aws.upbound.io/MySQLLayer": true, + "opsworks.aws.upbound.io/NodeJSAppLayer": true, + "opsworks.aws.upbound.io/Permission": false, + "opsworks.aws.upbound.io/PHPAppLayer": true, + "opsworks.aws.upbound.io/RailsAppLayer": true, + "opsworks.aws.upbound.io/RDSDBInstance": false, + "opsworks.aws.upbound.io/Stack": true, + "opsworks.aws.upbound.io/StaticWebLayer": true, + "opsworks.aws.upbound.io/UserProfile": false, + "organizations.aws.upbound.io/Account": true, + "organizations.aws.upbound.io/DelegatedAdministrator": false, + "organizations.aws.upbound.io/OrganizationalUnit": true, + "organizations.aws.upbound.io/Organization": false, + "organizations.aws.upbound.io/Policy": true, + "organizations.aws.upbound.io/PolicyAttachment": false, + "pinpoint.aws.upbound.io/App": true, + "pinpoint.aws.upbound.io/SMSChannel": false, + "pipes.aws.upbound.io/Pipe": true, + "qldb.aws.upbound.io/Ledger": true, + "qldb.aws.upbound.io/Stream": true, + "quicksight.aws.upbound.io/Group": false, + "quicksight.aws.upbound.io/User": false, + "ram.aws.upbound.io/PrincipalAssociation": false, + "ram.aws.upbound.io/ResourceAssociation": false, + "ram.aws.upbound.io/ResourceShareAccepter": false, + "ram.aws.upbound.io/ResourceShare": true, + "rds.aws.upbound.io/ClusterActivityStream": false, + "rds.aws.upbound.io/ClusterEndpoint": true, + "rds.aws.upbound.io/ClusterInstance": true, + "rds.aws.upbound.io/ClusterParameterGroup": true, + "rds.aws.upbound.io/ClusterRoleAssociation": false, + "rds.aws.upbound.io/Cluster": true, + "rds.aws.upbound.io/ClusterSnapshot": true, + "rds.aws.upbound.io/DBInstanceAutomatedBackupsReplication": false, + "rds.aws.upbound.io/DBSnapshotCopy": true, + "rds.aws.upbound.io/EventSubscription": true, + "rds.aws.upbound.io/GlobalCluster": false, + "rds.aws.upbound.io/InstanceRoleAssociation": false, + "rds.aws.upbound.io/Instance": true, + "rds.aws.upbound.io/OptionGroup": true, + "rds.aws.upbound.io/ParameterGroup": true, + "rds.aws.upbound.io/Proxy": true, + "rds.aws.upbound.io/ProxyDefaultTargetGroup": false, + "rds.aws.upbound.io/ProxyEndpoint": true, + "rds.aws.upbound.io/ProxyTarget": false, + "rds.aws.upbound.io/Snapshot": true, + "rds.aws.upbound.io/SubnetGroup": true, + "redshift.aws.upbound.io/AuthenticationProfile": false, + "redshift.aws.upbound.io/Cluster": true, + "redshift.aws.upbound.io/EndpointAccess": false, + "redshift.aws.upbound.io/EventSubscription": true, + "redshift.aws.upbound.io/HSMClientCertificate": true, + "redshift.aws.upbound.io/HSMConfiguration": true, + "redshift.aws.upbound.io/ParameterGroup": true, + "redshift.aws.upbound.io/ScheduledAction": false, + "redshift.aws.upbound.io/SnapshotCopyGrant": true, + "redshift.aws.upbound.io/SnapshotScheduleAssociation": false, + "redshift.aws.upbound.io/SnapshotSchedule": true, + "redshift.aws.upbound.io/SubnetGroup": true, + "redshift.aws.upbound.io/UsageLimit": true, + "redshiftserverless.aws.upbound.io/EndpointAccess": false, + "redshiftserverless.aws.upbound.io/RedshiftServerlessNamespace": true, + "redshiftserverless.aws.upbound.io/ResourcePolicy": false, + "redshiftserverless.aws.upbound.io/Snapshot": false, + "redshiftserverless.aws.upbound.io/UsageLimit": false, + "redshiftserverless.aws.upbound.io/Workgroup": true, + "resourcegroups.aws.upbound.io/Group": true, + "rolesanywhere.aws.upbound.io/Profile": true, + "route53.aws.upbound.io/DelegationSet": false, + "route53.aws.upbound.io/HealthCheck": true, + "route53.aws.upbound.io/HostedZoneDNSSEC": false, + "route53.aws.upbound.io/Record": false, + "route53.aws.upbound.io/ResolverConfig": false, + "route53.aws.upbound.io/TrafficPolicy": false, + "route53.aws.upbound.io/TrafficPolicyInstance": false, + "route53.aws.upbound.io/VPCAssociationAuthorization": false, + "route53.aws.upbound.io/ZoneAssociation": false, + "route53.aws.upbound.io/Zone": true, + "route53recoverycontrolconfig.aws.upbound.io/Cluster": false, + "route53recoverycontrolconfig.aws.upbound.io/ControlPanel": false, + "route53recoverycontrolconfig.aws.upbound.io/RoutingControl": false, + "route53recoverycontrolconfig.aws.upbound.io/SafetyRule": false, + "route53recoveryreadiness.aws.upbound.io/Cell": true, + "route53recoveryreadiness.aws.upbound.io/ReadinessCheck": true, + "route53recoveryreadiness.aws.upbound.io/RecoveryGroup": true, + "route53recoveryreadiness.aws.upbound.io/ResourceSet": true, + "route53resolver.aws.upbound.io/Endpoint": true, + "route53resolver.aws.upbound.io/RuleAssociation": false, + "route53resolver.aws.upbound.io/Rule": true, + "rum.aws.upbound.io/AppMonitor": true, + "rum.aws.upbound.io/MetricsDestination": false, + "s3.aws.upbound.io/BucketAccelerateConfiguration": false, + "s3.aws.upbound.io/BucketACL": false, + "s3.aws.upbound.io/BucketAnalyticsConfiguration": false, + "s3.aws.upbound.io/BucketCorsConfiguration": false, + "s3.aws.upbound.io/BucketIntelligentTieringConfiguration": false, + "s3.aws.upbound.io/BucketInventory": false, + "s3.aws.upbound.io/BucketLifecycleConfiguration": false, + "s3.aws.upbound.io/BucketLogging": false, + "s3.aws.upbound.io/BucketMetric": false, + "s3.aws.upbound.io/BucketNotification": false, + "s3.aws.upbound.io/BucketObjectLockConfiguration": false, + "s3.aws.upbound.io/BucketObject": true, + "s3.aws.upbound.io/BucketOwnershipControls": false, + "s3.aws.upbound.io/BucketPolicy": false, + "s3.aws.upbound.io/BucketPublicAccessBlock": false, + "s3.aws.upbound.io/BucketReplicationConfiguration": false, + "s3.aws.upbound.io/BucketRequestPaymentConfiguration": false, + "s3.aws.upbound.io/Bucket": true, + "s3.aws.upbound.io/BucketServerSideEncryptionConfiguration": false, + "s3.aws.upbound.io/BucketVersioning": false, + "s3.aws.upbound.io/BucketWebsiteConfiguration": false, + "s3.aws.upbound.io/DirectoryBucket": false, + "s3.aws.upbound.io/ObjectCopy": true, + "s3.aws.upbound.io/Object": true, + "s3control.aws.upbound.io/AccessPointPolicy": false, + "s3control.aws.upbound.io/AccessPoint": false, + "s3control.aws.upbound.io/AccountPublicAccessBlock": false, + "s3control.aws.upbound.io/MultiRegionAccessPointPolicy": false, + "s3control.aws.upbound.io/MultiRegionAccessPoint": false, + "s3control.aws.upbound.io/ObjectLambdaAccessPointPolicy": false, + "s3control.aws.upbound.io/ObjectLambdaAccessPoint": false, + "s3control.aws.upbound.io/StorageLensConfiguration": true, + "sagemaker.aws.upbound.io/AppImageConfig": true, + "sagemaker.aws.upbound.io/App": true, + "sagemaker.aws.upbound.io/CodeRepository": true, + "sagemaker.aws.upbound.io/DeviceFleet": true, + "sagemaker.aws.upbound.io/Device": false, + "sagemaker.aws.upbound.io/Domain": true, + "sagemaker.aws.upbound.io/EndpointConfiguration": true, + "sagemaker.aws.upbound.io/Endpoint": true, + "sagemaker.aws.upbound.io/FeatureGroup": true, + "sagemaker.aws.upbound.io/Image": true, + "sagemaker.aws.upbound.io/ImageVersion": false, + "sagemaker.aws.upbound.io/ModelPackageGroupPolicy": false, + "sagemaker.aws.upbound.io/ModelPackageGroup": true, + "sagemaker.aws.upbound.io/Model": true, + "sagemaker.aws.upbound.io/NotebookInstanceLifecycleConfiguration": false, + "sagemaker.aws.upbound.io/NotebookInstance": true, + "sagemaker.aws.upbound.io/ServicecatalogPortfolioStatus": false, + "sagemaker.aws.upbound.io/Space": true, + "sagemaker.aws.upbound.io/StudioLifecycleConfig": true, + "sagemaker.aws.upbound.io/UserProfile": true, + "sagemaker.aws.upbound.io/Workforce": false, + "sagemaker.aws.upbound.io/Workteam": true, + "scheduler.aws.upbound.io/ScheduleGroup": true, + "scheduler.aws.upbound.io/Schedule": false, + "schemas.aws.upbound.io/Discoverer": true, + "schemas.aws.upbound.io/Registry": true, + "schemas.aws.upbound.io/Schema": true, + "secretsmanager.aws.upbound.io/SecretPolicy": false, + "secretsmanager.aws.upbound.io/SecretRotation": false, + "secretsmanager.aws.upbound.io/Secret": true, + "secretsmanager.aws.upbound.io/SecretVersion": false, + "securityhub.aws.upbound.io/Account": false, + "securityhub.aws.upbound.io/ActionTarget": false, + "securityhub.aws.upbound.io/FindingAggregator": false, + "securityhub.aws.upbound.io/Insight": false, + "securityhub.aws.upbound.io/InviteAccepter": false, + "securityhub.aws.upbound.io/Member": false, + "securityhub.aws.upbound.io/ProductSubscription": false, + "securityhub.aws.upbound.io/StandardsSubscription": false, + "serverlessrepo.aws.upbound.io/CloudFormationStack": true, + "servicecatalog.aws.upbound.io/BudgetResourceAssociation": false, + "servicecatalog.aws.upbound.io/Constraint": false, + "servicecatalog.aws.upbound.io/Portfolio": true, + "servicecatalog.aws.upbound.io/PortfolioShare": false, + "servicecatalog.aws.upbound.io/PrincipalPortfolioAssociation": false, + "servicecatalog.aws.upbound.io/ProductPortfolioAssociation": false, + "servicecatalog.aws.upbound.io/Product": true, + "servicecatalog.aws.upbound.io/ProvisioningArtifact": false, + "servicecatalog.aws.upbound.io/ServiceAction": false, + "servicecatalog.aws.upbound.io/TagOptionResourceAssociation": false, + "servicecatalog.aws.upbound.io/TagOption": false, + "servicediscovery.aws.upbound.io/HTTPNamespace": true, + "servicediscovery.aws.upbound.io/PrivateDNSNamespace": true, + "servicediscovery.aws.upbound.io/PublicDNSNamespace": true, + "servicediscovery.aws.upbound.io/Service": true, + "servicequotas.aws.upbound.io/ServiceQuota": false, + "ses.aws.upbound.io/ActiveReceiptRuleSet": false, + "ses.aws.upbound.io/ConfigurationSet": false, + "ses.aws.upbound.io/DomainDKIM": false, + "ses.aws.upbound.io/DomainIdentity": false, + "ses.aws.upbound.io/DomainMailFrom": false, + "ses.aws.upbound.io/EmailIdentity": false, + "ses.aws.upbound.io/EventDestination": false, + "ses.aws.upbound.io/IdentityNotificationTopic": false, + "ses.aws.upbound.io/IdentityPolicy": false, + "ses.aws.upbound.io/ReceiptFilter": false, + "ses.aws.upbound.io/ReceiptRule": false, + "ses.aws.upbound.io/ReceiptRuleSet": false, + "ses.aws.upbound.io/Template": false, + "sesv2.aws.upbound.io/ConfigurationSetEventDestination": false, + "sesv2.aws.upbound.io/ConfigurationSet": true, + "sesv2.aws.upbound.io/DedicatedIPPool": true, + "sesv2.aws.upbound.io/EmailIdentity": true, + "sesv2.aws.upbound.io/EmailIdentityFeedbackAttributes": false, + "sesv2.aws.upbound.io/EmailIdentityMailFromAttributes": false, + "sfn.aws.upbound.io/Activity": true, + "sfn.aws.upbound.io/StateMachine": true, + "signer.aws.upbound.io/SigningJob": false, + "signer.aws.upbound.io/SigningProfilePermission": false, + "signer.aws.upbound.io/SigningProfile": true, + "simpledb.aws.upbound.io/Domain": false, + "sns.aws.upbound.io/PlatformApplication": false, + "sns.aws.upbound.io/SMSPreferences": false, + "sns.aws.upbound.io/TopicPolicy": false, + "sns.aws.upbound.io/Topic": true, + "sns.aws.upbound.io/TopicSubscription": false, + "sqs.aws.upbound.io/QueuePolicy": false, + "sqs.aws.upbound.io/QueueRedriveAllowPolicy": false, + "sqs.aws.upbound.io/QueueRedrivePolicy": false, + "sqs.aws.upbound.io/Queue": true, + "ssm.aws.upbound.io/Activation": true, + "ssm.aws.upbound.io/Association": true, + "ssm.aws.upbound.io/DefaultPatchBaseline": false, + "ssm.aws.upbound.io/Document": true, + "ssm.aws.upbound.io/MaintenanceWindow": true, + "ssm.aws.upbound.io/MaintenanceWindowTarget": false, + "ssm.aws.upbound.io/MaintenanceWindowTask": false, + "ssm.aws.upbound.io/Parameter": true, + "ssm.aws.upbound.io/PatchBaseline": true, + "ssm.aws.upbound.io/PatchGroup": false, + "ssm.aws.upbound.io/ResourceDataSync": false, + "ssm.aws.upbound.io/ServiceSetting": false, + "ssoadmin.aws.upbound.io/AccountAssignment": false, + "ssoadmin.aws.upbound.io/CustomerManagedPolicyAttachment": false, + "ssoadmin.aws.upbound.io/InstanceAccessControlAttributes": false, + "ssoadmin.aws.upbound.io/ManagedPolicyAttachment": false, + "ssoadmin.aws.upbound.io/PermissionsBoundaryAttachment": false, + "ssoadmin.aws.upbound.io/PermissionSetInlinePolicy": false, + "ssoadmin.aws.upbound.io/PermissionSet": true, + "swf.aws.upbound.io/Domain": true, + "timestreamwrite.aws.upbound.io/Database": true, + "timestreamwrite.aws.upbound.io/Table": true, + "transcribe.aws.upbound.io/LanguageModel": true, + "transcribe.aws.upbound.io/Vocabulary": true, + "transcribe.aws.upbound.io/VocabularyFilter": true, + "transfer.aws.upbound.io/Connector": true, + "transfer.aws.upbound.io/Server": true, + "transfer.aws.upbound.io/SSHKey": false, + "transfer.aws.upbound.io/Tag": false, + "transfer.aws.upbound.io/User": true, + "transfer.aws.upbound.io/Workflow": true, + "vpc.aws.upbound.io/NetworkPerformanceMetricSubscription": false, + "waf.aws.upbound.io/ByteMatchSet": false, + "waf.aws.upbound.io/GeoMatchSet": false, + "waf.aws.upbound.io/IPSet": false, + "waf.aws.upbound.io/RateBasedRule": true, + "waf.aws.upbound.io/RegexMatchSet": false, + "waf.aws.upbound.io/RegexPatternSet": false, + "waf.aws.upbound.io/Rule": true, + "waf.aws.upbound.io/SizeConstraintSet": false, + "waf.aws.upbound.io/SQLInjectionMatchSet": false, + "waf.aws.upbound.io/WebACL": true, + "waf.aws.upbound.io/XSSMatchSet": false, + "wafregional.aws.upbound.io/ByteMatchSet": false, + "wafregional.aws.upbound.io/GeoMatchSet": false, + "wafregional.aws.upbound.io/IPSet": false, + "wafregional.aws.upbound.io/RateBasedRule": true, + "wafregional.aws.upbound.io/RegexMatchSet": false, + "wafregional.aws.upbound.io/RegexPatternSet": false, + "wafregional.aws.upbound.io/Rule": true, + "wafregional.aws.upbound.io/SizeConstraintSet": false, + "wafregional.aws.upbound.io/SQLInjectionMatchSet": false, + "wafregional.aws.upbound.io/WebACL": true, + "wafregional.aws.upbound.io/XSSMatchSet": false, + "wafv2.aws.upbound.io/IPSet": true, + "wafv2.aws.upbound.io/RegexPatternSet": true, + "workspaces.aws.upbound.io/Directory": true, + "workspaces.aws.upbound.io/IPGroup": true, + "xray.aws.upbound.io/EncryptionConfig": false, + "xray.aws.upbound.io/Group": true, + "xray.aws.upbound.io/SamplingRule": true, + } +} diff --git a/filter_test.go b/filter_test.go index d519992..33a3436 100644 --- a/filter_test.go +++ b/filter_test.go @@ -9,6 +9,7 @@ import ( ) func TestSupportedManagedResource(t *testing.T) { + AWSResourceFilter := NewAWSResourceFilter() type args struct { desired *resource.DesiredComposed filter ResourceFilter @@ -22,22 +23,23 @@ func TestSupportedManagedResource(t *testing.T) { reason: "Kubernetes GVK is invalid", args: args{ desired: &resource.DesiredComposed{ - Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{Object: map[string]any{ - "metadata": map[string]any{ - "name": "test-resource", - "labels": map[string]any{ - IgnoreResourceLabel: "False", + Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{ + Object: map[string]any{ + "metadata": map[string]any{ + "name": "test-resource", + "labels": map[string]any{ + IgnoreResourceLabel: "False", + }, }, - }, - "spec": map[string]any{ - "forProvider": map[string]any{ - "region": "us-west-1", + "spec": map[string]any{ + "forProvider": map[string]any{ + "region": "us-west-1", + }, }, }, - }, }}, }, - filter: ManagedResourceFilter, + filter: AWSResourceFilter, }, want: false, }, @@ -45,24 +47,25 @@ func TestSupportedManagedResource(t *testing.T) { reason: "Filter Due to API group", args: args{ desired: &resource.DesiredComposed{ - Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{Object: map[string]any{ - "apiVersion": "example.crossplane.io/v1", - "kind": "TagManager", - "metadata": map[string]any{ - "name": "test-resource", - "labels": map[string]any{ - IgnoreResourceLabel: "False", + Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{ + Object: map[string]any{ + "apiVersion": "example.crossplane.io/v1", + "kind": "TagManager", + "metadata": map[string]any{ + "name": "test-resource", + "labels": map[string]any{ + IgnoreResourceLabel: "False", + }, }, - }, - "spec": map[string]any{ - "forProvider": map[string]any{ - "region": "us-west-1", + "spec": map[string]any{ + "forProvider": map[string]any{ + "region": "us-west-1", + }, }, }, - }, }}, }, - filter: ManagedResourceFilter, + filter: AWSResourceFilter, }, want: false, }, @@ -70,21 +73,22 @@ func TestSupportedManagedResource(t *testing.T) { reason: "Include due to API group", args: args{ desired: &resource.DesiredComposed{ - Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{Object: map[string]any{ - "apiVersion": "ec2.aws.upbound.io/v1beta1", - "kind": "VPC", - "metadata": map[string]any{ - "name": "test-resource", - }, - "spec": map[string]any{ - "forProvider": map[string]any{ - "region": "us-west-1", + Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{ + Object: map[string]any{ + "apiVersion": "ec2.aws.upbound.io/v1beta1", + "kind": "VPC", + "metadata": map[string]any{ + "name": "test-resource", + }, + "spec": map[string]any{ + "forProvider": map[string]any{ + "region": "us-west-1", + }, }, }, - }, }}, }, - filter: ManagedResourceFilter, + filter: AWSResourceFilter, }, want: true, }, @@ -92,16 +96,17 @@ func TestSupportedManagedResource(t *testing.T) { reason: "Filter Kinds that don't support tags", args: args{ desired: &resource.DesiredComposed{ - Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{Object: map[string]any{ - "apiVersion": "aws.upbound.io/v1beta1", - "kind": "ProviderConfig", - "metadata": map[string]any{ - "name": "test-resource", + Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{ + Object: map[string]any{ + "apiVersion": "aws.upbound.io/v1beta1", + "kind": "ProviderConfig", + "metadata": map[string]any{ + "name": "test-resource", + }, }, - }, }}, }, - filter: ManagedResourceFilter, + filter: AWSResourceFilter, }, want: false, }, @@ -109,21 +114,22 @@ func TestSupportedManagedResource(t *testing.T) { reason: "Filter Resources that aren't a Managed Resources", args: args{ desired: &resource.DesiredComposed{ - Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{Object: map[string]any{ - "apiVersion": "aws.upbound.io/v1beta1", - "kind": "NotAnMR", - "metadata": map[string]any{ - "name": "test-resource", - }, - "spec": map[string]any{ - "parameters": map[string]any{ - "crossplane": "rocks", + Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{ + Object: map[string]any{ + "apiVersion": "aws.upbound.io/v1beta1", + "kind": "NotAnMR", + "metadata": map[string]any{ + "name": "test-resource", + }, + "spec": map[string]any{ + "parameters": map[string]any{ + "crossplane": "rocks", + }, }, }, - }, }}, }, - filter: ManagedResourceFilter, + filter: AWSResourceFilter, }, want: false, }, diff --git a/fn.go b/fn.go index 0c7db2e..ce9f6f6 100644 --- a/fn.go +++ b/fn.go @@ -4,27 +4,25 @@ import ( "context" "strings" - "github.com/crossplane/crossplane-runtime/pkg/errors" - "github.com/crossplane/crossplane-runtime/pkg/fieldpath" - "github.com/crossplane/crossplane-runtime/pkg/logging" - + "github.com/crossplane-contrib/function-tag-manager/input/v1beta1" + fnv1 "github.com/crossplane/function-sdk-go/proto/v1" "github.com/crossplane/function-sdk-go/request" "github.com/crossplane/function-sdk-go/resource" "github.com/crossplane/function-sdk-go/response" - "github.com/crossplane-contrib/function-tag-manager/input/v1beta1" - fnv1 "github.com/crossplane/function-sdk-go/proto/v1" + "github.com/crossplane/crossplane-runtime/pkg/errors" + "github.com/crossplane/crossplane-runtime/pkg/fieldpath" + "github.com/crossplane/crossplane-runtime/pkg/logging" ) // Function returns whatever response you ask it to. -// not working type Function struct { fnv1.FunctionRunnerServiceServer log logging.Logger } -// RunFunction runs the Function +// RunFunction runs the Function. func (f *Function) RunFunction(_ context.Context, req *fnv1.RunFunctionRequest) (*fnv1.RunFunctionResponse, error) { f.log.Info("Running Function", "tag-manager", req.GetMeta().GetTag()) @@ -66,13 +64,14 @@ func (f *Function) RunFunction(_ context.Context, req *fnv1.RunFunctionRequest) return rsp, nil } + resourceFilter := NewAWSResourceFilter() for name, desired := range desiredComposed { desired.Resource.GetObjectKind() if IgnoreResource(desired) { f.log.Debug("skipping resource due to label", string(name), desired.Resource.GroupVersionKind().String()) continue } - if !SupportedManagedResource(desired, ManagedResourceFilter) { + if !SupportedManagedResource(desired, resourceFilter) { f.log.Debug("skipping resource that doesn't support tags", string(name), desired.Resource.GroupVersionKind().String()) continue } @@ -112,7 +111,7 @@ func (f *Function) RunFunction(_ context.Context, req *fnv1.RunFunctionRequest) return rsp, nil } -// IgnoreResource whether this resource has a label set to ignore +// IgnoreResource whether this resource has a label set to ignore. func IgnoreResource(dc *resource.DesiredComposed) bool { if dc == nil { return true @@ -121,11 +120,11 @@ func IgnoreResource(dc *resource.DesiredComposed) bool { err := fieldpath.Pave(dc.Resource.Object).GetValueInto("metadata.labels", &labels) if err != nil { return false - } else { - val, ok := labels[IgnoreResourceLabel].(string) - if ok && strings.ToLower(val) == "true" { - return true - } } + val, ok := labels[IgnoreResourceLabel].(string) + if ok && strings.EqualFold(val, "true") { + return true + } + return false } diff --git a/fn_test.go b/fn_test.go index ab2e0df..27bf5d3 100644 --- a/fn_test.go +++ b/fn_test.go @@ -4,7 +4,6 @@ import ( "context" "testing" - "github.com/crossplane/crossplane-runtime/pkg/logging" fnv1 "github.com/crossplane/function-sdk-go/proto/v1" "github.com/crossplane/function-sdk-go/resource" "github.com/crossplane/function-sdk-go/resource/composed" @@ -14,10 +13,11 @@ import ( "google.golang.org/protobuf/testing/protocmp" "google.golang.org/protobuf/types/known/durationpb" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + + "github.com/crossplane/crossplane-runtime/pkg/logging" ) func TestRunFunction(t *testing.T) { - type args struct { ctx context.Context req *fnv1.RunFunctionRequest @@ -197,17 +197,19 @@ func TestIgnoreResource(t *testing.T) { reason: "A resource with Label set to true returns true", args: args{ res: &resource.DesiredComposed{ - Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{ - Object: map[string]any{ - "apiVersion": "example.crossplane.io/v1", - "kind": "TagManager", - "metadata": map[string]any{ - "name": "test-resource", - "labels": map[string]any{ - IgnoreResourceLabel: "True", + Resource: &composed.Unstructured{ + Unstructured: unstructured.Unstructured{ + Object: map[string]any{ + "apiVersion": "example.crossplane.io/v1", + "kind": "TagManager", + "metadata": map[string]any{ + "name": "test-resource", + "labels": map[string]any{ + IgnoreResourceLabel: "True", + }, }, }, - }}, + }, }, }, }, @@ -217,16 +219,17 @@ func TestIgnoreResource(t *testing.T) { reason: "Label value should support mixed case", args: args{ res: &resource.DesiredComposed{ - Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{Object: map[string]any{ - "apiVersion": "example.crossplane.io/v1", - "kind": "TagManager", - "metadata": map[string]any{ - "name": "test-resource", - "labels": map[string]any{ - IgnoreResourceLabel: "trUe", + Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{ + Object: map[string]any{ + "apiVersion": "example.crossplane.io/v1", + "kind": "TagManager", + "metadata": map[string]any{ + "name": "test-resource", + "labels": map[string]any{ + IgnoreResourceLabel: "trUe", + }, }, }, - }, }}, }, }, @@ -236,16 +239,17 @@ func TestIgnoreResource(t *testing.T) { reason: "A resource with label set to not true returns false", args: args{ res: &resource.DesiredComposed{ - Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{Object: map[string]any{ - "apiVersion": "example.crossplane.io/v1", - "kind": "TagManager", - "metadata": map[string]any{ - "name": "test-resource", - "labels": map[string]any{ - IgnoreResourceLabel: "False", + Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{ + Object: map[string]any{ + "apiVersion": "example.crossplane.io/v1", + "kind": "TagManager", + "metadata": map[string]any{ + "name": "test-resource", + "labels": map[string]any{ + IgnoreResourceLabel: "False", + }, }, }, - }, }}, }, }, diff --git a/input/v1beta1/input.go b/input/v1beta1/input.go index b378625..09202d8 100644 --- a/input/v1beta1/input.go +++ b/input/v1beta1/input.go @@ -11,10 +11,7 @@ import ( // This isn't a custom resource, in the sense that we never install its CRD. // It is a KRM-like object, so we generate a CRD to describe its schema. -// TODO: Add your input type here! It doesn't need to be called 'Input', you can -// rename it to anything you like. - -// Input can be used to provide input to this Function. +// ManagedTags can be used to provide input to this Function. // +kubebuilder:object:root=true // +kubebuilder:storageversion // +kubebuilder:resource:categories=crossplane @@ -22,7 +19,7 @@ type ManagedTags struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` - // AddTags are fields that will be added to every composed resource + // AddTags are fields that will be added to every composed resource. // +optional AddTags []AddTag `json:"addTags,omitempty"` @@ -31,33 +28,36 @@ type ManagedTags struct { // +optional IgnoreTags IgnoreTags `json:"ignoreTags,omitempty"` - // IgnoreTags is a list of tag keys to remove from the resource + // IgnoreTags is a list of tag keys to remove from the resource. // +optional RemoveTags RemoveTags `json:"removeTags,omitempty"` } +// Tags contains a map tags. type Tags map[string]string -// TagManagerType configures where we get tags from +// TagManagerType configures the source of the input tags. type TagManagerType string const ( + // FromCompositeFieldPath instructs the function to get tag settings from the Composite fieldpath. FromCompositeFieldPath TagManagerType = "FromCompositeFieldPath" - FromValue TagManagerType = "FromValue" + // FromValue are static values set in the function's input. + FromValue TagManagerType = "FromValue" ) -// TagManagerPolicy sets what happens when the tag exists in the resource +// TagManagerPolicy sets what happens when the tag exists in the resource. type TagManagerPolicy string const ( - // ExistingTagPolicyReplace replaces the desired value of a tag if the observed tag differs + // ExistingTagPolicyReplace replaces the desired value of a tag if the observed tag differs. ExistingTagPolicyReplace TagManagerPolicy = "Replace" - // ExistingTagPolicyReplace retains the desired value of a tag if the observed tag differs + // ExistingTagPolicyRetain retains the desired value of a tag if the observed tag differs. ExistingTagPolicyRetain TagManagerPolicy = "Retain" ) +// AddTag defines tags that should be added to every resource. type AddTag struct { - // Type determines where tags are sourced from. FromValue are inline // to the composition. FromCompositeFieldPath fetches tags from a field in // the composite resource @@ -104,6 +104,7 @@ type IgnoreTag struct { Policy TagManagerPolicy `json:"policy,omitempty"` } +// IgnoreTags is a list of IgnoreTag settings. type IgnoreTags []IgnoreTag // RemoveTag is a tag that removed from the desired state. @@ -124,8 +125,10 @@ type RemoveTag struct { Keys []string `json:"keys,omitempty"` } +// RemoveTags is an array of RemoveTag settings. type RemoveTags []RemoveTag +// GetType returns the type of the managed tag. func (a *AddTag) GetType() TagManagerType { if a == nil || a.Type == "" { return FromValue @@ -133,6 +136,7 @@ func (a *AddTag) GetType() TagManagerType { return a.Type } +// GetPolicy returns the add tag policy. func (a *AddTag) GetPolicy() TagManagerPolicy { if a == nil || a.Type == "" { return ExistingTagPolicyReplace @@ -140,6 +144,7 @@ func (a *AddTag) GetPolicy() TagManagerPolicy { return a.Policy } +// GetType returns the type of the managed tag. func (i *IgnoreTag) GetType() TagManagerType { if i == nil || i.Type == "" { return FromValue @@ -147,27 +152,15 @@ func (i *IgnoreTag) GetType() TagManagerType { return i.Type } -func (a *IgnoreTag) GetPolicy() TagManagerPolicy { - if a == nil || a.Type == "" { +// GetPolicy returns the tag policy. +func (i *IgnoreTag) GetPolicy() TagManagerPolicy { + if i == nil || i.Type == "" { return ExistingTagPolicyReplace } - return a.Policy -} - -func GetKeys(i []IgnoreTag) []string { - var keys []string - for _, tag := range i { - switch t := tag.GetType(); t { - case FromValue: - if tag.Keys != nil { - keys = append(keys, tag.Keys...) - } - } - - } - return keys + return i.Policy } +// GetType returns the type of the managed tag. func (a *RemoveTag) GetType() TagManagerType { if a == nil || a.Type == "" { return FromValue diff --git a/main.go b/main.go index 88f0def..1ae6886 100644 --- a/main.go +++ b/main.go @@ -3,7 +3,6 @@ package main import ( "github.com/alecthomas/kong" - "github.com/crossplane/function-sdk-go" ) diff --git a/tags.go b/tags.go index 7006597..e36fbfa 100644 --- a/tags.go +++ b/tags.go @@ -3,27 +3,28 @@ package main import ( "dario.cat/mergo" "github.com/crossplane-contrib/function-tag-manager/input/v1beta1" - "github.com/crossplane/crossplane-runtime/pkg/fieldpath" "github.com/crossplane/function-sdk-go/resource" + + "github.com/crossplane/crossplane-runtime/pkg/fieldpath" ) // IgnoreCrossplaneTags tags added by Crossplane automatically // TODO: implement -var IgnoreCrossplaneTags = []string{"crossplane-kind", "crossplane-name", "crossplane-providerconfig"} +// var IgnoreCrossplaneTags = []string{"crossplane-kind", "crossplane-name", "crossplane-providerconfig"} -// IgnoreResourceAnnotation set this label to `True` or `true` to disable -// this function managing the resource's tags +// IgnoreResourceLabel set this label to `True` or `true` to disable +// this function from managing the resource's tags. const IgnoreResourceLabel = "tag-manager.fn.crossplane.io/ignore-resource" -// TagUpdater contains tags that are to be updated on a Desired Composed Resource +// TagUpdater contains tags that are to be updated on a Desired Composed Resource. type TagUpdater struct { - // Replace the tag values on the Desired Composed Resource will be overwritten if the keys match + // Replace the tag values on the Desired Composed Resource will be overwritten if the keys match. Replace v1beta1.Tags - // Retain the tag values on the Desired Composed Resource if the keys match + // Retain the tag values on the Desired Composed Resource if the keys match. Retain v1beta1.Tags } -// ResolveAddTags returns tags that will be Retained and Replaced +// ResolveAddTags returns tags that will be Retained and Replaced. func (f *Function) ResolveAddTags(in []v1beta1.AddTag, oxr *resource.Composite) TagUpdater { tu := TagUpdater{} for _, at := range in { @@ -46,7 +47,7 @@ func (f *Function) ResolveAddTags(in []v1beta1.AddTag, oxr *resource.Composite) return tu } -// MergeTags merges tags to a Desired Composed Resource +// MergeTags merges tags to a Desired Composed Resource. func MergeTags(desired *resource.DesiredComposed, tu TagUpdater) error { var desiredTags v1beta1.Tags _ = fieldpath.Pave(desired.Resource.Object).GetValueInto("spec.forProvider.tags", &desiredTags) @@ -64,7 +65,7 @@ func MergeTags(desired *resource.DesiredComposed, tu TagUpdater) error { return err } -// ResolveImportTags returns tags that are populated from observed resources +// ResolveIgnoreTags returns tags that are populated from observed resources. func (f *Function) ResolveIgnoreTags(in []v1beta1.IgnoreTag, oxr *resource.Composite, observed *resource.ObservedComposed) *TagUpdater { tu := &TagUpdater{} if observed == nil { @@ -72,7 +73,7 @@ func (f *Function) ResolveIgnoreTags(in []v1beta1.IgnoreTag, oxr *resource.Compo } var observedTags v1beta1.Tags if err := fieldpath.Pave(observed.Resource.Object).GetValueInto("status.atProvider.tags", &observedTags); err != nil { - f.log.Debug("unable to fetch tags from observed resource", string(observed.Resource.GetName()), observed.Resource.GroupVersionKind().String()) + f.log.Debug("unable to fetch tags from observed resource", observed.Resource.GetName(), observed.Resource.GroupVersionKind().String()) return nil } for _, at := range in { @@ -96,19 +97,19 @@ func (f *Function) ResolveIgnoreTags(in []v1beta1.IgnoreTag, oxr *resource.Compo if at.GetPolicy() == v1beta1.ExistingTagPolicyRetain { err := mergo.Map(&tu.Retain, tags) if err != nil { - f.log.Debug("unable to merge tags from observed resource", string(observed.Resource.GetName()), observed.Resource.GroupVersionKind().String(), "error", err.Error()) + f.log.Debug("unable to merge tags from observed resource", observed.Resource.GetName(), observed.Resource.GroupVersionKind().String(), "error", err.Error()) } } else { err := mergo.Map(&tu.Replace, tags) if err != nil { - f.log.Debug("unable to merge tags from observed resource", string(observed.Resource.GetName()), observed.Resource.GroupVersionKind().String(), "error", err.Error()) + f.log.Debug("unable to merge tags from observed resource", observed.Resource.GetName(), observed.Resource.GroupVersionKind().String(), "error", err.Error()) } } } return tu } -// ResolveRemoveTag resolves the list of tag keys that will be removed +// ResolveRemoveTags resolves the list of tag keys that will be removed. func (f *Function) ResolveRemoveTags(in []v1beta1.RemoveTag, oxr *resource.Composite) []string { tagKeys := make([]string, 0) for _, at := range in { @@ -128,7 +129,7 @@ func (f *Function) ResolveRemoveTags(in []v1beta1.RemoveTag, oxr *resource.Compo } // RemoveTags removes tags from a desired composed resource based -// on matching keys +// on matching keys. func RemoveTags(desired *resource.DesiredComposed, keys []string) error { if len(keys) == 0 { return nil diff --git a/tags_test.go b/tags_test.go index 2d5e09f..ddd158b 100644 --- a/tags_test.go +++ b/tags_test.go @@ -4,13 +4,14 @@ import ( "testing" "github.com/crossplane-contrib/function-tag-manager/input/v1beta1" - "github.com/crossplane/crossplane-runtime/pkg/logging" "github.com/crossplane/function-sdk-go/resource" "github.com/crossplane/function-sdk-go/resource/composed" "github.com/crossplane/function-sdk-go/resource/composite" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + + "github.com/crossplane/crossplane-runtime/pkg/logging" ) func TestResolveAddTags(t *testing.T) { @@ -45,7 +46,8 @@ func TestResolveAddTags(t *testing.T) { }, want: want{TagUpdater{ Replace: v1beta1.Tags{"replace": "me"}, - Retain: v1beta1.Tags{"retain": "me", "retain2": "me2"}}}, + Retain: v1beta1.Tags{"retain": "me", "retain2": "me2"}, + }}, }, "DefaultReplace": { reason: "By default tags are replaced", @@ -57,7 +59,8 @@ func TestResolveAddTags(t *testing.T) { }, want: want{TagUpdater{ Replace: v1beta1.Tags{"replace": "me"}, - Retain: v1beta1.Tags{"retain": "me", "retain2": "me2"}}}, + Retain: v1beta1.Tags{"retain": "me", "retain2": "me2"}, + }}, }, "MissingValues": { reason: "With missing values should populate keys only", @@ -69,7 +72,8 @@ func TestResolveAddTags(t *testing.T) { }, want: want{TagUpdater{ Replace: v1beta1.Tags{"replace": "me"}, - Retain: v1beta1.Tags{"retain": "", "retain2": ""}}}, + Retain: v1beta1.Tags{"retain": "", "retain2": ""}, + }}, }, "ValuesFromComposite": { reason: "Test getting tags from XR field Path", @@ -116,7 +120,8 @@ func TestResolveAddTags(t *testing.T) { TagUpdater{ Replace: v1beta1.Tags{"fromField": "fromXR", "fromField2": "fromXR2", "replace": "me"}, Retain: v1beta1.Tags{"optionalKey": "fromXR", "optionalKey2": "fromXR2"}, - }}, + }, + }, }, } f := &Function{log: logging.NewNopLogger()} @@ -149,16 +154,17 @@ func TestAddTags(t *testing.T) { reason: "A basic Test of merging and dealing with a resource with no tags", args: args{ desired: &resource.DesiredComposed{ - Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{Object: map[string]any{ - "apiVersion": "example.crossplane.io/v1", - "kind": "TagManager", - "metadata": map[string]any{ - "name": "test-resource", - "labels": map[string]any{ - IgnoreResourceLabel: "False", + Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{ + Object: map[string]any{ + "apiVersion": "example.crossplane.io/v1", + "kind": "TagManager", + "metadata": map[string]any{ + "name": "test-resource", + "labels": map[string]any{ + IgnoreResourceLabel: "False", + }, }, }, - }, }}, }, tu: TagUpdater{ @@ -168,27 +174,28 @@ func TestAddTags(t *testing.T) { }, want: want{ desired: &resource.DesiredComposed{ - Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{Object: map[string]any{ - "apiVersion": "example.crossplane.io/v1", - "kind": "TagManager", - "metadata": map[string]any{ - "name": "test-resource", - "labels": map[string]any{ - IgnoreResourceLabel: "False", + Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{ + Object: map[string]any{ + "apiVersion": "example.crossplane.io/v1", + "kind": "TagManager", + "metadata": map[string]any{ + "name": "test-resource", + "labels": map[string]any{ + IgnoreResourceLabel: "False", + }, }, - }, - "spec": map[string]any{ - "forProvider": map[string]any{ - "tags": map[string]any{ - "fromField": string("fromXR"), - "fromField2": string("fromXR2"), - "optionalKey": string("fromXR"), - "optionalKey2": string("fromXR2"), - "replace": string("me"), + "spec": map[string]any{ + "forProvider": map[string]any{ + "tags": map[string]any{ + "fromField": string("fromXR"), + "fromField2": string("fromXR2"), + "optionalKey": string("fromXR"), + "optionalKey2": string("fromXR2"), + "replace": string("me"), + }, }, }, }, - }, }}, }, err: nil, @@ -256,7 +263,8 @@ func TestResolveIgnoreTags(t *testing.T) { }, }, }, - }}}, + }, + }}, }, }, want: want{&TagUpdater{}}, @@ -327,7 +335,8 @@ func TestResolveIgnoreTags(t *testing.T) { }, }, }, - }}}, + }, + }}, }, }, want: want{ @@ -386,13 +395,15 @@ func TestResolveRemoveTags(t *testing.T) { reason: "Keys should be populated correctly from simple values", args: args{ in: []v1beta1.RemoveTag{ - {Type: v1beta1.FromValue, + { + Type: v1beta1.FromValue, Keys: []string{ "key1", "key2", }, }, - {Type: v1beta1.FromValue, + { + Type: v1beta1.FromValue, Keys: []string{ "key3", "key4", @@ -408,10 +419,12 @@ func TestResolveRemoveTags(t *testing.T) { reason: "Test getting keys from XR field Path", args: args{ in: []v1beta1.RemoveTag{ - {Type: v1beta1.FromCompositeFieldPath, + { + Type: v1beta1.FromCompositeFieldPath, FromFieldPath: &fieldPath, }, - {Type: v1beta1.FromValue, + { + Type: v1beta1.FromValue, Keys: []string{ "key1", "key2", @@ -472,43 +485,46 @@ func TestRemoveTags(t *testing.T) { reason: "A resource with no tags should be a no-op", args: args{ desired: &resource.DesiredComposed{ - Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{Object: map[string]any{ - "apiVersion": "example.crossplane.io/v1", - "kind": "TagManager", - "metadata": map[string]any{ - "name": "test-resource", - "labels": map[string]any{ - IgnoreResourceLabel: "False", - }, - }, - "spec": map[string]any{ - "forProvider": map[string]any{ - "region": "eu-south", + Resource: &composed.Unstructured{ + Unstructured: unstructured.Unstructured{ + Object: map[string]any{ + "apiVersion": "example.crossplane.io/v1", + "kind": "TagManager", + "metadata": map[string]any{ + "name": "test-resource", + "labels": map[string]any{ + IgnoreResourceLabel: "False", + }, + }, + "spec": map[string]any{ + "forProvider": map[string]any{ + "region": "eu-south", + }, + }, }, }, }, - }, - }, }, keys: []string{"key1", "key2"}, }, want: want{ desired: &resource.DesiredComposed{ - Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{Object: map[string]any{ - "apiVersion": "example.crossplane.io/v1", - "kind": "TagManager", - "metadata": map[string]any{ - "name": "test-resource", - "labels": map[string]any{ - IgnoreResourceLabel: "False", + Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{ + Object: map[string]any{ + "apiVersion": "example.crossplane.io/v1", + "kind": "TagManager", + "metadata": map[string]any{ + "name": "test-resource", + "labels": map[string]any{ + IgnoreResourceLabel: "False", + }, }, - }, - "spec": map[string]any{ - "forProvider": map[string]any{ - "region": "eu-south", + "spec": map[string]any{ + "forProvider": map[string]any{ + "region": "eu-south", + }, }, }, - }, }}, }, err: nil, @@ -518,48 +534,51 @@ func TestRemoveTags(t *testing.T) { reason: "Remove all tags correctly", args: args{ desired: &resource.DesiredComposed{ - Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{Object: map[string]any{ - "apiVersion": "example.crossplane.io/v1", - "kind": "TagManager", - "metadata": map[string]any{ - "name": "test-resource", - "labels": map[string]any{ - IgnoreResourceLabel: "False", - }, - }, - "spec": map[string]any{ - "forProvider": map[string]any{ - "region": "eu-south", - "tags": map[string]any{ - "key1": "value1", - "key2": "value2", + Resource: &composed.Unstructured{ + Unstructured: unstructured.Unstructured{ + Object: map[string]any{ + "apiVersion": "example.crossplane.io/v1", + "kind": "TagManager", + "metadata": map[string]any{ + "name": "test-resource", + "labels": map[string]any{ + IgnoreResourceLabel: "False", + }, + }, + "spec": map[string]any{ + "forProvider": map[string]any{ + "region": "eu-south", + "tags": map[string]any{ + "key1": "value1", + "key2": "value2", + }, + }, }, }, }, }, - }, - }, }, keys: []string{"key1", "key2"}, }, want: want{ desired: &resource.DesiredComposed{ - Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{Object: map[string]any{ - "apiVersion": "example.crossplane.io/v1", - "kind": "TagManager", - "metadata": map[string]any{ - "name": "test-resource", - "labels": map[string]any{ - IgnoreResourceLabel: "False", + Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{ + Object: map[string]any{ + "apiVersion": "example.crossplane.io/v1", + "kind": "TagManager", + "metadata": map[string]any{ + "name": "test-resource", + "labels": map[string]any{ + IgnoreResourceLabel: "False", + }, }, - }, - "spec": map[string]any{ - "forProvider": map[string]any{ - "region": "eu-south", - "tags": map[string]any{}, + "spec": map[string]any{ + "forProvider": map[string]any{ + "region": "eu-south", + "tags": map[string]any{}, + }, }, }, - }, }}, }, err: nil, @@ -569,51 +588,54 @@ func TestRemoveTags(t *testing.T) { reason: "Remove all tags correctly", args: args{ desired: &resource.DesiredComposed{ - Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{Object: map[string]any{ - "apiVersion": "example.crossplane.io/v1", - "kind": "TagManager", - "metadata": map[string]any{ - "name": "test-resource", - "labels": map[string]any{ - IgnoreResourceLabel: "False", - }, - }, - "spec": map[string]any{ - "forProvider": map[string]any{ - "region": "eu-south", - "tags": map[string]any{ - "key1": "value1", - "key2": "value2", - "key3": "keep", + Resource: &composed.Unstructured{ + Unstructured: unstructured.Unstructured{ + Object: map[string]any{ + "apiVersion": "example.crossplane.io/v1", + "kind": "TagManager", + "metadata": map[string]any{ + "name": "test-resource", + "labels": map[string]any{ + IgnoreResourceLabel: "False", + }, + }, + "spec": map[string]any{ + "forProvider": map[string]any{ + "region": "eu-south", + "tags": map[string]any{ + "key1": "value1", + "key2": "value2", + "key3": "keep", + }, + }, }, }, }, }, - }, - }, }, keys: []string{"key1", "key2"}, }, want: want{ desired: &resource.DesiredComposed{ - Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{Object: map[string]any{ - "apiVersion": "example.crossplane.io/v1", - "kind": "TagManager", - "metadata": map[string]any{ - "name": "test-resource", - "labels": map[string]any{ - IgnoreResourceLabel: "False", + Resource: &composed.Unstructured{Unstructured: unstructured.Unstructured{ + Object: map[string]any{ + "apiVersion": "example.crossplane.io/v1", + "kind": "TagManager", + "metadata": map[string]any{ + "name": "test-resource", + "labels": map[string]any{ + IgnoreResourceLabel: "False", + }, }, - }, - "spec": map[string]any{ - "forProvider": map[string]any{ - "region": "eu-south", - "tags": map[string]any{ - "key3": "keep", + "spec": map[string]any{ + "forProvider": map[string]any{ + "region": "eu-south", + "tags": map[string]any{ + "key3": "keep", + }, }, }, }, - }, }}, }, err: nil,