diff --git a/changes/unreleased/Fixed-20260930-070954.yaml b/changes/unreleased/Fixed-20260930-070954.yaml new file mode 100644 index 00000000..40c36fa8 --- /dev/null +++ b/changes/unreleased/Fixed-20260930-070954.yaml @@ -0,0 +1,5 @@ +kind: Fixed +body: Route unhandled S3 bucket subresources through the CRUD fallback and report failed service resets. +time: 2026-09-30T07:09:54.167849+09:00 +custom: + Issue: "174" diff --git a/cmd/devcloud/fidelity_test.go b/cmd/devcloud/fidelity_test.go index b1185a39..7f2f5457 100644 --- a/cmd/devcloud/fidelity_test.go +++ b/cmd/devcloud/fidelity_test.go @@ -99,16 +99,9 @@ func TestFidelityManifestCoversRegisteredServices(t *testing.T) { // lists. func TestFidelityManifestCoversCRUDRegistry(t *testing.T) { for _, id := range plugin.DefaultRegistry.RegisteredServices() { - // Registry membership is classifiability, not reachability. The CRUD - // registry is built from the model, so it also holds operations for - // services whose hand-written provider refuses unknown operations - // itself (apigatewayv2, xray) — the engine is never routed to for - // those, so "unimplemented" is the truth and this check would be - // asserting the opposite. TestFidelityManifestCoverage's `served == 0 - // && RegisteredOps > 0` guard is what catches wiring that goes missing. - if !fidelity.Services[id].EngineWired { - continue - } + // The gateway retries explicit AWS-shaped unimplemented responses through + // the CRUD engine, so every registry operation is reachable regardless of + // whether a legacy provider returns ErrUnhandledOp itself. for op := range crud.RegisteredOps(id) { tier, ok := fidelity.Lookup(id, op) if !ok { diff --git a/cmd/devcloud/main.go b/cmd/devcloud/main.go index 0e03aee7..18486ca2 100644 --- a/cmd/devcloud/main.go +++ b/cmd/devcloud/main.go @@ -6,10 +6,12 @@ import ( "context" "errors" "flag" + "fmt" "log/slog" "net/http" "os" "os/signal" + "path/filepath" "syscall" "time" @@ -18,6 +20,7 @@ import ( "github.com/skyoo2003/devcloud/internal/gateway" "github.com/skyoo2003/devcloud/internal/plugin" iamsvc "github.com/skyoo2003/devcloud/internal/services/iam" + "github.com/skyoo2003/devcloud/internal/shared/crud" ) // initOrder lists the services that must come up for DevCloud to be useful, in @@ -31,6 +34,7 @@ var initOrder = []string{ func main() { cfgPath := flag.String("config", "", "Path to config file (optional; uses ./devcloud.yaml if present, else embedded defaults)") + resetData := flag.Bool("reset-data", false, "Delete all local DevCloud data and exit") flag.Parse() var ( @@ -61,6 +65,23 @@ func main() { } registry := plugin.DefaultRegistry + if *resetData { + if err := resetAllData(cfg, registry); err != nil { + slog.Error("failed to reset local data", "error", err) + os.Exit(1) + } + slog.Info("local DevCloud data reset") + return + } + if err := crud.Open(filepath.Join(cfg.DataDir(), "devcloud.db")); err != nil { + slog.Error("failed to open DevCloud data store", "error", err) + os.Exit(1) + } + defer func() { + if err := crud.Close(); err != nil { + slog.Error("failed to close DevCloud data store", "error", err) + } + }() // A service's provider comes from the plugin itself, so config resolution is // provider-aware without the config package needing to know which services @@ -74,10 +95,10 @@ func main() { return plugin.ProviderOf(p) } - initService := func(name string, fatal bool) { + initService := func(name string, fatal bool) error { svcCfg := cfg.ProviderService(providerOf(name), name) if !svcCfg.Enabled { - return + return nil } pluginCfg := plugin.PluginConfig{ DataDir: svcCfg.DataDir, @@ -89,13 +110,14 @@ func main() { os.Exit(1) } slog.Warn("service init failed", "service", name, "error", err) - return + return err } slog.Info("service initialized", "service", name) + return nil } for _, name := range initOrder { - initService(name, true) + _ = initService(name, true) } // RegisteredServices() is sorted, so the long tail starts in a reproducible // order. Services already brought up above are skipped. @@ -103,7 +125,7 @@ func main() { if _, ok := registry.Get(name); ok { continue } - initService(name, false) + _ = initService(name, false) } // A services block is authoritative and `enabled` defaults to Go's false, @@ -129,13 +151,44 @@ func main() { var logCollector *admin.LogCollector var unroutedCollector *admin.UnroutedCollector adminHandler := http.NotFoundHandler() + var gw *gateway.Gateway if cfg.Admin.Enabled { logCollector = admin.NewLogCollector(1000) unroutedCollector = admin.NewUnroutedCollector(1000) - adminHandler = admin.NewAPI(registry, logCollector, unroutedCollector).Handler() + resetter := func(ctx context.Context) (int, error) { + if gw == nil { + return 0, errors.New("gateway is not initialized") + } + active := registry.ActiveServices() + resetErr := gw.WithMaintenance(func() error { + if err := registry.ShutdownAll(ctx); err != nil { + return err + } + if err := crud.Close(); err != nil { + return err + } + if err := resetAllData(cfg, registry); err != nil { + return err + } + if err := crud.Open(filepath.Join(cfg.DataDir(), "devcloud.db")); err != nil { + return err + } + for _, name := range active { + if err := initService(name, false); err != nil { + return fmt.Errorf("reinitialize %s: %w", name, err) + } + } + return nil + }) + if resetErr != nil { + return 0, resetErr + } + return len(registry.ActiveServices()), nil + } + adminHandler = admin.NewAPI(registry, logCollector, unroutedCollector, resetter).Handler() slog.Info("admin API enabled") } - gw := gateway.New(cfg.Server.Port, registry, adminHandler, logCollector, unroutedCollector) + gw = gateway.New(cfg.Server.Port, registry, adminHandler, logCollector, unroutedCollector) sigCh := make(chan os.Signal, 1) signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM) @@ -166,6 +219,28 @@ func main() { } } +// resetAllData removes DevCloud-owned state and every configured AWS service +// data directory. It is called only by the explicit --reset-data command. +func resetAllData(cfg *config.Config, registry *plugin.Registry) error { + paths := map[string]bool{filepath.Clean(cfg.DataDir()): true} + for _, id := range registry.RegisteredServices() { + p, ok := registry.Construct(id) + if !ok { + continue + } + paths[filepath.Clean(cfg.ProviderService(plugin.ProviderOf(p), id).DataDir)] = true + } + for path := range paths { + if path == "." || path == string(filepath.Separator) { + return fmt.Errorf("refusing to reset unsafe data path %q", path) + } + if err := os.RemoveAll(path); err != nil { + return fmt.Errorf("remove %s: %w", path, err) + } + } + return nil +} + func buildOptions(serviceID string, cfg *config.Config, registry *plugin.Registry) map[string]any { // server_port is passed to every service so URL-building providers // (SQS, ECR, CloudFormation, S3, Lambda, etc.) can construct diff --git a/docs/configuration.md b/docs/configuration.md index 5b7b0fd4..87665d96 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -96,6 +96,7 @@ logging: | `server.port` | `4747` | HTTP server port | | `services..enabled` | `false` | **Required per entry.** Listing a service is not enough — `enabled: true` still has to be set. | | `services..data_dir` | `./data/` | Data directory for persistent storage | +| `storage.data_dir` | `./data` | Directory holding DevCloud-wide local state, including generic AWS resources | | `admin.enabled` | `false` | Serve the admin REST API at `/devcloud/api/*` | | `logging.level` | `info` | `debug`, `info`, `warn`, `error` | | `logging.format` | `text` | `text` or `json` | @@ -149,6 +150,12 @@ block** — one under its forward-compatible name, one under its historical one. ## Data directories +DevCloud's generic resource fallback persists in SQLite at +`/devcloud.db`. By default this is `./data/devcloud.db`; an +explicit `DEVCLOUD_DATA_DIR` overrides it together with all service directories. +Use `devcloud --reset-data` before startup, or (with `admin.enabled: true`) +`DELETE /devcloud/api/data`, to remove **all** local DevCloud data. + | Service | Default `data_dir` | Backend | Contents | |---------|-------------------|---------|----------| | S3 | `./data/s3` | Filesystem + SQLite | Object files, `metadata.db` | diff --git a/docs/coverage.md b/docs/coverage.md index 674f54b6..1405f17e 100644 --- a/docs/coverage.md +++ b/docs/coverage.md @@ -17,8 +17,8 @@ denominators, because [routing and depth are two targets](#the-target): | Tier | Serving target | All registered | |---|---|---| | `hand-verified` | 4,497 | 4,528 | -| `auto-crud` | 5,193 | 10,871 | -| `unimplemented` | 2,717 | 3,802 | +| `auto-crud` | 5,910 | 11,588 | +| `unimplemented` | 2,000 | 3,085 | | **total known** | **12,407** | **19,201** | | **hand-verified share** | **36.2%** | **23.6%** | diff --git a/docs/crud-engine.md b/docs/crud-engine.md index 60199540..e0924e07 100644 --- a/docs/crud-engine.md +++ b/docs/crud-engine.md @@ -93,7 +93,9 @@ service from answering for operations it does not model — and it matters most - `List*` responses return stored objects; when the real AWS output member is a list of *names* rather than structures, an SDK may not populate it. - No required-parameter validation, so calls succeed with minimal input. -- The store is in-memory and per-process — not persisted across restarts. +- Resources are persisted in the local SQLite database under the configured + DevCloud data directory and survive restarts. `--reset-data` or + `DELETE /devcloud/api/data` clears all local DevCloud state. To promote an operation from `auto-crud` to `hand-verified`, implement it as an explicit `case` in the service provider, following existing patterns. See diff --git a/docs/getting-started.md b/docs/getting-started.md index 633e7d1d..aa41e12a 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -8,6 +8,10 @@ docker run -p 4747:4747 ghcr.io/skyoo2003/devcloud:latest To persist data across restarts, mount a volume: +Generic CRUD resources are persisted by default alongside service data. To +start from a clean local environment, run `devcloud --reset-data`; with the +admin API enabled, `DELETE /devcloud/api/data` performs the same full reset. + ```bash docker run -p 4747:4747 -v $(pwd)/data:/app/data ghcr.io/skyoo2003/devcloud:latest ``` diff --git a/internal/admin/api.go b/internal/admin/api.go index 0dfff026..245e9eef 100644 --- a/internal/admin/api.go +++ b/internal/admin/api.go @@ -18,18 +18,27 @@ type API struct { registry *plugin.Registry logCollector *LogCollector unrouted *UnroutedCollector + resetData DataResetter } +// DataResetter clears all local DevCloud state and returns the number of +// reinitialized services. It is injected by the application lifecycle layer. +type DataResetter func(context.Context) (int, error) + // NewAPI creates a new API. A nil unrouted collector is allowed; the unrouted // route then reports an empty result rather than 404ing, so a caller reading the // endpoint cannot mistake "not collecting" for "nothing was asked for" — the // distinction is visible in maxServiceIds. -func NewAPI(registry *plugin.Registry, logCollector *LogCollector, unrouted *UnroutedCollector) *API { - return &API{ +func NewAPI(registry *plugin.Registry, logCollector *LogCollector, unrouted *UnroutedCollector, resetters ...DataResetter) *API { + api := &API{ registry: registry, logCollector: logCollector, unrouted: unrouted, } + if len(resetters) > 0 { + api.resetData = resetters[0] + } + return api } // Handler returns an http.Handler that serves all /devcloud/api/* routes. @@ -41,10 +50,30 @@ func (d *API) Handler() http.Handler { mux.HandleFunc("/devcloud/api/logs", d.handleLogs) mux.HandleFunc("/devcloud/api/fidelity", d.handleFidelity) mux.HandleFunc("/devcloud/api/unrouted", d.handleUnrouted) + mux.HandleFunc("/devcloud/api/data", d.handleData) return mux } +// handleData deletes all DevCloud-owned local state. It is deliberately an +// admin-only endpoint and exposes no persistence implementation details. +func (d *API) handleData(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodDelete { + http.Error(w, "method not allowed", http.StatusMethodNotAllowed) + return + } + if d.resetData == nil { + http.Error(w, "data reset is unavailable", http.StatusServiceUnavailable) + return + } + active, err := d.resetData(r.Context()) + if err != nil { + http.Error(w, "failed to reset local data", http.StatusInternalServerError) + return + } + writeJSON(w, http.StatusOK, map[string]any{"reset": true, "activeServices": active}) +} + // handleUnrouted handles GET /devcloud/api/unrouted. // // It answers "what did callers ask this DevCloud for that it does not diff --git a/internal/admin/api_test.go b/internal/admin/api_test.go index 61a4bfe1..b4d156d1 100644 --- a/internal/admin/api_test.go +++ b/internal/admin/api_test.go @@ -176,6 +176,27 @@ func TestAPI_UnroutedRejectsNonGET(t *testing.T) { assert.Equal(t, http.StatusMethodNotAllowed, w.Code) } +func TestAPI_DataReset(t *testing.T) { + called := false + api := NewAPI(plugin.NewRegistry(), NewLogCollector(10), nil, + func(context.Context) (int, error) { + called = true + return 3, nil + }) + w := httptest.NewRecorder() + api.Handler().ServeHTTP(w, httptest.NewRequest(http.MethodDelete, "/devcloud/api/data", nil)) + require.Equal(t, http.StatusOK, w.Code) + assert.True(t, called) + var body map[string]any + require.NoError(t, json.NewDecoder(w.Body).Decode(&body)) + assert.Equal(t, true, body["reset"]) + assert.Equal(t, float64(3), body["activeServices"]) + + w = httptest.NewRecorder() + api.Handler().ServeHTTP(w, httptest.NewRequest(http.MethodGet, "/devcloud/api/data", nil)) + assert.Equal(t, http.StatusMethodNotAllowed, w.Code) +} + // TestAPI_Services registers a mock plugin and verifies the // /devcloud/api/services endpoint returns it. func TestAPI_Services(t *testing.T) { diff --git a/internal/codegen/gen_fidelity.go b/internal/codegen/gen_fidelity.go index 76953ca6..f68e9db2 100644 --- a/internal/codegen/gen_fidelity.go +++ b/internal/codegen/gen_fidelity.go @@ -84,13 +84,13 @@ func BuildFidelityData( for _, serviceID := range sortedKeys(providers) { provider := providers[serviceID] - // Reachable, not merely classifiable: an unwired provider serves none of - // the registry's operations, so its served set is empty and its - // CRUD-shaped operations fall through to unimplemented. - var served map[string]bool - if provider.EngineWired { - served = crudOps[serviceID] - } + // Every classified operation is reachable through the gateway. Providers + // that return ErrUnhandledOp take the original path; legacy providers + // that return an AWS-shaped NotImplemented/UnsupportedOperation response + // are retried by the gateway only when this registry classifies the + // operation. This preserves honest failures for non-CRUD operations while + // making the generic CRUD contract independent of provider boilerplate. + served := crudOps[serviceID] hand := make(map[string]bool, len(provider.Operations)) universe := make(map[string]bool) diff --git a/internal/codegen/gen_fidelity_test.go b/internal/codegen/gen_fidelity_test.go index d4888321..e36b4d49 100644 --- a/internal/codegen/gen_fidelity_test.go +++ b/internal/codegen/gen_fidelity_test.go @@ -28,21 +28,16 @@ func tierOf(t *testing.T, data FidelityData, serviceID, op string) string { return "" } -// TestBuildFidelityDataRequiresEngineWiring is the guard against the manifest -// overstating coverage. -// -// Being in the CRUD registry only means an operation is *classifiable* — the -// engine is reached at runtime only for providers that return -// plugin.ErrUnhandledOp. Labelling an operation auto-crud on registry -// membership alone publishes "this is served" for a provider that refuses it, -// which is exactly what a freshly scaffolded service would look like. -func TestBuildFidelityDataRequiresEngineWiring(t *testing.T) { +// TestBuildFidelityDataUsesGatewayFallback proves that legacy providers which +// return an AWS-shaped unimplemented response still expose classified CRUD +// operations through the gateway fallback. +func TestBuildFidelityDataUsesGatewayFallback(t *testing.T) { modelOps := map[string][]string{ "wired": {"CreateThing"}, "unwired": {"CreateThing"}, } - // Neither service hand-implements anything; the only difference is whether - // its dispatch reaches the engine. + // Neither service hand-implements anything. The gateway handles both the + // sentinel and legacy explicit unimplemented responses. providers := map[string]ProviderScan{ "wired": {EngineWired: true}, "unwired": {EngineWired: false}, @@ -54,10 +49,9 @@ func TestBuildFidelityDataRequiresEngineWiring(t *testing.T) { data := BuildFidelityData(modelOps, map[string]string{"demo": "json-1.1"}, providers, autoCRUD) - assert.Equal(t, "AutoCRUD", tierOf(t, data, "wired", "CreateThing"), - "an engine-wired provider's CRUD-shaped operation is served, so auto-crud is truthful") - assert.Equal(t, "Unimplemented", tierOf(t, data, "unwired", "CreateThing"), - "a provider that never reaches the engine serves nothing, whatever the CRUD registry says") + assert.Equal(t, "AutoCRUD", tierOf(t, data, "wired", "CreateThing")) + assert.Equal(t, "AutoCRUD", tierOf(t, data, "unwired", "CreateThing"), + "gateway fallback makes a classified operation reachable without provider boilerplate") } // TestBuildFidelityDataPromotesShortDeclaredOperations covers the operation name diff --git a/internal/codegen/scan_handverified_test.go b/internal/codegen/scan_handverified_test.go index 2069d2f8..f2cf0cdb 100644 --- a/internal/codegen/scan_handverified_test.go +++ b/internal/codegen/scan_handverified_test.go @@ -204,8 +204,11 @@ func TestScanProvidersDetectsEngineWiring(t *testing.T) { assert.True(t, scans[id].EngineWired, "%s returns plugin.ErrUnhandledOp, so it must be reported as engine-wired", id) } - // Path-routed and Query-protocol providers that answer their own default. - for _, id := range []string{"s3", "iam", "route53"} { + // IAM and Route53 answer their own defaults. S3 delegates unimplemented + // subresources to the CRUD engine. + assert.True(t, scans["s3"].EngineWired, + "s3 returns plugin.ErrUnhandledOp for unimplemented subresources") + for _, id := range []string{"iam", "route53"} { assert.False(t, scans[id].EngineWired, "%s never returns plugin.ErrUnhandledOp, so it must not be reported as engine-wired", id) } diff --git a/internal/config/config.go b/internal/config/config.go index ceb1ff1d..9095ead7 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -40,6 +40,7 @@ var knownProviders = map[string]bool{DefaultProvider: true} type Config struct { Server ServerConfig `yaml:"server"` Services map[string]ServiceConfig `yaml:"services"` + Storage StorageConfig `yaml:"storage"` Admin *AdminConfig `yaml:"admin"` Logging LoggingConfig `yaml:"logging"` @@ -76,6 +77,12 @@ type Config struct { baseDir string } +// StorageConfig configures data owned by DevCloud itself rather than by one +// AWS service. Service data_dir values remain backward compatible. +type StorageConfig struct { + DataDir string `yaml:"data_dir"` +} + type ServerConfig struct { Port int `yaml:"port"` } @@ -160,6 +167,18 @@ func (c *Config) ProviderService(provider, serviceID string) ServiceConfig { return svc } +// DataDir is the root for DevCloud-owned state. DEVCLOUD_DATA_DIR remains the +// highest-precedence override for both this state and service data directories. +func (c *Config) DataDir() string { + if c.baseDir != "" { + return c.baseDir + } + if c.Storage.DataDir != "" { + return c.Storage.DataDir + } + return defaultDataDir +} + // serviceBlock returns the services block that governs provider, and whether // one was written at all. The distinction matters: a block that exists is // authoritative even when empty, while no block means "run everything". diff --git a/internal/gateway/gateway.go b/internal/gateway/gateway.go index c694cca0..a6facf6d 100644 --- a/internal/gateway/gateway.go +++ b/internal/gateway/gateway.go @@ -7,6 +7,8 @@ import ( "fmt" "net/http" "strings" + "sync" + "sync/atomic" "time" "github.com/skyoo2003/devcloud/internal/admin" @@ -17,8 +19,10 @@ import ( // Gateway wraps an HTTP server and ties together the plugin registry with // the full middleware chain. type Gateway struct { - server *http.Server - registry *plugin.Registry + server *http.Server + registry *plugin.Registry + maintenance sync.RWMutex + resetting atomic.Bool } // New creates a Gateway that listens on the given port. @@ -38,15 +42,41 @@ type Gateway struct { // service. func New(port int, registry *plugin.Registry, adminAPI http.Handler, logCollector *admin.LogCollector, unroutedCollector *admin.UnroutedCollector) *Gateway { router := NewServiceRouter(registry, unroutedCollector) + g := &Gateway{registry: registry} // Logging middleware: records AWS API requests to logCollector. Only // installed when there is a collector to read them. - var serviceHandler http.Handler = router + var serviceHandler http.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if g.resetting.Load() { + http.Error(w, "DevCloud data reset in progress", http.StatusServiceUnavailable) + return + } + g.maintenance.RLock() + defer g.maintenance.RUnlock() + if g.resetting.Load() { + http.Error(w, "DevCloud data reset in progress", http.StatusServiceUnavailable) + return + } + router.ServeHTTP(w, r) + }) if logCollector != nil { serviceHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() rec := newStatusRecorder(w) - router.ServeHTTP(rec, r) + serviceHandlerBase := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if g.resetting.Load() { + http.Error(w, "DevCloud data reset in progress", http.StatusServiceUnavailable) + return + } + g.maintenance.RLock() + defer g.maintenance.RUnlock() + if g.resetting.Load() { + http.Error(w, "DevCloud data reset in progress", http.StatusServiceUnavailable) + return + } + router.ServeHTTP(w, r) + }) + serviceHandlerBase.ServeHTTP(rec, r) // IdentityMiddleware runs before this handler, so the region here is // what the caller signed for — empty for an unsigned client. id, _ := auth.FromContext(r.Context()) @@ -86,10 +116,18 @@ func New(port int, registry *plugin.Registry, adminAPI http.Handler, logCollecto IdleTimeout: 120 * time.Second, } - return &Gateway{ - server: srv, - registry: registry, - } + g.server = srv + return g +} + +// WithMaintenance blocks new AWS API requests while fn runs. Admin routes are +// intentionally left available so DELETE /devcloud/api/data can complete. +func (g *Gateway) WithMaintenance(fn func() error) error { + g.resetting.Store(true) + defer g.resetting.Store(false) + g.maintenance.Lock() + defer g.maintenance.Unlock() + return fn() } // detectService attempts to identify the AWS service from a request path. diff --git a/internal/gateway/router.go b/internal/gateway/router.go index aec4a877..85136309 100644 --- a/internal/gateway/router.go +++ b/internal/gateway/router.go @@ -80,7 +80,7 @@ func (sr *ServiceRouter) ServeHTTP(w http.ResponseWriter, r *http.Request) { // A provider that returns ErrUnhandledOp is opting into the generic CRUD // fallback for operations it does not implement. If the engine cannot // classify the operation either, emit the standard "unknown action" error. - if errors.Is(err, plugin.ErrUnhandledOp) { + if errors.Is(err, plugin.ErrUnhandledOp) || isUnimplementedResponse(resp) { res, cerr := crud.Handle(crud.Call{ Service: serviceID, Protocol: protocol, @@ -89,11 +89,13 @@ func (sr *ServiceRouter) ServeHTTP(w http.ResponseWriter, r *http.Request) { URI: r.URL.RequestURI(), Body: body, }) - if cerr != nil { + if cerr != nil && errors.Is(err, plugin.ErrUnhandledOp) { writeAWSError(w, protocol, http.StatusBadRequest, "InvalidAction", "unknown action: "+op) return } - resp, err = &plugin.Response{StatusCode: res.Status, Body: res.Body, ContentType: res.ContentType}, nil + if cerr == nil { + resp, err = &plugin.Response{StatusCode: res.Status, Body: res.Body, ContentType: res.ContentType}, nil + } } if err != nil { @@ -139,6 +141,20 @@ func (sr *ServiceRouter) ServeHTTP(w http.ResponseWriter, r *http.Request) { _, _ = w.Write(resp.Body) } +// isUnimplementedResponse recognises the explicit AWS-shaped errors returned +// by older hand-written providers. The fallback engine is still asked only for +// operations it classifies, so a non-CRUD operation keeps the provider's +// honest error rather than becoming a fabricated success. +func isUnimplementedResponse(resp *plugin.Response) bool { + if resp == nil { + return false + } + body := string(resp.Body) + return strings.Contains(body, "NotImplemented") || + strings.Contains(body, "UnsupportedOperation") || + strings.Contains(body, "MethodNotAllowed") +} + // extractOperationName derives the AWS operation name from the request. // - JSON protocols: X-Amz-Target header suffix after the '.' // - Query protocol: Action query/body parameter diff --git a/internal/generated/compat/services.json b/internal/generated/compat/services.json index baf29a87..3fa70ae2 100644 --- a/internal/generated/compat/services.json +++ b/internal/generated/compat/services.json @@ -468,8 +468,13 @@ "CreateIntegration", "CreateIntegrationResponse", "CreateModel", + "CreatePortal", + "CreatePortalProduct", + "CreateProductPage", + "CreateProductRestEndpointPage", "CreateRoute", "CreateRouteResponse", + "CreateRoutingRule", "CreateStage", "CreateVpcLink", "DeleteAccessLogSettings", @@ -482,10 +487,16 @@ "DeleteIntegration", "DeleteIntegrationResponse", "DeleteModel", + "DeletePortal", + "DeletePortalProduct", + "DeletePortalProductSharingPolicy", + "DeleteProductPage", + "DeleteProductRestEndpointPage", "DeleteRoute", "DeleteRouteRequestParameter", "DeleteRouteResponse", "DeleteRouteSettings", + "DeleteRoutingRule", "DeleteStage", "DeleteVpcLink", "ExportApi", @@ -506,16 +517,29 @@ "GetModel", "GetModelTemplate", "GetModels", + "GetPortal", + "GetPortalProduct", + "GetPortalProductSharingPolicy", + "GetProductPage", + "GetProductRestEndpointPage", "GetRoute", "GetRouteResponse", "GetRouteResponses", "GetRoutes", + "GetRoutingRule", "GetStage", "GetStages", "GetTags", "GetVpcLink", "GetVpcLinks", "ImportApi", + "ListPortalProducts", + "ListPortals", + "ListProductPages", + "ListProductRestEndpointPages", + "ListRoutingRules", + "PutPortalProductSharingPolicy", + "PutRoutingRule", "ReimportApi", "ResetAuthorizersCache", "TagResource", @@ -528,7 +552,12 @@ "UpdateIntegration", "UpdateIntegrationResponse", "UpdateModel", + "UpdatePortal", + "UpdatePortalProduct", + "UpdateProductPage", + "UpdateProductRestEndpointPage", "UpdateRoute", + "UpdateRouteResponse", "UpdateStage", "UpdateVpcLink" ] @@ -1025,6 +1054,7 @@ "ListSourceApiAssociations", "ListTagsForResource", "ListTypes", + "ListTypesByAssociation", "PutGraphqlApiEnvironmentVariables", "StartDataSourceIntrospection", "StartSchemaCreation", @@ -1355,9 +1385,13 @@ "CreateBackupSelection", "CreateBackupVault", "CreateFramework", + "CreateLegalHold", + "CreateLogicallyAirGappedBackupVault", "CreateReportPlan", + "CreateRestoreAccessBackupVault", "CreateRestoreTestingPlan", "CreateRestoreTestingSelection", + "CreateTieringConfiguration", "DeleteBackupPlan", "DeleteBackupSelection", "DeleteBackupVault", @@ -1369,8 +1403,10 @@ "DeleteReportPlan", "DeleteRestoreTestingPlan", "DeleteRestoreTestingSelection", + "DeleteTieringConfiguration", "DescribeBackupJob", "DescribeBackupVault", + "DescribeCopyJob", "DescribeFramework", "DescribeGlobalSettings", "DescribeProtectedResource", @@ -1379,6 +1415,7 @@ "DescribeReportJob", "DescribeReportPlan", "DescribeRestoreJob", + "DescribeScanJob", "ExportBackupPlanTemplate", "GetBackupPlan", "GetBackupPlanFromJSON", @@ -1386,6 +1423,7 @@ "GetBackupSelection", "GetBackupVaultAccessPolicy", "GetBackupVaultNotifications", + "GetLegalHold", "GetRecoveryPointIndexDetails", "GetRecoveryPointRestoreMetadata", "GetRestoreJobMetadata", @@ -1393,6 +1431,7 @@ "GetRestoreTestingPlan", "GetRestoreTestingSelection", "GetSupportedResourceTypes", + "GetTieringConfiguration", "ListBackupJobSummaries", "ListBackupJobs", "ListBackupPlanTemplates", @@ -1400,20 +1439,28 @@ "ListBackupPlans", "ListBackupSelections", "ListBackupVaults", + "ListCopyJobSummaries", + "ListCopyJobs", "ListFrameworks", "ListIndexedRecoveryPoints", + "ListLegalHolds", "ListProtectedResources", "ListProtectedResourcesByBackupVault", "ListRecoveryPointsByBackupVault", + "ListRecoveryPointsByLegalHold", "ListRecoveryPointsByResource", "ListReportJobs", "ListReportPlans", + "ListRestoreAccessBackupVaults", "ListRestoreJobSummaries", "ListRestoreJobs", "ListRestoreJobsByProtectedResource", "ListRestoreTestingPlans", "ListRestoreTestingSelections", + "ListScanJobSummaries", + "ListScanJobs", "ListTags", + "ListTieringConfigurations", "PutBackupVaultAccessPolicy", "PutBackupVaultLockConfiguration", "PutBackupVaultNotifications", @@ -1432,7 +1479,8 @@ "UpdateRegionSettings", "UpdateReportPlan", "UpdateRestoreTestingPlan", - "UpdateRestoreTestingSelection" + "UpdateRestoreTestingSelection", + "UpdateTieringConfiguration" ] }, "backupgateway": { @@ -1601,25 +1649,102 @@ "bedrock": { "protocol": "rest-json", "servedOps": [ + "CreateAutomatedReasoningPolicy", + "CreateAutomatedReasoningPolicyTestCase", + "CreateAutomatedReasoningPolicyVersion", + "CreateCustomModel", + "CreateCustomModelDeployment", + "CreateEvaluationJob", + "CreateFoundationModelAgreement", "CreateGuardrail", + "CreateGuardrailVersion", + "CreateInferenceProfile", + "CreateMarketplaceModelEndpoint", + "CreateModelCopyJob", "CreateModelCustomizationJob", + "CreateModelImportJob", + "CreateModelInvocationJob", + "CreatePromptRouter", + "CreateProvisionedModelThroughput", + "DeleteAutomatedReasoningPolicy", + "DeleteAutomatedReasoningPolicyBuildWorkflow", + "DeleteAutomatedReasoningPolicyTestCase", "DeleteCustomModel", + "DeleteCustomModelDeployment", + "DeleteEnforcedGuardrailConfiguration", + "DeleteFoundationModelAgreement", "DeleteGuardrail", + "DeleteImportedModel", + "DeleteInferenceProfile", + "DeleteMarketplaceModelEndpoint", + "DeleteModelInvocationLoggingConfiguration", + "DeletePromptRouter", + "DeleteProvisionedModelThroughput", + "DeleteResourcePolicy", + "DeregisterMarketplaceModelEndpoint", + "GetAutomatedReasoningPolicy", + "GetAutomatedReasoningPolicyAnnotations", + "GetAutomatedReasoningPolicyBuildWorkflow", + "GetAutomatedReasoningPolicyBuildWorkflowResultAssets", + "GetAutomatedReasoningPolicyNextScenario", + "GetAutomatedReasoningPolicyTestCase", + "GetAutomatedReasoningPolicyTestResult", "GetCustomModel", + "GetCustomModelDeployment", + "GetEvaluationJob", "GetFoundationModel", + "GetFoundationModelAvailability", "GetGuardrail", + "GetImportedModel", + "GetInferenceProfile", + "GetMarketplaceModelEndpoint", + "GetModelCopyJob", "GetModelCustomizationJob", + "GetModelImportJob", + "GetModelInvocationJob", + "GetModelInvocationLoggingConfiguration", + "GetPromptRouter", + "GetProvisionedModelThroughput", + "GetResourcePolicy", + "GetUseCaseForModelAccess", "InvokeModel", "InvokeModelWithResponseStream", + "ListAutomatedReasoningPolicies", + "ListAutomatedReasoningPolicyBuildWorkflows", + "ListAutomatedReasoningPolicyTestCases", + "ListAutomatedReasoningPolicyTestResults", + "ListCustomModelDeployments", "ListCustomModels", + "ListEnforcedGuardrailsConfiguration", + "ListEvaluationJobs", + "ListFoundationModelAgreementOffers", "ListFoundationModels", "ListGuardrails", + "ListImportedModels", + "ListInferenceProfiles", + "ListMarketplaceModelEndpoints", + "ListModelCopyJobs", "ListModelCustomizationJobs", + "ListModelImportJobs", + "ListModelInvocationJobs", + "ListPromptRouters", + "ListProvisionedModelThroughputs", "ListTagsForResource", + "PutEnforcedGuardrailConfiguration", + "PutModelInvocationLoggingConfiguration", + "PutResourcePolicy", + "PutUseCaseForModelAccess", + "RegisterMarketplaceModelEndpoint", "StopModelCustomizationJob", "TagResource", "UntagResource", - "UpdateGuardrail" + "UpdateAutomatedReasoningPolicy", + "UpdateAutomatedReasoningPolicyAnnotations", + "UpdateAutomatedReasoningPolicyTestCase", + "UpdateCustomModelDeployment", + "UpdateGuardrail", + "UpdateMarketplaceModelEndpoint", + "UpdateProvisionedModelThroughput" ] }, "bedrockagent": { @@ -2736,51 +2861,164 @@ "cloudfront": { "protocol": "rest-xml", "servedOps": [ + "CreateAnycastIpList", "CreateCachePolicy", + "CreateCloudFrontOriginAccessIdentity", + "CreateConnectionFunction", + "CreateConnectionGroup", + "CreateContinuousDeploymentPolicy", "CreateDistribution", + "CreateDistributionTenant", "CreateDistributionWithTags", + "CreateFieldLevelEncryptionConfig", + "CreateFieldLevelEncryptionProfile", "CreateFunction", "CreateInvalidation", + "CreateInvalidationForDistributionTenant", + "CreateKeyGroup", + "CreateKeyValueStore", + "CreateMonitoringSubscription", "CreateOriginAccessControl", "CreateOriginRequestPolicy", + "CreatePublicKey", + "CreateRealtimeLogConfig", "CreateResponseHeadersPolicy", + "CreateStreamingDistribution", + "CreateStreamingDistributionWithTags", + "CreateTrustStore", + "CreateVpcOrigin", + "DeleteAnycastIpList", "DeleteCachePolicy", + "DeleteCloudFrontOriginAccessIdentity", + "DeleteConnectionFunction", + "DeleteConnectionGroup", + "DeleteContinuousDeploymentPolicy", "DeleteDistribution", + "DeleteDistributionTenant", + "DeleteFieldLevelEncryptionConfig", + "DeleteFieldLevelEncryptionProfile", "DeleteFunction", + "DeleteKeyGroup", + "DeleteKeyValueStore", + "DeleteMonitoringSubscription", "DeleteOriginAccessControl", "DeleteOriginRequestPolicy", + "DeletePublicKey", + "DeleteRealtimeLogConfig", + "DeleteResourcePolicy", "DeleteResponseHeadersPolicy", + "DeleteStreamingDistribution", + "DeleteTrustStore", + "DeleteVpcOrigin", + "DescribeConnectionFunction", "DescribeFunction", + "DescribeKeyValueStore", + "GetAnycastIpList", "GetCachePolicy", "GetCachePolicyConfig", + "GetCloudFrontOriginAccessIdentity", + "GetCloudFrontOriginAccessIdentityConfig", + "GetConnectionFunction", + "GetConnectionGroup", + "GetConnectionGroupByRoutingEndpoint", + "GetContinuousDeploymentPolicy", + "GetContinuousDeploymentPolicyConfig", "GetDistribution", "GetDistributionConfig", + "GetDistributionTenant", + "GetDistributionTenantByDomain", + "GetFieldLevelEncryption", + "GetFieldLevelEncryptionConfig", + "GetFieldLevelEncryptionProfile", + "GetFieldLevelEncryptionProfileConfig", "GetFunction", "GetInvalidation", + "GetInvalidationForDistributionTenant", + "GetKeyGroup", + "GetKeyGroupConfig", + "GetManagedCertificateDetails", + "GetMonitoringSubscription", "GetOriginAccessControl", "GetOriginAccessControlConfig", "GetOriginRequestPolicy", "GetOriginRequestPolicyConfig", + "GetPublicKey", + "GetPublicKeyConfig", + "GetRealtimeLogConfig", + "GetResourcePolicy", "GetResponseHeadersPolicy", "GetResponseHeadersPolicyConfig", + "GetStreamingDistribution", + "GetStreamingDistributionConfig", + "GetTrustStore", + "GetVpcOrigin", + "ListAnycastIpLists", "ListCachePolicies", + "ListCloudFrontOriginAccessIdentities", + "ListConflictingAliases", + "ListConnectionFunctions", + "ListConnectionGroups", + "ListContinuousDeploymentPolicies", + "ListDistributionTenants", + "ListDistributionTenantsByCustomization", "ListDistributions", + "ListDistributionsByAnycastIpListId", + "ListDistributionsByCachePolicyId", + "ListDistributionsByConnectionFunction", + "ListDistributionsByConnectionMode", + "ListDistributionsByKeyGroup", + "ListDistributionsByOriginRequestPolicyId", + "ListDistributionsByOwnedResource", + "ListDistributionsByRealtimeLogConfig", + "ListDistributionsByResponseHeadersPolicyId", + "ListDistributionsByTrustStore", + "ListDistributionsByVpcOriginId", + "ListDistributionsByWebACLId", + "ListDomainConflicts", + "ListFieldLevelEncryptionConfigs", + "ListFieldLevelEncryptionProfiles", "ListFunctions", "ListInvalidations", + "ListInvalidationsForDistributionTenant", + "ListKeyGroups", + "ListKeyValueStores", "ListOriginAccessControls", "ListOriginRequestPolicies", + "ListPublicKeys", + "ListRealtimeLogConfigs", "ListResponseHeadersPolicies", + "ListStreamingDistributions", "ListTagsForResource", + "ListTrustStores", + "ListVpcOrigins", "PublishFunction", + "PutResourcePolicy", "TagResource", "TestFunction", "UntagResource", + "UpdateAnycastIpList", "UpdateCachePolicy", + "UpdateCloudFrontOriginAccessIdentity", + "UpdateConnectionFunction", + "UpdateConnectionGroup", + "UpdateContinuousDeploymentPolicy", "UpdateDistribution", + "UpdateDistributionTenant", + "UpdateDistributionWithStagingConfig", + "UpdateDomainAssociation", + "UpdateFieldLevelEncryptionConfig", + "UpdateFieldLevelEncryptionProfile", "UpdateFunction", + "UpdateKeyGroup", + "UpdateKeyValueStore", "UpdateOriginAccessControl", "UpdateOriginRequestPolicy", - "UpdateResponseHeadersPolicy" + "UpdatePublicKey", + "UpdateRealtimeLogConfig", + "UpdateResponseHeadersPolicy", + "UpdateStreamingDistribution", + "UpdateTrustStore", + "UpdateVpcOrigin" ] }, "cloudfrontkeyvaluestore": { @@ -5941,10 +6179,14 @@ "CreateAccessPoint", "CreateFileSystem", "CreateMountTarget", + "CreateReplicationConfiguration", + "CreateTags", "DeleteAccessPoint", "DeleteFileSystem", "DeleteFileSystemPolicy", "DeleteMountTarget", + "DeleteReplicationConfiguration", + "DeleteTags", "DescribeAccessPoints", "DescribeAccountPreferences", "DescribeBackupPolicy", @@ -5954,14 +6196,17 @@ "DescribeMountTargetSecurityGroups", "DescribeMountTargets", "DescribeReplicationConfigurations", + "DescribeTags", "ListTagsForResource", "ModifyMountTargetSecurityGroups", + "PutAccountPreferences", "PutBackupPolicy", "PutFileSystemPolicy", "PutLifecycleConfiguration", "TagResource", "UntagResource", - "UpdateFileSystem" + "UpdateFileSystem", + "UpdateFileSystemProtection" ] }, "eks": { @@ -7780,58 +8025,148 @@ "AttachRolePolicy", "AttachUserPolicy", "CreateAccessKey", + "CreateAccountAlias", + "CreateDelegationRequest", "CreateGroup", "CreateInstanceProfile", + "CreateLoginProfile", + "CreateOpenIDConnectProvider", "CreatePolicy", "CreatePolicyVersion", "CreateRole", + "CreateSAMLProvider", + "CreateServiceLinkedRole", + "CreateServiceSpecificCredential", "CreateUser", + "CreateVirtualMFADevice", "DeleteAccessKey", + "DeleteAccountAlias", + "DeleteAccountPasswordPolicy", "DeleteGroup", "DeleteGroupPolicy", "DeleteInstanceProfile", + "DeleteLoginProfile", + "DeleteOpenIDConnectProvider", "DeletePolicy", + "DeletePolicyVersion", "DeleteRole", + "DeleteRolePermissionsBoundary", "DeleteRolePolicy", + "DeleteSAMLProvider", + "DeleteSSHPublicKey", + "DeleteServerCertificate", + "DeleteServiceLinkedRole", + "DeleteServiceSpecificCredential", + "DeleteSigningCertificate", "DeleteUser", + "DeleteUserPermissionsBoundary", "DeleteUserPolicy", + "DeleteVirtualMFADevice", "DetachGroupPolicy", "DetachRolePolicy", "DetachUserPolicy", + "GetAccessKeyLastUsed", + "GetAccountAuthorizationDetails", + "GetAccountPasswordPolicy", + "GetAccountSummary", + "GetContextKeysForCustomPolicy", + "GetContextKeysForPrincipalPolicy", + "GetCredentialReport", + "GetDelegationRequest", "GetGroup", "GetGroupPolicy", + "GetHumanReadableSummary", "GetInstanceProfile", + "GetLoginProfile", + "GetMFADevice", + "GetOpenIDConnectProvider", + "GetOrganizationsAccessReport", + "GetOutboundWebIdentityFederationInfo", "GetPolicy", "GetPolicyVersion", "GetRole", "GetRolePolicy", + "GetSAMLProvider", + "GetSSHPublicKey", + "GetServerCertificate", + "GetServiceLastAccessedDetails", + "GetServiceLastAccessedDetailsWithEntities", + "GetServiceLinkedRoleDeletionStatus", "GetUser", "GetUserPolicy", "ListAccessKeys", + "ListAccountAliases", "ListAttachedGroupPolicies", "ListAttachedRolePolicies", "ListAttachedUserPolicies", + "ListDelegationRequests", + "ListEntitiesForPolicy", "ListGroupPolicies", "ListGroups", + "ListGroupsForUser", + "ListInstanceProfileTags", "ListInstanceProfiles", + "ListInstanceProfilesForRole", + "ListMFADeviceTags", + "ListMFADevices", + "ListOpenIDConnectProviderTags", + "ListOpenIDConnectProviders", + "ListOrganizationsFeatures", + "ListPolicies", + "ListPoliciesGrantingServiceAccess", + "ListPolicyTags", "ListPolicyVersions", "ListRolePolicies", "ListRoleTags", "ListRoles", + "ListSAMLProviderTags", + "ListSAMLProviders", + "ListSSHPublicKeys", + "ListServerCertificateTags", + "ListServerCertificates", + "ListServiceSpecificCredentials", + "ListSigningCertificates", "ListUserPolicies", "ListUserTags", "ListUsers", + "ListVirtualMFADevices", "PutGroupPolicy", + "PutRolePermissionsBoundary", "PutRolePolicy", + "PutUserPermissionsBoundary", "PutUserPolicy", "RemoveRoleFromInstanceProfile", "RemoveUserFromGroup", + "TagInstanceProfile", + "TagMFADevice", + "TagOpenIDConnectProvider", + "TagPolicy", "TagRole", + "TagSAMLProvider", + "TagServerCertificate", "TagUser", + "UntagInstanceProfile", + "UntagMFADevice", + "UntagOpenIDConnectProvider", + "UntagPolicy", "UntagRole", + "UntagSAMLProvider", + "UntagServerCertificate", "UntagUser", "UpdateAccessKey", + "UpdateAccountPasswordPolicy", "UpdateAssumeRolePolicy", + "UpdateDelegationRequest", + "UpdateGroup", + "UpdateLoginProfile", + "UpdateOpenIDConnectProviderThumbprint", + "UpdateRole", + "UpdateRoleDescription", + "UpdateSAMLProvider", + "UpdateSSHPublicKey", + "UpdateServerCertificate", + "UpdateServiceSpecificCredential", + "UpdateSigningCertificate", "UpdateUser" ] }, @@ -8130,67 +8465,242 @@ "AttachPolicy", "AttachThingPrincipal", "CancelJob", + "CreateAuditSuppression", + "CreateAuthorizer", + "CreateBillingGroup", + "CreateCertificateFromCsr", + "CreateCertificateProvider", + "CreateCommand", + "CreateCustomMetric", + "CreateDimension", + "CreateDomainConfiguration", + "CreateDynamicThingGroup", + "CreateFleetMetric", "CreateJob", + "CreateJobTemplate", "CreateKeysAndCertificate", + "CreateMitigationAction", + "CreateOTAUpdate", + "CreatePackage", + "CreatePackageVersion", "CreatePolicy", "CreatePolicyVersion", + "CreateProvisioningClaim", + "CreateProvisioningTemplate", + "CreateProvisioningTemplateVersion", "CreateRoleAlias", + "CreateScheduledAudit", + "CreateSecurityProfile", + "CreateStream", "CreateThing", "CreateThingGroup", "CreateThingType", "CreateTopicRule", + "CreateTopicRuleDestination", + "DeleteAccountAuditConfiguration", + "DeleteAuditSuppression", + "DeleteAuthorizer", + "DeleteBillingGroup", + "DeleteCACertificate", "DeleteCertificate", + "DeleteCertificateProvider", + "DeleteCommand", + "DeleteCommandExecution", + "DeleteCustomMetric", + "DeleteDimension", + "DeleteDomainConfiguration", + "DeleteDynamicThingGroup", + "DeleteFleetMetric", "DeleteJob", + "DeleteJobExecution", + "DeleteJobTemplate", + "DeleteMitigationAction", + "DeleteOTAUpdate", + "DeletePackage", + "DeletePackageVersion", "DeletePolicy", "DeletePolicyVersion", + "DeleteProvisioningTemplate", + "DeleteProvisioningTemplateVersion", + "DeleteRegistrationCode", "DeleteRoleAlias", + "DeleteScheduledAudit", + "DeleteSecurityProfile", + "DeleteStream", "DeleteThing", "DeleteThingGroup", "DeleteThingType", "DeleteTopicRule", + "DeleteTopicRuleDestination", + "DeleteV2LoggingLevel", "DeprecateThingType", + "DescribeAccountAuditConfiguration", + "DescribeAuditFinding", + "DescribeAuditMitigationActionsTask", + "DescribeAuditSuppression", + "DescribeAuditTask", + "DescribeAuthorizer", + "DescribeBillingGroup", + "DescribeCACertificate", "DescribeCertificate", + "DescribeCertificateProvider", + "DescribeCustomMetric", + "DescribeDefaultAuthorizer", + "DescribeDetectMitigationActionsTask", + "DescribeDimension", + "DescribeDomainConfiguration", + "DescribeEncryptionConfiguration", "DescribeEndpoint", + "DescribeEventConfigurations", + "DescribeFleetMetric", + "DescribeIndex", "DescribeJob", + "DescribeJobExecution", + "DescribeJobTemplate", + "DescribeManagedJobTemplate", + "DescribeMitigationAction", + "DescribeProvisioningTemplate", + "DescribeProvisioningTemplateVersion", "DescribeRoleAlias", + "DescribeScheduledAudit", + "DescribeSecurityProfile", + "DescribeStream", "DescribeThing", "DescribeThingGroup", + "DescribeThingRegistrationTask", "DescribeThingType", "DetachPolicy", "DetachThingPrincipal", "DisableTopicRule", "EnableTopicRule", + "GetBehaviorModelTrainingSummaries", + "GetBucketsAggregation", + "GetCardinality", + "GetCommand", + "GetCommandExecution", + "GetEffectivePolicies", + "GetIndexingConfiguration", + "GetJobDocument", + "GetLoggingOptions", + "GetOTAUpdate", + "GetPackage", + "GetPackageConfiguration", + "GetPackageVersion", + "GetPercentiles", "GetPolicy", "GetPolicyVersion", + "GetRegistrationCode", + "GetStatistics", + "GetThingConnectivityData", "GetTopicRule", + "GetTopicRuleDestination", + "GetV2LoggingOptions", + "ListActiveViolations", "ListAttachedPolicies", + "ListAuditFindings", + "ListAuditMitigationActionsExecutions", + "ListAuditMitigationActionsTasks", + "ListAuditSuppressions", + "ListAuditTasks", + "ListAuthorizers", + "ListBillingGroups", + "ListCACertificates", + "ListCertificateProviders", "ListCertificates", + "ListCertificatesByCA", + "ListCommandExecutions", + "ListCommands", + "ListCustomMetrics", + "ListDetectMitigationActionsExecutions", + "ListDetectMitigationActionsTasks", + "ListDimensions", + "ListDomainConfigurations", + "ListFleetMetrics", + "ListIndices", + "ListJobExecutionsForJob", + "ListJobExecutionsForThing", + "ListJobTemplates", "ListJobs", + "ListManagedJobTemplates", + "ListMetricValues", + "ListMitigationActions", + "ListOTAUpdates", + "ListOutgoingCertificates", + "ListPackageVersions", + "ListPackages", "ListPolicies", + "ListPolicyPrincipals", "ListPolicyVersions", + "ListPrincipalPolicies", "ListPrincipalThings", + "ListPrincipalThingsV2", + "ListProvisioningTemplateVersions", + "ListProvisioningTemplates", + "ListRelatedResourcesForAuditFinding", "ListRoleAliases", + "ListSbomValidationResults", + "ListScheduledAudits", + "ListSecurityProfiles", + "ListSecurityProfilesForTarget", + "ListStreams", "ListTagsForResource", "ListTargetsForPolicy", + "ListTargetsForSecurityProfile", "ListThingGroups", "ListThingGroupsForThing", "ListThingPrincipals", + "ListThingPrincipalsV2", + "ListThingRegistrationTaskReports", + "ListThingRegistrationTasks", "ListThingTypes", "ListThings", + "ListThingsInBillingGroup", "ListThingsInThingGroup", + "ListTopicRuleDestinations", "ListTopicRules", + "ListV2LoggingLevels", + "ListViolationEvents", + "PutVerificationStateOnViolation", + "RegisterCACertificate", "RegisterCertificate", "RegisterCertificateWithoutCA", + "RegisterThing", "RemoveThingFromThingGroup", "ReplaceTopicRule", "SetDefaultPolicyVersion", "TagResource", "UntagResource", + "UpdateAccountAuditConfiguration", + "UpdateAuditSuppression", + "UpdateAuthorizer", + "UpdateBillingGroup", + "UpdateCACertificate", "UpdateCertificate", + "UpdateCertificateProvider", + "UpdateCommand", + "UpdateCustomMetric", + "UpdateDimension", + "UpdateDomainConfiguration", + "UpdateDynamicThingGroup", + "UpdateEncryptionConfiguration", + "UpdateEventConfigurations", + "UpdateFleetMetric", + "UpdateIndexingConfiguration", + "UpdateJob", + "UpdateMitigationAction", + "UpdatePackage", + "UpdatePackageConfiguration", + "UpdatePackageVersion", + "UpdateProvisioningTemplate", "UpdateRoleAlias", + "UpdateScheduledAudit", + "UpdateSecurityProfile", + "UpdateStream", "UpdateThing", "UpdateThingGroup", - "UpdateThingType" + "UpdateThingGroupsForThing", + "UpdateThingType", + "UpdateTopicRuleDestination" ] }, "iotdataplane": { @@ -8595,39 +9105,84 @@ "CreateServiceProfile", "CreateWirelessDevice", "CreateWirelessGateway", + "CreateWirelessGatewayTask", + "CreateWirelessGatewayTaskDefinition", "DeleteDestination", "DeleteDeviceProfile", "DeleteFuotaTask", "DeleteMulticastGroup", "DeleteNetworkAnalyzerConfiguration", + "DeleteQueuedMessages", "DeleteServiceProfile", "DeleteWirelessDevice", + "DeleteWirelessDeviceImportTask", "DeleteWirelessGateway", + "DeleteWirelessGatewayTask", + "DeleteWirelessGatewayTaskDefinition", + "DeregisterWirelessDevice", "GetDestination", "GetDeviceProfile", + "GetEventConfigurationByResourceTypes", "GetFuotaTask", + "GetLogLevelsByResourceTypes", + "GetMetricConfiguration", + "GetMetrics", "GetMulticastGroup", + "GetMulticastGroupSession", "GetNetworkAnalyzerConfiguration", + "GetPartnerAccount", + "GetPosition", + "GetPositionConfiguration", + "GetPositionEstimate", + "GetResourceEventConfiguration", + "GetResourceLogLevel", + "GetResourcePosition", + "GetServiceEndpoint", "GetServiceProfile", "GetWirelessDevice", + "GetWirelessDeviceImportTask", + "GetWirelessDeviceStatistics", "GetWirelessGateway", + "GetWirelessGatewayCertificate", + "GetWirelessGatewayFirmwareInformation", + "GetWirelessGatewayStatistics", + "GetWirelessGatewayTask", + "GetWirelessGatewayTaskDefinition", "ListDestinations", "ListDeviceProfiles", + "ListDevicesForWirelessDeviceImportTask", + "ListEventConfigurations", "ListFuotaTasks", "ListMulticastGroups", + "ListMulticastGroupsByFuotaTask", "ListNetworkAnalyzerConfigurations", + "ListPartnerAccounts", + "ListPositionConfigurations", + "ListQueuedMessages", "ListServiceProfiles", "ListTagsForResource", + "ListWirelessDeviceImportTasks", "ListWirelessDevices", + "ListWirelessGatewayTaskDefinitions", "ListWirelessGateways", + "PutPositionConfiguration", + "PutResourceLogLevel", "StartFuotaTask", "TagResource", "UntagResource", "UpdateDestination", + "UpdateEventConfigurationByResourceTypes", "UpdateFuotaTask", + "UpdateLogLevelsByResourceTypes", + "UpdateMetricConfiguration", "UpdateMulticastGroup", "UpdateNetworkAnalyzerConfiguration", + "UpdatePartnerAccount", + "UpdatePosition", + "UpdateResourceEventConfiguration", + "UpdateResourcePosition", "UpdateWirelessDevice", + "UpdateWirelessDeviceImportTask", "UpdateWirelessGateway" ] }, @@ -9203,29 +9758,79 @@ "servedOps": [ "AddPermission", "CreateAlias", + "CreateCapacityProvider", + "CreateCodeSigningConfig", "CreateEventSourceMapping", "CreateFunction", + "CreateFunctionUrlConfig", "DeleteAlias", + "DeleteCapacityProvider", + "DeleteCodeSigningConfig", "DeleteEventSourceMapping", "DeleteFunction", + "DeleteFunctionCodeSigningConfig", + "DeleteFunctionConcurrency", + "DeleteFunctionEventInvokeConfig", + "DeleteFunctionUrlConfig", + "DeleteLayerVersion", + "DeleteProvisionedConcurrencyConfig", + "GetAccountSettings", "GetAlias", + "GetCapacityProvider", + "GetCodeSigningConfig", + "GetDurableExecution", + "GetDurableExecutionHistory", + "GetDurableExecutionState", "GetEventSourceMapping", "GetFunction", + "GetFunctionCodeSigningConfig", + "GetFunctionConcurrency", + "GetFunctionConfiguration", + "GetFunctionEventInvokeConfig", + "GetFunctionRecursionConfig", + "GetFunctionScalingConfig", + "GetFunctionUrlConfig", + "GetLayerVersion", + "GetLayerVersionByArn", + "GetLayerVersionPolicy", "GetPolicy", + "GetProvisionedConcurrencyConfig", + "GetRuntimeManagementConfig", "Invoke", "ListAliases", + "ListCapacityProviders", + "ListCodeSigningConfigs", + "ListDurableExecutionsByFunction", "ListEventSourceMappings", + "ListFunctionEventInvokeConfigs", + "ListFunctionUrlConfigs", + "ListFunctionVersionsByCapacityProvider", "ListFunctions", + "ListFunctionsByCodeSigningConfig", + "ListLayerVersions", + "ListLayers", + "ListProvisionedConcurrencyConfigs", "ListTags", "ListVersionsByFunction", "PublishVersion", + "PutFunctionCodeSigningConfig", + "PutFunctionConcurrency", + "PutFunctionEventInvokeConfig", + "PutFunctionRecursionConfig", + "PutFunctionScalingConfig", + "PutProvisionedConcurrencyConfig", + "PutRuntimeManagementConfig", "RemovePermission", "TagResource", "UntagResource", "UpdateAlias", + "UpdateCapacityProvider", + "UpdateCodeSigningConfig", "UpdateEventSourceMapping", "UpdateFunctionCode", - "UpdateFunctionConfiguration" + "UpdateFunctionConfiguration", + "UpdateFunctionEventInvokeConfig", + "UpdateFunctionUrlConfig" ] }, "lambdacore": { @@ -9992,6 +10597,7 @@ "ListMembers", "ListNetworks", "ListNodes", + "ListProposalVotes", "ListProposals", "ListTagsForResource", "RejectInvitation", @@ -12978,6 +13584,7 @@ "AssociateResourceShare", "AssociateResourceSharePermission", "CreatePermission", + "CreatePermissionVersion", "CreateResourceShare", "DeletePermission", "DeletePermissionVersion", @@ -13692,6 +14299,8 @@ "CreateReusableDelegationSet", "CreateTrafficPolicy", "CreateTrafficPolicyInstance", + "CreateTrafficPolicyVersion", + "CreateVPCAssociationAuthorization", "DeactivateKeySigningKey", "DeleteCidrCollection", "DeleteHealthCheck", @@ -13701,32 +14310,52 @@ "DeleteReusableDelegationSet", "DeleteTrafficPolicy", "DeleteTrafficPolicyInstance", + "DeleteVPCAssociationAuthorization", "DisableHostedZoneDNSSEC", "DisassociateVPCFromHostedZone", "EnableHostedZoneDNSSEC", + "GetAccountLimit", + "GetChange", + "GetCheckerIpRanges", "GetDNSSEC", + "GetGeoLocation", "GetHealthCheck", + "GetHealthCheckCount", + "GetHealthCheckLastFailureReason", "GetHealthCheckStatus", "GetHostedZone", + "GetHostedZoneCount", + "GetHostedZoneLimit", "GetQueryLoggingConfig", "GetReusableDelegationSet", + "GetReusableDelegationSetLimit", "GetTrafficPolicy", "GetTrafficPolicyInstance", + "GetTrafficPolicyInstanceCount", "ListCidrBlocks", "ListCidrCollections", "ListCidrLocations", + "ListGeoLocations", "ListHealthChecks", "ListHostedZones", + "ListHostedZonesByName", + "ListHostedZonesByVPC", "ListKeySigningKeys", "ListQueryLoggingConfigs", "ListResourceRecordSets", "ListReusableDelegationSets", "ListTagsForResource", + "ListTagsForResources", "ListTrafficPolicies", "ListTrafficPolicyInstances", "ListTrafficPolicyInstancesByHostedZone", "ListTrafficPolicyInstancesByPolicy", + "ListTrafficPolicyVersions", + "ListVPCAssociationAuthorizations", "UpdateHealthCheck", + "UpdateHostedZoneComment", + "UpdateHostedZoneFeatures", + "UpdateTrafficPolicyComment", "UpdateTrafficPolicyInstance" ] }, @@ -14028,38 +14657,103 @@ "CompleteMultipartUpload", "CopyObject", "CreateBucket", + "CreateBucketMetadataConfiguration", + "CreateBucketMetadataTableConfiguration", "CreateMultipartUpload", + "CreateSession", "DeleteBucket", + "DeleteBucketAnalyticsConfiguration", "DeleteBucketCors", + "DeleteBucketEncryption", + "DeleteBucketIntelligentTieringConfiguration", + "DeleteBucketInventoryConfiguration", + "DeleteBucketLifecycle", + "DeleteBucketMetadataConfiguration", + "DeleteBucketMetadataTableConfiguration", + "DeleteBucketMetricsConfiguration", + "DeleteBucketOwnershipControls", "DeleteBucketPolicy", + "DeleteBucketReplication", "DeleteBucketTagging", + "DeleteBucketWebsite", "DeleteObject", "DeleteObjectTagging", "DeleteObjects", + "DeletePublicAccessBlock", + "GetBucketAbac", + "GetBucketAccelerateConfiguration", "GetBucketAcl", + "GetBucketAnalyticsConfiguration", "GetBucketCors", + "GetBucketEncryption", + "GetBucketIntelligentTieringConfiguration", + "GetBucketInventoryConfiguration", + "GetBucketLifecycleConfiguration", "GetBucketLocation", + "GetBucketLogging", + "GetBucketMetadataConfiguration", + "GetBucketMetadataTableConfiguration", + "GetBucketMetricsConfiguration", "GetBucketNotificationConfiguration", + "GetBucketOwnershipControls", "GetBucketPolicy", + "GetBucketPolicyStatus", + "GetBucketReplication", + "GetBucketRequestPayment", "GetBucketTagging", "GetBucketVersioning", + "GetBucketWebsite", "GetObject", + "GetObjectAcl", + "GetObjectAttributes", + "GetObjectLegalHold", + "GetObjectLockConfiguration", + "GetObjectRetention", "GetObjectTagging", + "GetObjectTorrent", + "GetPublicAccessBlock", "HeadBucket", "HeadObject", + "ListBucketAnalyticsConfigurations", + "ListBucketIntelligentTieringConfigurations", + "ListBucketInventoryConfigurations", + "ListBucketMetricsConfigurations", "ListBuckets", + "ListDirectoryBuckets", "ListMultipartUploads", + "ListObjectVersions", "ListObjects", "ListObjectsV2", "ListParts", + "PutBucketAbac", + "PutBucketAccelerateConfiguration", "PutBucketAcl", + "PutBucketAnalyticsConfiguration", "PutBucketCors", + "PutBucketEncryption", + "PutBucketIntelligentTieringConfiguration", + "PutBucketInventoryConfiguration", + "PutBucketLifecycleConfiguration", + "PutBucketLogging", + "PutBucketMetricsConfiguration", "PutBucketNotificationConfiguration", + "PutBucketOwnershipControls", "PutBucketPolicy", + "PutBucketReplication", + "PutBucketRequestPayment", "PutBucketTagging", "PutBucketVersioning", + "PutBucketWebsite", "PutObject", + "PutObjectAcl", + "PutObjectLegalHold", + "PutObjectLockConfiguration", + "PutObjectRetention", "PutObjectTagging", + "PutPublicAccessBlock", + "UpdateBucketMetadataInventoryTableConfiguration", + "UpdateBucketMetadataJournalTableConfiguration", + "UpdateObjectEncryption", "UploadPart" ] }, @@ -15285,6 +15979,7 @@ "ListTagsForResource", "ListTemplates", "ListVerifiedEmailAddresses", + "PutConfigurationSetDeliveryOptions", "PutIdentityPolicy", "ReorderReceiptRuleSet", "SendBounce", @@ -15305,6 +16000,8 @@ "UntagResource", "UpdateAccountSendingEnabled", "UpdateConfigurationSetEventDestination", + "UpdateConfigurationSetReputationMetricsEnabled", + "UpdateConfigurationSetSendingEnabled", "UpdateConfigurationSetTrackingOptions", "UpdateCustomVerificationEmailTemplate", "UpdateReceiptRule", @@ -15610,12 +16307,26 @@ "AddPermission", "CheckIfPhoneNumberIsOptedOut", "ConfirmSubscription", + "CreatePlatformApplication", + "CreatePlatformEndpoint", + "CreateSMSSandboxPhoneNumber", "CreateTopic", + "DeleteEndpoint", + "DeletePlatformApplication", + "DeleteSMSSandboxPhoneNumber", "DeleteTopic", "GetDataProtectionPolicy", + "GetEndpointAttributes", + "GetPlatformApplicationAttributes", + "GetSMSAttributes", + "GetSMSSandboxAccountStatus", "GetSubscriptionAttributes", "GetTopicAttributes", + "ListEndpointsByPlatformApplication", + "ListOriginationNumbers", "ListPhoneNumbersOptedOut", + "ListPlatformApplications", + "ListSMSSandboxPhoneNumbers", "ListSubscriptions", "ListSubscriptionsByTopic", "ListTagsForResource", @@ -17524,19 +18235,23 @@ "GetEncryptionConfig", "GetGroup", "GetGroups", + "GetIndexingRules", "GetInsight", "GetInsightEvents", "GetInsightImpactGraph", "GetInsightSummaries", "GetResourcePolicy", + "GetRetrievedTracesGraph", "GetSamplingRules", "GetSamplingStatisticSummaries", "GetSamplingTargets", "GetServiceGraph", "GetTimeSeriesServiceStatistics", "GetTraceGraph", + "GetTraceSegmentDestination", "GetTraceSummaries", "ListResourcePolicies", + "ListRetrievedTraces", "ListTagsForResource", "PutEncryptionConfig", "PutResourcePolicy", @@ -17545,7 +18260,9 @@ "TagResource", "UntagResource", "UpdateGroup", - "UpdateSamplingRule" + "UpdateIndexingRule", + "UpdateSamplingRule", + "UpdateTraceSegmentDestination" ] } } diff --git a/internal/generated/fidelity/manifest_gen.go b/internal/generated/fidelity/manifest_gen.go index 5ca97dd0..a6e9c76f 100644 --- a/internal/generated/fidelity/manifest_gen.go +++ b/internal/generated/fidelity/manifest_gen.go @@ -520,13 +520,13 @@ var Services = map[string]Service{ "CreateIntegration": TierHandVerified, "CreateIntegrationResponse": TierHandVerified, "CreateModel": TierHandVerified, - "CreatePortal": TierUnimplemented, - "CreatePortalProduct": TierUnimplemented, - "CreateProductPage": TierUnimplemented, - "CreateProductRestEndpointPage": TierUnimplemented, + "CreatePortal": TierAutoCRUD, + "CreatePortalProduct": TierAutoCRUD, + "CreateProductPage": TierAutoCRUD, + "CreateProductRestEndpointPage": TierAutoCRUD, "CreateRoute": TierHandVerified, "CreateRouteResponse": TierHandVerified, - "CreateRoutingRule": TierUnimplemented, + "CreateRoutingRule": TierAutoCRUD, "CreateStage": TierHandVerified, "CreateVpcLink": TierHandVerified, "DeleteAccessLogSettings": TierHandVerified, @@ -539,16 +539,16 @@ var Services = map[string]Service{ "DeleteIntegration": TierHandVerified, "DeleteIntegrationResponse": TierHandVerified, "DeleteModel": TierHandVerified, - "DeletePortal": TierUnimplemented, - "DeletePortalProduct": TierUnimplemented, - "DeletePortalProductSharingPolicy": TierUnimplemented, - "DeleteProductPage": TierUnimplemented, - "DeleteProductRestEndpointPage": TierUnimplemented, + "DeletePortal": TierAutoCRUD, + "DeletePortalProduct": TierAutoCRUD, + "DeletePortalProductSharingPolicy": TierAutoCRUD, + "DeleteProductPage": TierAutoCRUD, + "DeleteProductRestEndpointPage": TierAutoCRUD, "DeleteRoute": TierHandVerified, "DeleteRouteRequestParameter": TierHandVerified, "DeleteRouteResponse": TierHandVerified, "DeleteRouteSettings": TierHandVerified, - "DeleteRoutingRule": TierUnimplemented, + "DeleteRoutingRule": TierAutoCRUD, "DeleteStage": TierHandVerified, "DeleteVpcLink": TierHandVerified, "DisablePortal": TierUnimplemented, @@ -570,31 +570,31 @@ var Services = map[string]Service{ "GetModel": TierHandVerified, "GetModelTemplate": TierHandVerified, "GetModels": TierHandVerified, - "GetPortal": TierUnimplemented, - "GetPortalProduct": TierUnimplemented, - "GetPortalProductSharingPolicy": TierUnimplemented, - "GetProductPage": TierUnimplemented, - "GetProductRestEndpointPage": TierUnimplemented, + "GetPortal": TierAutoCRUD, + "GetPortalProduct": TierAutoCRUD, + "GetPortalProductSharingPolicy": TierAutoCRUD, + "GetProductPage": TierAutoCRUD, + "GetProductRestEndpointPage": TierAutoCRUD, "GetRoute": TierHandVerified, "GetRouteResponse": TierHandVerified, "GetRouteResponses": TierHandVerified, "GetRoutes": TierHandVerified, - "GetRoutingRule": TierUnimplemented, + "GetRoutingRule": TierAutoCRUD, "GetStage": TierHandVerified, "GetStages": TierHandVerified, "GetTags": TierHandVerified, "GetVpcLink": TierHandVerified, "GetVpcLinks": TierHandVerified, "ImportApi": TierHandVerified, - "ListPortalProducts": TierUnimplemented, - "ListPortals": TierUnimplemented, - "ListProductPages": TierUnimplemented, - "ListProductRestEndpointPages": TierUnimplemented, - "ListRoutingRules": TierUnimplemented, + "ListPortalProducts": TierAutoCRUD, + "ListPortals": TierAutoCRUD, + "ListProductPages": TierAutoCRUD, + "ListProductRestEndpointPages": TierAutoCRUD, + "ListRoutingRules": TierAutoCRUD, "PreviewPortal": TierUnimplemented, "PublishPortal": TierUnimplemented, - "PutPortalProductSharingPolicy": TierUnimplemented, - "PutRoutingRule": TierUnimplemented, + "PutPortalProductSharingPolicy": TierAutoCRUD, + "PutRoutingRule": TierAutoCRUD, "ReimportApi": TierHandVerified, "ResetAuthorizersCache": TierHandVerified, "TagResource": TierHandVerified, @@ -607,12 +607,12 @@ var Services = map[string]Service{ "UpdateIntegration": TierHandVerified, "UpdateIntegrationResponse": TierHandVerified, "UpdateModel": TierHandVerified, - "UpdatePortal": TierUnimplemented, - "UpdatePortalProduct": TierUnimplemented, - "UpdateProductPage": TierUnimplemented, - "UpdateProductRestEndpointPage": TierUnimplemented, + "UpdatePortal": TierAutoCRUD, + "UpdatePortalProduct": TierAutoCRUD, + "UpdateProductPage": TierAutoCRUD, + "UpdateProductRestEndpointPage": TierAutoCRUD, "UpdateRoute": TierHandVerified, - "UpdateRouteResponse": TierUnimplemented, + "UpdateRouteResponse": TierAutoCRUD, "UpdateStage": TierHandVerified, "UpdateVpcLink": TierHandVerified, }}, @@ -1125,7 +1125,7 @@ var Services = map[string]Service{ "ListSourceApiAssociations": TierHandVerified, "ListTagsForResource": TierHandVerified, "ListTypes": TierHandVerified, - "ListTypesByAssociation": TierUnimplemented, + "ListTypesByAssociation": TierAutoCRUD, "PutGraphqlApiEnvironmentVariables": TierHandVerified, "StartDataSourceIntrospection": TierHandVerified, "StartSchemaCreation": TierHandVerified, @@ -1454,13 +1454,13 @@ var Services = map[string]Service{ "CreateBackupSelection": TierHandVerified, "CreateBackupVault": TierHandVerified, "CreateFramework": TierHandVerified, - "CreateLegalHold": TierUnimplemented, - "CreateLogicallyAirGappedBackupVault": TierUnimplemented, + "CreateLegalHold": TierAutoCRUD, + "CreateLogicallyAirGappedBackupVault": TierAutoCRUD, "CreateReportPlan": TierHandVerified, - "CreateRestoreAccessBackupVault": TierUnimplemented, + "CreateRestoreAccessBackupVault": TierAutoCRUD, "CreateRestoreTestingPlan": TierHandVerified, "CreateRestoreTestingSelection": TierHandVerified, - "CreateTieringConfiguration": TierUnimplemented, + "CreateTieringConfiguration": TierAutoCRUD, "DeleteBackupPlan": TierHandVerified, "DeleteBackupSelection": TierHandVerified, "DeleteBackupVault": TierHandVerified, @@ -1472,10 +1472,10 @@ var Services = map[string]Service{ "DeleteReportPlan": TierHandVerified, "DeleteRestoreTestingPlan": TierHandVerified, "DeleteRestoreTestingSelection": TierHandVerified, - "DeleteTieringConfiguration": TierUnimplemented, + "DeleteTieringConfiguration": TierAutoCRUD, "DescribeBackupJob": TierHandVerified, "DescribeBackupVault": TierHandVerified, - "DescribeCopyJob": TierUnimplemented, + "DescribeCopyJob": TierAutoCRUD, "DescribeFramework": TierHandVerified, "DescribeGlobalSettings": TierHandVerified, "DescribeProtectedResource": TierHandVerified, @@ -1484,7 +1484,7 @@ var Services = map[string]Service{ "DescribeReportJob": TierHandVerified, "DescribeReportPlan": TierHandVerified, "DescribeRestoreJob": TierHandVerified, - "DescribeScanJob": TierUnimplemented, + "DescribeScanJob": TierAutoCRUD, "DisassociateBackupVaultMpaApprovalTeam": TierUnimplemented, "DisassociateRecoveryPoint": TierUnimplemented, "DisassociateRecoveryPointFromParent": TierUnimplemented, @@ -1495,7 +1495,7 @@ var Services = map[string]Service{ "GetBackupSelection": TierHandVerified, "GetBackupVaultAccessPolicy": TierHandVerified, "GetBackupVaultNotifications": TierHandVerified, - "GetLegalHold": TierUnimplemented, + "GetLegalHold": TierAutoCRUD, "GetRecoveryPointIndexDetails": TierHandVerified, "GetRecoveryPointRestoreMetadata": TierHandVerified, "GetRestoreJobMetadata": TierHandVerified, @@ -1503,7 +1503,7 @@ var Services = map[string]Service{ "GetRestoreTestingPlan": TierHandVerified, "GetRestoreTestingSelection": TierHandVerified, "GetSupportedResourceTypes": TierHandVerified, - "GetTieringConfiguration": TierUnimplemented, + "GetTieringConfiguration": TierAutoCRUD, "ListBackupJobSummaries": TierHandVerified, "ListBackupJobs": TierHandVerified, "ListBackupPlanTemplates": TierHandVerified, @@ -1511,28 +1511,28 @@ var Services = map[string]Service{ "ListBackupPlans": TierHandVerified, "ListBackupSelections": TierHandVerified, "ListBackupVaults": TierHandVerified, - "ListCopyJobSummaries": TierUnimplemented, - "ListCopyJobs": TierUnimplemented, + "ListCopyJobSummaries": TierAutoCRUD, + "ListCopyJobs": TierAutoCRUD, "ListFrameworks": TierHandVerified, "ListIndexedRecoveryPoints": TierHandVerified, - "ListLegalHolds": TierUnimplemented, + "ListLegalHolds": TierAutoCRUD, "ListProtectedResources": TierHandVerified, "ListProtectedResourcesByBackupVault": TierHandVerified, "ListRecoveryPointsByBackupVault": TierHandVerified, - "ListRecoveryPointsByLegalHold": TierUnimplemented, + "ListRecoveryPointsByLegalHold": TierAutoCRUD, "ListRecoveryPointsByResource": TierHandVerified, "ListReportJobs": TierHandVerified, "ListReportPlans": TierHandVerified, - "ListRestoreAccessBackupVaults": TierUnimplemented, + "ListRestoreAccessBackupVaults": TierAutoCRUD, "ListRestoreJobSummaries": TierHandVerified, "ListRestoreJobs": TierHandVerified, "ListRestoreJobsByProtectedResource": TierHandVerified, "ListRestoreTestingPlans": TierHandVerified, "ListRestoreTestingSelections": TierHandVerified, - "ListScanJobSummaries": TierUnimplemented, - "ListScanJobs": TierUnimplemented, + "ListScanJobSummaries": TierAutoCRUD, + "ListScanJobs": TierAutoCRUD, "ListTags": TierHandVerified, - "ListTieringConfigurations": TierUnimplemented, + "ListTieringConfigurations": TierAutoCRUD, "PutBackupVaultAccessPolicy": TierHandVerified, "PutBackupVaultLockConfiguration": TierHandVerified, "PutBackupVaultNotifications": TierHandVerified, @@ -1555,7 +1555,7 @@ var Services = map[string]Service{ "UpdateReportPlan": TierHandVerified, "UpdateRestoreTestingPlan": TierHandVerified, "UpdateRestoreTestingSelection": TierHandVerified, - "UpdateTieringConfiguration": TierUnimplemented, + "UpdateTieringConfiguration": TierAutoCRUD, }}, "backupgateway": {Protocol: "json-1.0", ModelBacked: true, EngineWired: true, Operations: map[string]Tier{ "AssociateGatewayToServer": TierUnimplemented, @@ -1720,93 +1720,93 @@ var Services = map[string]Service{ "bedrock": {Protocol: "rest-json", ModelBacked: true, EngineWired: false, Operations: map[string]Tier{ "BatchDeleteEvaluationJob": TierUnimplemented, "CancelAutomatedReasoningPolicyBuildWorkflow": TierUnimplemented, - "CreateAutomatedReasoningPolicy": TierUnimplemented, - "CreateAutomatedReasoningPolicyTestCase": TierUnimplemented, - "CreateAutomatedReasoningPolicyVersion": TierUnimplemented, - "CreateCustomModel": TierUnimplemented, - "CreateCustomModelDeployment": TierUnimplemented, - "CreateEvaluationJob": TierUnimplemented, - "CreateFoundationModelAgreement": TierUnimplemented, + "CreateAutomatedReasoningPolicy": TierAutoCRUD, + "CreateAutomatedReasoningPolicyTestCase": TierAutoCRUD, + "CreateAutomatedReasoningPolicyVersion": TierAutoCRUD, + "CreateCustomModel": TierAutoCRUD, + "CreateCustomModelDeployment": TierAutoCRUD, + "CreateEvaluationJob": TierAutoCRUD, + "CreateFoundationModelAgreement": TierAutoCRUD, "CreateGuardrail": TierHandVerified, - "CreateGuardrailVersion": TierUnimplemented, - "CreateInferenceProfile": TierUnimplemented, - "CreateMarketplaceModelEndpoint": TierUnimplemented, - "CreateModelCopyJob": TierUnimplemented, + "CreateGuardrailVersion": TierAutoCRUD, + "CreateInferenceProfile": TierAutoCRUD, + "CreateMarketplaceModelEndpoint": TierAutoCRUD, + "CreateModelCopyJob": TierAutoCRUD, "CreateModelCustomizationJob": TierHandVerified, - "CreateModelImportJob": TierUnimplemented, - "CreateModelInvocationJob": TierUnimplemented, - "CreatePromptRouter": TierUnimplemented, - "CreateProvisionedModelThroughput": TierUnimplemented, - "DeleteAutomatedReasoningPolicy": TierUnimplemented, - "DeleteAutomatedReasoningPolicyBuildWorkflow": TierUnimplemented, - "DeleteAutomatedReasoningPolicyTestCase": TierUnimplemented, + "CreateModelImportJob": TierAutoCRUD, + "CreateModelInvocationJob": TierAutoCRUD, + "CreatePromptRouter": TierAutoCRUD, + "CreateProvisionedModelThroughput": TierAutoCRUD, + "DeleteAutomatedReasoningPolicy": TierAutoCRUD, + "DeleteAutomatedReasoningPolicyBuildWorkflow": TierAutoCRUD, + "DeleteAutomatedReasoningPolicyTestCase": TierAutoCRUD, "DeleteCustomModel": TierHandVerified, - "DeleteCustomModelDeployment": TierUnimplemented, - "DeleteEnforcedGuardrailConfiguration": TierUnimplemented, - "DeleteFoundationModelAgreement": TierUnimplemented, + "DeleteCustomModelDeployment": TierAutoCRUD, + "DeleteEnforcedGuardrailConfiguration": TierAutoCRUD, + "DeleteFoundationModelAgreement": TierAutoCRUD, "DeleteGuardrail": TierHandVerified, - "DeleteImportedModel": TierUnimplemented, - "DeleteInferenceProfile": TierUnimplemented, - "DeleteMarketplaceModelEndpoint": TierUnimplemented, - "DeleteModelInvocationLoggingConfiguration": TierUnimplemented, - "DeletePromptRouter": TierUnimplemented, - "DeleteProvisionedModelThroughput": TierUnimplemented, - "DeleteResourcePolicy": TierUnimplemented, - "DeregisterMarketplaceModelEndpoint": TierUnimplemented, + "DeleteImportedModel": TierAutoCRUD, + "DeleteInferenceProfile": TierAutoCRUD, + "DeleteMarketplaceModelEndpoint": TierAutoCRUD, + "DeleteModelInvocationLoggingConfiguration": TierAutoCRUD, + "DeletePromptRouter": TierAutoCRUD, + "DeleteProvisionedModelThroughput": TierAutoCRUD, + "DeleteResourcePolicy": TierAutoCRUD, + "DeregisterMarketplaceModelEndpoint": TierAutoCRUD, "ExportAutomatedReasoningPolicyVersion": TierUnimplemented, - "GetAutomatedReasoningPolicy": TierUnimplemented, - "GetAutomatedReasoningPolicyAnnotations": TierUnimplemented, - "GetAutomatedReasoningPolicyBuildWorkflow": TierUnimplemented, - "GetAutomatedReasoningPolicyBuildWorkflowResultAssets": TierUnimplemented, - "GetAutomatedReasoningPolicyNextScenario": TierUnimplemented, - "GetAutomatedReasoningPolicyTestCase": TierUnimplemented, - "GetAutomatedReasoningPolicyTestResult": TierUnimplemented, + "GetAutomatedReasoningPolicy": TierAutoCRUD, + "GetAutomatedReasoningPolicyAnnotations": TierAutoCRUD, + "GetAutomatedReasoningPolicyBuildWorkflow": TierAutoCRUD, + "GetAutomatedReasoningPolicyBuildWorkflowResultAssets": TierAutoCRUD, + "GetAutomatedReasoningPolicyNextScenario": TierAutoCRUD, + "GetAutomatedReasoningPolicyTestCase": TierAutoCRUD, + "GetAutomatedReasoningPolicyTestResult": TierAutoCRUD, "GetCustomModel": TierHandVerified, - "GetCustomModelDeployment": TierUnimplemented, - "GetEvaluationJob": TierUnimplemented, + "GetCustomModelDeployment": TierAutoCRUD, + "GetEvaluationJob": TierAutoCRUD, "GetFoundationModel": TierHandVerified, - "GetFoundationModelAvailability": TierUnimplemented, + "GetFoundationModelAvailability": TierAutoCRUD, "GetGuardrail": TierHandVerified, - "GetImportedModel": TierUnimplemented, - "GetInferenceProfile": TierUnimplemented, - "GetMarketplaceModelEndpoint": TierUnimplemented, - "GetModelCopyJob": TierUnimplemented, + "GetImportedModel": TierAutoCRUD, + "GetInferenceProfile": TierAutoCRUD, + "GetMarketplaceModelEndpoint": TierAutoCRUD, + "GetModelCopyJob": TierAutoCRUD, "GetModelCustomizationJob": TierHandVerified, - "GetModelImportJob": TierUnimplemented, - "GetModelInvocationJob": TierUnimplemented, - "GetModelInvocationLoggingConfiguration": TierUnimplemented, - "GetPromptRouter": TierUnimplemented, - "GetProvisionedModelThroughput": TierUnimplemented, - "GetResourcePolicy": TierUnimplemented, - "GetUseCaseForModelAccess": TierUnimplemented, + "GetModelImportJob": TierAutoCRUD, + "GetModelInvocationJob": TierAutoCRUD, + "GetModelInvocationLoggingConfiguration": TierAutoCRUD, + "GetPromptRouter": TierAutoCRUD, + "GetProvisionedModelThroughput": TierAutoCRUD, + "GetResourcePolicy": TierAutoCRUD, + "GetUseCaseForModelAccess": TierAutoCRUD, "InvokeModel": TierHandVerified, "InvokeModelWithResponseStream": TierHandVerified, - "ListAutomatedReasoningPolicies": TierUnimplemented, - "ListAutomatedReasoningPolicyBuildWorkflows": TierUnimplemented, - "ListAutomatedReasoningPolicyTestCases": TierUnimplemented, - "ListAutomatedReasoningPolicyTestResults": TierUnimplemented, - "ListCustomModelDeployments": TierUnimplemented, + "ListAutomatedReasoningPolicies": TierAutoCRUD, + "ListAutomatedReasoningPolicyBuildWorkflows": TierAutoCRUD, + "ListAutomatedReasoningPolicyTestCases": TierAutoCRUD, + "ListAutomatedReasoningPolicyTestResults": TierAutoCRUD, + "ListCustomModelDeployments": TierAutoCRUD, "ListCustomModels": TierHandVerified, - "ListEnforcedGuardrailsConfiguration": TierUnimplemented, - "ListEvaluationJobs": TierUnimplemented, - "ListFoundationModelAgreementOffers": TierUnimplemented, + "ListEnforcedGuardrailsConfiguration": TierAutoCRUD, + "ListEvaluationJobs": TierAutoCRUD, + "ListFoundationModelAgreementOffers": TierAutoCRUD, "ListFoundationModels": TierHandVerified, "ListGuardrails": TierHandVerified, - "ListImportedModels": TierUnimplemented, - "ListInferenceProfiles": TierUnimplemented, - "ListMarketplaceModelEndpoints": TierUnimplemented, - "ListModelCopyJobs": TierUnimplemented, + "ListImportedModels": TierAutoCRUD, + "ListInferenceProfiles": TierAutoCRUD, + "ListMarketplaceModelEndpoints": TierAutoCRUD, + "ListModelCopyJobs": TierAutoCRUD, "ListModelCustomizationJobs": TierHandVerified, - "ListModelImportJobs": TierUnimplemented, - "ListModelInvocationJobs": TierUnimplemented, - "ListPromptRouters": TierUnimplemented, - "ListProvisionedModelThroughputs": TierUnimplemented, + "ListModelImportJobs": TierAutoCRUD, + "ListModelInvocationJobs": TierAutoCRUD, + "ListPromptRouters": TierAutoCRUD, + "ListProvisionedModelThroughputs": TierAutoCRUD, "ListTagsForResource": TierHandVerified, - "PutEnforcedGuardrailConfiguration": TierUnimplemented, - "PutModelInvocationLoggingConfiguration": TierUnimplemented, - "PutResourcePolicy": TierUnimplemented, - "PutUseCaseForModelAccess": TierUnimplemented, - "RegisterMarketplaceModelEndpoint": TierUnimplemented, + "PutEnforcedGuardrailConfiguration": TierAutoCRUD, + "PutModelInvocationLoggingConfiguration": TierAutoCRUD, + "PutResourcePolicy": TierAutoCRUD, + "PutUseCaseForModelAccess": TierAutoCRUD, + "RegisterMarketplaceModelEndpoint": TierAutoCRUD, "StartAutomatedReasoningPolicyBuildWorkflow": TierUnimplemented, "StartAutomatedReasoningPolicyTestWorkflow": TierUnimplemented, "StopEvaluationJob": TierUnimplemented, @@ -1814,13 +1814,13 @@ var Services = map[string]Service{ "StopModelInvocationJob": TierUnimplemented, "TagResource": TierHandVerified, "UntagResource": TierHandVerified, - "UpdateAutomatedReasoningPolicy": TierUnimplemented, - "UpdateAutomatedReasoningPolicyAnnotations": TierUnimplemented, - "UpdateAutomatedReasoningPolicyTestCase": TierUnimplemented, - "UpdateCustomModelDeployment": TierUnimplemented, + "UpdateAutomatedReasoningPolicy": TierAutoCRUD, + "UpdateAutomatedReasoningPolicyAnnotations": TierAutoCRUD, + "UpdateAutomatedReasoningPolicyTestCase": TierAutoCRUD, + "UpdateCustomModelDeployment": TierAutoCRUD, "UpdateGuardrail": TierHandVerified, - "UpdateMarketplaceModelEndpoint": TierUnimplemented, - "UpdateProvisionedModelThroughput": TierUnimplemented, + "UpdateMarketplaceModelEndpoint": TierAutoCRUD, + "UpdateProvisionedModelThroughput": TierAutoCRUD, }}, "bedrockagent": {Protocol: "rest-json", ModelBacked: true, EngineWired: true, Operations: map[string]Tier{ "AssociateAgentCollaborator": TierUnimplemented, @@ -3038,168 +3038,168 @@ var Services = map[string]Service{ "AssociateDistributionTenantWebACL": TierUnimplemented, "AssociateDistributionWebACL": TierUnimplemented, "CopyDistribution": TierUnimplemented, - "CreateAnycastIpList": TierUnimplemented, + "CreateAnycastIpList": TierAutoCRUD, "CreateCachePolicy": TierHandVerified, - "CreateCloudFrontOriginAccessIdentity": TierUnimplemented, - "CreateConnectionFunction": TierUnimplemented, - "CreateConnectionGroup": TierUnimplemented, - "CreateContinuousDeploymentPolicy": TierUnimplemented, + "CreateCloudFrontOriginAccessIdentity": TierAutoCRUD, + "CreateConnectionFunction": TierAutoCRUD, + "CreateConnectionGroup": TierAutoCRUD, + "CreateContinuousDeploymentPolicy": TierAutoCRUD, "CreateDistribution": TierHandVerified, - "CreateDistributionTenant": TierUnimplemented, + "CreateDistributionTenant": TierAutoCRUD, "CreateDistributionWithTags": TierHandVerified, - "CreateFieldLevelEncryptionConfig": TierUnimplemented, - "CreateFieldLevelEncryptionProfile": TierUnimplemented, + "CreateFieldLevelEncryptionConfig": TierAutoCRUD, + "CreateFieldLevelEncryptionProfile": TierAutoCRUD, "CreateFunction": TierHandVerified, "CreateInvalidation": TierHandVerified, - "CreateInvalidationForDistributionTenant": TierUnimplemented, - "CreateKeyGroup": TierUnimplemented, - "CreateKeyValueStore": TierUnimplemented, - "CreateMonitoringSubscription": TierUnimplemented, + "CreateInvalidationForDistributionTenant": TierAutoCRUD, + "CreateKeyGroup": TierAutoCRUD, + "CreateKeyValueStore": TierAutoCRUD, + "CreateMonitoringSubscription": TierAutoCRUD, "CreateOriginAccessControl": TierHandVerified, "CreateOriginRequestPolicy": TierHandVerified, - "CreatePublicKey": TierUnimplemented, - "CreateRealtimeLogConfig": TierUnimplemented, + "CreatePublicKey": TierAutoCRUD, + "CreateRealtimeLogConfig": TierAutoCRUD, "CreateResponseHeadersPolicy": TierHandVerified, - "CreateStreamingDistribution": TierUnimplemented, - "CreateStreamingDistributionWithTags": TierUnimplemented, - "CreateTrustStore": TierUnimplemented, - "CreateVpcOrigin": TierUnimplemented, - "DeleteAnycastIpList": TierUnimplemented, + "CreateStreamingDistribution": TierAutoCRUD, + "CreateStreamingDistributionWithTags": TierAutoCRUD, + "CreateTrustStore": TierAutoCRUD, + "CreateVpcOrigin": TierAutoCRUD, + "DeleteAnycastIpList": TierAutoCRUD, "DeleteCachePolicy": TierHandVerified, - "DeleteCloudFrontOriginAccessIdentity": TierUnimplemented, - "DeleteConnectionFunction": TierUnimplemented, - "DeleteConnectionGroup": TierUnimplemented, - "DeleteContinuousDeploymentPolicy": TierUnimplemented, + "DeleteCloudFrontOriginAccessIdentity": TierAutoCRUD, + "DeleteConnectionFunction": TierAutoCRUD, + "DeleteConnectionGroup": TierAutoCRUD, + "DeleteContinuousDeploymentPolicy": TierAutoCRUD, "DeleteDistribution": TierHandVerified, - "DeleteDistributionTenant": TierUnimplemented, - "DeleteFieldLevelEncryptionConfig": TierUnimplemented, - "DeleteFieldLevelEncryptionProfile": TierUnimplemented, + "DeleteDistributionTenant": TierAutoCRUD, + "DeleteFieldLevelEncryptionConfig": TierAutoCRUD, + "DeleteFieldLevelEncryptionProfile": TierAutoCRUD, "DeleteFunction": TierHandVerified, - "DeleteKeyGroup": TierUnimplemented, - "DeleteKeyValueStore": TierUnimplemented, - "DeleteMonitoringSubscription": TierUnimplemented, + "DeleteKeyGroup": TierAutoCRUD, + "DeleteKeyValueStore": TierAutoCRUD, + "DeleteMonitoringSubscription": TierAutoCRUD, "DeleteOriginAccessControl": TierHandVerified, "DeleteOriginRequestPolicy": TierHandVerified, - "DeletePublicKey": TierUnimplemented, - "DeleteRealtimeLogConfig": TierUnimplemented, - "DeleteResourcePolicy": TierUnimplemented, + "DeletePublicKey": TierAutoCRUD, + "DeleteRealtimeLogConfig": TierAutoCRUD, + "DeleteResourcePolicy": TierAutoCRUD, "DeleteResponseHeadersPolicy": TierHandVerified, - "DeleteStreamingDistribution": TierUnimplemented, - "DeleteTrustStore": TierUnimplemented, - "DeleteVpcOrigin": TierUnimplemented, - "DescribeConnectionFunction": TierUnimplemented, + "DeleteStreamingDistribution": TierAutoCRUD, + "DeleteTrustStore": TierAutoCRUD, + "DeleteVpcOrigin": TierAutoCRUD, + "DescribeConnectionFunction": TierAutoCRUD, "DescribeFunction": TierHandVerified, - "DescribeKeyValueStore": TierUnimplemented, + "DescribeKeyValueStore": TierAutoCRUD, "DisassociateDistributionTenantWebACL": TierUnimplemented, "DisassociateDistributionWebACL": TierUnimplemented, - "GetAnycastIpList": TierUnimplemented, + "GetAnycastIpList": TierAutoCRUD, "GetCachePolicy": TierHandVerified, "GetCachePolicyConfig": TierHandVerified, - "GetCloudFrontOriginAccessIdentity": TierUnimplemented, - "GetCloudFrontOriginAccessIdentityConfig": TierUnimplemented, - "GetConnectionFunction": TierUnimplemented, - "GetConnectionGroup": TierUnimplemented, - "GetConnectionGroupByRoutingEndpoint": TierUnimplemented, - "GetContinuousDeploymentPolicy": TierUnimplemented, - "GetContinuousDeploymentPolicyConfig": TierUnimplemented, + "GetCloudFrontOriginAccessIdentity": TierAutoCRUD, + "GetCloudFrontOriginAccessIdentityConfig": TierAutoCRUD, + "GetConnectionFunction": TierAutoCRUD, + "GetConnectionGroup": TierAutoCRUD, + "GetConnectionGroupByRoutingEndpoint": TierAutoCRUD, + "GetContinuousDeploymentPolicy": TierAutoCRUD, + "GetContinuousDeploymentPolicyConfig": TierAutoCRUD, "GetDistribution": TierHandVerified, "GetDistributionConfig": TierHandVerified, - "GetDistributionTenant": TierUnimplemented, - "GetDistributionTenantByDomain": TierUnimplemented, - "GetFieldLevelEncryption": TierUnimplemented, - "GetFieldLevelEncryptionConfig": TierUnimplemented, - "GetFieldLevelEncryptionProfile": TierUnimplemented, - "GetFieldLevelEncryptionProfileConfig": TierUnimplemented, + "GetDistributionTenant": TierAutoCRUD, + "GetDistributionTenantByDomain": TierAutoCRUD, + "GetFieldLevelEncryption": TierAutoCRUD, + "GetFieldLevelEncryptionConfig": TierAutoCRUD, + "GetFieldLevelEncryptionProfile": TierAutoCRUD, + "GetFieldLevelEncryptionProfileConfig": TierAutoCRUD, "GetFunction": TierHandVerified, "GetInvalidation": TierHandVerified, - "GetInvalidationForDistributionTenant": TierUnimplemented, - "GetKeyGroup": TierUnimplemented, - "GetKeyGroupConfig": TierUnimplemented, - "GetManagedCertificateDetails": TierUnimplemented, - "GetMonitoringSubscription": TierUnimplemented, + "GetInvalidationForDistributionTenant": TierAutoCRUD, + "GetKeyGroup": TierAutoCRUD, + "GetKeyGroupConfig": TierAutoCRUD, + "GetManagedCertificateDetails": TierAutoCRUD, + "GetMonitoringSubscription": TierAutoCRUD, "GetOriginAccessControl": TierHandVerified, "GetOriginAccessControlConfig": TierHandVerified, "GetOriginRequestPolicy": TierHandVerified, "GetOriginRequestPolicyConfig": TierHandVerified, - "GetPublicKey": TierUnimplemented, - "GetPublicKeyConfig": TierUnimplemented, - "GetRealtimeLogConfig": TierUnimplemented, - "GetResourcePolicy": TierUnimplemented, + "GetPublicKey": TierAutoCRUD, + "GetPublicKeyConfig": TierAutoCRUD, + "GetRealtimeLogConfig": TierAutoCRUD, + "GetResourcePolicy": TierAutoCRUD, "GetResponseHeadersPolicy": TierHandVerified, "GetResponseHeadersPolicyConfig": TierHandVerified, - "GetStreamingDistribution": TierUnimplemented, - "GetStreamingDistributionConfig": TierUnimplemented, - "GetTrustStore": TierUnimplemented, - "GetVpcOrigin": TierUnimplemented, - "ListAnycastIpLists": TierUnimplemented, + "GetStreamingDistribution": TierAutoCRUD, + "GetStreamingDistributionConfig": TierAutoCRUD, + "GetTrustStore": TierAutoCRUD, + "GetVpcOrigin": TierAutoCRUD, + "ListAnycastIpLists": TierAutoCRUD, "ListCachePolicies": TierHandVerified, - "ListCloudFrontOriginAccessIdentities": TierUnimplemented, - "ListConflictingAliases": TierUnimplemented, - "ListConnectionFunctions": TierUnimplemented, - "ListConnectionGroups": TierUnimplemented, - "ListContinuousDeploymentPolicies": TierUnimplemented, - "ListDistributionTenants": TierUnimplemented, - "ListDistributionTenantsByCustomization": TierUnimplemented, + "ListCloudFrontOriginAccessIdentities": TierAutoCRUD, + "ListConflictingAliases": TierAutoCRUD, + "ListConnectionFunctions": TierAutoCRUD, + "ListConnectionGroups": TierAutoCRUD, + "ListContinuousDeploymentPolicies": TierAutoCRUD, + "ListDistributionTenants": TierAutoCRUD, + "ListDistributionTenantsByCustomization": TierAutoCRUD, "ListDistributions": TierHandVerified, - "ListDistributionsByAnycastIpListId": TierUnimplemented, - "ListDistributionsByCachePolicyId": TierUnimplemented, - "ListDistributionsByConnectionFunction": TierUnimplemented, - "ListDistributionsByConnectionMode": TierUnimplemented, - "ListDistributionsByKeyGroup": TierUnimplemented, - "ListDistributionsByOriginRequestPolicyId": TierUnimplemented, - "ListDistributionsByOwnedResource": TierUnimplemented, - "ListDistributionsByRealtimeLogConfig": TierUnimplemented, - "ListDistributionsByResponseHeadersPolicyId": TierUnimplemented, - "ListDistributionsByTrustStore": TierUnimplemented, - "ListDistributionsByVpcOriginId": TierUnimplemented, - "ListDistributionsByWebACLId": TierUnimplemented, - "ListDomainConflicts": TierUnimplemented, - "ListFieldLevelEncryptionConfigs": TierUnimplemented, - "ListFieldLevelEncryptionProfiles": TierUnimplemented, + "ListDistributionsByAnycastIpListId": TierAutoCRUD, + "ListDistributionsByCachePolicyId": TierAutoCRUD, + "ListDistributionsByConnectionFunction": TierAutoCRUD, + "ListDistributionsByConnectionMode": TierAutoCRUD, + "ListDistributionsByKeyGroup": TierAutoCRUD, + "ListDistributionsByOriginRequestPolicyId": TierAutoCRUD, + "ListDistributionsByOwnedResource": TierAutoCRUD, + "ListDistributionsByRealtimeLogConfig": TierAutoCRUD, + "ListDistributionsByResponseHeadersPolicyId": TierAutoCRUD, + "ListDistributionsByTrustStore": TierAutoCRUD, + "ListDistributionsByVpcOriginId": TierAutoCRUD, + "ListDistributionsByWebACLId": TierAutoCRUD, + "ListDomainConflicts": TierAutoCRUD, + "ListFieldLevelEncryptionConfigs": TierAutoCRUD, + "ListFieldLevelEncryptionProfiles": TierAutoCRUD, "ListFunctions": TierHandVerified, "ListInvalidations": TierHandVerified, - "ListInvalidationsForDistributionTenant": TierUnimplemented, - "ListKeyGroups": TierUnimplemented, - "ListKeyValueStores": TierUnimplemented, + "ListInvalidationsForDistributionTenant": TierAutoCRUD, + "ListKeyGroups": TierAutoCRUD, + "ListKeyValueStores": TierAutoCRUD, "ListOriginAccessControls": TierHandVerified, "ListOriginRequestPolicies": TierHandVerified, - "ListPublicKeys": TierUnimplemented, - "ListRealtimeLogConfigs": TierUnimplemented, + "ListPublicKeys": TierAutoCRUD, + "ListRealtimeLogConfigs": TierAutoCRUD, "ListResponseHeadersPolicies": TierHandVerified, - "ListStreamingDistributions": TierUnimplemented, + "ListStreamingDistributions": TierAutoCRUD, "ListTagsForResource": TierHandVerified, - "ListTrustStores": TierUnimplemented, - "ListVpcOrigins": TierUnimplemented, + "ListTrustStores": TierAutoCRUD, + "ListVpcOrigins": TierAutoCRUD, "PublishConnectionFunction": TierUnimplemented, "PublishFunction": TierHandVerified, - "PutResourcePolicy": TierUnimplemented, + "PutResourcePolicy": TierAutoCRUD, "TagResource": TierHandVerified, "TestConnectionFunction": TierUnimplemented, "TestFunction": TierHandVerified, "UntagResource": TierHandVerified, - "UpdateAnycastIpList": TierUnimplemented, + "UpdateAnycastIpList": TierAutoCRUD, "UpdateCachePolicy": TierHandVerified, - "UpdateCloudFrontOriginAccessIdentity": TierUnimplemented, - "UpdateConnectionFunction": TierUnimplemented, - "UpdateConnectionGroup": TierUnimplemented, - "UpdateContinuousDeploymentPolicy": TierUnimplemented, + "UpdateCloudFrontOriginAccessIdentity": TierAutoCRUD, + "UpdateConnectionFunction": TierAutoCRUD, + "UpdateConnectionGroup": TierAutoCRUD, + "UpdateContinuousDeploymentPolicy": TierAutoCRUD, "UpdateDistribution": TierHandVerified, - "UpdateDistributionTenant": TierUnimplemented, - "UpdateDistributionWithStagingConfig": TierUnimplemented, - "UpdateDomainAssociation": TierUnimplemented, - "UpdateFieldLevelEncryptionConfig": TierUnimplemented, - "UpdateFieldLevelEncryptionProfile": TierUnimplemented, + "UpdateDistributionTenant": TierAutoCRUD, + "UpdateDistributionWithStagingConfig": TierAutoCRUD, + "UpdateDomainAssociation": TierAutoCRUD, + "UpdateFieldLevelEncryptionConfig": TierAutoCRUD, + "UpdateFieldLevelEncryptionProfile": TierAutoCRUD, "UpdateFunction": TierHandVerified, - "UpdateKeyGroup": TierUnimplemented, - "UpdateKeyValueStore": TierUnimplemented, + "UpdateKeyGroup": TierAutoCRUD, + "UpdateKeyValueStore": TierAutoCRUD, "UpdateOriginAccessControl": TierHandVerified, "UpdateOriginRequestPolicy": TierHandVerified, - "UpdatePublicKey": TierUnimplemented, - "UpdateRealtimeLogConfig": TierUnimplemented, + "UpdatePublicKey": TierAutoCRUD, + "UpdateRealtimeLogConfig": TierAutoCRUD, "UpdateResponseHeadersPolicy": TierHandVerified, - "UpdateStreamingDistribution": TierUnimplemented, - "UpdateTrustStore": TierUnimplemented, - "UpdateVpcOrigin": TierUnimplemented, + "UpdateStreamingDistribution": TierAutoCRUD, + "UpdateTrustStore": TierAutoCRUD, + "UpdateVpcOrigin": TierAutoCRUD, "VerifyDnsConfiguration": TierUnimplemented, }}, "cloudfrontkeyvaluestore": {Protocol: "rest-json", ModelBacked: true, EngineWired: true, Operations: map[string]Tier{ @@ -7358,14 +7358,14 @@ var Services = map[string]Service{ "CreateAccessPoint": TierHandVerified, "CreateFileSystem": TierHandVerified, "CreateMountTarget": TierHandVerified, - "CreateReplicationConfiguration": TierUnimplemented, - "CreateTags": TierUnimplemented, + "CreateReplicationConfiguration": TierAutoCRUD, + "CreateTags": TierAutoCRUD, "DeleteAccessPoint": TierHandVerified, "DeleteFileSystem": TierHandVerified, "DeleteFileSystemPolicy": TierHandVerified, "DeleteMountTarget": TierHandVerified, - "DeleteReplicationConfiguration": TierUnimplemented, - "DeleteTags": TierUnimplemented, + "DeleteReplicationConfiguration": TierAutoCRUD, + "DeleteTags": TierAutoCRUD, "DescribeAccessPoints": TierHandVerified, "DescribeAccountPreferences": TierHandVerified, "DescribeBackupPolicy": TierHandVerified, @@ -7375,17 +7375,17 @@ var Services = map[string]Service{ "DescribeMountTargetSecurityGroups": TierHandVerified, "DescribeMountTargets": TierHandVerified, "DescribeReplicationConfigurations": TierHandVerified, - "DescribeTags": TierUnimplemented, + "DescribeTags": TierAutoCRUD, "ListTagsForResource": TierHandVerified, "ModifyMountTargetSecurityGroups": TierHandVerified, - "PutAccountPreferences": TierUnimplemented, + "PutAccountPreferences": TierAutoCRUD, "PutBackupPolicy": TierHandVerified, "PutFileSystemPolicy": TierHandVerified, "PutLifecycleConfiguration": TierHandVerified, "TagResource": TierHandVerified, "UntagResource": TierHandVerified, "UpdateFileSystem": TierHandVerified, - "UpdateFileSystemProtection": TierUnimplemented, + "UpdateFileSystemProtection": TierAutoCRUD, }}, "eks": {Protocol: "rest-json", ModelBacked: true, EngineWired: false, Operations: map[string]Tier{ "AssociateAccessPolicy": TierHandVerified, @@ -9277,44 +9277,44 @@ var Services = map[string]Service{ "AttachUserPolicy": TierHandVerified, "ChangePassword": TierUnimplemented, "CreateAccessKey": TierHandVerified, - "CreateAccountAlias": TierUnimplemented, - "CreateDelegationRequest": TierUnimplemented, + "CreateAccountAlias": TierAutoCRUD, + "CreateDelegationRequest": TierAutoCRUD, "CreateGroup": TierHandVerified, "CreateInstanceProfile": TierHandVerified, - "CreateLoginProfile": TierUnimplemented, - "CreateOpenIDConnectProvider": TierUnimplemented, + "CreateLoginProfile": TierAutoCRUD, + "CreateOpenIDConnectProvider": TierAutoCRUD, "CreatePolicy": TierHandVerified, "CreatePolicyVersion": TierHandVerified, "CreateRole": TierHandVerified, - "CreateSAMLProvider": TierUnimplemented, - "CreateServiceLinkedRole": TierUnimplemented, - "CreateServiceSpecificCredential": TierUnimplemented, + "CreateSAMLProvider": TierAutoCRUD, + "CreateServiceLinkedRole": TierAutoCRUD, + "CreateServiceSpecificCredential": TierAutoCRUD, "CreateUser": TierHandVerified, - "CreateVirtualMFADevice": TierUnimplemented, + "CreateVirtualMFADevice": TierAutoCRUD, "DeactivateMFADevice": TierUnimplemented, "DeleteAccessKey": TierHandVerified, - "DeleteAccountAlias": TierUnimplemented, - "DeleteAccountPasswordPolicy": TierUnimplemented, + "DeleteAccountAlias": TierAutoCRUD, + "DeleteAccountPasswordPolicy": TierAutoCRUD, "DeleteGroup": TierHandVerified, "DeleteGroupPolicy": TierHandVerified, "DeleteInstanceProfile": TierHandVerified, - "DeleteLoginProfile": TierUnimplemented, - "DeleteOpenIDConnectProvider": TierUnimplemented, + "DeleteLoginProfile": TierAutoCRUD, + "DeleteOpenIDConnectProvider": TierAutoCRUD, "DeletePolicy": TierHandVerified, - "DeletePolicyVersion": TierUnimplemented, + "DeletePolicyVersion": TierAutoCRUD, "DeleteRole": TierHandVerified, - "DeleteRolePermissionsBoundary": TierUnimplemented, + "DeleteRolePermissionsBoundary": TierAutoCRUD, "DeleteRolePolicy": TierHandVerified, - "DeleteSAMLProvider": TierUnimplemented, - "DeleteSSHPublicKey": TierUnimplemented, - "DeleteServerCertificate": TierUnimplemented, - "DeleteServiceLinkedRole": TierUnimplemented, - "DeleteServiceSpecificCredential": TierUnimplemented, - "DeleteSigningCertificate": TierUnimplemented, + "DeleteSAMLProvider": TierAutoCRUD, + "DeleteSSHPublicKey": TierAutoCRUD, + "DeleteServerCertificate": TierAutoCRUD, + "DeleteServiceLinkedRole": TierAutoCRUD, + "DeleteServiceSpecificCredential": TierAutoCRUD, + "DeleteSigningCertificate": TierAutoCRUD, "DeleteUser": TierHandVerified, - "DeleteUserPermissionsBoundary": TierUnimplemented, + "DeleteUserPermissionsBoundary": TierAutoCRUD, "DeleteUserPolicy": TierHandVerified, - "DeleteVirtualMFADevice": TierUnimplemented, + "DeleteVirtualMFADevice": TierAutoCRUD, "DetachGroupPolicy": TierHandVerified, "DetachRolePolicy": TierHandVerified, "DetachUserPolicy": TierHandVerified, @@ -9328,75 +9328,75 @@ var Services = map[string]Service{ "GenerateCredentialReport": TierUnimplemented, "GenerateOrganizationsAccessReport": TierUnimplemented, "GenerateServiceLastAccessedDetails": TierUnimplemented, - "GetAccessKeyLastUsed": TierUnimplemented, - "GetAccountAuthorizationDetails": TierUnimplemented, - "GetAccountPasswordPolicy": TierUnimplemented, - "GetAccountSummary": TierUnimplemented, - "GetContextKeysForCustomPolicy": TierUnimplemented, - "GetContextKeysForPrincipalPolicy": TierUnimplemented, - "GetCredentialReport": TierUnimplemented, - "GetDelegationRequest": TierUnimplemented, + "GetAccessKeyLastUsed": TierAutoCRUD, + "GetAccountAuthorizationDetails": TierAutoCRUD, + "GetAccountPasswordPolicy": TierAutoCRUD, + "GetAccountSummary": TierAutoCRUD, + "GetContextKeysForCustomPolicy": TierAutoCRUD, + "GetContextKeysForPrincipalPolicy": TierAutoCRUD, + "GetCredentialReport": TierAutoCRUD, + "GetDelegationRequest": TierAutoCRUD, "GetGroup": TierHandVerified, "GetGroupPolicy": TierHandVerified, - "GetHumanReadableSummary": TierUnimplemented, + "GetHumanReadableSummary": TierAutoCRUD, "GetInstanceProfile": TierHandVerified, - "GetLoginProfile": TierUnimplemented, - "GetMFADevice": TierUnimplemented, - "GetOpenIDConnectProvider": TierUnimplemented, - "GetOrganizationsAccessReport": TierUnimplemented, - "GetOutboundWebIdentityFederationInfo": TierUnimplemented, + "GetLoginProfile": TierAutoCRUD, + "GetMFADevice": TierAutoCRUD, + "GetOpenIDConnectProvider": TierAutoCRUD, + "GetOrganizationsAccessReport": TierAutoCRUD, + "GetOutboundWebIdentityFederationInfo": TierAutoCRUD, "GetPolicy": TierHandVerified, "GetPolicyVersion": TierHandVerified, "GetRole": TierHandVerified, "GetRolePolicy": TierHandVerified, - "GetSAMLProvider": TierUnimplemented, - "GetSSHPublicKey": TierUnimplemented, - "GetServerCertificate": TierUnimplemented, - "GetServiceLastAccessedDetails": TierUnimplemented, - "GetServiceLastAccessedDetailsWithEntities": TierUnimplemented, - "GetServiceLinkedRoleDeletionStatus": TierUnimplemented, + "GetSAMLProvider": TierAutoCRUD, + "GetSSHPublicKey": TierAutoCRUD, + "GetServerCertificate": TierAutoCRUD, + "GetServiceLastAccessedDetails": TierAutoCRUD, + "GetServiceLastAccessedDetailsWithEntities": TierAutoCRUD, + "GetServiceLinkedRoleDeletionStatus": TierAutoCRUD, "GetUser": TierHandVerified, "GetUserPolicy": TierHandVerified, "ListAccessKeys": TierHandVerified, - "ListAccountAliases": TierUnimplemented, + "ListAccountAliases": TierAutoCRUD, "ListAttachedGroupPolicies": TierHandVerified, "ListAttachedRolePolicies": TierHandVerified, "ListAttachedUserPolicies": TierHandVerified, - "ListDelegationRequests": TierUnimplemented, - "ListEntitiesForPolicy": TierUnimplemented, + "ListDelegationRequests": TierAutoCRUD, + "ListEntitiesForPolicy": TierAutoCRUD, "ListGroupPolicies": TierHandVerified, "ListGroups": TierHandVerified, - "ListGroupsForUser": TierUnimplemented, - "ListInstanceProfileTags": TierUnimplemented, + "ListGroupsForUser": TierAutoCRUD, + "ListInstanceProfileTags": TierAutoCRUD, "ListInstanceProfiles": TierHandVerified, - "ListInstanceProfilesForRole": TierUnimplemented, - "ListMFADeviceTags": TierUnimplemented, - "ListMFADevices": TierUnimplemented, - "ListOpenIDConnectProviderTags": TierUnimplemented, - "ListOpenIDConnectProviders": TierUnimplemented, - "ListOrganizationsFeatures": TierUnimplemented, - "ListPolicies": TierUnimplemented, - "ListPoliciesGrantingServiceAccess": TierUnimplemented, - "ListPolicyTags": TierUnimplemented, + "ListInstanceProfilesForRole": TierAutoCRUD, + "ListMFADeviceTags": TierAutoCRUD, + "ListMFADevices": TierAutoCRUD, + "ListOpenIDConnectProviderTags": TierAutoCRUD, + "ListOpenIDConnectProviders": TierAutoCRUD, + "ListOrganizationsFeatures": TierAutoCRUD, + "ListPolicies": TierAutoCRUD, + "ListPoliciesGrantingServiceAccess": TierAutoCRUD, + "ListPolicyTags": TierAutoCRUD, "ListPolicyVersions": TierHandVerified, "ListRolePolicies": TierHandVerified, "ListRoleTags": TierHandVerified, "ListRoles": TierHandVerified, - "ListSAMLProviderTags": TierUnimplemented, - "ListSAMLProviders": TierUnimplemented, - "ListSSHPublicKeys": TierUnimplemented, - "ListServerCertificateTags": TierUnimplemented, - "ListServerCertificates": TierUnimplemented, - "ListServiceSpecificCredentials": TierUnimplemented, - "ListSigningCertificates": TierUnimplemented, + "ListSAMLProviderTags": TierAutoCRUD, + "ListSAMLProviders": TierAutoCRUD, + "ListSSHPublicKeys": TierAutoCRUD, + "ListServerCertificateTags": TierAutoCRUD, + "ListServerCertificates": TierAutoCRUD, + "ListServiceSpecificCredentials": TierAutoCRUD, + "ListSigningCertificates": TierAutoCRUD, "ListUserPolicies": TierHandVerified, "ListUserTags": TierHandVerified, "ListUsers": TierHandVerified, - "ListVirtualMFADevices": TierUnimplemented, + "ListVirtualMFADevices": TierAutoCRUD, "PutGroupPolicy": TierHandVerified, - "PutRolePermissionsBoundary": TierUnimplemented, + "PutRolePermissionsBoundary": TierAutoCRUD, "PutRolePolicy": TierHandVerified, - "PutUserPermissionsBoundary": TierUnimplemented, + "PutUserPermissionsBoundary": TierAutoCRUD, "PutUserPolicy": TierHandVerified, "RejectDelegationRequest": TierUnimplemented, "RemoveClientIDFromOpenIDConnectProvider": TierUnimplemented, @@ -9409,36 +9409,36 @@ var Services = map[string]Service{ "SetSecurityTokenServicePreferences": TierUnimplemented, "SimulateCustomPolicy": TierUnimplemented, "SimulatePrincipalPolicy": TierUnimplemented, - "TagInstanceProfile": TierUnimplemented, - "TagMFADevice": TierUnimplemented, - "TagOpenIDConnectProvider": TierUnimplemented, - "TagPolicy": TierUnimplemented, + "TagInstanceProfile": TierAutoCRUD, + "TagMFADevice": TierAutoCRUD, + "TagOpenIDConnectProvider": TierAutoCRUD, + "TagPolicy": TierAutoCRUD, "TagRole": TierHandVerified, - "TagSAMLProvider": TierUnimplemented, - "TagServerCertificate": TierUnimplemented, + "TagSAMLProvider": TierAutoCRUD, + "TagServerCertificate": TierAutoCRUD, "TagUser": TierHandVerified, - "UntagInstanceProfile": TierUnimplemented, - "UntagMFADevice": TierUnimplemented, - "UntagOpenIDConnectProvider": TierUnimplemented, - "UntagPolicy": TierUnimplemented, + "UntagInstanceProfile": TierAutoCRUD, + "UntagMFADevice": TierAutoCRUD, + "UntagOpenIDConnectProvider": TierAutoCRUD, + "UntagPolicy": TierAutoCRUD, "UntagRole": TierHandVerified, - "UntagSAMLProvider": TierUnimplemented, - "UntagServerCertificate": TierUnimplemented, + "UntagSAMLProvider": TierAutoCRUD, + "UntagServerCertificate": TierAutoCRUD, "UntagUser": TierHandVerified, "UpdateAccessKey": TierHandVerified, - "UpdateAccountPasswordPolicy": TierUnimplemented, + "UpdateAccountPasswordPolicy": TierAutoCRUD, "UpdateAssumeRolePolicy": TierHandVerified, - "UpdateDelegationRequest": TierUnimplemented, - "UpdateGroup": TierUnimplemented, - "UpdateLoginProfile": TierUnimplemented, - "UpdateOpenIDConnectProviderThumbprint": TierUnimplemented, - "UpdateRole": TierUnimplemented, - "UpdateRoleDescription": TierUnimplemented, - "UpdateSAMLProvider": TierUnimplemented, - "UpdateSSHPublicKey": TierUnimplemented, - "UpdateServerCertificate": TierUnimplemented, - "UpdateServiceSpecificCredential": TierUnimplemented, - "UpdateSigningCertificate": TierUnimplemented, + "UpdateDelegationRequest": TierAutoCRUD, + "UpdateGroup": TierAutoCRUD, + "UpdateLoginProfile": TierAutoCRUD, + "UpdateOpenIDConnectProviderThumbprint": TierAutoCRUD, + "UpdateRole": TierAutoCRUD, + "UpdateRoleDescription": TierAutoCRUD, + "UpdateSAMLProvider": TierAutoCRUD, + "UpdateSSHPublicKey": TierAutoCRUD, + "UpdateServerCertificate": TierAutoCRUD, + "UpdateServiceSpecificCredential": TierAutoCRUD, + "UpdateSigningCertificate": TierAutoCRUD, "UpdateUser": TierHandVerified, "UploadSSHPublicKey": TierUnimplemented, "UploadServerCertificate": TierUnimplemented, @@ -9764,109 +9764,109 @@ var Services = map[string]Service{ "CancelJobExecution": TierUnimplemented, "ClearDefaultAuthorizer": TierUnimplemented, "ConfirmTopicRuleDestination": TierUnimplemented, - "CreateAuditSuppression": TierUnimplemented, - "CreateAuthorizer": TierUnimplemented, - "CreateBillingGroup": TierUnimplemented, - "CreateCertificateFromCsr": TierUnimplemented, - "CreateCertificateProvider": TierUnimplemented, - "CreateCommand": TierUnimplemented, - "CreateCustomMetric": TierUnimplemented, - "CreateDimension": TierUnimplemented, - "CreateDomainConfiguration": TierUnimplemented, - "CreateDynamicThingGroup": TierUnimplemented, - "CreateFleetMetric": TierUnimplemented, + "CreateAuditSuppression": TierAutoCRUD, + "CreateAuthorizer": TierAutoCRUD, + "CreateBillingGroup": TierAutoCRUD, + "CreateCertificateFromCsr": TierAutoCRUD, + "CreateCertificateProvider": TierAutoCRUD, + "CreateCommand": TierAutoCRUD, + "CreateCustomMetric": TierAutoCRUD, + "CreateDimension": TierAutoCRUD, + "CreateDomainConfiguration": TierAutoCRUD, + "CreateDynamicThingGroup": TierAutoCRUD, + "CreateFleetMetric": TierAutoCRUD, "CreateJob": TierHandVerified, - "CreateJobTemplate": TierUnimplemented, + "CreateJobTemplate": TierAutoCRUD, "CreateKeysAndCertificate": TierHandVerified, - "CreateMitigationAction": TierUnimplemented, - "CreateOTAUpdate": TierUnimplemented, - "CreatePackage": TierUnimplemented, - "CreatePackageVersion": TierUnimplemented, + "CreateMitigationAction": TierAutoCRUD, + "CreateOTAUpdate": TierAutoCRUD, + "CreatePackage": TierAutoCRUD, + "CreatePackageVersion": TierAutoCRUD, "CreatePolicy": TierHandVerified, "CreatePolicyVersion": TierHandVerified, - "CreateProvisioningClaim": TierUnimplemented, - "CreateProvisioningTemplate": TierUnimplemented, - "CreateProvisioningTemplateVersion": TierUnimplemented, + "CreateProvisioningClaim": TierAutoCRUD, + "CreateProvisioningTemplate": TierAutoCRUD, + "CreateProvisioningTemplateVersion": TierAutoCRUD, "CreateRoleAlias": TierHandVerified, - "CreateScheduledAudit": TierUnimplemented, - "CreateSecurityProfile": TierUnimplemented, - "CreateStream": TierUnimplemented, + "CreateScheduledAudit": TierAutoCRUD, + "CreateSecurityProfile": TierAutoCRUD, + "CreateStream": TierAutoCRUD, "CreateThing": TierHandVerified, "CreateThingGroup": TierHandVerified, "CreateThingType": TierHandVerified, "CreateTopicRule": TierHandVerified, - "CreateTopicRuleDestination": TierUnimplemented, - "DeleteAccountAuditConfiguration": TierUnimplemented, - "DeleteAuditSuppression": TierUnimplemented, - "DeleteAuthorizer": TierUnimplemented, - "DeleteBillingGroup": TierUnimplemented, - "DeleteCACertificate": TierUnimplemented, + "CreateTopicRuleDestination": TierAutoCRUD, + "DeleteAccountAuditConfiguration": TierAutoCRUD, + "DeleteAuditSuppression": TierAutoCRUD, + "DeleteAuthorizer": TierAutoCRUD, + "DeleteBillingGroup": TierAutoCRUD, + "DeleteCACertificate": TierAutoCRUD, "DeleteCertificate": TierHandVerified, - "DeleteCertificateProvider": TierUnimplemented, - "DeleteCommand": TierUnimplemented, - "DeleteCommandExecution": TierUnimplemented, - "DeleteCustomMetric": TierUnimplemented, - "DeleteDimension": TierUnimplemented, - "DeleteDomainConfiguration": TierUnimplemented, - "DeleteDynamicThingGroup": TierUnimplemented, - "DeleteFleetMetric": TierUnimplemented, + "DeleteCertificateProvider": TierAutoCRUD, + "DeleteCommand": TierAutoCRUD, + "DeleteCommandExecution": TierAutoCRUD, + "DeleteCustomMetric": TierAutoCRUD, + "DeleteDimension": TierAutoCRUD, + "DeleteDomainConfiguration": TierAutoCRUD, + "DeleteDynamicThingGroup": TierAutoCRUD, + "DeleteFleetMetric": TierAutoCRUD, "DeleteJob": TierHandVerified, - "DeleteJobExecution": TierUnimplemented, - "DeleteJobTemplate": TierUnimplemented, - "DeleteMitigationAction": TierUnimplemented, - "DeleteOTAUpdate": TierUnimplemented, - "DeletePackage": TierUnimplemented, - "DeletePackageVersion": TierUnimplemented, + "DeleteJobExecution": TierAutoCRUD, + "DeleteJobTemplate": TierAutoCRUD, + "DeleteMitigationAction": TierAutoCRUD, + "DeleteOTAUpdate": TierAutoCRUD, + "DeletePackage": TierAutoCRUD, + "DeletePackageVersion": TierAutoCRUD, "DeletePolicy": TierHandVerified, "DeletePolicyVersion": TierHandVerified, - "DeleteProvisioningTemplate": TierUnimplemented, - "DeleteProvisioningTemplateVersion": TierUnimplemented, - "DeleteRegistrationCode": TierUnimplemented, + "DeleteProvisioningTemplate": TierAutoCRUD, + "DeleteProvisioningTemplateVersion": TierAutoCRUD, + "DeleteRegistrationCode": TierAutoCRUD, "DeleteRoleAlias": TierHandVerified, - "DeleteScheduledAudit": TierUnimplemented, - "DeleteSecurityProfile": TierUnimplemented, - "DeleteStream": TierUnimplemented, + "DeleteScheduledAudit": TierAutoCRUD, + "DeleteSecurityProfile": TierAutoCRUD, + "DeleteStream": TierAutoCRUD, "DeleteThing": TierHandVerified, "DeleteThingGroup": TierHandVerified, "DeleteThingType": TierHandVerified, "DeleteTopicRule": TierHandVerified, - "DeleteTopicRuleDestination": TierUnimplemented, - "DeleteV2LoggingLevel": TierUnimplemented, + "DeleteTopicRuleDestination": TierAutoCRUD, + "DeleteV2LoggingLevel": TierAutoCRUD, "DeprecateThingType": TierHandVerified, - "DescribeAccountAuditConfiguration": TierUnimplemented, - "DescribeAuditFinding": TierUnimplemented, - "DescribeAuditMitigationActionsTask": TierUnimplemented, - "DescribeAuditSuppression": TierUnimplemented, - "DescribeAuditTask": TierUnimplemented, - "DescribeAuthorizer": TierUnimplemented, - "DescribeBillingGroup": TierUnimplemented, - "DescribeCACertificate": TierUnimplemented, + "DescribeAccountAuditConfiguration": TierAutoCRUD, + "DescribeAuditFinding": TierAutoCRUD, + "DescribeAuditMitigationActionsTask": TierAutoCRUD, + "DescribeAuditSuppression": TierAutoCRUD, + "DescribeAuditTask": TierAutoCRUD, + "DescribeAuthorizer": TierAutoCRUD, + "DescribeBillingGroup": TierAutoCRUD, + "DescribeCACertificate": TierAutoCRUD, "DescribeCertificate": TierHandVerified, - "DescribeCertificateProvider": TierUnimplemented, - "DescribeCustomMetric": TierUnimplemented, - "DescribeDefaultAuthorizer": TierUnimplemented, - "DescribeDetectMitigationActionsTask": TierUnimplemented, - "DescribeDimension": TierUnimplemented, - "DescribeDomainConfiguration": TierUnimplemented, - "DescribeEncryptionConfiguration": TierUnimplemented, + "DescribeCertificateProvider": TierAutoCRUD, + "DescribeCustomMetric": TierAutoCRUD, + "DescribeDefaultAuthorizer": TierAutoCRUD, + "DescribeDetectMitigationActionsTask": TierAutoCRUD, + "DescribeDimension": TierAutoCRUD, + "DescribeDomainConfiguration": TierAutoCRUD, + "DescribeEncryptionConfiguration": TierAutoCRUD, "DescribeEndpoint": TierHandVerified, - "DescribeEventConfigurations": TierUnimplemented, - "DescribeFleetMetric": TierUnimplemented, - "DescribeIndex": TierUnimplemented, + "DescribeEventConfigurations": TierAutoCRUD, + "DescribeFleetMetric": TierAutoCRUD, + "DescribeIndex": TierAutoCRUD, "DescribeJob": TierHandVerified, - "DescribeJobExecution": TierUnimplemented, - "DescribeJobTemplate": TierUnimplemented, - "DescribeManagedJobTemplate": TierUnimplemented, - "DescribeMitigationAction": TierUnimplemented, - "DescribeProvisioningTemplate": TierUnimplemented, - "DescribeProvisioningTemplateVersion": TierUnimplemented, + "DescribeJobExecution": TierAutoCRUD, + "DescribeJobTemplate": TierAutoCRUD, + "DescribeManagedJobTemplate": TierAutoCRUD, + "DescribeMitigationAction": TierAutoCRUD, + "DescribeProvisioningTemplate": TierAutoCRUD, + "DescribeProvisioningTemplateVersion": TierAutoCRUD, "DescribeRoleAlias": TierHandVerified, - "DescribeScheduledAudit": TierUnimplemented, - "DescribeSecurityProfile": TierUnimplemented, - "DescribeStream": TierUnimplemented, + "DescribeScheduledAudit": TierAutoCRUD, + "DescribeSecurityProfile": TierAutoCRUD, + "DescribeStream": TierAutoCRUD, "DescribeThing": TierHandVerified, "DescribeThingGroup": TierHandVerified, - "DescribeThingRegistrationTask": TierUnimplemented, + "DescribeThingRegistrationTask": TierAutoCRUD, "DescribeThingType": TierHandVerified, "DetachPolicy": TierHandVerified, "DetachPrincipalPolicy": TierUnimplemented, @@ -9875,98 +9875,98 @@ var Services = map[string]Service{ "DisableTopicRule": TierHandVerified, "DisassociateSbomFromPackageVersion": TierUnimplemented, "EnableTopicRule": TierHandVerified, - "GetBehaviorModelTrainingSummaries": TierUnimplemented, - "GetBucketsAggregation": TierUnimplemented, - "GetCardinality": TierUnimplemented, - "GetCommand": TierUnimplemented, - "GetCommandExecution": TierUnimplemented, - "GetEffectivePolicies": TierUnimplemented, - "GetIndexingConfiguration": TierUnimplemented, - "GetJobDocument": TierUnimplemented, - "GetLoggingOptions": TierUnimplemented, - "GetOTAUpdate": TierUnimplemented, - "GetPackage": TierUnimplemented, - "GetPackageConfiguration": TierUnimplemented, - "GetPackageVersion": TierUnimplemented, - "GetPercentiles": TierUnimplemented, + "GetBehaviorModelTrainingSummaries": TierAutoCRUD, + "GetBucketsAggregation": TierAutoCRUD, + "GetCardinality": TierAutoCRUD, + "GetCommand": TierAutoCRUD, + "GetCommandExecution": TierAutoCRUD, + "GetEffectivePolicies": TierAutoCRUD, + "GetIndexingConfiguration": TierAutoCRUD, + "GetJobDocument": TierAutoCRUD, + "GetLoggingOptions": TierAutoCRUD, + "GetOTAUpdate": TierAutoCRUD, + "GetPackage": TierAutoCRUD, + "GetPackageConfiguration": TierAutoCRUD, + "GetPackageVersion": TierAutoCRUD, + "GetPercentiles": TierAutoCRUD, "GetPolicy": TierHandVerified, "GetPolicyVersion": TierHandVerified, - "GetRegistrationCode": TierUnimplemented, - "GetStatistics": TierUnimplemented, - "GetThingConnectivityData": TierUnimplemented, + "GetRegistrationCode": TierAutoCRUD, + "GetStatistics": TierAutoCRUD, + "GetThingConnectivityData": TierAutoCRUD, "GetTopicRule": TierHandVerified, - "GetTopicRuleDestination": TierUnimplemented, - "GetV2LoggingOptions": TierUnimplemented, - "ListActiveViolations": TierUnimplemented, + "GetTopicRuleDestination": TierAutoCRUD, + "GetV2LoggingOptions": TierAutoCRUD, + "ListActiveViolations": TierAutoCRUD, "ListAttachedPolicies": TierHandVerified, - "ListAuditFindings": TierUnimplemented, - "ListAuditMitigationActionsExecutions": TierUnimplemented, - "ListAuditMitigationActionsTasks": TierUnimplemented, - "ListAuditSuppressions": TierUnimplemented, - "ListAuditTasks": TierUnimplemented, - "ListAuthorizers": TierUnimplemented, - "ListBillingGroups": TierUnimplemented, - "ListCACertificates": TierUnimplemented, - "ListCertificateProviders": TierUnimplemented, + "ListAuditFindings": TierAutoCRUD, + "ListAuditMitigationActionsExecutions": TierAutoCRUD, + "ListAuditMitigationActionsTasks": TierAutoCRUD, + "ListAuditSuppressions": TierAutoCRUD, + "ListAuditTasks": TierAutoCRUD, + "ListAuthorizers": TierAutoCRUD, + "ListBillingGroups": TierAutoCRUD, + "ListCACertificates": TierAutoCRUD, + "ListCertificateProviders": TierAutoCRUD, "ListCertificates": TierHandVerified, - "ListCertificatesByCA": TierUnimplemented, - "ListCommandExecutions": TierUnimplemented, - "ListCommands": TierUnimplemented, - "ListCustomMetrics": TierUnimplemented, - "ListDetectMitigationActionsExecutions": TierUnimplemented, - "ListDetectMitigationActionsTasks": TierUnimplemented, - "ListDimensions": TierUnimplemented, - "ListDomainConfigurations": TierUnimplemented, - "ListFleetMetrics": TierUnimplemented, - "ListIndices": TierUnimplemented, - "ListJobExecutionsForJob": TierUnimplemented, - "ListJobExecutionsForThing": TierUnimplemented, - "ListJobTemplates": TierUnimplemented, + "ListCertificatesByCA": TierAutoCRUD, + "ListCommandExecutions": TierAutoCRUD, + "ListCommands": TierAutoCRUD, + "ListCustomMetrics": TierAutoCRUD, + "ListDetectMitigationActionsExecutions": TierAutoCRUD, + "ListDetectMitigationActionsTasks": TierAutoCRUD, + "ListDimensions": TierAutoCRUD, + "ListDomainConfigurations": TierAutoCRUD, + "ListFleetMetrics": TierAutoCRUD, + "ListIndices": TierAutoCRUD, + "ListJobExecutionsForJob": TierAutoCRUD, + "ListJobExecutionsForThing": TierAutoCRUD, + "ListJobTemplates": TierAutoCRUD, "ListJobs": TierHandVerified, - "ListManagedJobTemplates": TierUnimplemented, - "ListMetricValues": TierUnimplemented, - "ListMitigationActions": TierUnimplemented, - "ListOTAUpdates": TierUnimplemented, - "ListOutgoingCertificates": TierUnimplemented, - "ListPackageVersions": TierUnimplemented, - "ListPackages": TierUnimplemented, + "ListManagedJobTemplates": TierAutoCRUD, + "ListMetricValues": TierAutoCRUD, + "ListMitigationActions": TierAutoCRUD, + "ListOTAUpdates": TierAutoCRUD, + "ListOutgoingCertificates": TierAutoCRUD, + "ListPackageVersions": TierAutoCRUD, + "ListPackages": TierAutoCRUD, "ListPolicies": TierHandVerified, - "ListPolicyPrincipals": TierUnimplemented, + "ListPolicyPrincipals": TierAutoCRUD, "ListPolicyVersions": TierHandVerified, - "ListPrincipalPolicies": TierUnimplemented, + "ListPrincipalPolicies": TierAutoCRUD, "ListPrincipalThings": TierHandVerified, - "ListPrincipalThingsV2": TierUnimplemented, - "ListProvisioningTemplateVersions": TierUnimplemented, - "ListProvisioningTemplates": TierUnimplemented, - "ListRelatedResourcesForAuditFinding": TierUnimplemented, + "ListPrincipalThingsV2": TierAutoCRUD, + "ListProvisioningTemplateVersions": TierAutoCRUD, + "ListProvisioningTemplates": TierAutoCRUD, + "ListRelatedResourcesForAuditFinding": TierAutoCRUD, "ListRoleAliases": TierHandVerified, - "ListSbomValidationResults": TierUnimplemented, - "ListScheduledAudits": TierUnimplemented, - "ListSecurityProfiles": TierUnimplemented, - "ListSecurityProfilesForTarget": TierUnimplemented, - "ListStreams": TierUnimplemented, + "ListSbomValidationResults": TierAutoCRUD, + "ListScheduledAudits": TierAutoCRUD, + "ListSecurityProfiles": TierAutoCRUD, + "ListSecurityProfilesForTarget": TierAutoCRUD, + "ListStreams": TierAutoCRUD, "ListTagsForResource": TierHandVerified, "ListTargetsForPolicy": TierHandVerified, - "ListTargetsForSecurityProfile": TierUnimplemented, + "ListTargetsForSecurityProfile": TierAutoCRUD, "ListThingGroups": TierHandVerified, "ListThingGroupsForThing": TierHandVerified, "ListThingPrincipals": TierHandVerified, - "ListThingPrincipalsV2": TierUnimplemented, - "ListThingRegistrationTaskReports": TierUnimplemented, - "ListThingRegistrationTasks": TierUnimplemented, + "ListThingPrincipalsV2": TierAutoCRUD, + "ListThingRegistrationTaskReports": TierAutoCRUD, + "ListThingRegistrationTasks": TierAutoCRUD, "ListThingTypes": TierHandVerified, "ListThings": TierHandVerified, - "ListThingsInBillingGroup": TierUnimplemented, + "ListThingsInBillingGroup": TierAutoCRUD, "ListThingsInThingGroup": TierHandVerified, - "ListTopicRuleDestinations": TierUnimplemented, + "ListTopicRuleDestinations": TierAutoCRUD, "ListTopicRules": TierHandVerified, - "ListV2LoggingLevels": TierUnimplemented, - "ListViolationEvents": TierUnimplemented, - "PutVerificationStateOnViolation": TierUnimplemented, - "RegisterCACertificate": TierUnimplemented, + "ListV2LoggingLevels": TierAutoCRUD, + "ListViolationEvents": TierAutoCRUD, + "PutVerificationStateOnViolation": TierAutoCRUD, + "RegisterCACertificate": TierAutoCRUD, "RegisterCertificate": TierHandVerified, "RegisterCertificateWithoutCA": TierHandVerified, - "RegisterThing": TierUnimplemented, + "RegisterThing": TierAutoCRUD, "RejectCertificateTransfer": TierUnimplemented, "RemoveThingFromBillingGroup": TierUnimplemented, "RemoveThingFromThingGroup": TierHandVerified, @@ -9987,37 +9987,37 @@ var Services = map[string]Service{ "TestInvokeAuthorizer": TierUnimplemented, "TransferCertificate": TierUnimplemented, "UntagResource": TierHandVerified, - "UpdateAccountAuditConfiguration": TierUnimplemented, - "UpdateAuditSuppression": TierUnimplemented, - "UpdateAuthorizer": TierUnimplemented, - "UpdateBillingGroup": TierUnimplemented, - "UpdateCACertificate": TierUnimplemented, + "UpdateAccountAuditConfiguration": TierAutoCRUD, + "UpdateAuditSuppression": TierAutoCRUD, + "UpdateAuthorizer": TierAutoCRUD, + "UpdateBillingGroup": TierAutoCRUD, + "UpdateCACertificate": TierAutoCRUD, "UpdateCertificate": TierHandVerified, - "UpdateCertificateProvider": TierUnimplemented, - "UpdateCommand": TierUnimplemented, - "UpdateCustomMetric": TierUnimplemented, - "UpdateDimension": TierUnimplemented, - "UpdateDomainConfiguration": TierUnimplemented, - "UpdateDynamicThingGroup": TierUnimplemented, - "UpdateEncryptionConfiguration": TierUnimplemented, - "UpdateEventConfigurations": TierUnimplemented, - "UpdateFleetMetric": TierUnimplemented, - "UpdateIndexingConfiguration": TierUnimplemented, - "UpdateJob": TierUnimplemented, - "UpdateMitigationAction": TierUnimplemented, - "UpdatePackage": TierUnimplemented, - "UpdatePackageConfiguration": TierUnimplemented, - "UpdatePackageVersion": TierUnimplemented, - "UpdateProvisioningTemplate": TierUnimplemented, + "UpdateCertificateProvider": TierAutoCRUD, + "UpdateCommand": TierAutoCRUD, + "UpdateCustomMetric": TierAutoCRUD, + "UpdateDimension": TierAutoCRUD, + "UpdateDomainConfiguration": TierAutoCRUD, + "UpdateDynamicThingGroup": TierAutoCRUD, + "UpdateEncryptionConfiguration": TierAutoCRUD, + "UpdateEventConfigurations": TierAutoCRUD, + "UpdateFleetMetric": TierAutoCRUD, + "UpdateIndexingConfiguration": TierAutoCRUD, + "UpdateJob": TierAutoCRUD, + "UpdateMitigationAction": TierAutoCRUD, + "UpdatePackage": TierAutoCRUD, + "UpdatePackageConfiguration": TierAutoCRUD, + "UpdatePackageVersion": TierAutoCRUD, + "UpdateProvisioningTemplate": TierAutoCRUD, "UpdateRoleAlias": TierHandVerified, - "UpdateScheduledAudit": TierUnimplemented, - "UpdateSecurityProfile": TierUnimplemented, - "UpdateStream": TierUnimplemented, + "UpdateScheduledAudit": TierAutoCRUD, + "UpdateSecurityProfile": TierAutoCRUD, + "UpdateStream": TierAutoCRUD, "UpdateThing": TierHandVerified, "UpdateThingGroup": TierHandVerified, - "UpdateThingGroupsForThing": TierUnimplemented, + "UpdateThingGroupsForThing": TierAutoCRUD, "UpdateThingType": TierHandVerified, - "UpdateTopicRuleDestination": TierUnimplemented, + "UpdateTopicRuleDestination": TierAutoCRUD, "ValidateSecurityProfileBehaviors": TierUnimplemented, }}, "iotdataplane": {Protocol: "rest-json", ModelBacked: true, EngineWired: false, Operations: map[string]Tier{ @@ -10454,21 +10454,21 @@ var Services = map[string]Service{ "CreateServiceProfile": TierHandVerified, "CreateWirelessDevice": TierHandVerified, "CreateWirelessGateway": TierHandVerified, - "CreateWirelessGatewayTask": TierUnimplemented, - "CreateWirelessGatewayTaskDefinition": TierUnimplemented, + "CreateWirelessGatewayTask": TierAutoCRUD, + "CreateWirelessGatewayTaskDefinition": TierAutoCRUD, "DeleteDestination": TierHandVerified, "DeleteDeviceProfile": TierHandVerified, "DeleteFuotaTask": TierHandVerified, "DeleteMulticastGroup": TierHandVerified, "DeleteNetworkAnalyzerConfiguration": TierHandVerified, - "DeleteQueuedMessages": TierUnimplemented, + "DeleteQueuedMessages": TierAutoCRUD, "DeleteServiceProfile": TierHandVerified, "DeleteWirelessDevice": TierHandVerified, - "DeleteWirelessDeviceImportTask": TierUnimplemented, + "DeleteWirelessDeviceImportTask": TierAutoCRUD, "DeleteWirelessGateway": TierHandVerified, - "DeleteWirelessGatewayTask": TierUnimplemented, - "DeleteWirelessGatewayTaskDefinition": TierUnimplemented, - "DeregisterWirelessDevice": TierUnimplemented, + "DeleteWirelessGatewayTask": TierAutoCRUD, + "DeleteWirelessGatewayTaskDefinition": TierAutoCRUD, + "DeregisterWirelessDevice": TierAutoCRUD, "DisassociateAwsAccountFromPartnerAccount": TierUnimplemented, "DisassociateMulticastGroupFromFuotaTask": TierUnimplemented, "DisassociateWirelessDeviceFromFuotaTask": TierUnimplemented, @@ -10478,51 +10478,51 @@ var Services = map[string]Service{ "DisassociateWirelessGatewayFromThing": TierUnimplemented, "GetDestination": TierHandVerified, "GetDeviceProfile": TierHandVerified, - "GetEventConfigurationByResourceTypes": TierUnimplemented, + "GetEventConfigurationByResourceTypes": TierAutoCRUD, "GetFuotaTask": TierHandVerified, - "GetLogLevelsByResourceTypes": TierUnimplemented, - "GetMetricConfiguration": TierUnimplemented, - "GetMetrics": TierUnimplemented, + "GetLogLevelsByResourceTypes": TierAutoCRUD, + "GetMetricConfiguration": TierAutoCRUD, + "GetMetrics": TierAutoCRUD, "GetMulticastGroup": TierHandVerified, - "GetMulticastGroupSession": TierUnimplemented, + "GetMulticastGroupSession": TierAutoCRUD, "GetNetworkAnalyzerConfiguration": TierHandVerified, - "GetPartnerAccount": TierUnimplemented, - "GetPosition": TierUnimplemented, - "GetPositionConfiguration": TierUnimplemented, - "GetPositionEstimate": TierUnimplemented, - "GetResourceEventConfiguration": TierUnimplemented, - "GetResourceLogLevel": TierUnimplemented, - "GetResourcePosition": TierUnimplemented, - "GetServiceEndpoint": TierUnimplemented, + "GetPartnerAccount": TierAutoCRUD, + "GetPosition": TierAutoCRUD, + "GetPositionConfiguration": TierAutoCRUD, + "GetPositionEstimate": TierAutoCRUD, + "GetResourceEventConfiguration": TierAutoCRUD, + "GetResourceLogLevel": TierAutoCRUD, + "GetResourcePosition": TierAutoCRUD, + "GetServiceEndpoint": TierAutoCRUD, "GetServiceProfile": TierHandVerified, "GetWirelessDevice": TierHandVerified, - "GetWirelessDeviceImportTask": TierUnimplemented, - "GetWirelessDeviceStatistics": TierUnimplemented, + "GetWirelessDeviceImportTask": TierAutoCRUD, + "GetWirelessDeviceStatistics": TierAutoCRUD, "GetWirelessGateway": TierHandVerified, - "GetWirelessGatewayCertificate": TierUnimplemented, - "GetWirelessGatewayFirmwareInformation": TierUnimplemented, - "GetWirelessGatewayStatistics": TierUnimplemented, - "GetWirelessGatewayTask": TierUnimplemented, - "GetWirelessGatewayTaskDefinition": TierUnimplemented, + "GetWirelessGatewayCertificate": TierAutoCRUD, + "GetWirelessGatewayFirmwareInformation": TierAutoCRUD, + "GetWirelessGatewayStatistics": TierAutoCRUD, + "GetWirelessGatewayTask": TierAutoCRUD, + "GetWirelessGatewayTaskDefinition": TierAutoCRUD, "ListDestinations": TierHandVerified, "ListDeviceProfiles": TierHandVerified, - "ListDevicesForWirelessDeviceImportTask": TierUnimplemented, - "ListEventConfigurations": TierUnimplemented, + "ListDevicesForWirelessDeviceImportTask": TierAutoCRUD, + "ListEventConfigurations": TierAutoCRUD, "ListFuotaTasks": TierHandVerified, "ListMulticastGroups": TierHandVerified, - "ListMulticastGroupsByFuotaTask": TierUnimplemented, + "ListMulticastGroupsByFuotaTask": TierAutoCRUD, "ListNetworkAnalyzerConfigurations": TierHandVerified, - "ListPartnerAccounts": TierUnimplemented, - "ListPositionConfigurations": TierUnimplemented, - "ListQueuedMessages": TierUnimplemented, + "ListPartnerAccounts": TierAutoCRUD, + "ListPositionConfigurations": TierAutoCRUD, + "ListQueuedMessages": TierAutoCRUD, "ListServiceProfiles": TierHandVerified, "ListTagsForResource": TierHandVerified, - "ListWirelessDeviceImportTasks": TierUnimplemented, + "ListWirelessDeviceImportTasks": TierAutoCRUD, "ListWirelessDevices": TierHandVerified, - "ListWirelessGatewayTaskDefinitions": TierUnimplemented, + "ListWirelessGatewayTaskDefinitions": TierAutoCRUD, "ListWirelessGateways": TierHandVerified, - "PutPositionConfiguration": TierUnimplemented, - "PutResourceLogLevel": TierUnimplemented, + "PutPositionConfiguration": TierAutoCRUD, + "PutResourceLogLevel": TierAutoCRUD, "ResetAllResourceLogLevels": TierUnimplemented, "ResetResourceLogLevel": TierUnimplemented, "SendDataToMulticastGroup": TierUnimplemented, @@ -10537,18 +10537,18 @@ var Services = map[string]Service{ "TestWirelessDevice": TierUnimplemented, "UntagResource": TierHandVerified, "UpdateDestination": TierHandVerified, - "UpdateEventConfigurationByResourceTypes": TierUnimplemented, + "UpdateEventConfigurationByResourceTypes": TierAutoCRUD, "UpdateFuotaTask": TierHandVerified, - "UpdateLogLevelsByResourceTypes": TierUnimplemented, - "UpdateMetricConfiguration": TierUnimplemented, + "UpdateLogLevelsByResourceTypes": TierAutoCRUD, + "UpdateMetricConfiguration": TierAutoCRUD, "UpdateMulticastGroup": TierHandVerified, "UpdateNetworkAnalyzerConfiguration": TierHandVerified, - "UpdatePartnerAccount": TierUnimplemented, - "UpdatePosition": TierUnimplemented, - "UpdateResourceEventConfiguration": TierUnimplemented, - "UpdateResourcePosition": TierUnimplemented, + "UpdatePartnerAccount": TierAutoCRUD, + "UpdatePosition": TierAutoCRUD, + "UpdateResourceEventConfiguration": TierAutoCRUD, + "UpdateResourcePosition": TierAutoCRUD, "UpdateWirelessDevice": TierHandVerified, - "UpdateWirelessDeviceImportTask": TierUnimplemented, + "UpdateWirelessDeviceImportTask": TierAutoCRUD, "UpdateWirelessGateway": TierHandVerified, }}, "ivs": {Protocol: "rest-json", ModelBacked: true, EngineWired: true, Operations: map[string]Tier{ @@ -11116,71 +11116,71 @@ var Services = map[string]Service{ "AddPermission": TierHandVerified, "CheckpointDurableExecution": TierUnimplemented, "CreateAlias": TierHandVerified, - "CreateCapacityProvider": TierUnimplemented, - "CreateCodeSigningConfig": TierUnimplemented, + "CreateCapacityProvider": TierAutoCRUD, + "CreateCodeSigningConfig": TierAutoCRUD, "CreateEventSourceMapping": TierHandVerified, "CreateFunction": TierHandVerified, - "CreateFunctionUrlConfig": TierUnimplemented, + "CreateFunctionUrlConfig": TierAutoCRUD, "DeleteAlias": TierHandVerified, - "DeleteCapacityProvider": TierUnimplemented, - "DeleteCodeSigningConfig": TierUnimplemented, + "DeleteCapacityProvider": TierAutoCRUD, + "DeleteCodeSigningConfig": TierAutoCRUD, "DeleteEventSourceMapping": TierHandVerified, "DeleteFunction": TierHandVerified, - "DeleteFunctionCodeSigningConfig": TierUnimplemented, - "DeleteFunctionConcurrency": TierUnimplemented, - "DeleteFunctionEventInvokeConfig": TierUnimplemented, - "DeleteFunctionUrlConfig": TierUnimplemented, - "DeleteLayerVersion": TierUnimplemented, - "DeleteProvisionedConcurrencyConfig": TierUnimplemented, - "GetAccountSettings": TierUnimplemented, + "DeleteFunctionCodeSigningConfig": TierAutoCRUD, + "DeleteFunctionConcurrency": TierAutoCRUD, + "DeleteFunctionEventInvokeConfig": TierAutoCRUD, + "DeleteFunctionUrlConfig": TierAutoCRUD, + "DeleteLayerVersion": TierAutoCRUD, + "DeleteProvisionedConcurrencyConfig": TierAutoCRUD, + "GetAccountSettings": TierAutoCRUD, "GetAlias": TierHandVerified, - "GetCapacityProvider": TierUnimplemented, - "GetCodeSigningConfig": TierUnimplemented, - "GetDurableExecution": TierUnimplemented, - "GetDurableExecutionHistory": TierUnimplemented, - "GetDurableExecutionState": TierUnimplemented, + "GetCapacityProvider": TierAutoCRUD, + "GetCodeSigningConfig": TierAutoCRUD, + "GetDurableExecution": TierAutoCRUD, + "GetDurableExecutionHistory": TierAutoCRUD, + "GetDurableExecutionState": TierAutoCRUD, "GetEventSourceMapping": TierHandVerified, "GetFunction": TierHandVerified, - "GetFunctionCodeSigningConfig": TierUnimplemented, - "GetFunctionConcurrency": TierUnimplemented, - "GetFunctionConfiguration": TierUnimplemented, - "GetFunctionEventInvokeConfig": TierUnimplemented, - "GetFunctionRecursionConfig": TierUnimplemented, - "GetFunctionScalingConfig": TierUnimplemented, - "GetFunctionUrlConfig": TierUnimplemented, - "GetLayerVersion": TierUnimplemented, - "GetLayerVersionByArn": TierUnimplemented, - "GetLayerVersionPolicy": TierUnimplemented, + "GetFunctionCodeSigningConfig": TierAutoCRUD, + "GetFunctionConcurrency": TierAutoCRUD, + "GetFunctionConfiguration": TierAutoCRUD, + "GetFunctionEventInvokeConfig": TierAutoCRUD, + "GetFunctionRecursionConfig": TierAutoCRUD, + "GetFunctionScalingConfig": TierAutoCRUD, + "GetFunctionUrlConfig": TierAutoCRUD, + "GetLayerVersion": TierAutoCRUD, + "GetLayerVersionByArn": TierAutoCRUD, + "GetLayerVersionPolicy": TierAutoCRUD, "GetPolicy": TierHandVerified, - "GetProvisionedConcurrencyConfig": TierUnimplemented, - "GetRuntimeManagementConfig": TierUnimplemented, + "GetProvisionedConcurrencyConfig": TierAutoCRUD, + "GetRuntimeManagementConfig": TierAutoCRUD, "Invoke": TierHandVerified, "InvokeAsync": TierUnimplemented, "InvokeWithResponseStream": TierUnimplemented, "ListAliases": TierHandVerified, - "ListCapacityProviders": TierUnimplemented, - "ListCodeSigningConfigs": TierUnimplemented, - "ListDurableExecutionsByFunction": TierUnimplemented, + "ListCapacityProviders": TierAutoCRUD, + "ListCodeSigningConfigs": TierAutoCRUD, + "ListDurableExecutionsByFunction": TierAutoCRUD, "ListEventSourceMappings": TierHandVerified, - "ListFunctionEventInvokeConfigs": TierUnimplemented, - "ListFunctionUrlConfigs": TierUnimplemented, - "ListFunctionVersionsByCapacityProvider": TierUnimplemented, + "ListFunctionEventInvokeConfigs": TierAutoCRUD, + "ListFunctionUrlConfigs": TierAutoCRUD, + "ListFunctionVersionsByCapacityProvider": TierAutoCRUD, "ListFunctions": TierHandVerified, - "ListFunctionsByCodeSigningConfig": TierUnimplemented, - "ListLayerVersions": TierUnimplemented, - "ListLayers": TierUnimplemented, - "ListProvisionedConcurrencyConfigs": TierUnimplemented, + "ListFunctionsByCodeSigningConfig": TierAutoCRUD, + "ListLayerVersions": TierAutoCRUD, + "ListLayers": TierAutoCRUD, + "ListProvisionedConcurrencyConfigs": TierAutoCRUD, "ListTags": TierHandVerified, "ListVersionsByFunction": TierHandVerified, "PublishLayerVersion": TierUnimplemented, "PublishVersion": TierHandVerified, - "PutFunctionCodeSigningConfig": TierUnimplemented, - "PutFunctionConcurrency": TierUnimplemented, - "PutFunctionEventInvokeConfig": TierUnimplemented, - "PutFunctionRecursionConfig": TierUnimplemented, - "PutFunctionScalingConfig": TierUnimplemented, - "PutProvisionedConcurrencyConfig": TierUnimplemented, - "PutRuntimeManagementConfig": TierUnimplemented, + "PutFunctionCodeSigningConfig": TierAutoCRUD, + "PutFunctionConcurrency": TierAutoCRUD, + "PutFunctionEventInvokeConfig": TierAutoCRUD, + "PutFunctionRecursionConfig": TierAutoCRUD, + "PutFunctionScalingConfig": TierAutoCRUD, + "PutProvisionedConcurrencyConfig": TierAutoCRUD, + "PutRuntimeManagementConfig": TierAutoCRUD, "RemoveLayerVersionPermission": TierUnimplemented, "RemovePermission": TierHandVerified, "SendDurableExecutionCallbackFailure": TierUnimplemented, @@ -11190,13 +11190,13 @@ var Services = map[string]Service{ "TagResource": TierHandVerified, "UntagResource": TierHandVerified, "UpdateAlias": TierHandVerified, - "UpdateCapacityProvider": TierUnimplemented, - "UpdateCodeSigningConfig": TierUnimplemented, + "UpdateCapacityProvider": TierAutoCRUD, + "UpdateCodeSigningConfig": TierAutoCRUD, "UpdateEventSourceMapping": TierHandVerified, "UpdateFunctionCode": TierHandVerified, "UpdateFunctionConfiguration": TierHandVerified, - "UpdateFunctionEventInvokeConfig": TierUnimplemented, - "UpdateFunctionUrlConfig": TierUnimplemented, + "UpdateFunctionEventInvokeConfig": TierAutoCRUD, + "UpdateFunctionUrlConfig": TierAutoCRUD, }}, "lambdacore": {Protocol: "rest-json", ModelBacked: true, EngineWired: true, Operations: map[string]Tier{ "CreateNetworkConnector": TierAutoCRUD, @@ -12027,7 +12027,7 @@ var Services = map[string]Service{ "ListMembers": TierHandVerified, "ListNetworks": TierHandVerified, "ListNodes": TierHandVerified, - "ListProposalVotes": TierUnimplemented, + "ListProposalVotes": TierAutoCRUD, "ListProposals": TierHandVerified, "ListTagsForResource": TierHandVerified, "RejectInvitation": TierHandVerified, @@ -15227,7 +15227,7 @@ var Services = map[string]Service{ "AssociateResourceShare": TierHandVerified, "AssociateResourceSharePermission": TierHandVerified, "CreatePermission": TierHandVerified, - "CreatePermissionVersion": TierUnimplemented, + "CreatePermissionVersion": TierAutoCRUD, "CreateResourceShare": TierHandVerified, "DeletePermission": TierHandVerified, "DeletePermissionVersion": TierHandVerified, @@ -16032,8 +16032,8 @@ var Services = map[string]Service{ "CreateReusableDelegationSet": TierHandVerified, "CreateTrafficPolicy": TierHandVerified, "CreateTrafficPolicyInstance": TierHandVerified, - "CreateTrafficPolicyVersion": TierUnimplemented, - "CreateVPCAssociationAuthorization": TierUnimplemented, + "CreateTrafficPolicyVersion": TierAutoCRUD, + "CreateVPCAssociationAuthorization": TierAutoCRUD, "DeactivateKeySigningKey": TierHandVerified, "DeleteCidrCollection": TierHandVerified, "DeleteHealthCheck": TierHandVerified, @@ -16043,53 +16043,53 @@ var Services = map[string]Service{ "DeleteReusableDelegationSet": TierHandVerified, "DeleteTrafficPolicy": TierHandVerified, "DeleteTrafficPolicyInstance": TierHandVerified, - "DeleteVPCAssociationAuthorization": TierUnimplemented, + "DeleteVPCAssociationAuthorization": TierAutoCRUD, "DisableHostedZoneDNSSEC": TierHandVerified, "DisassociateVPCFromHostedZone": TierHandVerified, "EnableHostedZoneDNSSEC": TierHandVerified, - "GetAccountLimit": TierUnimplemented, - "GetChange": TierUnimplemented, - "GetCheckerIpRanges": TierUnimplemented, + "GetAccountLimit": TierAutoCRUD, + "GetChange": TierAutoCRUD, + "GetCheckerIpRanges": TierAutoCRUD, "GetDNSSEC": TierHandVerified, - "GetGeoLocation": TierUnimplemented, + "GetGeoLocation": TierAutoCRUD, "GetHealthCheck": TierHandVerified, - "GetHealthCheckCount": TierUnimplemented, - "GetHealthCheckLastFailureReason": TierUnimplemented, + "GetHealthCheckCount": TierAutoCRUD, + "GetHealthCheckLastFailureReason": TierAutoCRUD, "GetHealthCheckStatus": TierHandVerified, "GetHostedZone": TierHandVerified, - "GetHostedZoneCount": TierUnimplemented, - "GetHostedZoneLimit": TierUnimplemented, + "GetHostedZoneCount": TierAutoCRUD, + "GetHostedZoneLimit": TierAutoCRUD, "GetQueryLoggingConfig": TierHandVerified, "GetReusableDelegationSet": TierHandVerified, - "GetReusableDelegationSetLimit": TierUnimplemented, + "GetReusableDelegationSetLimit": TierAutoCRUD, "GetTrafficPolicy": TierHandVerified, "GetTrafficPolicyInstance": TierHandVerified, - "GetTrafficPolicyInstanceCount": TierUnimplemented, + "GetTrafficPolicyInstanceCount": TierAutoCRUD, "ListCidrBlocks": TierHandVerified, "ListCidrCollections": TierHandVerified, "ListCidrLocations": TierHandVerified, - "ListGeoLocations": TierUnimplemented, + "ListGeoLocations": TierAutoCRUD, "ListHealthChecks": TierHandVerified, "ListHostedZones": TierHandVerified, - "ListHostedZonesByName": TierUnimplemented, - "ListHostedZonesByVPC": TierUnimplemented, + "ListHostedZonesByName": TierAutoCRUD, + "ListHostedZonesByVPC": TierAutoCRUD, "ListKeySigningKeys": TierHandVerified, "ListQueryLoggingConfigs": TierHandVerified, "ListResourceRecordSets": TierHandVerified, "ListReusableDelegationSets": TierHandVerified, "ListTagsForResource": TierHandVerified, - "ListTagsForResources": TierUnimplemented, + "ListTagsForResources": TierAutoCRUD, "ListTrafficPolicies": TierHandVerified, "ListTrafficPolicyInstances": TierHandVerified, "ListTrafficPolicyInstancesByHostedZone": TierHandVerified, "ListTrafficPolicyInstancesByPolicy": TierHandVerified, - "ListTrafficPolicyVersions": TierUnimplemented, - "ListVPCAssociationAuthorizations": TierUnimplemented, + "ListTrafficPolicyVersions": TierAutoCRUD, + "ListVPCAssociationAuthorizations": TierAutoCRUD, "TestDNSAnswer": TierUnimplemented, "UpdateHealthCheck": TierHandVerified, - "UpdateHostedZoneComment": TierUnimplemented, - "UpdateHostedZoneFeatures": TierUnimplemented, - "UpdateTrafficPolicyComment": TierUnimplemented, + "UpdateHostedZoneComment": TierAutoCRUD, + "UpdateHostedZoneFeatures": TierAutoCRUD, + "UpdateTrafficPolicyComment": TierAutoCRUD, "UpdateTrafficPolicyInstance": TierHandVerified, }}, "route53domains": {Protocol: "json-1.1", ModelBacked: true, EngineWired: true, Operations: map[string]Tier{ @@ -16393,111 +16393,111 @@ var Services = map[string]Service{ "UpdateAppMonitor": TierAutoCRUD, "UpdateRumMetricDefinition": TierAutoCRUD, }}, - "s3": {Protocol: "rest-xml", ModelBacked: true, EngineWired: false, Operations: map[string]Tier{ + "s3": {Protocol: "rest-xml", ModelBacked: true, EngineWired: true, Operations: map[string]Tier{ "AbortMultipartUpload": TierHandVerified, "CompleteMultipartUpload": TierHandVerified, "CopyObject": TierHandVerified, "CreateBucket": TierHandVerified, - "CreateBucketMetadataConfiguration": TierUnimplemented, - "CreateBucketMetadataTableConfiguration": TierUnimplemented, + "CreateBucketMetadataConfiguration": TierAutoCRUD, + "CreateBucketMetadataTableConfiguration": TierAutoCRUD, "CreateMultipartUpload": TierHandVerified, - "CreateSession": TierUnimplemented, + "CreateSession": TierAutoCRUD, "DeleteBucket": TierHandVerified, - "DeleteBucketAnalyticsConfiguration": TierUnimplemented, + "DeleteBucketAnalyticsConfiguration": TierAutoCRUD, "DeleteBucketCors": TierHandVerified, - "DeleteBucketEncryption": TierUnimplemented, - "DeleteBucketIntelligentTieringConfiguration": TierUnimplemented, - "DeleteBucketInventoryConfiguration": TierUnimplemented, - "DeleteBucketLifecycle": TierUnimplemented, - "DeleteBucketMetadataConfiguration": TierUnimplemented, - "DeleteBucketMetadataTableConfiguration": TierUnimplemented, - "DeleteBucketMetricsConfiguration": TierUnimplemented, - "DeleteBucketOwnershipControls": TierUnimplemented, + "DeleteBucketEncryption": TierAutoCRUD, + "DeleteBucketIntelligentTieringConfiguration": TierAutoCRUD, + "DeleteBucketInventoryConfiguration": TierAutoCRUD, + "DeleteBucketLifecycle": TierAutoCRUD, + "DeleteBucketMetadataConfiguration": TierAutoCRUD, + "DeleteBucketMetadataTableConfiguration": TierAutoCRUD, + "DeleteBucketMetricsConfiguration": TierAutoCRUD, + "DeleteBucketOwnershipControls": TierAutoCRUD, "DeleteBucketPolicy": TierHandVerified, - "DeleteBucketReplication": TierUnimplemented, + "DeleteBucketReplication": TierAutoCRUD, "DeleteBucketTagging": TierHandVerified, - "DeleteBucketWebsite": TierUnimplemented, + "DeleteBucketWebsite": TierAutoCRUD, "DeleteObject": TierHandVerified, "DeleteObjectTagging": TierHandVerified, "DeleteObjects": TierHandVerified, - "DeletePublicAccessBlock": TierUnimplemented, - "GetBucketAbac": TierUnimplemented, - "GetBucketAccelerateConfiguration": TierUnimplemented, + "DeletePublicAccessBlock": TierAutoCRUD, + "GetBucketAbac": TierAutoCRUD, + "GetBucketAccelerateConfiguration": TierAutoCRUD, "GetBucketAcl": TierHandVerified, - "GetBucketAnalyticsConfiguration": TierUnimplemented, + "GetBucketAnalyticsConfiguration": TierAutoCRUD, "GetBucketCors": TierHandVerified, - "GetBucketEncryption": TierUnimplemented, - "GetBucketIntelligentTieringConfiguration": TierUnimplemented, - "GetBucketInventoryConfiguration": TierUnimplemented, - "GetBucketLifecycleConfiguration": TierUnimplemented, + "GetBucketEncryption": TierAutoCRUD, + "GetBucketIntelligentTieringConfiguration": TierAutoCRUD, + "GetBucketInventoryConfiguration": TierAutoCRUD, + "GetBucketLifecycleConfiguration": TierAutoCRUD, "GetBucketLocation": TierHandVerified, - "GetBucketLogging": TierUnimplemented, - "GetBucketMetadataConfiguration": TierUnimplemented, - "GetBucketMetadataTableConfiguration": TierUnimplemented, - "GetBucketMetricsConfiguration": TierUnimplemented, + "GetBucketLogging": TierAutoCRUD, + "GetBucketMetadataConfiguration": TierAutoCRUD, + "GetBucketMetadataTableConfiguration": TierAutoCRUD, + "GetBucketMetricsConfiguration": TierAutoCRUD, "GetBucketNotificationConfiguration": TierHandVerified, - "GetBucketOwnershipControls": TierUnimplemented, + "GetBucketOwnershipControls": TierAutoCRUD, "GetBucketPolicy": TierHandVerified, - "GetBucketPolicyStatus": TierUnimplemented, - "GetBucketReplication": TierUnimplemented, - "GetBucketRequestPayment": TierUnimplemented, + "GetBucketPolicyStatus": TierAutoCRUD, + "GetBucketReplication": TierAutoCRUD, + "GetBucketRequestPayment": TierAutoCRUD, "GetBucketTagging": TierHandVerified, "GetBucketVersioning": TierHandVerified, - "GetBucketWebsite": TierUnimplemented, + "GetBucketWebsite": TierAutoCRUD, "GetObject": TierHandVerified, - "GetObjectAcl": TierUnimplemented, - "GetObjectAttributes": TierUnimplemented, - "GetObjectLegalHold": TierUnimplemented, - "GetObjectLockConfiguration": TierUnimplemented, - "GetObjectRetention": TierUnimplemented, + "GetObjectAcl": TierAutoCRUD, + "GetObjectAttributes": TierAutoCRUD, + "GetObjectLegalHold": TierAutoCRUD, + "GetObjectLockConfiguration": TierAutoCRUD, + "GetObjectRetention": TierAutoCRUD, "GetObjectTagging": TierHandVerified, - "GetObjectTorrent": TierUnimplemented, - "GetPublicAccessBlock": TierUnimplemented, + "GetObjectTorrent": TierAutoCRUD, + "GetPublicAccessBlock": TierAutoCRUD, "HeadBucket": TierHandVerified, "HeadObject": TierHandVerified, - "ListBucketAnalyticsConfigurations": TierUnimplemented, - "ListBucketIntelligentTieringConfigurations": TierUnimplemented, - "ListBucketInventoryConfigurations": TierUnimplemented, - "ListBucketMetricsConfigurations": TierUnimplemented, + "ListBucketAnalyticsConfigurations": TierAutoCRUD, + "ListBucketIntelligentTieringConfigurations": TierAutoCRUD, + "ListBucketInventoryConfigurations": TierAutoCRUD, + "ListBucketMetricsConfigurations": TierAutoCRUD, "ListBuckets": TierHandVerified, - "ListDirectoryBuckets": TierUnimplemented, + "ListDirectoryBuckets": TierAutoCRUD, "ListMultipartUploads": TierHandVerified, - "ListObjectVersions": TierUnimplemented, + "ListObjectVersions": TierAutoCRUD, "ListObjects": TierHandVerified, "ListObjectsV2": TierHandVerified, "ListParts": TierHandVerified, - "PutBucketAbac": TierUnimplemented, - "PutBucketAccelerateConfiguration": TierUnimplemented, + "PutBucketAbac": TierAutoCRUD, + "PutBucketAccelerateConfiguration": TierAutoCRUD, "PutBucketAcl": TierHandVerified, - "PutBucketAnalyticsConfiguration": TierUnimplemented, + "PutBucketAnalyticsConfiguration": TierAutoCRUD, "PutBucketCors": TierHandVerified, - "PutBucketEncryption": TierUnimplemented, - "PutBucketIntelligentTieringConfiguration": TierUnimplemented, - "PutBucketInventoryConfiguration": TierUnimplemented, - "PutBucketLifecycleConfiguration": TierUnimplemented, - "PutBucketLogging": TierUnimplemented, - "PutBucketMetricsConfiguration": TierUnimplemented, + "PutBucketEncryption": TierAutoCRUD, + "PutBucketIntelligentTieringConfiguration": TierAutoCRUD, + "PutBucketInventoryConfiguration": TierAutoCRUD, + "PutBucketLifecycleConfiguration": TierAutoCRUD, + "PutBucketLogging": TierAutoCRUD, + "PutBucketMetricsConfiguration": TierAutoCRUD, "PutBucketNotificationConfiguration": TierHandVerified, - "PutBucketOwnershipControls": TierUnimplemented, + "PutBucketOwnershipControls": TierAutoCRUD, "PutBucketPolicy": TierHandVerified, - "PutBucketReplication": TierUnimplemented, - "PutBucketRequestPayment": TierUnimplemented, + "PutBucketReplication": TierAutoCRUD, + "PutBucketRequestPayment": TierAutoCRUD, "PutBucketTagging": TierHandVerified, "PutBucketVersioning": TierHandVerified, - "PutBucketWebsite": TierUnimplemented, + "PutBucketWebsite": TierAutoCRUD, "PutObject": TierHandVerified, - "PutObjectAcl": TierUnimplemented, - "PutObjectLegalHold": TierUnimplemented, - "PutObjectLockConfiguration": TierUnimplemented, - "PutObjectRetention": TierUnimplemented, + "PutObjectAcl": TierAutoCRUD, + "PutObjectLegalHold": TierAutoCRUD, + "PutObjectLockConfiguration": TierAutoCRUD, + "PutObjectRetention": TierAutoCRUD, "PutObjectTagging": TierHandVerified, - "PutPublicAccessBlock": TierUnimplemented, + "PutPublicAccessBlock": TierAutoCRUD, "RenameObject": TierUnimplemented, "RestoreObject": TierUnimplemented, "SelectObjectContent": TierUnimplemented, - "UpdateBucketMetadataInventoryTableConfiguration": TierUnimplemented, - "UpdateBucketMetadataJournalTableConfiguration": TierUnimplemented, - "UpdateObjectEncryption": TierUnimplemented, + "UpdateBucketMetadataInventoryTableConfiguration": TierAutoCRUD, + "UpdateBucketMetadataJournalTableConfiguration": TierAutoCRUD, + "UpdateObjectEncryption": TierAutoCRUD, "UploadPart": TierHandVerified, "UploadPartCopy": TierUnimplemented, "WriteGetObjectResponse": TierUnimplemented, @@ -17795,7 +17795,7 @@ var Services = map[string]Service{ "ListTagsForResource": TierHandVerified, "ListTemplates": TierHandVerified, "ListVerifiedEmailAddresses": TierHandVerified, - "PutConfigurationSetDeliveryOptions": TierUnimplemented, + "PutConfigurationSetDeliveryOptions": TierAutoCRUD, "PutIdentityPolicy": TierHandVerified, "ReorderReceiptRuleSet": TierHandVerified, "SendBounce": TierHandVerified, @@ -17816,8 +17816,8 @@ var Services = map[string]Service{ "UntagResource": TierHandVerified, "UpdateAccountSendingEnabled": TierHandVerified, "UpdateConfigurationSetEventDestination": TierHandVerified, - "UpdateConfigurationSetReputationMetricsEnabled": TierUnimplemented, - "UpdateConfigurationSetSendingEnabled": TierUnimplemented, + "UpdateConfigurationSetReputationMetricsEnabled": TierAutoCRUD, + "UpdateConfigurationSetSendingEnabled": TierAutoCRUD, "UpdateConfigurationSetTrackingOptions": TierHandVerified, "UpdateCustomVerificationEmailTemplate": TierHandVerified, "UpdateReceiptRule": TierHandVerified, @@ -18106,26 +18106,26 @@ var Services = map[string]Service{ "AddPermission": TierHandVerified, "CheckIfPhoneNumberIsOptedOut": TierHandVerified, "ConfirmSubscription": TierHandVerified, - "CreatePlatformApplication": TierUnimplemented, - "CreatePlatformEndpoint": TierUnimplemented, - "CreateSMSSandboxPhoneNumber": TierUnimplemented, + "CreatePlatformApplication": TierAutoCRUD, + "CreatePlatformEndpoint": TierAutoCRUD, + "CreateSMSSandboxPhoneNumber": TierAutoCRUD, "CreateTopic": TierHandVerified, - "DeleteEndpoint": TierUnimplemented, - "DeletePlatformApplication": TierUnimplemented, - "DeleteSMSSandboxPhoneNumber": TierUnimplemented, + "DeleteEndpoint": TierAutoCRUD, + "DeletePlatformApplication": TierAutoCRUD, + "DeleteSMSSandboxPhoneNumber": TierAutoCRUD, "DeleteTopic": TierHandVerified, "GetDataProtectionPolicy": TierHandVerified, - "GetEndpointAttributes": TierUnimplemented, - "GetPlatformApplicationAttributes": TierUnimplemented, - "GetSMSAttributes": TierUnimplemented, - "GetSMSSandboxAccountStatus": TierUnimplemented, + "GetEndpointAttributes": TierAutoCRUD, + "GetPlatformApplicationAttributes": TierAutoCRUD, + "GetSMSAttributes": TierAutoCRUD, + "GetSMSSandboxAccountStatus": TierAutoCRUD, "GetSubscriptionAttributes": TierHandVerified, "GetTopicAttributes": TierHandVerified, - "ListEndpointsByPlatformApplication": TierUnimplemented, - "ListOriginationNumbers": TierUnimplemented, + "ListEndpointsByPlatformApplication": TierAutoCRUD, + "ListOriginationNumbers": TierAutoCRUD, "ListPhoneNumbersOptedOut": TierHandVerified, - "ListPlatformApplications": TierUnimplemented, - "ListSMSSandboxPhoneNumbers": TierUnimplemented, + "ListPlatformApplications": TierAutoCRUD, + "ListSMSSandboxPhoneNumbers": TierAutoCRUD, "ListSubscriptions": TierHandVerified, "ListSubscriptionsByTopic": TierHandVerified, "ListTagsForResource": TierHandVerified, @@ -20094,23 +20094,23 @@ var Services = map[string]Service{ "GetEncryptionConfig": TierHandVerified, "GetGroup": TierHandVerified, "GetGroups": TierHandVerified, - "GetIndexingRules": TierUnimplemented, + "GetIndexingRules": TierAutoCRUD, "GetInsight": TierHandVerified, "GetInsightEvents": TierHandVerified, "GetInsightImpactGraph": TierHandVerified, "GetInsightSummaries": TierHandVerified, "GetResourcePolicy": TierHandVerified, - "GetRetrievedTracesGraph": TierUnimplemented, + "GetRetrievedTracesGraph": TierAutoCRUD, "GetSamplingRules": TierHandVerified, "GetSamplingStatisticSummaries": TierHandVerified, "GetSamplingTargets": TierHandVerified, "GetServiceGraph": TierHandVerified, "GetTimeSeriesServiceStatistics": TierHandVerified, "GetTraceGraph": TierHandVerified, - "GetTraceSegmentDestination": TierUnimplemented, + "GetTraceSegmentDestination": TierAutoCRUD, "GetTraceSummaries": TierHandVerified, "ListResourcePolicies": TierHandVerified, - "ListRetrievedTraces": TierUnimplemented, + "ListRetrievedTraces": TierAutoCRUD, "ListTagsForResource": TierHandVerified, "PutEncryptionConfig": TierHandVerified, "PutResourcePolicy": TierHandVerified, @@ -20120,9 +20120,9 @@ var Services = map[string]Service{ "TagResource": TierHandVerified, "UntagResource": TierHandVerified, "UpdateGroup": TierHandVerified, - "UpdateIndexingRule": TierUnimplemented, + "UpdateIndexingRule": TierAutoCRUD, "UpdateSamplingRule": TierHandVerified, - "UpdateTraceSegmentDestination": TierUnimplemented, + "UpdateTraceSegmentDestination": TierAutoCRUD, }}, } diff --git a/internal/plugin/registry.go b/internal/plugin/registry.go index e4972bb9..3ec1d392 100644 --- a/internal/plugin/registry.go +++ b/internal/plugin/registry.go @@ -108,5 +108,9 @@ func (r *Registry) ShutdownAll(ctx context.Context) error { errs = append(errs, fmt.Errorf("shutdown %s: %w", id, err)) } } + // A shutdown provider cannot safely serve another request. Clear the active + // set even if one shutdown failed, so callers never retain a stale instance + // while deciding how to recover. + r.active = make(map[string]ServicePlugin) return errors.Join(errs...) } diff --git a/internal/plugin/registry_test.go b/internal/plugin/registry_test.go index d80091c3..b9368fd8 100644 --- a/internal/plugin/registry_test.go +++ b/internal/plugin/registry_test.go @@ -45,3 +45,15 @@ func TestRegistryList(t *testing.T) { require.NoError(t, err) assert.Equal(t, []string{"s3"}, reg.ActiveServices()) } + +func TestRegistryShutdownAllClearsActiveServices(t *testing.T) { + reg := NewRegistry() + reg.Register("s3", func() ServicePlugin { return &mockPlugin{} }) + _, err := reg.Init("s3", PluginConfig{}) + require.NoError(t, err) + + require.NoError(t, reg.ShutdownAll(context.Background())) + assert.Empty(t, reg.ActiveServices()) + _, ok := reg.Get("s3") + assert.False(t, ok) +} diff --git a/internal/services/s3/provider.go b/internal/services/s3/provider.go index 50af336f..1a0f2dbd 100644 --- a/internal/services/s3/provider.go +++ b/internal/services/s3/provider.go @@ -178,6 +178,13 @@ func (p *S3Provider) HandleRequest(ctx context.Context, _ string, req *http.Requ if _, ok := q["notification"]; ok { return p.putBucketNotification(ctx, bucket, req) } + // A query parameter on a bucket PUT identifies a bucket + // sub-resource. Do not mistake an unimplemented one for CreateBucket: + // the gateway can then offer its generic CRUD implementation when one + // is registered for the operation. + if _, unhandled := unhandledSubresource(q); unhandled { + return nil, plugin.ErrUnhandledOp + } return p.createBucket(ctx, bucket) } // Object-level subresource checks diff --git a/internal/services/s3/provider_test.go b/internal/services/s3/provider_test.go index a065172d..c6b4a3f7 100644 --- a/internal/services/s3/provider_test.go +++ b/internal/services/s3/provider_test.go @@ -540,3 +540,12 @@ func TestS3Provider_UnhandledBucketSubresourceDeclines(t *testing.T) { }) } } + +func TestS3Provider_UnhandledPutBucketSubresourceDeclines(t *testing.T) { + p := newTestProvider(t) + defer func() { _ = p.Shutdown(context.Background()) }() + + resp, err := p.HandleRequest(context.Background(), "", httptest.NewRequest("PUT", "/sub-bucket?accelerate", nil)) + assert.Nil(t, resp) + assert.ErrorIs(t, err, plugin.ErrUnhandledOp) +} diff --git a/internal/services/sesv2/provider.go b/internal/services/sesv2/provider.go index 436bc371..dd0ed023 100644 --- a/internal/services/sesv2/provider.go +++ b/internal/services/sesv2/provider.go @@ -1198,6 +1198,14 @@ func resolveOp(method, urlPath string) string { resource := segs[0] switch resource { + case "list-identities": + // Newer SESv2 SDK models bind ListEmailIdentities to + // POST /v2/email/list-identities, while older models use + // GET /v2/email/identities. Accept both published bindings. + if n == 1 && method == http.MethodPost { + return "ListEmailIdentities" + } + case "identities": if n == 1 { if method == "POST" { diff --git a/internal/services/sesv2/provider_test.go b/internal/services/sesv2/provider_test.go index b49ec24f..ca02afa8 100644 --- a/internal/services/sesv2/provider_test.go +++ b/internal/services/sesv2/provider_test.go @@ -106,6 +106,14 @@ func TestEmailIdentityCRUD(t *testing.T) { t.Errorf("expected 1 identity, got %v", listResp["EmailIdentities"]) } + // Newer botocore models use POST /v2/email/list-identities instead of + // GET /v2/email/identities for the same operation. + listResp = callOp(t, p, "", "/v2/email/list-identities", http.MethodPost, nil) + ids, ok = listResp["EmailIdentities"].([]any) + if !ok || len(ids) != 1 { + t.Errorf("expected 1 identity from alternate list route, got %v", listResp["EmailIdentities"]) + } + // Duplicate -> 400 callOpStatus(t, p, "CreateEmailIdentity", "/v2/email/identities", http.MethodPost, map[string]any{ "EmailIdentity": "test@example.com", diff --git a/internal/shared/crud/crud.go b/internal/shared/crud/crud.go index 0e0bf4e6..f74165cc 100644 --- a/internal/shared/crud/crud.go +++ b/internal/shared/crud/crud.go @@ -13,6 +13,7 @@ package crud import ( "crypto/rand" + "database/sql" "encoding/hex" "encoding/json" "errors" @@ -24,6 +25,7 @@ import ( "time" "github.com/skyoo2003/devcloud/internal/shared/httproute" + storesqlite "github.com/skyoo2003/devcloud/internal/storage/sqlite" ) // ErrUnclassified means the engine has no CRUD handling for this operation; the @@ -80,6 +82,7 @@ var ( registry = map[string]map[string]OpMeta{} // service -> op -> meta routes = map[string][]httproute.Route{} // service -> REST routes, sorted by operation store = map[string]map[string]map[string]any{} // "service|resource" -> id -> doc + db *storesqlite.Store // providerRoutes holds the REST routes of services whose provider serves // them by hand. It is kept apart from routes rather than merged into it @@ -89,6 +92,60 @@ var ( providerRoutes = map[string][]httproute.Route{} ) +var migrations = []storesqlite.Migration{{ + Version: 1, + SQL: `CREATE TABLE IF NOT EXISTS crud_resources ( + service TEXT NOT NULL, + resource TEXT NOT NULL, + resource_id TEXT NOT NULL, + document_json BLOB NOT NULL, + PRIMARY KEY (service, resource, resource_id) + );`, +}} + +// Open configures the durable store used by the fallback engine. It is called +// once during DevCloud startup; unit tests that exercise the engine in +// isolation retain an in-memory fallback until Open is called. +func Open(path string) error { + s, err := storesqlite.Open(path, migrations) + if err != nil { + return err + } + mu.Lock() + old := db + db = s + mu.Unlock() + if old != nil { + return old.Close() + } + return nil +} + +// Close releases the durable fallback store. It is safe to call when the +// engine has not been initialized. +func Close() error { + mu.Lock() + s := db + db = nil + mu.Unlock() + if s == nil { + return nil + } + return s.Close() +} + +// Reset deletes every fallback-engine resource while preserving the schema. +func Reset() error { + mu.Lock() + defer mu.Unlock() + store = map[string]map[string]map[string]any{} + if db == nil { + return nil + } + _, err := db.DB().Exec(`DELETE FROM crud_resources`) + return err +} + // Register records a service's operation metadata. The generated crudregistry // package calls this from a single init(). func Register(service string, ops map[string]OpMeta) { @@ -417,7 +474,9 @@ func dispatch(service, protocol, op string, m OpMeta, params map[string]any) (*R id := resourceID(m.Resource, params) item := maps.Clone(params) stamp(item, service, m.Resource, id) - put(service, m.Resource, id, item) + if err := put(service, m.Resource, id, item); err != nil { + return nil, err + } return okBody(protocol, op, wrapItem(m, item)) case "Get": @@ -425,10 +484,17 @@ func dispatch(service, protocol, op string, m OpMeta, params map[string]any) (*R // wrapper) returns the stored list, not a single-resource lookup — a fresh // store yields an empty collection (200), not ResourceNotFoundException. if m.OutputItemKey == "" && m.OutputListKey != "" { - return okBody(protocol, op, map[string]any{m.OutputListKey: list(service, m.Resource)}) + items, err := list(service, m.Resource) + if err != nil { + return nil, err + } + return okBody(protocol, op, map[string]any{m.OutputListKey: items}) } id := resourceID(m.Resource, params) - item, found := get(service, m.Resource, id) + item, found, err := get(service, m.Resource, id) + if err != nil { + return nil, err + } if !found { return notFound(protocol, m.Resource), nil } @@ -439,16 +505,25 @@ func dispatch(service, protocol, op string, m OpMeta, params map[string]any) (*R if key == "" { key = m.Resource + "s" } - return okBody(protocol, op, map[string]any{key: list(service, m.Resource)}) + items, err := list(service, m.Resource) + if err != nil { + return nil, err + } + return okBody(protocol, op, map[string]any{key: items}) case "Delete": id := resourceID(m.Resource, params) - del(service, m.Resource, id) + if err := del(service, m.Resource, id); err != nil { + return nil, err + } return okBody(protocol, op, map[string]any{}) case "Update": id := resourceID(m.Resource, params) - item, found := get(service, m.Resource, id) + item, found, err := get(service, m.Resource, id) + if err != nil { + return nil, err + } if !found { item = maps.Clone(params) stamp(item, service, m.Resource, id) @@ -457,7 +532,9 @@ func dispatch(service, protocol, op string, m OpMeta, params map[string]any) (*R item[k] = v } } - put(service, m.Resource, id, item) + if err := put(service, m.Resource, id, item); err != nil { + return nil, err + } return okBody(protocol, op, wrapItem(m, item)) case "Tag", "Untag", "Relate", "Toggle": @@ -499,48 +576,100 @@ func wrapItem(m OpMeta, item map[string]any) map[string]any { return item } -// --- in-memory store --- +// --- durable store --- func storeKey(service, resource string) string { return service + "|" + resource } -func put(service, resource, id string, doc map[string]any) { +func put(service, resource, id string, doc map[string]any) error { + encoded, err := json.Marshal(doc) + if err != nil { + return err + } mu.Lock() defer mu.Unlock() + if db != nil { + _, err := db.DB().Exec(`INSERT INTO crud_resources(service, resource, resource_id, document_json) + VALUES (?, ?, ?, ?) + ON CONFLICT(service, resource, resource_id) DO UPDATE SET document_json=excluded.document_json`, + service, resource, id, encoded) + return err + } k := storeKey(service, resource) if store[k] == nil { store[k] = map[string]map[string]any{} } store[k][id] = doc + return nil } -func get(service, resource, id string) (map[string]any, bool) { +func get(service, resource, id string) (map[string]any, bool, error) { mu.RLock() defer mu.RUnlock() + if db != nil { + var encoded []byte + err := db.DB().QueryRow(`SELECT document_json FROM crud_resources WHERE service=? AND resource=? AND resource_id=?`, service, resource, id).Scan(&encoded) + if errors.Is(err, sql.ErrNoRows) { + return nil, false, nil + } + if err != nil { + return nil, false, err + } + var doc map[string]any + if err := json.Unmarshal(encoded, &doc); err != nil { + return nil, false, err + } + return doc, true, nil + } doc, ok := store[storeKey(service, resource)][id] if !ok { - return nil, false + return nil, false, nil } // Copy: the caller marshals/mutates this after the lock is released, so it // must not alias the stored map (else a concurrent Get/List marshalling it // while an Update writes to it triggers a fatal concurrent map read/write). - return maps.Clone(doc), true + return maps.Clone(doc), true, nil } -func del(service, resource, id string) { +func del(service, resource, id string) error { mu.Lock() defer mu.Unlock() + if db != nil { + _, err := db.DB().Exec(`DELETE FROM crud_resources WHERE service=? AND resource=? AND resource_id=?`, service, resource, id) + return err + } delete(store[storeKey(service, resource)], id) + return nil } -func list(service, resource string) []map[string]any { +func list(service, resource string) ([]map[string]any, error) { mu.RLock() defer mu.RUnlock() + if db != nil { + rows, err := db.DB().Query(`SELECT document_json FROM crud_resources WHERE service=? AND resource=? ORDER BY resource_id`, service, resource) + if err != nil { + return nil, err + } + defer func() { _ = rows.Close() }() + out := []map[string]any{} + for rows.Next() { + var encoded []byte + if err := rows.Scan(&encoded); err != nil { + return nil, err + } + var doc map[string]any + if err := json.Unmarshal(encoded, &doc); err != nil { + return nil, err + } + out = append(out, doc) + } + return out, rows.Err() + } items := store[storeKey(service, resource)] out := make([]map[string]any, 0, len(items)) for _, doc := range items { out = append(out, maps.Clone(doc)) // copy: marshalled unlocked, see get() } - return out + return out, nil } // --- helpers --- diff --git a/internal/shared/crud/crud_test.go b/internal/shared/crud/crud_test.go index 1e1ec2bc..aa44d5c9 100644 --- a/internal/shared/crud/crud_test.go +++ b/internal/shared/crud/crud_test.go @@ -5,6 +5,7 @@ package crud import ( "encoding/json" "net/url" + "path/filepath" "strings" "sync" "testing" @@ -27,6 +28,38 @@ func decode(t *testing.T, r *Result) map[string]any { return m } +func TestEnginePersistsAcrossReopen(t *testing.T) { + defer func() { requireNoError(t, Close()) }() + path := filepath.Join(t.TempDir(), "devcloud.db") + const service = "persisted-service" + Register(service, map[string]OpMeta{ + "CreateThing": {Verb: "Create", Resource: "Thing", OutputItemKey: "Thing"}, + "GetThing": {Verb: "Get", Resource: "Thing", OutputItemKey: "Thing"}, + }) + + requireNoError(t, Open(path)) + if _, err := handleJSON(t, service, "CreateThing", map[string]any{"ThingName": "survives"}); err != nil { + t.Fatal(err) + } + requireNoError(t, Close()) + requireNoError(t, Open(path)) + + result, err := handleJSON(t, service, "GetThing", map[string]any{"ThingName": "survives"}) + if err != nil { + t.Fatal(err) + } + if got := decode(t, result)["Thing"].(map[string]any)["ThingName"]; got != "survives" { + t.Fatalf("persisted ThingName = %v, want survives", got) + } +} + +func requireNoError(t *testing.T, err error) { + t.Helper() + if err != nil { + t.Fatal(err) + } +} + func TestEngineCRUDRoundTrip(t *testing.T) { const svc = "testsvc" Register(svc, map[string]OpMeta{