From ca465beffe698d841992c00d366ac0211ed9c5f0 Mon Sep 17 00:00:00 2001 From: Sung-Kyu Yoo Date: Sun, 6 Sep 2026 05:00:39 +0900 Subject: [PATCH 1/2] test: add reproducer for fabricated successes on unserved operations RED: 8 failed, 120 passed, 17 skipped. FAILED [autoscaling.DescribeAdjustmentTypes] FAILED [cloudformation.DescribeChangeSetHooks] FAILED [elasticache.DescribeCacheEngineVersions] FAILED [elasticloadbalancingv2.DescribeCapacityReservation] FAILED [rds.DescribeBlueGreenDeployments] FAILED [redshift.DescribeAccountAttributes] FAILED [resourcegroups.Tag] FAILED [s3.ListBucketAnalyticsConfigurations] Each returned HTTP 200 for an operation the fidelity manifest does not list as served. docs/coverage.md calls that the one thing DevCloud must never do. test_service_smoke.py already asserted this for services that serve nothing at all. The gap was the other case: a service that serves plenty and answers an operation it does not implement with an empty success anyway. --- .../test_no_fabricated_success.py | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 tests/compatibility/test_no_fabricated_success.py diff --git a/tests/compatibility/test_no_fabricated_success.py b/tests/compatibility/test_no_fabricated_success.py new file mode 100644 index 00000000..9c659c90 --- /dev/null +++ b/tests/compatibility/test_no_fabricated_success.py @@ -0,0 +1,144 @@ +"""An operation DevCloud does not serve must never answer 200. + +This is the one guarantee docs/coverage.md calls absolute: + + What it must never do is fabricate a success. + +Registering a service DevCloud cannot fully serve is worth doing — the call is +routed and answered locally instead of silently reaching a billed AWS account — +but only while the answer is an honest error. A fabricated 200 is worse than not +registering the service at all, because the caller believes it. + +test_service_smoke.py already asserts this for services that serve *nothing*. +The gap this file closes is the other case, and the one the defect lived in: a +service that serves plenty and answers an operation it does not implement with +an empty success anyway. The fidelity manifest says which operations are served; +every operation it does not list must decline. +""" + +import pytest +from botocore import xform_name +from botocore.exceptions import ClientError, ParamValidationError + +import _coverage + +MANIFEST = _coverage.load_manifest() + +# Operations to avoid probing with. A refusal is observable without writing +# anything, so nothing that could create or overwrite state is used. Delete and +# Modify of a resource that does not exist stay in scope — an empty store has +# nothing to lose. +_MUTATING_PREFIXES = ("Create", "Put", "Register", "Add", "Import", "Start", "Run") + + +def _unserved_probe(service_id, entry): + """Return an operation the manifest says is not served, or None. + + Reads first, so a failure reads unambiguously. + """ + name = _coverage.boto3_name(service_id) + if name is None: + return None, None + + model = _coverage.service_model(name) + unserved = sorted(set(model.operation_names) - set(entry["servedOps"])) + + for prefix in ("Describe", "List", "Get"): + for op in unserved: + if op.startswith(prefix): + return name, op + + for op in unserved: + if not op.startswith(_MUTATING_PREFIXES): + return name, op + return name, None + + +# Two fabricated successes that this file's fix does not reach, marked strict so +# they fail the moment they start passing rather than rotting into an accepted +# state. Only what was observed is recorded — the mechanism behind each is not +# the provider `default` branch that was fixed here, and has not been identified: +# +# s3.ListBucketAnalyticsConfigurations +# GET /{Bucket}?analytics answers 200 with an empty body. S3's provider +# default returns MethodNotAllowed, so this is not that branch. +# +# resourcegroups.Tag +# PUT /resources/{Arn}/tags answers 200 echoing the request's Arn and +# Tags. The manifest lists the operation as unimplemented and the CRUD +# registry does not hold it; it holds GetTags at the same path under GET, +# and httproute.Match does compare methods (match.go:42), so the obvious +# explanation is ruled out rather than confirmed. +# +# Both are real violations of the guarantee and neither is fixed here: they are +# different defects that deserve their own diagnosis and their own change. +KNOWN_UNFIXED = { + ( + "s3", + "ListBucketAnalyticsConfigurations", + ): "empty 200 from S3's sub-resource routing", + ( + "resourcegroups", + "Tag", + ): "engine-shaped echo for an operation the manifest calls unimplemented", +} + +# Every service that is addressable, routable, and has an unserved operation to +# ask for. Built at collection time so the parametrisation names the operation +# rather than an index. +_PROBES = [] +for _service in sorted(MANIFEST): + if ( + _service in _coverage.NO_BOTO3_CLIENT + or _service in _coverage.UNREACHABLE_FROM_BOTO3 + ): + continue + _name, _op = _unserved_probe(_service, MANIFEST[_service]) + if _op is not None: + _PROBES.append((_service, _name, _op)) + + +def _case(service, client_name, operation): + reason = KNOWN_UNFIXED.get((service, operation)) + marks = [pytest.mark.xfail(strict=True, reason=reason)] if reason else [] + return pytest.param(service, client_name, operation, marks=marks) + + +@pytest.mark.parametrize( + "service,client_name,operation", + [_case(*probe) for probe in _PROBES], + ids=[f"{s}.{op}" for s, _, op in _PROBES], +) +def test_unserved_operation_declines(service_client, service, client_name, operation): + client = service_client(client_name) + params = _coverage.stub_params(client_name, operation) + + try: + response = getattr(client, xform_name(operation))(**params) + except ParamValidationError: + pytest.skip( + f"{client_name}.{operation}: the stub builder cannot satisfy this input " + "shape, so the request never reaches DevCloud" + ) + except ClientError as exc: + assert exc.response.get("Error", {}).get("Code"), ( + f"{service} ({client_name}.{operation}) failed without an AWS error " + f"code: {exc.response.get('Error')}" + ) + return + except Exception as exc: # noqa: BLE001 - reported, not swallowed + pytest.fail( + f"{service} ({client_name}.{operation}, {MANIFEST[service]['protocol']}) " + f"answered something botocore could not parse ({type(exc).__name__}: " + f"{exc}). The manifest does not list this operation as served, so the " + "answer should have been a clean AWS error." + ) + + pytest.fail( + f"{service} ({client_name}.{operation}, {MANIFEST[service]['protocol']}) " + f"returned {response['ResponseMetadata']['HTTPStatusCode']} for an " + "operation the fidelity manifest does not list as served. That is a " + "fabricated success — the guarantee docs/coverage.md calls absolute. " + "The provider's default branch most likely answers unknown operations " + "itself instead of returning plugin.ErrUnhandledOp." + ) From 2e1a69aae833c1e9f61426aeb7e13293f8294508 Mon Sep 17 00:00:00 2001 From: Sung-Kyu Yoo Date: Sun, 6 Sep 2026 05:00:54 +0900 Subject: [PATCH 2/2] fix: eight query providers fabricated a success for unimplemented actions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GREEN: 126 passed, 17 skipped, 2 xfailed. The six failures this change targets are gone; the two that remain are different defects, marked xfail(strict) with what was observed rather than a guessed cause. The default branch of each provider returned 200 with an empty for any action it did not implement. Two consequences, both bad: the caller was told an operation succeeded when nothing ran, and the body carried no wrapper, so botocore's query parser raised KeyError instead of returning a value. neptune.describe_db_cluster_endpoints() crashed the SDK outright. Each now returns plugin.ErrUnhandledOp, which is what every other provider in the fleet does and what the CRUD engine has been reachable through since query was admitted in #143. 223 operations move from unimplemented to auto-crud — they are served from the real store now — and the rest decline with InvalidAction. docs/coverage.md's tier table moves with them: auto-crud 4,970 -> 5,193, unimplemented 2,941 -> 2,718, total unchanged. That edit was not optional; the gate added in #144 failed until the published figures matched the manifest, naming both numbers. --- changes/unreleased/Fixed-20260906-140000.yaml | 5 + docs/coverage.md | 4 +- internal/generated/compat/services.json | 225 ++++++++- internal/generated/fidelity/manifest_gen.go | 462 +++++++++--------- internal/services/autoscaling/provider.go | 15 +- internal/services/cloudformation/provider.go | 15 +- internal/services/docdb/provider.go | 15 +- internal/services/elasticache/provider.go | 15 +- .../elasticloadbalancingv2/provider.go | 15 +- internal/services/neptune/provider.go | 15 +- internal/services/rds/provider.go | 15 +- internal/services/redshift/provider.go | 15 +- 12 files changed, 550 insertions(+), 266 deletions(-) create mode 100644 changes/unreleased/Fixed-20260906-140000.yaml diff --git a/changes/unreleased/Fixed-20260906-140000.yaml b/changes/unreleased/Fixed-20260906-140000.yaml new file mode 100644 index 00000000..c9d4e78c --- /dev/null +++ b/changes/unreleased/Fixed-20260906-140000.yaml @@ -0,0 +1,5 @@ +kind: Fixed +body: 'Eight query-protocol providers no longer fabricate a success. `rds`, `neptune`, `docdb`, `redshift`, `elasticache`, `autoscaling`, `cloudformation` and `elasticloadbalancingv2` answered any operation they do not implement with HTTP 200 and an empty ``, so a caller was told an operation succeeded when nothing ran. The body also had no `` wrapper, so botocore raised `KeyError` rather than returning a value — `neptune.describe_db_cluster_endpoints()` crashed the SDK. They now hand the operation to the generic CRUD engine, which serves the 223 CRUD-shaped ones from the real store and refuses the rest with a clean `InvalidAction`' +time: 2026-09-06T14:00:00.000000+09:00 +custom: + Issue: "145" diff --git a/docs/coverage.md b/docs/coverage.md index 4cb5df58..d6754e9e 100644 --- a/docs/coverage.md +++ b/docs/coverage.md @@ -23,8 +23,8 @@ Per operation, from the [fidelity manifest](fidelity-manifest.md): | Tier | Operations | |---|---| | `hand-verified` | 4,496 | -| `auto-crud` | 4,970 | -| `unimplemented` | 2,941 | +| `auto-crud` | 5,193 | +| `unimplemented` | 2,718 | | **total known** | **12,407** | ## Why a registered service can serve nothing diff --git a/internal/generated/compat/services.json b/internal/generated/compat/services.json index 8c92af42..37427412 100644 --- a/internal/generated/compat/services.json +++ b/internal/generated/compat/services.json @@ -695,18 +695,32 @@ "DeleteAutoScalingGroup", "DeleteLaunchConfiguration", "DeleteLifecycleHook", + "DeleteNotificationConfiguration", "DeletePolicy", "DeleteScheduledAction", "DeleteTags", + "DeleteWarmPool", "DescribeAccountLimits", + "DescribeAdjustmentTypes", "DescribeAutoScalingGroups", "DescribeAutoScalingInstances", + "DescribeAutoScalingNotificationTypes", "DescribeInstanceRefreshes", "DescribeLaunchConfigurations", + "DescribeLifecycleHookTypes", "DescribeLifecycleHooks", + "DescribeLoadBalancerTargetGroups", + "DescribeLoadBalancers", + "DescribeMetricCollectionTypes", + "DescribeNotificationConfigurations", "DescribePolicies", + "DescribeScalingActivities", + "DescribeScalingProcessTypes", "DescribeScheduledActions", "DescribeTags", + "DescribeTerminationPolicyTypes", + "DescribeTrafficSources", + "DescribeWarmPool", "DetachInstances", "DetachLoadBalancerTargetGroups", "DetachLoadBalancers", @@ -716,9 +730,12 @@ "EnterStandby", "ExecutePolicy", "ExitStandby", + "GetPredictiveScalingForecast", "PutLifecycleHook", + "PutNotificationConfiguration", "PutScalingPolicy", "PutScheduledUpdateGroupAction", + "PutWarmPool", "RecordLifecycleActionHeartbeat", "ResumeProcesses", "RollbackInstanceRefresh", @@ -1419,21 +1436,30 @@ "BatchDescribeTypeConfigurations", "ContinueUpdateRollback", "CreateChangeSet", + "CreateGeneratedTemplate", "CreateStack", "CreateStackInstances", + "CreateStackRefactor", "CreateStackSet", "DeactivateType", "DeleteChangeSet", + "DeleteGeneratedTemplate", "DeleteStack", "DeleteStackInstances", "DeleteStackSet", "DeregisterType", "DescribeAccountLimits", "DescribeChangeSet", + "DescribeChangeSetHooks", + "DescribeEvents", + "DescribeGeneratedTemplate", + "DescribeOrganizationsAccess", "DescribePublisher", + "DescribeResourceScan", "DescribeStackDriftDetectionStatus", "DescribeStackEvents", "DescribeStackInstance", + "DescribeStackRefactor", "DescribeStackResource", "DescribeStackResourceDrifts", "DescribeStackResources", @@ -1445,15 +1471,26 @@ "DetectStackDrift", "DetectStackResourceDrift", "ExecuteChangeSet", + "GetGeneratedTemplate", + "GetHookResult", "GetStackPolicy", "GetTemplate", "GetTemplateSummary", "ImportStacksToStackSet", "ListChangeSets", "ListExports", + "ListGeneratedTemplates", + "ListHookResults", "ListImports", + "ListResourceScanRelatedResources", + "ListResourceScanResources", + "ListResourceScans", + "ListStackInstanceResourceDrifts", "ListStackInstances", + "ListStackRefactorActions", + "ListStackRefactors", "ListStackResources", + "ListStackSetAutoDeploymentTargets", "ListStackSetOperationResults", "ListStackSetOperations", "ListStackSets", @@ -1471,6 +1508,7 @@ "SignalResource", "StopStackSetOperation", "TestType", + "UpdateGeneratedTemplate", "UpdateStack", "UpdateStackInstances", "UpdateStackSet", @@ -3724,8 +3762,10 @@ "CreateCacheParameterGroup", "CreateCacheSecurityGroup", "CreateCacheSubnetGroup", + "CreateGlobalReplicationGroup", "CreateReplicationGroup", "CreateServerlessCache", + "CreateServerlessCacheSnapshot", "CreateSnapshot", "CreateUser", "CreateUserGroup", @@ -3734,27 +3774,39 @@ "DeleteCacheParameterGroup", "DeleteCacheSecurityGroup", "DeleteCacheSubnetGroup", + "DeleteGlobalReplicationGroup", "DeleteReplicationGroup", "DeleteServerlessCache", + "DeleteServerlessCacheSnapshot", "DeleteSnapshot", "DeleteUser", "DeleteUserGroup", "DescribeCacheClusters", + "DescribeCacheEngineVersions", "DescribeCacheParameterGroups", "DescribeCacheParameters", "DescribeCacheSecurityGroups", "DescribeCacheSubnetGroups", "DescribeEngineDefaultParameters", + "DescribeEvents", + "DescribeGlobalReplicationGroups", "DescribeReplicationGroups", + "DescribeReservedCacheNodes", + "DescribeReservedCacheNodesOfferings", + "DescribeServerlessCacheSnapshots", "DescribeServerlessCaches", + "DescribeServiceUpdates", "DescribeSnapshots", + "DescribeUpdateActions", "DescribeUserGroups", "DescribeUsers", "IncreaseReplicaCount", + "ListAllowedNodeTypeModifications", "ListTagsForResource", "ModifyCacheCluster", "ModifyCacheParameterGroup", "ModifyCacheSubnetGroup", + "ModifyGlobalReplicationGroup", "ModifyReplicationGroup", "ModifyReplicationGroupShardConfiguration", "ModifyServerlessCache", @@ -3851,12 +3903,17 @@ "CreateLoadBalancer", "CreateRule", "CreateTargetGroup", + "CreateTrustStore", "DeleteListener", "DeleteLoadBalancer", "DeleteRule", + "DeleteSharedTrustStoreAssociation", "DeleteTargetGroup", + "DeleteTrustStore", "DeregisterTargets", "DescribeAccountLimits", + "DescribeCapacityReservation", + "DescribeListenerAttributes", "DescribeListenerCertificates", "DescribeListeners", "DescribeLoadBalancerAttributes", @@ -3867,11 +3924,21 @@ "DescribeTargetGroupAttributes", "DescribeTargetGroups", "DescribeTargetHealth", + "DescribeTrustStoreAssociations", + "DescribeTrustStoreRevocations", + "DescribeTrustStores", + "GetResourcePolicy", + "GetTrustStoreCaCertificatesBundle", + "GetTrustStoreRevocationContent", + "ModifyCapacityReservation", + "ModifyIpPools", "ModifyListener", + "ModifyListenerAttributes", "ModifyLoadBalancerAttributes", "ModifyRule", "ModifyTargetGroup", "ModifyTargetGroupAttributes", + "ModifyTrustStore", "RegisterTargets", "RemoveListenerCertificates", "RemoveTags", @@ -7665,53 +7732,122 @@ "CopyDBParameterGroup", "CopyDBSnapshot", "CopyOptionGroup", + "CreateBlueGreenDeployment", + "CreateCustomDBEngineVersion", "CreateDBCluster", + "CreateDBClusterEndpoint", "CreateDBClusterParameterGroup", "CreateDBClusterSnapshot", "CreateDBInstance", + "CreateDBInstanceReadReplica", "CreateDBParameterGroup", + "CreateDBProxy", + "CreateDBProxyEndpoint", + "CreateDBSecurityGroup", + "CreateDBShardGroup", "CreateDBSnapshot", "CreateDBSubnetGroup", + "CreateEventSubscription", + "CreateGlobalCluster", + "CreateIntegration", "CreateOptionGroup", + "CreateTenantDatabase", + "DeleteBlueGreenDeployment", + "DeleteCustomDBEngineVersion", "DeleteDBCluster", + "DeleteDBClusterAutomatedBackup", + "DeleteDBClusterEndpoint", "DeleteDBClusterParameterGroup", "DeleteDBClusterSnapshot", "DeleteDBInstance", + "DeleteDBInstanceAutomatedBackup", "DeleteDBParameterGroup", + "DeleteDBProxy", + "DeleteDBProxyEndpoint", + "DeleteDBSecurityGroup", + "DeleteDBShardGroup", "DeleteDBSnapshot", "DeleteDBSubnetGroup", + "DeleteEventSubscription", + "DeleteGlobalCluster", + "DeleteIntegration", "DeleteOptionGroup", + "DeleteTenantDatabase", + "DeregisterDBProxyTargets", "DescribeAccountAttributes", + "DescribeBlueGreenDeployments", "DescribeCertificates", + "DescribeDBClusterAutomatedBackups", + "DescribeDBClusterBacktracks", + "DescribeDBClusterEndpoints", "DescribeDBClusterParameterGroups", "DescribeDBClusterParameters", + "DescribeDBClusterSnapshotAttributes", "DescribeDBClusterSnapshots", "DescribeDBClusters", "DescribeDBEngineVersions", + "DescribeDBInstanceAutomatedBackups", "DescribeDBInstances", + "DescribeDBLogFiles", + "DescribeDBMajorEngineVersions", "DescribeDBParameterGroups", "DescribeDBParameters", + "DescribeDBProxies", + "DescribeDBProxyEndpoints", + "DescribeDBProxyTargetGroups", + "DescribeDBProxyTargets", + "DescribeDBRecommendations", + "DescribeDBSecurityGroups", + "DescribeDBShardGroups", + "DescribeDBSnapshotAttributes", + "DescribeDBSnapshotTenantDatabases", "DescribeDBSnapshots", "DescribeDBSubnetGroups", "DescribeEngineDefaultClusterParameters", "DescribeEngineDefaultParameters", "DescribeEventCategories", + "DescribeEventSubscriptions", "DescribeEvents", + "DescribeExportTasks", + "DescribeGlobalClusters", + "DescribeIntegrations", "DescribeOptionGroupOptions", "DescribeOptionGroups", "DescribeOrderableDBInstanceOptions", "DescribePendingMaintenanceActions", + "DescribeReservedDBInstances", + "DescribeReservedDBInstancesOfferings", "DescribeSourceRegions", + "DescribeTenantDatabases", + "DescribeValidDBInstanceModifications", "FailoverDBCluster", "ListTagsForResource", + "ModifyActivityStream", + "ModifyCertificates", + "ModifyCurrentDBClusterCapacity", + "ModifyCustomDBEngineVersion", "ModifyDBCluster", + "ModifyDBClusterEndpoint", "ModifyDBClusterParameterGroup", + "ModifyDBClusterSnapshotAttribute", "ModifyDBInstance", "ModifyDBParameterGroup", + "ModifyDBProxy", + "ModifyDBProxyEndpoint", + "ModifyDBProxyTargetGroup", + "ModifyDBRecommendation", + "ModifyDBShardGroup", + "ModifyDBSnapshot", + "ModifyDBSnapshotAttribute", "ModifyDBSubnetGroup", + "ModifyEventSubscription", + "ModifyGlobalCluster", + "ModifyIntegration", "ModifyOptionGroup", + "ModifyTenantDatabase", "RebootDBCluster", "RebootDBInstance", + "RegisterDBProxyTargets", "RemoveTagsFromResource", "ResetDBClusterParameterGroup", "ResetDBParameterGroup", @@ -7729,36 +7865,123 @@ "protocol": "query", "servedOps": [ "CopyClusterSnapshot", + "CreateAuthenticationProfile", "CreateCluster", "CreateClusterParameterGroup", + "CreateClusterSecurityGroup", "CreateClusterSnapshot", "CreateClusterSubnetGroup", + "CreateCustomDomainAssociation", + "CreateEndpointAccess", + "CreateEventSubscription", + "CreateHsmClientCertificate", + "CreateHsmConfiguration", + "CreateIntegration", + "CreateRedshiftIdcApplication", + "CreateScheduledAction", + "CreateSnapshotCopyGrant", + "CreateSnapshotSchedule", "CreateTags", + "CreateUsageLimit", + "DeleteAuthenticationProfile", "DeleteCluster", "DeleteClusterParameterGroup", + "DeleteClusterSecurityGroup", "DeleteClusterSnapshot", "DeleteClusterSubnetGroup", + "DeleteCustomDomainAssociation", + "DeleteEndpointAccess", + "DeleteEventSubscription", + "DeleteHsmClientCertificate", + "DeleteHsmConfiguration", + "DeleteIntegration", + "DeletePartner", + "DeleteRedshiftIdcApplication", + "DeleteResourcePolicy", + "DeleteScheduledAction", + "DeleteSnapshotCopyGrant", + "DeleteSnapshotSchedule", "DeleteTags", + "DeleteUsageLimit", + "DeregisterNamespace", + "DescribeAccountAttributes", + "DescribeAuthenticationProfiles", + "DescribeClusterDbRevisions", "DescribeClusterParameterGroups", "DescribeClusterParameters", + "DescribeClusterSecurityGroups", "DescribeClusterSnapshots", "DescribeClusterSubnetGroups", + "DescribeClusterTracks", + "DescribeClusterVersions", "DescribeClusters", + "DescribeCustomDomainAssociations", + "DescribeDataShares", + "DescribeDataSharesForConsumer", + "DescribeDataSharesForProducer", "DescribeDefaultClusterParameters", + "DescribeEndpointAccess", + "DescribeEndpointAuthorization", + "DescribeEventCategories", + "DescribeEventSubscriptions", + "DescribeEvents", + "DescribeHsmClientCertificates", + "DescribeHsmConfigurations", + "DescribeInboundIntegrations", + "DescribeIntegrations", "DescribeLoggingStatus", + "DescribeNodeConfigurationOptions", + "DescribeOrderableClusterOptions", + "DescribePartners", + "DescribeRedshiftIdcApplications", + "DescribeReservedNodeExchangeStatus", + "DescribeReservedNodeOfferings", + "DescribeReservedNodes", + "DescribeResize", + "DescribeScheduledActions", + "DescribeSnapshotCopyGrants", + "DescribeSnapshotSchedules", + "DescribeStorage", + "DescribeTableRestoreStatus", "DescribeTags", + "DescribeUsageLimits", "DisableLogging", "EnableLogging", "GetClusterCredentials", "GetClusterCredentialsWithIAM", + "GetIdentityCenterAuthToken", + "GetReservedNodeExchangeConfigurationOptions", + "GetReservedNodeExchangeOfferings", + "GetResourcePolicy", + "ListRecommendations", + "ModifyAquaConfiguration", + "ModifyAuthenticationProfile", "ModifyCluster", + "ModifyClusterDbRevision", + "ModifyClusterIamRoles", + "ModifyClusterMaintenance", "ModifyClusterParameterGroup", + "ModifyClusterSnapshot", + "ModifyClusterSnapshotSchedule", "ModifyClusterSubnetGroup", + "ModifyCustomDomainAssociation", + "ModifyEndpointAccess", + "ModifyEventSubscription", + "ModifyIntegration", + "ModifyLakehouseConfiguration", + "ModifyRedshiftIdcApplication", + "ModifyScheduledAction", + "ModifySnapshotCopyRetentionPeriod", + "ModifySnapshotSchedule", + "ModifyUsageLimit", "PauseCluster", + "PutResourcePolicy", "RebootCluster", + "RegisterNamespace", "ResetClusterParameterGroup", "RestoreFromClusterSnapshot", - "ResumeCluster" + "ResumeCluster", + "UpdatePartnerStatus" ] }, "redshiftdata": { diff --git a/internal/generated/fidelity/manifest_gen.go b/internal/generated/fidelity/manifest_gen.go index 2321eaf0..53a1edd1 100644 --- a/internal/generated/fidelity/manifest_gen.go +++ b/internal/generated/fidelity/manifest_gen.go @@ -745,7 +745,7 @@ var Services = map[string]Service{ "UpdatePreparedStatement": TierHandVerified, "UpdateWorkGroup": TierHandVerified, }}, - "autoscaling": {Protocol: "query", ModelBacked: true, EngineWired: false, Operations: map[string]Tier{ + "autoscaling": {Protocol: "query", ModelBacked: true, EngineWired: true, Operations: map[string]Tier{ "AttachInstances": TierHandVerified, "AttachLoadBalancerTargetGroups": TierHandVerified, "AttachLoadBalancers": TierHandVerified, @@ -760,32 +760,32 @@ var Services = map[string]Service{ "DeleteAutoScalingGroup": TierHandVerified, "DeleteLaunchConfiguration": TierHandVerified, "DeleteLifecycleHook": TierHandVerified, - "DeleteNotificationConfiguration": TierUnimplemented, + "DeleteNotificationConfiguration": TierAutoCRUD, "DeletePolicy": TierHandVerified, "DeleteScheduledAction": TierHandVerified, "DeleteTags": TierHandVerified, - "DeleteWarmPool": TierUnimplemented, + "DeleteWarmPool": TierAutoCRUD, "DescribeAccountLimits": TierHandVerified, - "DescribeAdjustmentTypes": TierUnimplemented, + "DescribeAdjustmentTypes": TierAutoCRUD, "DescribeAutoScalingGroups": TierHandVerified, "DescribeAutoScalingInstances": TierHandVerified, - "DescribeAutoScalingNotificationTypes": TierUnimplemented, + "DescribeAutoScalingNotificationTypes": TierAutoCRUD, "DescribeInstanceRefreshes": TierHandVerified, "DescribeLaunchConfigurations": TierHandVerified, - "DescribeLifecycleHookTypes": TierUnimplemented, + "DescribeLifecycleHookTypes": TierAutoCRUD, "DescribeLifecycleHooks": TierHandVerified, - "DescribeLoadBalancerTargetGroups": TierUnimplemented, - "DescribeLoadBalancers": TierUnimplemented, - "DescribeMetricCollectionTypes": TierUnimplemented, - "DescribeNotificationConfigurations": TierUnimplemented, + "DescribeLoadBalancerTargetGroups": TierAutoCRUD, + "DescribeLoadBalancers": TierAutoCRUD, + "DescribeMetricCollectionTypes": TierAutoCRUD, + "DescribeNotificationConfigurations": TierAutoCRUD, "DescribePolicies": TierHandVerified, - "DescribeScalingActivities": TierUnimplemented, - "DescribeScalingProcessTypes": TierUnimplemented, + "DescribeScalingActivities": TierAutoCRUD, + "DescribeScalingProcessTypes": TierAutoCRUD, "DescribeScheduledActions": TierHandVerified, "DescribeTags": TierHandVerified, - "DescribeTerminationPolicyTypes": TierUnimplemented, - "DescribeTrafficSources": TierUnimplemented, - "DescribeWarmPool": TierUnimplemented, + "DescribeTerminationPolicyTypes": TierAutoCRUD, + "DescribeTrafficSources": TierAutoCRUD, + "DescribeWarmPool": TierAutoCRUD, "DetachInstances": TierHandVerified, "DetachLoadBalancerTargetGroups": TierHandVerified, "DetachLoadBalancers": TierHandVerified, @@ -795,13 +795,13 @@ var Services = map[string]Service{ "EnterStandby": TierHandVerified, "ExecutePolicy": TierHandVerified, "ExitStandby": TierHandVerified, - "GetPredictiveScalingForecast": TierUnimplemented, + "GetPredictiveScalingForecast": TierAutoCRUD, "LaunchInstances": TierUnimplemented, "PutLifecycleHook": TierHandVerified, - "PutNotificationConfiguration": TierUnimplemented, + "PutNotificationConfiguration": TierAutoCRUD, "PutScalingPolicy": TierHandVerified, "PutScheduledUpdateGroupAction": TierHandVerified, - "PutWarmPool": TierUnimplemented, + "PutWarmPool": TierAutoCRUD, "RecordLifecycleActionHeartbeat": TierHandVerified, "ResumeProcesses": TierHandVerified, "RollbackInstanceRefresh": TierHandVerified, @@ -1641,38 +1641,38 @@ var Services = map[string]Service{ "ValidateResource": TierHandVerified, "WaitForResource": TierHandVerified, }}, - "cloudformation": {Protocol: "query", ModelBacked: true, EngineWired: false, Operations: map[string]Tier{ + "cloudformation": {Protocol: "query", ModelBacked: true, EngineWired: true, Operations: map[string]Tier{ "ActivateOrganizationsAccess": TierUnimplemented, "ActivateType": TierHandVerified, "BatchDescribeTypeConfigurations": TierHandVerified, "CancelUpdateStack": TierUnimplemented, "ContinueUpdateRollback": TierHandVerified, "CreateChangeSet": TierHandVerified, - "CreateGeneratedTemplate": TierUnimplemented, + "CreateGeneratedTemplate": TierAutoCRUD, "CreateStack": TierHandVerified, "CreateStackInstances": TierHandVerified, - "CreateStackRefactor": TierUnimplemented, + "CreateStackRefactor": TierAutoCRUD, "CreateStackSet": TierHandVerified, "DeactivateOrganizationsAccess": TierUnimplemented, "DeactivateType": TierHandVerified, "DeleteChangeSet": TierHandVerified, - "DeleteGeneratedTemplate": TierUnimplemented, + "DeleteGeneratedTemplate": TierAutoCRUD, "DeleteStack": TierHandVerified, "DeleteStackInstances": TierHandVerified, "DeleteStackSet": TierHandVerified, "DeregisterType": TierHandVerified, "DescribeAccountLimits": TierHandVerified, "DescribeChangeSet": TierHandVerified, - "DescribeChangeSetHooks": TierUnimplemented, - "DescribeEvents": TierUnimplemented, - "DescribeGeneratedTemplate": TierUnimplemented, - "DescribeOrganizationsAccess": TierUnimplemented, + "DescribeChangeSetHooks": TierAutoCRUD, + "DescribeEvents": TierAutoCRUD, + "DescribeGeneratedTemplate": TierAutoCRUD, + "DescribeOrganizationsAccess": TierAutoCRUD, "DescribePublisher": TierHandVerified, - "DescribeResourceScan": TierUnimplemented, + "DescribeResourceScan": TierAutoCRUD, "DescribeStackDriftDetectionStatus": TierHandVerified, "DescribeStackEvents": TierHandVerified, "DescribeStackInstance": TierHandVerified, - "DescribeStackRefactor": TierUnimplemented, + "DescribeStackRefactor": TierAutoCRUD, "DescribeStackResource": TierHandVerified, "DescribeStackResourceDrifts": TierHandVerified, "DescribeStackResources": TierHandVerified, @@ -1687,26 +1687,26 @@ var Services = map[string]Service{ "EstimateTemplateCost": TierUnimplemented, "ExecuteChangeSet": TierHandVerified, "ExecuteStackRefactor": TierUnimplemented, - "GetGeneratedTemplate": TierUnimplemented, - "GetHookResult": TierUnimplemented, + "GetGeneratedTemplate": TierAutoCRUD, + "GetHookResult": TierAutoCRUD, "GetStackPolicy": TierHandVerified, "GetTemplate": TierHandVerified, "GetTemplateSummary": TierHandVerified, "ImportStacksToStackSet": TierHandVerified, "ListChangeSets": TierHandVerified, "ListExports": TierHandVerified, - "ListGeneratedTemplates": TierUnimplemented, - "ListHookResults": TierUnimplemented, + "ListGeneratedTemplates": TierAutoCRUD, + "ListHookResults": TierAutoCRUD, "ListImports": TierHandVerified, - "ListResourceScanRelatedResources": TierUnimplemented, - "ListResourceScanResources": TierUnimplemented, - "ListResourceScans": TierUnimplemented, - "ListStackInstanceResourceDrifts": TierUnimplemented, + "ListResourceScanRelatedResources": TierAutoCRUD, + "ListResourceScanResources": TierAutoCRUD, + "ListResourceScans": TierAutoCRUD, + "ListStackInstanceResourceDrifts": TierAutoCRUD, "ListStackInstances": TierHandVerified, - "ListStackRefactorActions": TierUnimplemented, - "ListStackRefactors": TierUnimplemented, + "ListStackRefactorActions": TierAutoCRUD, + "ListStackRefactors": TierAutoCRUD, "ListStackResources": TierHandVerified, - "ListStackSetAutoDeploymentTargets": TierUnimplemented, + "ListStackSetAutoDeploymentTargets": TierAutoCRUD, "ListStackSetOperationResults": TierHandVerified, "ListStackSetOperations": TierHandVerified, "ListStackSets": TierHandVerified, @@ -1726,7 +1726,7 @@ var Services = map[string]Service{ "StartResourceScan": TierUnimplemented, "StopStackSetOperation": TierHandVerified, "TestType": TierHandVerified, - "UpdateGeneratedTemplate": TierUnimplemented, + "UpdateGeneratedTemplate": TierAutoCRUD, "UpdateStack": TierHandVerified, "UpdateStackInstances": TierHandVerified, "UpdateStackSet": TierHandVerified, @@ -3825,7 +3825,7 @@ var Services = map[string]Service{ "StopReplicationTask": TierHandVerified, "TestConnection": TierHandVerified, }}, - "docdb": {Protocol: "query", ModelBacked: true, EngineWired: false, Operations: map[string]Tier{ + "docdb": {Protocol: "query", ModelBacked: true, EngineWired: true, Operations: map[string]Tier{ "AddSourceIdentifierToSubscription": TierHandVerified, "AddTagsToResource": TierHandVerified, "ApplyPendingMaintenanceAction": TierHandVerified, @@ -4998,7 +4998,7 @@ var Services = map[string]Service{ "UpdateNodegroupVersion": TierHandVerified, "UpdatePodIdentityAssociation": TierHandVerified, }}, - "elasticache": {Protocol: "query", ModelBacked: true, EngineWired: false, Operations: map[string]Tier{ + "elasticache": {Protocol: "query", ModelBacked: true, EngineWired: true, Operations: map[string]Tier{ "AddTagsToResource": TierHandVerified, "AuthorizeCacheSecurityGroupIngress": TierHandVerified, "BatchApplyUpdateAction": TierUnimplemented, @@ -5010,10 +5010,10 @@ var Services = map[string]Service{ "CreateCacheParameterGroup": TierHandVerified, "CreateCacheSecurityGroup": TierHandVerified, "CreateCacheSubnetGroup": TierHandVerified, - "CreateGlobalReplicationGroup": TierUnimplemented, + "CreateGlobalReplicationGroup": TierAutoCRUD, "CreateReplicationGroup": TierHandVerified, "CreateServerlessCache": TierHandVerified, - "CreateServerlessCacheSnapshot": TierUnimplemented, + "CreateServerlessCacheSnapshot": TierAutoCRUD, "CreateSnapshot": TierHandVerified, "CreateUser": TierHandVerified, "CreateUserGroup": TierHandVerified, @@ -5023,30 +5023,30 @@ var Services = map[string]Service{ "DeleteCacheParameterGroup": TierHandVerified, "DeleteCacheSecurityGroup": TierHandVerified, "DeleteCacheSubnetGroup": TierHandVerified, - "DeleteGlobalReplicationGroup": TierUnimplemented, + "DeleteGlobalReplicationGroup": TierAutoCRUD, "DeleteReplicationGroup": TierHandVerified, "DeleteServerlessCache": TierHandVerified, - "DeleteServerlessCacheSnapshot": TierUnimplemented, + "DeleteServerlessCacheSnapshot": TierAutoCRUD, "DeleteSnapshot": TierHandVerified, "DeleteUser": TierHandVerified, "DeleteUserGroup": TierHandVerified, "DescribeCacheClusters": TierHandVerified, - "DescribeCacheEngineVersions": TierUnimplemented, + "DescribeCacheEngineVersions": TierAutoCRUD, "DescribeCacheParameterGroups": TierHandVerified, "DescribeCacheParameters": TierHandVerified, "DescribeCacheSecurityGroups": TierHandVerified, "DescribeCacheSubnetGroups": TierHandVerified, "DescribeEngineDefaultParameters": TierHandVerified, - "DescribeEvents": TierUnimplemented, - "DescribeGlobalReplicationGroups": TierUnimplemented, + "DescribeEvents": TierAutoCRUD, + "DescribeGlobalReplicationGroups": TierAutoCRUD, "DescribeReplicationGroups": TierHandVerified, - "DescribeReservedCacheNodes": TierUnimplemented, - "DescribeReservedCacheNodesOfferings": TierUnimplemented, - "DescribeServerlessCacheSnapshots": TierUnimplemented, + "DescribeReservedCacheNodes": TierAutoCRUD, + "DescribeReservedCacheNodesOfferings": TierAutoCRUD, + "DescribeServerlessCacheSnapshots": TierAutoCRUD, "DescribeServerlessCaches": TierHandVerified, - "DescribeServiceUpdates": TierUnimplemented, + "DescribeServiceUpdates": TierAutoCRUD, "DescribeSnapshots": TierHandVerified, - "DescribeUpdateActions": TierUnimplemented, + "DescribeUpdateActions": TierAutoCRUD, "DescribeUserGroups": TierHandVerified, "DescribeUsers": TierHandVerified, "DisassociateGlobalReplicationGroup": TierUnimplemented, @@ -5054,12 +5054,12 @@ var Services = map[string]Service{ "FailoverGlobalReplicationGroup": TierUnimplemented, "IncreaseNodeGroupsInGlobalReplicationGroup": TierUnimplemented, "IncreaseReplicaCount": TierHandVerified, - "ListAllowedNodeTypeModifications": TierUnimplemented, + "ListAllowedNodeTypeModifications": TierAutoCRUD, "ListTagsForResource": TierHandVerified, "ModifyCacheCluster": TierHandVerified, "ModifyCacheParameterGroup": TierHandVerified, "ModifyCacheSubnetGroup": TierHandVerified, - "ModifyGlobalReplicationGroup": TierUnimplemented, + "ModifyGlobalReplicationGroup": TierAutoCRUD, "ModifyReplicationGroup": TierHandVerified, "ModifyReplicationGroupShardConfiguration": TierHandVerified, "ModifyServerlessCache": TierHandVerified, @@ -5155,7 +5155,7 @@ var Services = map[string]Service{ "SetLoadBalancerPoliciesForBackendServer": TierUnimplemented, "SetLoadBalancerPoliciesOfListener": TierUnimplemented, }}, - "elasticloadbalancingv2": {Protocol: "query", ModelBacked: true, EngineWired: false, Operations: map[string]Tier{ + "elasticloadbalancingv2": {Protocol: "query", ModelBacked: true, EngineWired: true, Operations: map[string]Tier{ "AddListenerCertificates": TierHandVerified, "AddTags": TierHandVerified, "AddTrustStoreRevocations": TierUnimplemented, @@ -5163,17 +5163,17 @@ var Services = map[string]Service{ "CreateLoadBalancer": TierHandVerified, "CreateRule": TierHandVerified, "CreateTargetGroup": TierHandVerified, - "CreateTrustStore": TierUnimplemented, + "CreateTrustStore": TierAutoCRUD, "DeleteListener": TierHandVerified, "DeleteLoadBalancer": TierHandVerified, "DeleteRule": TierHandVerified, - "DeleteSharedTrustStoreAssociation": TierUnimplemented, + "DeleteSharedTrustStoreAssociation": TierAutoCRUD, "DeleteTargetGroup": TierHandVerified, - "DeleteTrustStore": TierUnimplemented, + "DeleteTrustStore": TierAutoCRUD, "DeregisterTargets": TierHandVerified, "DescribeAccountLimits": TierHandVerified, - "DescribeCapacityReservation": TierUnimplemented, - "DescribeListenerAttributes": TierUnimplemented, + "DescribeCapacityReservation": TierAutoCRUD, + "DescribeListenerAttributes": TierAutoCRUD, "DescribeListenerCertificates": TierHandVerified, "DescribeListeners": TierHandVerified, "DescribeLoadBalancerAttributes": TierHandVerified, @@ -5184,21 +5184,21 @@ var Services = map[string]Service{ "DescribeTargetGroupAttributes": TierHandVerified, "DescribeTargetGroups": TierHandVerified, "DescribeTargetHealth": TierHandVerified, - "DescribeTrustStoreAssociations": TierUnimplemented, - "DescribeTrustStoreRevocations": TierUnimplemented, - "DescribeTrustStores": TierUnimplemented, - "GetResourcePolicy": TierUnimplemented, - "GetTrustStoreCaCertificatesBundle": TierUnimplemented, - "GetTrustStoreRevocationContent": TierUnimplemented, - "ModifyCapacityReservation": TierUnimplemented, - "ModifyIpPools": TierUnimplemented, + "DescribeTrustStoreAssociations": TierAutoCRUD, + "DescribeTrustStoreRevocations": TierAutoCRUD, + "DescribeTrustStores": TierAutoCRUD, + "GetResourcePolicy": TierAutoCRUD, + "GetTrustStoreCaCertificatesBundle": TierAutoCRUD, + "GetTrustStoreRevocationContent": TierAutoCRUD, + "ModifyCapacityReservation": TierAutoCRUD, + "ModifyIpPools": TierAutoCRUD, "ModifyListener": TierHandVerified, - "ModifyListenerAttributes": TierUnimplemented, + "ModifyListenerAttributes": TierAutoCRUD, "ModifyLoadBalancerAttributes": TierHandVerified, "ModifyRule": TierHandVerified, "ModifyTargetGroup": TierHandVerified, "ModifyTargetGroupAttributes": TierHandVerified, - "ModifyTrustStore": TierUnimplemented, + "ModifyTrustStore": TierAutoCRUD, "RegisterTargets": TierHandVerified, "RemoveListenerCertificates": TierHandVerified, "RemoveTags": TierHandVerified, @@ -8259,7 +8259,7 @@ var Services = map[string]Service{ "UpdateEnvironment": TierHandVerified, "UpdateVariables": TierHandVerified, }}, - "neptune": {Protocol: "query", ModelBacked: true, EngineWired: false, Operations: map[string]Tier{ + "neptune": {Protocol: "query", ModelBacked: true, EngineWired: true, Operations: map[string]Tier{ "AddRoleToDBCluster": TierHandVerified, "AddSourceIdentifierToSubscription": TierHandVerified, "AddTagsToResource": TierHandVerified, @@ -9591,7 +9591,7 @@ var Services = map[string]Service{ "UntagResource": TierHandVerified, "UpdateResourceShare": TierHandVerified, }}, - "rds": {Protocol: "query", ModelBacked: true, EngineWired: false, Operations: map[string]Tier{ + "rds": {Protocol: "query", ModelBacked: true, EngineWired: true, Operations: map[string]Tier{ "AddRoleToDBCluster": TierUnimplemented, "AddRoleToDBInstance": TierUnimplemented, "AddSourceIdentifierToSubscription": TierUnimplemented, @@ -9605,130 +9605,130 @@ var Services = map[string]Service{ "CopyDBParameterGroup": TierHandVerified, "CopyDBSnapshot": TierHandVerified, "CopyOptionGroup": TierHandVerified, - "CreateBlueGreenDeployment": TierUnimplemented, - "CreateCustomDBEngineVersion": TierUnimplemented, + "CreateBlueGreenDeployment": TierAutoCRUD, + "CreateCustomDBEngineVersion": TierAutoCRUD, "CreateDBCluster": TierHandVerified, - "CreateDBClusterEndpoint": TierUnimplemented, + "CreateDBClusterEndpoint": TierAutoCRUD, "CreateDBClusterParameterGroup": TierHandVerified, "CreateDBClusterSnapshot": TierHandVerified, "CreateDBInstance": TierHandVerified, - "CreateDBInstanceReadReplica": TierUnimplemented, + "CreateDBInstanceReadReplica": TierAutoCRUD, "CreateDBParameterGroup": TierHandVerified, - "CreateDBProxy": TierUnimplemented, - "CreateDBProxyEndpoint": TierUnimplemented, - "CreateDBSecurityGroup": TierUnimplemented, - "CreateDBShardGroup": TierUnimplemented, + "CreateDBProxy": TierAutoCRUD, + "CreateDBProxyEndpoint": TierAutoCRUD, + "CreateDBSecurityGroup": TierAutoCRUD, + "CreateDBShardGroup": TierAutoCRUD, "CreateDBSnapshot": TierHandVerified, "CreateDBSubnetGroup": TierHandVerified, - "CreateEventSubscription": TierUnimplemented, - "CreateGlobalCluster": TierUnimplemented, - "CreateIntegration": TierUnimplemented, + "CreateEventSubscription": TierAutoCRUD, + "CreateGlobalCluster": TierAutoCRUD, + "CreateIntegration": TierAutoCRUD, "CreateOptionGroup": TierHandVerified, - "CreateTenantDatabase": TierUnimplemented, - "DeleteBlueGreenDeployment": TierUnimplemented, - "DeleteCustomDBEngineVersion": TierUnimplemented, + "CreateTenantDatabase": TierAutoCRUD, + "DeleteBlueGreenDeployment": TierAutoCRUD, + "DeleteCustomDBEngineVersion": TierAutoCRUD, "DeleteDBCluster": TierHandVerified, - "DeleteDBClusterAutomatedBackup": TierUnimplemented, - "DeleteDBClusterEndpoint": TierUnimplemented, + "DeleteDBClusterAutomatedBackup": TierAutoCRUD, + "DeleteDBClusterEndpoint": TierAutoCRUD, "DeleteDBClusterParameterGroup": TierHandVerified, "DeleteDBClusterSnapshot": TierHandVerified, "DeleteDBInstance": TierHandVerified, - "DeleteDBInstanceAutomatedBackup": TierUnimplemented, + "DeleteDBInstanceAutomatedBackup": TierAutoCRUD, "DeleteDBParameterGroup": TierHandVerified, - "DeleteDBProxy": TierUnimplemented, - "DeleteDBProxyEndpoint": TierUnimplemented, - "DeleteDBSecurityGroup": TierUnimplemented, - "DeleteDBShardGroup": TierUnimplemented, + "DeleteDBProxy": TierAutoCRUD, + "DeleteDBProxyEndpoint": TierAutoCRUD, + "DeleteDBSecurityGroup": TierAutoCRUD, + "DeleteDBShardGroup": TierAutoCRUD, "DeleteDBSnapshot": TierHandVerified, "DeleteDBSubnetGroup": TierHandVerified, - "DeleteEventSubscription": TierUnimplemented, - "DeleteGlobalCluster": TierUnimplemented, - "DeleteIntegration": TierUnimplemented, + "DeleteEventSubscription": TierAutoCRUD, + "DeleteGlobalCluster": TierAutoCRUD, + "DeleteIntegration": TierAutoCRUD, "DeleteOptionGroup": TierHandVerified, - "DeleteTenantDatabase": TierUnimplemented, - "DeregisterDBProxyTargets": TierUnimplemented, + "DeleteTenantDatabase": TierAutoCRUD, + "DeregisterDBProxyTargets": TierAutoCRUD, "DescribeAccountAttributes": TierHandVerified, - "DescribeBlueGreenDeployments": TierUnimplemented, + "DescribeBlueGreenDeployments": TierAutoCRUD, "DescribeCertificates": TierHandVerified, - "DescribeDBClusterAutomatedBackups": TierUnimplemented, - "DescribeDBClusterBacktracks": TierUnimplemented, - "DescribeDBClusterEndpoints": TierUnimplemented, + "DescribeDBClusterAutomatedBackups": TierAutoCRUD, + "DescribeDBClusterBacktracks": TierAutoCRUD, + "DescribeDBClusterEndpoints": TierAutoCRUD, "DescribeDBClusterParameterGroups": TierHandVerified, "DescribeDBClusterParameters": TierHandVerified, - "DescribeDBClusterSnapshotAttributes": TierUnimplemented, + "DescribeDBClusterSnapshotAttributes": TierAutoCRUD, "DescribeDBClusterSnapshots": TierHandVerified, "DescribeDBClusters": TierHandVerified, "DescribeDBEngineVersions": TierHandVerified, - "DescribeDBInstanceAutomatedBackups": TierUnimplemented, + "DescribeDBInstanceAutomatedBackups": TierAutoCRUD, "DescribeDBInstances": TierHandVerified, - "DescribeDBLogFiles": TierUnimplemented, - "DescribeDBMajorEngineVersions": TierUnimplemented, + "DescribeDBLogFiles": TierAutoCRUD, + "DescribeDBMajorEngineVersions": TierAutoCRUD, "DescribeDBParameterGroups": TierHandVerified, "DescribeDBParameters": TierHandVerified, - "DescribeDBProxies": TierUnimplemented, - "DescribeDBProxyEndpoints": TierUnimplemented, - "DescribeDBProxyTargetGroups": TierUnimplemented, - "DescribeDBProxyTargets": TierUnimplemented, - "DescribeDBRecommendations": TierUnimplemented, - "DescribeDBSecurityGroups": TierUnimplemented, - "DescribeDBShardGroups": TierUnimplemented, - "DescribeDBSnapshotAttributes": TierUnimplemented, - "DescribeDBSnapshotTenantDatabases": TierUnimplemented, + "DescribeDBProxies": TierAutoCRUD, + "DescribeDBProxyEndpoints": TierAutoCRUD, + "DescribeDBProxyTargetGroups": TierAutoCRUD, + "DescribeDBProxyTargets": TierAutoCRUD, + "DescribeDBRecommendations": TierAutoCRUD, + "DescribeDBSecurityGroups": TierAutoCRUD, + "DescribeDBShardGroups": TierAutoCRUD, + "DescribeDBSnapshotAttributes": TierAutoCRUD, + "DescribeDBSnapshotTenantDatabases": TierAutoCRUD, "DescribeDBSnapshots": TierHandVerified, "DescribeDBSubnetGroups": TierHandVerified, "DescribeEngineDefaultClusterParameters": TierHandVerified, "DescribeEngineDefaultParameters": TierHandVerified, "DescribeEventCategories": TierHandVerified, - "DescribeEventSubscriptions": TierUnimplemented, + "DescribeEventSubscriptions": TierAutoCRUD, "DescribeEvents": TierHandVerified, - "DescribeExportTasks": TierUnimplemented, - "DescribeGlobalClusters": TierUnimplemented, - "DescribeIntegrations": TierUnimplemented, + "DescribeExportTasks": TierAutoCRUD, + "DescribeGlobalClusters": TierAutoCRUD, + "DescribeIntegrations": TierAutoCRUD, "DescribeOptionGroupOptions": TierHandVerified, "DescribeOptionGroups": TierHandVerified, "DescribeOrderableDBInstanceOptions": TierHandVerified, "DescribePendingMaintenanceActions": TierHandVerified, - "DescribeReservedDBInstances": TierUnimplemented, - "DescribeReservedDBInstancesOfferings": TierUnimplemented, + "DescribeReservedDBInstances": TierAutoCRUD, + "DescribeReservedDBInstancesOfferings": TierAutoCRUD, "DescribeSourceRegions": TierHandVerified, - "DescribeTenantDatabases": TierUnimplemented, - "DescribeValidDBInstanceModifications": TierUnimplemented, + "DescribeTenantDatabases": TierAutoCRUD, + "DescribeValidDBInstanceModifications": TierAutoCRUD, "DisableHttpEndpoint": TierUnimplemented, "DownloadDBLogFilePortion": TierUnimplemented, "EnableHttpEndpoint": TierUnimplemented, "FailoverDBCluster": TierHandVerified, "FailoverGlobalCluster": TierUnimplemented, "ListTagsForResource": TierHandVerified, - "ModifyActivityStream": TierUnimplemented, - "ModifyCertificates": TierUnimplemented, - "ModifyCurrentDBClusterCapacity": TierUnimplemented, - "ModifyCustomDBEngineVersion": TierUnimplemented, + "ModifyActivityStream": TierAutoCRUD, + "ModifyCertificates": TierAutoCRUD, + "ModifyCurrentDBClusterCapacity": TierAutoCRUD, + "ModifyCustomDBEngineVersion": TierAutoCRUD, "ModifyDBCluster": TierHandVerified, - "ModifyDBClusterEndpoint": TierUnimplemented, + "ModifyDBClusterEndpoint": TierAutoCRUD, "ModifyDBClusterParameterGroup": TierHandVerified, - "ModifyDBClusterSnapshotAttribute": TierUnimplemented, + "ModifyDBClusterSnapshotAttribute": TierAutoCRUD, "ModifyDBInstance": TierHandVerified, "ModifyDBParameterGroup": TierHandVerified, - "ModifyDBProxy": TierUnimplemented, - "ModifyDBProxyEndpoint": TierUnimplemented, - "ModifyDBProxyTargetGroup": TierUnimplemented, - "ModifyDBRecommendation": TierUnimplemented, - "ModifyDBShardGroup": TierUnimplemented, - "ModifyDBSnapshot": TierUnimplemented, - "ModifyDBSnapshotAttribute": TierUnimplemented, + "ModifyDBProxy": TierAutoCRUD, + "ModifyDBProxyEndpoint": TierAutoCRUD, + "ModifyDBProxyTargetGroup": TierAutoCRUD, + "ModifyDBRecommendation": TierAutoCRUD, + "ModifyDBShardGroup": TierAutoCRUD, + "ModifyDBSnapshot": TierAutoCRUD, + "ModifyDBSnapshotAttribute": TierAutoCRUD, "ModifyDBSubnetGroup": TierHandVerified, - "ModifyEventSubscription": TierUnimplemented, - "ModifyGlobalCluster": TierUnimplemented, - "ModifyIntegration": TierUnimplemented, + "ModifyEventSubscription": TierAutoCRUD, + "ModifyGlobalCluster": TierAutoCRUD, + "ModifyIntegration": TierAutoCRUD, "ModifyOptionGroup": TierHandVerified, - "ModifyTenantDatabase": TierUnimplemented, + "ModifyTenantDatabase": TierAutoCRUD, "PromoteReadReplica": TierUnimplemented, "PromoteReadReplicaDBCluster": TierUnimplemented, "PurchaseReservedDBInstancesOffering": TierUnimplemented, "RebootDBCluster": TierHandVerified, "RebootDBInstance": TierHandVerified, "RebootDBShardGroup": TierUnimplemented, - "RegisterDBProxyTargets": TierUnimplemented, + "RegisterDBProxyTargets": TierAutoCRUD, "RemoveFromGlobalCluster": TierUnimplemented, "RemoveRoleFromDBCluster": TierUnimplemented, "RemoveRoleFromDBInstance": TierUnimplemented, @@ -9764,7 +9764,7 @@ var Services = map[string]Service{ "ExecuteStatement": TierUnimplemented, "RollbackTransaction": TierUnimplemented, }}, - "redshift": {Protocol: "query", ModelBacked: true, EngineWired: false, Operations: map[string]Tier{ + "redshift": {Protocol: "query", ModelBacked: true, EngineWired: true, Operations: map[string]Tier{ "AcceptReservedNodeExchange": TierUnimplemented, "AddPartner": TierUnimplemented, "AssociateDataShareConsumer": TierUnimplemented, @@ -9776,87 +9776,87 @@ var Services = map[string]Service{ "BatchModifyClusterSnapshots": TierUnimplemented, "CancelResize": TierUnimplemented, "CopyClusterSnapshot": TierHandVerified, - "CreateAuthenticationProfile": TierUnimplemented, + "CreateAuthenticationProfile": TierAutoCRUD, "CreateCluster": TierHandVerified, "CreateClusterParameterGroup": TierHandVerified, - "CreateClusterSecurityGroup": TierUnimplemented, + "CreateClusterSecurityGroup": TierAutoCRUD, "CreateClusterSnapshot": TierHandVerified, "CreateClusterSubnetGroup": TierHandVerified, - "CreateCustomDomainAssociation": TierUnimplemented, - "CreateEndpointAccess": TierUnimplemented, - "CreateEventSubscription": TierUnimplemented, - "CreateHsmClientCertificate": TierUnimplemented, - "CreateHsmConfiguration": TierUnimplemented, - "CreateIntegration": TierUnimplemented, - "CreateRedshiftIdcApplication": TierUnimplemented, - "CreateScheduledAction": TierUnimplemented, - "CreateSnapshotCopyGrant": TierUnimplemented, - "CreateSnapshotSchedule": TierUnimplemented, + "CreateCustomDomainAssociation": TierAutoCRUD, + "CreateEndpointAccess": TierAutoCRUD, + "CreateEventSubscription": TierAutoCRUD, + "CreateHsmClientCertificate": TierAutoCRUD, + "CreateHsmConfiguration": TierAutoCRUD, + "CreateIntegration": TierAutoCRUD, + "CreateRedshiftIdcApplication": TierAutoCRUD, + "CreateScheduledAction": TierAutoCRUD, + "CreateSnapshotCopyGrant": TierAutoCRUD, + "CreateSnapshotSchedule": TierAutoCRUD, "CreateTags": TierHandVerified, - "CreateUsageLimit": TierUnimplemented, + "CreateUsageLimit": TierAutoCRUD, "DeauthorizeDataShare": TierUnimplemented, - "DeleteAuthenticationProfile": TierUnimplemented, + "DeleteAuthenticationProfile": TierAutoCRUD, "DeleteCluster": TierHandVerified, "DeleteClusterParameterGroup": TierHandVerified, - "DeleteClusterSecurityGroup": TierUnimplemented, + "DeleteClusterSecurityGroup": TierAutoCRUD, "DeleteClusterSnapshot": TierHandVerified, "DeleteClusterSubnetGroup": TierHandVerified, - "DeleteCustomDomainAssociation": TierUnimplemented, - "DeleteEndpointAccess": TierUnimplemented, - "DeleteEventSubscription": TierUnimplemented, - "DeleteHsmClientCertificate": TierUnimplemented, - "DeleteHsmConfiguration": TierUnimplemented, - "DeleteIntegration": TierUnimplemented, - "DeletePartner": TierUnimplemented, - "DeleteRedshiftIdcApplication": TierUnimplemented, - "DeleteResourcePolicy": TierUnimplemented, - "DeleteScheduledAction": TierUnimplemented, - "DeleteSnapshotCopyGrant": TierUnimplemented, - "DeleteSnapshotSchedule": TierUnimplemented, + "DeleteCustomDomainAssociation": TierAutoCRUD, + "DeleteEndpointAccess": TierAutoCRUD, + "DeleteEventSubscription": TierAutoCRUD, + "DeleteHsmClientCertificate": TierAutoCRUD, + "DeleteHsmConfiguration": TierAutoCRUD, + "DeleteIntegration": TierAutoCRUD, + "DeletePartner": TierAutoCRUD, + "DeleteRedshiftIdcApplication": TierAutoCRUD, + "DeleteResourcePolicy": TierAutoCRUD, + "DeleteScheduledAction": TierAutoCRUD, + "DeleteSnapshotCopyGrant": TierAutoCRUD, + "DeleteSnapshotSchedule": TierAutoCRUD, "DeleteTags": TierHandVerified, - "DeleteUsageLimit": TierUnimplemented, - "DeregisterNamespace": TierUnimplemented, - "DescribeAccountAttributes": TierUnimplemented, - "DescribeAuthenticationProfiles": TierUnimplemented, - "DescribeClusterDbRevisions": TierUnimplemented, + "DeleteUsageLimit": TierAutoCRUD, + "DeregisterNamespace": TierAutoCRUD, + "DescribeAccountAttributes": TierAutoCRUD, + "DescribeAuthenticationProfiles": TierAutoCRUD, + "DescribeClusterDbRevisions": TierAutoCRUD, "DescribeClusterParameterGroups": TierHandVerified, "DescribeClusterParameters": TierHandVerified, - "DescribeClusterSecurityGroups": TierUnimplemented, + "DescribeClusterSecurityGroups": TierAutoCRUD, "DescribeClusterSnapshots": TierHandVerified, "DescribeClusterSubnetGroups": TierHandVerified, - "DescribeClusterTracks": TierUnimplemented, - "DescribeClusterVersions": TierUnimplemented, + "DescribeClusterTracks": TierAutoCRUD, + "DescribeClusterVersions": TierAutoCRUD, "DescribeClusters": TierHandVerified, - "DescribeCustomDomainAssociations": TierUnimplemented, - "DescribeDataShares": TierUnimplemented, - "DescribeDataSharesForConsumer": TierUnimplemented, - "DescribeDataSharesForProducer": TierUnimplemented, + "DescribeCustomDomainAssociations": TierAutoCRUD, + "DescribeDataShares": TierAutoCRUD, + "DescribeDataSharesForConsumer": TierAutoCRUD, + "DescribeDataSharesForProducer": TierAutoCRUD, "DescribeDefaultClusterParameters": TierHandVerified, - "DescribeEndpointAccess": TierUnimplemented, - "DescribeEndpointAuthorization": TierUnimplemented, - "DescribeEventCategories": TierUnimplemented, - "DescribeEventSubscriptions": TierUnimplemented, - "DescribeEvents": TierUnimplemented, - "DescribeHsmClientCertificates": TierUnimplemented, - "DescribeHsmConfigurations": TierUnimplemented, - "DescribeInboundIntegrations": TierUnimplemented, - "DescribeIntegrations": TierUnimplemented, + "DescribeEndpointAccess": TierAutoCRUD, + "DescribeEndpointAuthorization": TierAutoCRUD, + "DescribeEventCategories": TierAutoCRUD, + "DescribeEventSubscriptions": TierAutoCRUD, + "DescribeEvents": TierAutoCRUD, + "DescribeHsmClientCertificates": TierAutoCRUD, + "DescribeHsmConfigurations": TierAutoCRUD, + "DescribeInboundIntegrations": TierAutoCRUD, + "DescribeIntegrations": TierAutoCRUD, "DescribeLoggingStatus": TierHandVerified, - "DescribeNodeConfigurationOptions": TierUnimplemented, - "DescribeOrderableClusterOptions": TierUnimplemented, - "DescribePartners": TierUnimplemented, - "DescribeRedshiftIdcApplications": TierUnimplemented, - "DescribeReservedNodeExchangeStatus": TierUnimplemented, - "DescribeReservedNodeOfferings": TierUnimplemented, - "DescribeReservedNodes": TierUnimplemented, - "DescribeResize": TierUnimplemented, - "DescribeScheduledActions": TierUnimplemented, - "DescribeSnapshotCopyGrants": TierUnimplemented, - "DescribeSnapshotSchedules": TierUnimplemented, - "DescribeStorage": TierUnimplemented, - "DescribeTableRestoreStatus": TierUnimplemented, + "DescribeNodeConfigurationOptions": TierAutoCRUD, + "DescribeOrderableClusterOptions": TierAutoCRUD, + "DescribePartners": TierAutoCRUD, + "DescribeRedshiftIdcApplications": TierAutoCRUD, + "DescribeReservedNodeExchangeStatus": TierAutoCRUD, + "DescribeReservedNodeOfferings": TierAutoCRUD, + "DescribeReservedNodes": TierAutoCRUD, + "DescribeResize": TierAutoCRUD, + "DescribeScheduledActions": TierAutoCRUD, + "DescribeSnapshotCopyGrants": TierAutoCRUD, + "DescribeSnapshotSchedules": TierAutoCRUD, + "DescribeStorage": TierAutoCRUD, + "DescribeTableRestoreStatus": TierAutoCRUD, "DescribeTags": TierHandVerified, - "DescribeUsageLimits": TierUnimplemented, + "DescribeUsageLimits": TierAutoCRUD, "DisableLogging": TierHandVerified, "DisableSnapshotCopy": TierUnimplemented, "DisassociateDataShareConsumer": TierUnimplemented, @@ -9865,36 +9865,36 @@ var Services = map[string]Service{ "FailoverPrimaryCompute": TierUnimplemented, "GetClusterCredentials": TierHandVerified, "GetClusterCredentialsWithIAM": TierHandVerified, - "GetIdentityCenterAuthToken": TierUnimplemented, - "GetReservedNodeExchangeConfigurationOptions": TierUnimplemented, - "GetReservedNodeExchangeOfferings": TierUnimplemented, - "GetResourcePolicy": TierUnimplemented, - "ListRecommendations": TierUnimplemented, - "ModifyAquaConfiguration": TierUnimplemented, - "ModifyAuthenticationProfile": TierUnimplemented, + "GetIdentityCenterAuthToken": TierAutoCRUD, + "GetReservedNodeExchangeConfigurationOptions": TierAutoCRUD, + "GetReservedNodeExchangeOfferings": TierAutoCRUD, + "GetResourcePolicy": TierAutoCRUD, + "ListRecommendations": TierAutoCRUD, + "ModifyAquaConfiguration": TierAutoCRUD, + "ModifyAuthenticationProfile": TierAutoCRUD, "ModifyCluster": TierHandVerified, - "ModifyClusterDbRevision": TierUnimplemented, - "ModifyClusterIamRoles": TierUnimplemented, - "ModifyClusterMaintenance": TierUnimplemented, + "ModifyClusterDbRevision": TierAutoCRUD, + "ModifyClusterIamRoles": TierAutoCRUD, + "ModifyClusterMaintenance": TierAutoCRUD, "ModifyClusterParameterGroup": TierHandVerified, - "ModifyClusterSnapshot": TierUnimplemented, - "ModifyClusterSnapshotSchedule": TierUnimplemented, + "ModifyClusterSnapshot": TierAutoCRUD, + "ModifyClusterSnapshotSchedule": TierAutoCRUD, "ModifyClusterSubnetGroup": TierHandVerified, - "ModifyCustomDomainAssociation": TierUnimplemented, - "ModifyEndpointAccess": TierUnimplemented, - "ModifyEventSubscription": TierUnimplemented, - "ModifyIntegration": TierUnimplemented, - "ModifyLakehouseConfiguration": TierUnimplemented, - "ModifyRedshiftIdcApplication": TierUnimplemented, - "ModifyScheduledAction": TierUnimplemented, - "ModifySnapshotCopyRetentionPeriod": TierUnimplemented, - "ModifySnapshotSchedule": TierUnimplemented, - "ModifyUsageLimit": TierUnimplemented, + "ModifyCustomDomainAssociation": TierAutoCRUD, + "ModifyEndpointAccess": TierAutoCRUD, + "ModifyEventSubscription": TierAutoCRUD, + "ModifyIntegration": TierAutoCRUD, + "ModifyLakehouseConfiguration": TierAutoCRUD, + "ModifyRedshiftIdcApplication": TierAutoCRUD, + "ModifyScheduledAction": TierAutoCRUD, + "ModifySnapshotCopyRetentionPeriod": TierAutoCRUD, + "ModifySnapshotSchedule": TierAutoCRUD, + "ModifyUsageLimit": TierAutoCRUD, "PauseCluster": TierHandVerified, "PurchaseReservedNodeOffering": TierUnimplemented, - "PutResourcePolicy": TierUnimplemented, + "PutResourcePolicy": TierAutoCRUD, "RebootCluster": TierHandVerified, - "RegisterNamespace": TierUnimplemented, + "RegisterNamespace": TierAutoCRUD, "RejectDataShare": TierUnimplemented, "ResetClusterParameterGroup": TierHandVerified, "ResizeCluster": TierUnimplemented, @@ -9905,7 +9905,7 @@ var Services = map[string]Service{ "RevokeEndpointAccess": TierUnimplemented, "RevokeSnapshotAccess": TierUnimplemented, "RotateEncryptionKey": TierUnimplemented, - "UpdatePartnerStatus": TierUnimplemented, + "UpdatePartnerStatus": TierAutoCRUD, }}, "redshiftdata": {Protocol: "json-1.1", ModelBacked: true, EngineWired: true, Operations: map[string]Tier{ "BatchExecuteStatement": TierUnimplemented, diff --git a/internal/services/autoscaling/provider.go b/internal/services/autoscaling/provider.go index 2bd4f229..3d6a92de 100644 --- a/internal/services/autoscaling/provider.go +++ b/internal/services/autoscaling/provider.go @@ -174,10 +174,17 @@ func (p *Provider) HandleRequest(ctx context.Context, op string, req *http.Reque return p.handleTerminateInstanceInAutoScalingGroup(form) default: - type genericResult struct { - XMLName xml.Name `xml:"GenericResponse"` - } - return asXMLResponse(http.StatusOK, genericResult{XMLName: xml.Name{Local: action + "Response"}}) + // Hand back to the generic CRUD engine rather than inventing a success. + // This branch used to return 200 with an empty , which + // is a fabricated success for an operation nothing implements — the one + // thing docs/coverage.md says must never happen. It also had no + // wrapper, so botocore's query parser raised KeyError on + // the operations that declare one. + // + // The engine serves the CRUD-shaped actions from the real store and + // refuses the rest with InvalidAction. Either way the caller is told the + // truth. See internal/shared/crud. + return nil, plugin.ErrUnhandledOp } } diff --git a/internal/services/cloudformation/provider.go b/internal/services/cloudformation/provider.go index cb6f3302..60270f82 100644 --- a/internal/services/cloudformation/provider.go +++ b/internal/services/cloudformation/provider.go @@ -204,10 +204,17 @@ func (p *Provider) HandleRequest(ctx context.Context, op string, req *http.Reque return p.handleDescribePublisher(form) default: - type genericResult struct { - XMLName xml.Name `xml:"GenericResponse"` - } - return shared.XMLResponse(http.StatusOK, genericResult{XMLName: xml.Name{Local: action + "Response"}}) + // Hand back to the generic CRUD engine rather than inventing a success. + // This branch used to return 200 with an empty , which + // is a fabricated success for an operation nothing implements — the one + // thing docs/coverage.md says must never happen. It also had no + // wrapper, so botocore's query parser raised KeyError on + // the operations that declare one. + // + // The engine serves the CRUD-shaped actions from the real store and + // refuses the rest with InvalidAction. Either way the caller is told the + // truth. See internal/shared/crud. + return nil, plugin.ErrUnhandledOp } } diff --git a/internal/services/docdb/provider.go b/internal/services/docdb/provider.go index 461054c9..2abe2b19 100644 --- a/internal/services/docdb/provider.go +++ b/internal/services/docdb/provider.go @@ -187,10 +187,17 @@ func (p *Provider) HandleRequest(ctx context.Context, op string, req *http.Reque return p.handleSwitchoverGlobalCluster(form) default: - type genericResult struct { - XMLName xml.Name `xml:"GenericResponse"` - } - return shared.XMLResponse(http.StatusOK, genericResult{XMLName: xml.Name{Local: action + "Response"}}) + // Hand back to the generic CRUD engine rather than inventing a success. + // This branch used to return 200 with an empty , which + // is a fabricated success for an operation nothing implements — the one + // thing docs/coverage.md says must never happen. It also had no + // wrapper, so botocore's query parser raised KeyError on + // the operations that declare one. + // + // The engine serves the CRUD-shaped actions from the real store and + // refuses the rest with InvalidAction. Either way the caller is told the + // truth. See internal/shared/crud. + return nil, plugin.ErrUnhandledOp } } diff --git a/internal/services/elasticache/provider.go b/internal/services/elasticache/provider.go index 32e1108c..def85ab4 100644 --- a/internal/services/elasticache/provider.go +++ b/internal/services/elasticache/provider.go @@ -175,10 +175,17 @@ func (p *Provider) HandleRequest(ctx context.Context, op string, req *http.Reque return p.handleListTagsForResource(form) default: - type genericResponse struct { - XMLName xml.Name `xml:"GenericResponse"` - } - return ecXMLResponse(http.StatusOK, genericResponse{XMLName: xml.Name{Local: action + "Response"}}) + // Hand back to the generic CRUD engine rather than inventing a success. + // This branch used to return 200 with an empty , which + // is a fabricated success for an operation nothing implements — the one + // thing docs/coverage.md says must never happen. It also had no + // wrapper, so botocore's query parser raised KeyError on + // the operations that declare one. + // + // The engine serves the CRUD-shaped actions from the real store and + // refuses the rest with InvalidAction. Either way the caller is told the + // truth. See internal/shared/crud. + return nil, plugin.ErrUnhandledOp } } diff --git a/internal/services/elasticloadbalancingv2/provider.go b/internal/services/elasticloadbalancingv2/provider.go index bbd5ca01..de76a4be 100644 --- a/internal/services/elasticloadbalancingv2/provider.go +++ b/internal/services/elasticloadbalancingv2/provider.go @@ -145,10 +145,17 @@ func (p *Provider) HandleRequest(ctx context.Context, op string, req *http.Reque return p.handleDescribeListenerCertificates(form) default: - type genericResult struct { - XMLName xml.Name `xml:"GenericResponse"` - } - return shared.XMLResponse(http.StatusOK, genericResult{XMLName: xml.Name{Local: action + "Response"}}) + // Hand back to the generic CRUD engine rather than inventing a success. + // This branch used to return 200 with an empty , which + // is a fabricated success for an operation nothing implements — the one + // thing docs/coverage.md says must never happen. It also had no + // wrapper, so botocore's query parser raised KeyError on + // the operations that declare one. + // + // The engine serves the CRUD-shaped actions from the real store and + // refuses the rest with InvalidAction. Either way the caller is told the + // truth. See internal/shared/crud. + return nil, plugin.ErrUnhandledOp } } diff --git a/internal/services/neptune/provider.go b/internal/services/neptune/provider.go index 1427d5e5..de9f737d 100644 --- a/internal/services/neptune/provider.go +++ b/internal/services/neptune/provider.go @@ -225,10 +225,17 @@ func (p *Provider) HandleRequest(ctx context.Context, op string, req *http.Reque return p.handleSwitchoverGlobalCluster(form) default: - type genericResult struct { - XMLName xml.Name `xml:"GenericResponse"` - } - return shared.XMLResponse(http.StatusOK, genericResult{XMLName: xml.Name{Local: action + "Response"}}) + // Hand back to the generic CRUD engine rather than inventing a success. + // This branch used to return 200 with an empty , which + // is a fabricated success for an operation nothing implements — the one + // thing docs/coverage.md says must never happen. It also had no + // wrapper, so botocore's query parser raised KeyError on + // the operations that declare one. + // + // The engine serves the CRUD-shaped actions from the real store and + // refuses the rest with InvalidAction. Either way the caller is told the + // truth. See internal/shared/crud. + return nil, plugin.ErrUnhandledOp } } diff --git a/internal/services/rds/provider.go b/internal/services/rds/provider.go index 21c3103b..be9bd304 100644 --- a/internal/services/rds/provider.go +++ b/internal/services/rds/provider.go @@ -201,10 +201,17 @@ func (p *Provider) HandleRequest(ctx context.Context, op string, req *http.Reque return p.handleApplyPendingMaintenanceAction(form) default: - type genericResult struct { - XMLName xml.Name `xml:"GenericResponse"` - } - return shared.XMLResponse(http.StatusOK, genericResult{XMLName: xml.Name{Local: action + "Response"}}) + // Hand back to the generic CRUD engine rather than inventing a success. + // This branch used to return 200 with an empty , which + // is a fabricated success for an operation nothing implements — the one + // thing docs/coverage.md says must never happen. It also had no + // wrapper, so botocore's query parser raised KeyError on + // the operations that declare one. + // + // The engine serves the CRUD-shaped actions from the real store and + // refuses the rest with InvalidAction. Either way the caller is told the + // truth. See internal/shared/crud. + return nil, plugin.ErrUnhandledOp } } diff --git a/internal/services/redshift/provider.go b/internal/services/redshift/provider.go index d91a76ac..462076a0 100644 --- a/internal/services/redshift/provider.go +++ b/internal/services/redshift/provider.go @@ -135,10 +135,17 @@ func (p *Provider) HandleRequest(ctx context.Context, op string, req *http.Reque return p.handleGetClusterCredentialsWithIAM(form) default: - type genericResult struct { - XMLName xml.Name `xml:"GenericResponse"` - } - return shared.XMLResponse(http.StatusOK, genericResult{XMLName: xml.Name{Local: action + "Response"}}) + // Hand back to the generic CRUD engine rather than inventing a success. + // This branch used to return 200 with an empty , which + // is a fabricated success for an operation nothing implements — the one + // thing docs/coverage.md says must never happen. It also had no + // wrapper, so botocore's query parser raised KeyError on + // the operations that declare one. + // + // The engine serves the CRUD-shaped actions from the real store and + // refuses the rest with InvalidAction. Either way the caller is told the + // truth. See internal/shared/crud. + return nil, plugin.ErrUnhandledOp } }