diff --git a/changes/unreleased/Added-20260905-201000.yaml b/changes/unreleased/Added-20260905-201000.yaml new file mode 100644 index 00000000..2e4809ae --- /dev/null +++ b/changes/unreleased/Added-20260905-201000.yaml @@ -0,0 +1,5 @@ +kind: Added +body: 'The generic CRUD engine now serves every protocol DevCloud registers. `rest-xml` and `query` were the last two: `rest-xml` recovers its operation from the request method and path against the model''s URI templates, like `rest-json`, and `query` reads it from the `Action` field of the form body. 112 operations move from `unimplemented` to `auto-crud` — 94 in `s3-control` and 18 in `elastic-load-balancing` — and protocol is no longer a reason any registered service serves nothing' +time: 2026-09-05T20:10:00.000000+09:00 +custom: + Issue: "143" diff --git a/changes/unreleased/Changed-20260905-201001.yaml b/changes/unreleased/Changed-20260905-201001.yaml new file mode 100644 index 00000000..ee0438d2 --- /dev/null +++ b/changes/unreleased/Changed-20260905-201001.yaml @@ -0,0 +1,5 @@ +kind: Changed +body: '`rest-xml` request bodies are still not buffered by the gateway, now by an explicit rule rather than as a side effect of the protocol being unservable. The engine serves `rest-xml` from the path and query alone, so S3''s large binary uploads keep streaming; `crud.NeedsBody` is the predicate and a test fails if the body is read' +time: 2026-09-05T20:10:01.000000+09:00 +custom: + Issue: "143" diff --git a/docs/coverage.md b/docs/coverage.md index 278f4c87..08435ffc 100644 --- a/docs/coverage.md +++ b/docs/coverage.md @@ -10,36 +10,35 @@ things: | Number | What it means | Today | |---|---|---| | **Registered** | The gateway routes the service. A call reaches DevCloud instead of falling through to real AWS. | **205** | -| **Serving ≥1 operation** | At least one operation returns a real, store-backed answer — hand-written or served by the generic CRUD engine. | **199** | -| **Registered-only** | Routed, but every operation declines with a clean AWS error. Nothing is served. | **6** | +| **Serving ≥1 operation** | At least one operation returns a real, store-backed answer — hand-written or served by the generic CRUD engine. | **201** | +| **Registered-only** | Routed, but every operation declines with a clean AWS error. Nothing is served. | **4** | Per operation, from the [fidelity manifest](fidelity-manifest.md): | Tier | Operations | |---|---| | `hand-verified` | 4,496 | -| `auto-crud` | 4,858 | -| `unimplemented` | 3,053 | +| `auto-crud` | 4,970 | +| `unimplemented` | 2,941 | | **total known** | **12,407** | ## Why a registered service can serve nothing The generic CRUD engine has to know which operation a request is for, and it has -to recognise that operation as CRUD-shaped. Two things can stop it. +to recognise that operation as CRUD-shaped. Only the second one still stops it. -**The protocol does not say which operation.** The `X-Amz-Target` JSON protocols -name the operation in a header. `rest-json` does not, but every one of its -operations is bound to an HTTP method and a URI template in the model, and -`internal/shared/httproute` matches a request back to the operation from that -pair — so the engine serves it too. `query` and `rest-xml` have neither a target -header nor a modelled path the engine can match, so they are unreachable by it -and serve nothing until somebody writes the provider by hand. +**The protocol always says which operation.** Each one says it somewhere +different, and the engine reads all of them: the `X-Amz-Target` JSON protocols +put it in a header; `rest-json` and `rest-xml` bind every operation to an HTTP +method and a URI template, which `internal/shared/httproute` matches a request +back to; `query` puts it in the `Action` field of the form body. This used to be +the main reason a service served nothing. It no longer is. **The operation is not CRUD-shaped.** `GetThing`, `ListThings`, `CreateThing` and their siblings map onto a generic store. `ExecuteStatement`, `InvokeEndpoint` and `QueryForecast` do not, and the engine refuses them rather than inventing an answer. A service whose entire API is that shape serves nothing whatever its -protocol. +protocol. This is now the *only* reason. Registered services by protocol: @@ -48,19 +47,21 @@ Registered services by protocol: | `json-1.1` | 64 | yes — operation from `X-Amz-Target` | | `json-1.0` | 17 | yes — operation from `X-Amz-Target` | | `rest-json` | 93 | yes — operation from method + path | -| `query` | 15 | no | -| `rest-xml` | 4 | no | +| `query` | 15 | yes — operation from the `Action` form field | +| `rest-xml` | 4 | yes — operation from method + path | | no in-tree model | 12 | n/a — hand-written providers | -Six services are registered and serve nothing. Four are the second case — no -CRUD-shaped operation anywhere in their API: `forecastquery` (`QueryForecast`, +Four services are registered and serve nothing, and all four are the same case — +no CRUD-shaped operation anywhere in their API: `forecastquery` (`QueryForecast`, `QueryWhatIfForecast`), the two SageMaker Runtime variants (`InvokeEndpoint*`), and `rds-data` (`ExecuteStatement`, `BeginTransaction`, `CommitTransaction`, `RollbackTransaction`). No protocol change reaches them. -The other two are the first case, and they are the whole of what is left: -`elastic-load-balancing` (`query`) and `s3-control` (`rest-xml`). Both are in -the demand set, and both are what PRD Milestone 5 now covers. +Being engine-servable is not the same as being served. Thirteen of the fifteen +`query` services and three of the four `rest-xml` ones have hand-written +providers that answer their own unknown operations, so they never enter the +engine and their manifest did not move when the protocols were admitted — the +`EngineWired` flag records that per service. A registered operation is not automatically a reachable one. The engine is entered only when a provider returns `plugin.ErrUnhandledOp`, so a hand-written @@ -103,8 +104,8 @@ stopped on the best surface available. | | Count | |---|---| | Registered | 57 | -| Serving ≥1 operation | 54 | -| Registered-only | 3 | +| Serving ≥1 operation | 56 | +| Registered-only | 1 | The 57 split by protocol as 34 `rest-json`, 15 `json-1.1`, 6 `json-1.0`, 1 `query`, 1 `rest-xml`. Two thirds of the set is `rest-json`, which is why the @@ -112,12 +113,19 @@ engine gaining that protocol is what made this milestone possible rather than a matter of arithmetic: without it, 34 of the 57 would have registered and served nothing. -The three that do not meet the floor are named above, each for a different -reason. `rds-data` is the one worth calling out: it is supported by all three -projects in the demand survey — the strongest signal in the whole set — and it -still cannot be served generically, because not one of its six operations is -CRUD-shaped. Breadth does not reach every service, and saying so is cheaper than -a fabricated success. +The one that does not meet the floor is `rds-data`, and it is the one worth +calling out: it is supported by all three projects in the demand survey — the +strongest signal in the whole set — and it still cannot be served generically, +because not one of its six operations is CRUD-shaped. Breadth does not reach +every service, and saying so is cheaper than a fabricated success. + +`elastic-load-balancing` and `s3-control` were the other two. They were the last +of the demand set because of their protocols, not their APIs, and both are +served now: 18 of ELB's 29 operations and 94 of S3 Control's 97. The eleven and +the three that remain are the not-CRUD-shaped case again — `ConfigureHealthCheck` +and `ApplySecurityGroupsToLoadBalancer` among them, which a Terraform `aws_elb` +resource does call. Breadth is what this milestone bought; depth is still not +claimed. ## What counts as a service diff --git a/docs/crud-engine.md b/docs/crud-engine.md index aa737f01..18a445ab 100644 --- a/docs/crud-engine.md +++ b/docs/crud-engine.md @@ -35,24 +35,62 @@ it. Where that name lives depends on the protocol: |---|---|---| | `json-1.0`, `json-1.1` | the `X-Amz-Target` header | yes | | `rest-json` | the request method and path, matched against the model's URI templates (`internal/shared/httproute`) | yes | -| `query` | — | no | -| `rest-xml` | — | no | - -For `rest-json` the engine reads parameters from three places, least -authoritative first: values the model binds with `httpQuery`, then the JSON -body, then the path labels. The URI is what addresses the resource, so a path -label wins. A `restJson1` model never binds one member to two of these, so real -SDK traffic never exercises the precedence. - -It does **not** read `httpHeader` members, `httpPayload` blobs, or streaming -bodies. An operation whose identifier arrives only in a header is therefore -served with a generated id rather than the caller's — plausible, not faithful, -which is the engine's stated contract. - -A request whose method and path match no route in the service's table is -**declined** with `InvalidAction`, never served from the store. That is what -keeps a registered `rest-json` service from answering for paths it does not -model. +| `rest-xml` | the same — every `restXml` operation is bound to a method and URI too | yes | +| `query` | the `Action` field of the form body | yes | +| `ec2-query` | — | no | + +Every protocol DevCloud registers is now readable, so a service that serves +nothing does so because none of its operations is CRUD-shaped, not because of +how it talks. `ec2-query` is the one exception and it is not a gap in practice: +the only service that speaks it is EC2, whose provider is hand-written and never +reaches the engine. + +### Where parameters come from + +For the two REST protocols, three places, least authoritative first: values the +model binds with `httpQuery`, then the request body, then the path labels. The +URI is what addresses the resource, so a path label wins. A REST model never +binds one member to two of these, so real SDK traffic never exercises the +precedence; it is defined so a hand-rolled request cannot redirect a lookup. + +For `query`, the form body, flat keys only. `Action` and `Version` are dropped: +they describe the request rather than the resource, and storing them would echo +`CreateLoadBalancer` back inside a result element. A structured +member arrives flattened as `Listeners.member.1.Protocol`; the engine has no +nested shape to put it in, so it is not emitted in the response. + +**`rest-xml` request bodies are never read at all.** The gateway does not buffer +them — S3 speaks `rest-xml` and its bodies are multi-gigabyte uploads that must +keep streaming — so a `rest-xml` operation is served from its path and query +alone. Every CRUD-shaped S3 Control operation addresses its resource that way, +so nothing is lost; an operation that carried its identifier only in a body +would get a generated id. + +The engine does **not** read `httpHeader` members, `httpPayload` blobs, or +streaming bodies. An operation whose identifier arrives only in a header is +therefore served with a generated id rather than the caller's — plausible, not +faithful, which is the engine's stated contract. + +### Responses + +The JSON protocols get a JSON body. `query` and `rest-xml` get XML, and they do +not share an envelope: botocore's query parser looks for `` +nested inside `` and, given anything else, returns a result +with nothing in it rather than an error, while its `rest-xml` parser maps the +root element's children straight onto the output shape. List entries are wrapped +in ``, which is AWS's default for both dialects; a model that flattens a +list gets the unflattened form, because the engine has no flattening +information. No `xmlns` is emitted — botocore strips namespaces before matching +element names. + +### Declining + +A request whose method and path match no route in the service's table, or whose +`Action` names an operation the service did not register, is **declined** with +`InvalidAction` and never served from the store. That is what keeps a registered +service from answering for operations it does not model — and it matters most +for `rest-xml`, because `DetectProtocol` routes anything it cannot classify to +S3. ## Fidelity tiers diff --git a/internal/codegen/gen_crud_meta.go b/internal/codegen/gen_crud_meta.go index 3cb06ccb..d88e0799 100644 --- a/internal/codegen/gen_crud_meta.go +++ b/internal/codegen/gen_crud_meta.go @@ -132,18 +132,27 @@ func classifyOps(model *ir.Model) []crudOpData { // engineServable reports whether the engine can serve a service's protocol. // -// The JSON protocols carry the operation name in X-Amz-Target. rest-json does -// not, but every one of its operations is bound to a method and URI template, -// and internal/shared/httproute turns that pair back into an operation name — -// so the engine can classify it too. query and rest-xml have neither, which is -// what PRD Milestone 5 owns; admitting them here would mean guessing. +// The JSON protocols carry the operation name in X-Amz-Target. rest-json and +// rest-xml do not, but every one of their operations is bound to a method and +// URI template, and internal/shared/httproute turns that pair back into an +// operation name — so the engine can classify them too. rest-xml was excluded +// on the assumption that it had no modelled path; it has one, and all 97 of +// s3-control's operations carry it. +// +// query has no modelled path at all, so it registers no route; the engine +// matches it by the Action field of the form body instead. It is admitted here +// because that is a place the operation name genuinely is, not a guess. +// +// ec2-query stays out. It is form-encoded like query but not interchangeable +// with it, and the only service that speaks it has a hand-written provider. // // This is deliberately the same question crud.Servable answers at runtime. The // two must agree: a protocol classified here but refused there registers // operations nothing can reach, and the fidelity manifest would call them // auto-crud. func engineServable(protocol string) bool { - return strings.HasPrefix(protocol, "json") || protocol == "rest-json" + return strings.HasPrefix(protocol, "json") || + protocol == "rest-json" || protocol == "rest-xml" || protocol == "query" } // ServiceCRUDData classifies an engine-servable model's CRUD operations. It diff --git a/internal/codegen/gen_crud_meta_test.go b/internal/codegen/gen_crud_meta_test.go index 932b60df..4a0fa436 100644 --- a/internal/codegen/gen_crud_meta_test.go +++ b/internal/codegen/gen_crud_meta_test.go @@ -92,22 +92,62 @@ func TestServiceCRUDDataJSONUnchanged(t *testing.T) { } } -// TestServiceCRUDDataRejectsUnservableProtocols holds the boundary Milestone 5 -// owns. query and rest-xml put the operation neither in a header nor in a -// modelled path the engine can match, so admitting them would serve fabricated -// answers to callers the engine cannot actually understand. -func TestServiceCRUDDataRejectsUnservableProtocols(t *testing.T) { - for _, protocol := range []string{"query", "rest-xml"} { - t.Run(protocol, func(t *testing.T) { - model := crudModel(protocol, - ir.Operation{Name: "ListGraphs", OutputName: "ListGraphsOutput", - HTTPMethod: "GET", HTTPUri: "/v1/graphs"}, - ) +// TestServiceCRUDDataAdmitsRESTXML is the codegen half of the rest-xml change. +// This gate and crud.Servable answer the same question and must agree: a +// protocol admitted here but refused there registers operations nothing can +// reach, and the fidelity manifest would publish them as auto-crud. +func TestServiceCRUDDataAdmitsRESTXML(t *testing.T) { + model := crudModel("rest-xml", + ir.Operation{Name: "ListAccessPoints", OutputName: "ListAccessPointsOutput", + HTTPMethod: "GET", HTTPUri: "/v20180820/accesspoint"}, + ) - _, ok := ServiceCRUDData(model) - assert.False(t, ok, "%s must not be engine-servable", protocol) - }) + data, ok := ServiceCRUDData(model) + require.True(t, ok, "rest-xml service must be engine-servable") + + ops := map[string]crudOpData{} + for _, op := range data.Ops { + ops[op.Op] = op } + // The route is the whole classification story for rest-xml, so it has to + // survive into the registry the same way rest-json's does. + assert.Equal(t, "GET", ops["ListAccessPoints"].Method) + assert.Equal(t, "/v20180820/accesspoint", ops["ListAccessPoints"].URI) +} + +// TestServiceCRUDDataAdmitsQuery closes the last protocol gap. query has no +// modelled path at all — its operations carry no http trait — so unlike the +// REST protocols it registers no route, and the engine matches it by the +// Action field of the form body instead. +func TestServiceCRUDDataAdmitsQuery(t *testing.T) { + model := crudModel("query", + ir.Operation{Name: "DescribeLoadBalancers", OutputName: "DescribeLoadBalancersOutput"}, + ) + + data, ok := ServiceCRUDData(model) + require.True(t, ok, "query service must be engine-servable") + + ops := map[string]crudOpData{} + for _, op := range data.Ops { + ops[op.Op] = op + } + // No route, and that is correct rather than a gap: a query operation has + // no method or URI to register, and Register skips an empty URI so the + // service contributes nothing to the route table. + assert.Empty(t, ops["DescribeLoadBalancers"].Method) + assert.Empty(t, ops["DescribeLoadBalancers"].URI) +} + +// TestServiceCRUDDataRejectsEC2Query holds the remaining boundary. ec2Query is +// form-encoded like query but not interchangeable with it, and the only service +// that speaks it has a hand-written provider that never reaches the engine. +func TestServiceCRUDDataRejectsEC2Query(t *testing.T) { + model := crudModel("ec2-query", + ir.Operation{Name: "DescribeInstances", OutputName: "DescribeInstancesOutput"}, + ) + + _, ok := ServiceCRUDData(model) + assert.False(t, ok, "ec2-query must not be engine-servable") } // TestServiceCRUDDataSkipsUnclassifiableService is the rds-data case: a diff --git a/internal/gateway/router.go b/internal/gateway/router.go index 6d59d943..aec4a877 100644 --- a/internal/gateway/router.go +++ b/internal/gateway/router.go @@ -54,12 +54,19 @@ func (sr *ServiceRouter) ServeHTTP(w http.ResponseWriter, r *http.Request) { op := extractOperationName(r, protocol) - // Buffer the body for the protocols the CRUD fallback engine can serve, so - // it can re-read it if the provider does not handle the operation. Cheap for - // JSON and rest-json payloads; skipped for REST-XML (S3), where bodies may - // be large binary uploads and the engine would refuse them anyway. + // Buffer the body for the protocols whose parameters live in it, so the + // engine can re-read it if the provider does not handle the operation. Cheap + // for JSON, rest-json and query payloads. + // + // This asks crud.NeedsBody, not crud.Servable, and the difference is + // rest-xml. The engine serves rest-xml — it classifies the operation from + // the method and path like rest-json — but it must do so without the body: + // S3 speaks rest-xml, its bodies are large binary uploads, and every + // CRUD-shaped S3 Control operation addresses its resource with a path label + // or a query term anyway. Asking the servable question here would buffer + // every PutObject to serve a provider that never reaches the engine. var body []byte - if crud.Servable(protocol) { + if crud.NeedsBody(protocol) { var rerr error if body, rerr = io.ReadAll(r.Body); rerr != nil { writeAWSError(w, protocol, http.StatusBadRequest, "SerializationException", "failed to read request body") diff --git a/internal/gateway/router_test.go b/internal/gateway/router_test.go index 561531ea..636dd2f6 100644 --- a/internal/gateway/router_test.go +++ b/internal/gateway/router_test.go @@ -219,9 +219,79 @@ func TestServiceRouter_RESTJSONUnmatchedPathDeclinesCleanly(t *testing.T) { assert.Contains(t, w.Body.String(), "InvalidAction") } -// TestServiceRouter_RESTXMLBodyStillUnbuffered pins the exception. S3 bodies are -// large binary uploads, and reading one into memory to offer it to an engine -// that refuses rest-xml anyway would be a straight regression. +// TestServiceRouter_QueryReachesEngine is the gateway half of the query change. +// It is worth its own test because query is the only protocol where the gateway +// and the engine could disagree about which operation a request is for: the +// gateway reads Action from the URL, the engine reads it from the form body, +// and every real SDK puts it in the body. +func TestServiceRouter_QueryReachesEngine(t *testing.T) { + const svc = "gwquerysvc" + crud.Register(svc, map[string]crud.OpMeta{ + "CreateGizmo": {Verb: "Create", Resource: "GwGizmo", OutputItemKey: "Gizmo"}, + }) + router := NewServiceRouter(newDecliningRegistry(svc, plugin.ProtocolQuery), nil) + + form := "Action=CreateGizmo&Version=2012-06-01&GwGizmoName=g1" + req := httptest.NewRequest(http.MethodPost, "/", strings.NewReader(form)) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + req.Header.Set("Authorization", + "AWS4-HMAC-SHA256 Credential=AKIA/20130524/us-east-1/"+svc+"/aws4_request, Signature=abc") + + w := httptest.NewRecorder() + router.ServeHTTP(w, req) + + require.Equal(t, http.StatusOK, w.Code, "body: %s", w.Body.String()) + body := w.Body.String() + assert.Contains(t, body, "", "not the query envelope") + assert.Contains(t, body, "") + assert.Contains(t, body, "g1", + "the form body did not reach the engine") + assert.NotContains(t, body, "", "protocol field leaked into the resource") +} + +// TestServiceRouter_RESTXMLReachesEngineWithoutBuffering is the gateway half of +// the rest-xml change, and it asserts two things that have to hold together. +// +// The engine must serve the request — it can, because every rest-xml operation +// is bound to a method and URI template — and the gateway must not have read +// the body to let it. Those pull in opposite directions under one predicate, +// which is why Servable and NeedsBody are now separate: S3 speaks rest-xml, and +// buffering a multi-gigabyte PutObject to serve a provider that never reaches +// the engine would be a straight regression. +func TestServiceRouter_RESTXMLReachesEngineWithoutBuffering(t *testing.T) { + const svc = "s3control" + crud.Register(svc, map[string]crud.OpMeta{ + "ListAccessPoints": {Verb: "List", Resource: "GwAccessPoint", OutputListKey: "AccessPointList", + Method: "GET", URI: "/v20180820/accesspoint"}, + }) + router := NewServiceRouter(newDecliningRegistry(svc, plugin.ProtocolRESTXML), nil) + + req := httptest.NewRequest(http.MethodGet, "/v20180820/accesspoint", &failOnReadBody{t: t}) + req.Header.Set("Authorization", + "AWS4-HMAC-SHA256 Credential=AKIA/20130524/us-east-1/s3/aws4_request, Signature=abc") + + w := httptest.NewRecorder() + router.ServeHTTP(w, req) + + require.Equal(t, http.StatusOK, w.Code, "body: %s", w.Body.String()) + assert.Contains(t, w.Body.String(), "", + "rest-xml response is not the engine's XML") + assert.Equal(t, "application/xml", w.Header().Get("Content-Type")) +} + +// failOnReadBody fails the test if anything reads it. It is how "the gateway did +// not buffer this" is made observable: a length check on a captured body cannot +// tell "never read" from "read and restored". +type failOnReadBody struct{ t *testing.T } + +func (f *failOnReadBody) Read([]byte) (int, error) { + f.t.Error("the gateway read a rest-xml request body; S3 uploads must keep streaming") + return 0, io.EOF +} + +// TestServiceRouter_RESTXMLBodyStillUnbuffered pins the exception for the +// service the exception exists for. S3's provider never returns ErrUnhandledOp, +// so it never reaches the engine, and its bodies must keep streaming. func TestServiceRouter_RESTXMLBodyStillUnbuffered(t *testing.T) { var seen []byte reg := plugin.NewRegistry() diff --git a/internal/generated/crudregistry/registry_gen.go b/internal/generated/crudregistry/registry_gen.go index f7fbb548..f42bf517 100644 --- a/internal/generated/crudregistry/registry_gen.go +++ b/internal/generated/crudregistry/registry_gen.go @@ -567,6 +567,47 @@ func init() { "UpdatePreparedStatement": {Verb: "Update", Resource: "PreparedStatement", OutputListKey: "", OutputItemKey: ""}, "UpdateWorkGroup": {Verb: "Update", Resource: "WorkGroup", OutputListKey: "", OutputItemKey: ""}, }) + crud.Register("autoscaling", map[string]crud.OpMeta{ + "CreateAutoScalingGroup": {Verb: "Create", Resource: "AutoScalingGroup", OutputListKey: "", OutputItemKey: ""}, + "CreateLaunchConfiguration": {Verb: "Create", Resource: "LaunchConfiguration", OutputListKey: "", OutputItemKey: ""}, + "CreateOrUpdateTags": {Verb: "Create", Resource: "OrUpdateTag", OutputListKey: "", OutputItemKey: ""}, + "DeleteAutoScalingGroup": {Verb: "Delete", Resource: "AutoScalingGroup", OutputListKey: "", OutputItemKey: ""}, + "DeleteLaunchConfiguration": {Verb: "Delete", Resource: "LaunchConfiguration", OutputListKey: "", OutputItemKey: ""}, + "DeleteLifecycleHook": {Verb: "Delete", Resource: "LifecycleHook", OutputListKey: "", OutputItemKey: ""}, + "DeleteNotificationConfiguration": {Verb: "Delete", Resource: "NotificationConfiguration", OutputListKey: "", OutputItemKey: ""}, + "DeletePolicy": {Verb: "Delete", Resource: "Policy", OutputListKey: "", OutputItemKey: ""}, + "DeleteScheduledAction": {Verb: "Delete", Resource: "ScheduledAction", OutputListKey: "", OutputItemKey: ""}, + "DeleteTags": {Verb: "Delete", Resource: "Tag", OutputListKey: "", OutputItemKey: ""}, + "DeleteWarmPool": {Verb: "Delete", Resource: "WarmPool", OutputListKey: "", OutputItemKey: ""}, + "DescribeAccountLimits": {Verb: "Get", Resource: "AccountLimit", OutputListKey: "", OutputItemKey: ""}, + "DescribeAdjustmentTypes": {Verb: "Get", Resource: "AdjustmentType", OutputListKey: "AdjustmentTypes", OutputItemKey: ""}, + "DescribeAutoScalingGroups": {Verb: "Get", Resource: "AutoScalingGroup", OutputListKey: "AutoScalingGroups", OutputItemKey: ""}, + "DescribeAutoScalingInstances": {Verb: "Get", Resource: "AutoScalingInstance", OutputListKey: "AutoScalingInstances", OutputItemKey: ""}, + "DescribeAutoScalingNotificationTypes": {Verb: "Get", Resource: "AutoScalingNotificationType", OutputListKey: "AutoScalingNotificationTypes", OutputItemKey: ""}, + "DescribeInstanceRefreshes": {Verb: "Get", Resource: "InstanceRefreshe", OutputListKey: "InstanceRefreshes", OutputItemKey: ""}, + "DescribeLaunchConfigurations": {Verb: "Get", Resource: "LaunchConfiguration", OutputListKey: "LaunchConfigurations", OutputItemKey: ""}, + "DescribeLifecycleHookTypes": {Verb: "Get", Resource: "LifecycleHookType", OutputListKey: "LifecycleHookTypes", OutputItemKey: ""}, + "DescribeLifecycleHooks": {Verb: "Get", Resource: "LifecycleHook", OutputListKey: "LifecycleHooks", OutputItemKey: ""}, + "DescribeLoadBalancerTargetGroups": {Verb: "Get", Resource: "LoadBalancerTargetGroup", OutputListKey: "LoadBalancerTargetGroups", OutputItemKey: ""}, + "DescribeLoadBalancers": {Verb: "Get", Resource: "LoadBalancer", OutputListKey: "LoadBalancers", OutputItemKey: ""}, + "DescribeMetricCollectionTypes": {Verb: "Get", Resource: "MetricCollectionType", OutputListKey: "Granularities", OutputItemKey: ""}, + "DescribeNotificationConfigurations": {Verb: "Get", Resource: "NotificationConfiguration", OutputListKey: "NotificationConfigurations", OutputItemKey: ""}, + "DescribePolicies": {Verb: "Get", Resource: "Policy", OutputListKey: "ScalingPolicies", OutputItemKey: ""}, + "DescribeScalingActivities": {Verb: "Get", Resource: "ScalingActivity", OutputListKey: "Activities", OutputItemKey: ""}, + "DescribeScalingProcessTypes": {Verb: "Get", Resource: "ScalingProcessType", OutputListKey: "Processes", OutputItemKey: ""}, + "DescribeScheduledActions": {Verb: "Get", Resource: "ScheduledAction", OutputListKey: "ScheduledUpdateGroupActions", OutputItemKey: ""}, + "DescribeTags": {Verb: "Get", Resource: "Tag", OutputListKey: "Tags", OutputItemKey: ""}, + "DescribeTerminationPolicyTypes": {Verb: "Get", Resource: "TerminationPolicyType", OutputListKey: "TerminationPolicyTypes", OutputItemKey: ""}, + "DescribeTrafficSources": {Verb: "Get", Resource: "TrafficSource", OutputListKey: "TrafficSources", OutputItemKey: ""}, + "DescribeWarmPool": {Verb: "Get", Resource: "WarmPool", OutputListKey: "Instances", OutputItemKey: "WarmPoolConfiguration"}, + "GetPredictiveScalingForecast": {Verb: "Get", Resource: "PredictiveScalingForecast", OutputListKey: "LoadForecast", OutputItemKey: "CapacityForecast"}, + "PutLifecycleHook": {Verb: "Update", Resource: "LifecycleHook", OutputListKey: "", OutputItemKey: ""}, + "PutNotificationConfiguration": {Verb: "Update", Resource: "NotificationConfiguration", OutputListKey: "", OutputItemKey: ""}, + "PutScalingPolicy": {Verb: "Update", Resource: "ScalingPolicy", OutputListKey: "Alarms", OutputItemKey: ""}, + "PutScheduledUpdateGroupAction": {Verb: "Update", Resource: "ScheduledUpdateGroupAction", OutputListKey: "", OutputItemKey: ""}, + "PutWarmPool": {Verb: "Update", Resource: "WarmPool", OutputListKey: "", OutputItemKey: ""}, + "UpdateAutoScalingGroup": {Verb: "Update", Resource: "AutoScalingGroup", OutputListKey: "", OutputItemKey: ""}, + }) crud.Register("backup", map[string]crud.OpMeta{ "CreateBackupPlan": {Verb: "Create", Resource: "BackupPlan", OutputListKey: "AdvancedBackupSettings", OutputItemKey: "", Method: "PUT", URI: "/backup/plans"}, "CreateBackupSelection": {Verb: "Create", Resource: "BackupSelection", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/backup/plans/{BackupPlanId}/selections"}, @@ -1263,6 +1304,231 @@ func init() { "UpdateProtectedJob": {Verb: "Update", Resource: "ProtectedJob", OutputListKey: "", OutputItemKey: "protectedJob", Method: "PATCH", URI: "/memberships/{membershipIdentifier}/protectedJobs/{protectedJobIdentifier}"}, "UpdateProtectedQuery": {Verb: "Update", Resource: "ProtectedQuery", OutputListKey: "", OutputItemKey: "protectedQuery", Method: "PATCH", URI: "/memberships/{membershipIdentifier}/protectedQueries/{protectedQueryIdentifier}"}, }) + crud.Register("cloudformation", map[string]crud.OpMeta{ + "CreateChangeSet": {Verb: "Create", Resource: "ChangeSet", OutputListKey: "", OutputItemKey: ""}, + "CreateGeneratedTemplate": {Verb: "Create", Resource: "GeneratedTemplate", OutputListKey: "", OutputItemKey: ""}, + "CreateStack": {Verb: "Create", Resource: "Stack", OutputListKey: "", OutputItemKey: ""}, + "CreateStackInstances": {Verb: "Create", Resource: "StackInstance", OutputListKey: "", OutputItemKey: ""}, + "CreateStackRefactor": {Verb: "Create", Resource: "StackRefactor", OutputListKey: "", OutputItemKey: ""}, + "CreateStackSet": {Verb: "Create", Resource: "StackSet", OutputListKey: "", OutputItemKey: ""}, + "DeleteChangeSet": {Verb: "Delete", Resource: "ChangeSet", OutputListKey: "", OutputItemKey: ""}, + "DeleteGeneratedTemplate": {Verb: "Delete", Resource: "GeneratedTemplate", OutputListKey: "", OutputItemKey: ""}, + "DeleteStack": {Verb: "Delete", Resource: "Stack", OutputListKey: "", OutputItemKey: ""}, + "DeleteStackInstances": {Verb: "Delete", Resource: "StackInstance", OutputListKey: "", OutputItemKey: ""}, + "DeleteStackSet": {Verb: "Delete", Resource: "StackSet", OutputListKey: "", OutputItemKey: ""}, + "DeregisterType": {Verb: "Delete", Resource: "Type", OutputListKey: "", OutputItemKey: ""}, + "DescribeAccountLimits": {Verb: "Get", Resource: "AccountLimit", OutputListKey: "AccountLimits", OutputItemKey: ""}, + "DescribeChangeSet": {Verb: "Get", Resource: "ChangeSet", OutputListKey: "Capabilities", OutputItemKey: "RollbackConfiguration"}, + "DescribeChangeSetHooks": {Verb: "Get", Resource: "ChangeSetHook", OutputListKey: "Hooks", OutputItemKey: ""}, + "DescribeEvents": {Verb: "Get", Resource: "Event", OutputListKey: "OperationEvents", OutputItemKey: ""}, + "DescribeGeneratedTemplate": {Verb: "Get", Resource: "GeneratedTemplate", OutputListKey: "Resources", OutputItemKey: "Progress"}, + "DescribeOrganizationsAccess": {Verb: "Get", Resource: "OrganizationsAccess", OutputListKey: "", OutputItemKey: ""}, + "DescribePublisher": {Verb: "Get", Resource: "Publisher", OutputListKey: "", OutputItemKey: ""}, + "DescribeResourceScan": {Verb: "Get", Resource: "ResourceScan", OutputListKey: "ResourceTypes", OutputItemKey: ""}, + "DescribeStackDriftDetectionStatus": {Verb: "Get", Resource: "StackDriftDetectionStatu", OutputListKey: "", OutputItemKey: ""}, + "DescribeStackEvents": {Verb: "Get", Resource: "StackEvent", OutputListKey: "StackEvents", OutputItemKey: ""}, + "DescribeStackInstance": {Verb: "Get", Resource: "StackInstance", OutputListKey: "", OutputItemKey: "StackInstance"}, + "DescribeStackRefactor": {Verb: "Get", Resource: "StackRefactor", OutputListKey: "StackIds", OutputItemKey: ""}, + "DescribeStackResource": {Verb: "Get", Resource: "StackResource", OutputListKey: "", OutputItemKey: "StackResourceDetail"}, + "DescribeStackResourceDrifts": {Verb: "Get", Resource: "StackResourceDrift", OutputListKey: "StackResourceDrifts", OutputItemKey: ""}, + "DescribeStackResources": {Verb: "Get", Resource: "StackResource", OutputListKey: "StackResources", OutputItemKey: ""}, + "DescribeStackSet": {Verb: "Get", Resource: "StackSet", OutputListKey: "", OutputItemKey: "StackSet"}, + "DescribeStackSetOperation": {Verb: "Get", Resource: "StackSetOperation", OutputListKey: "", OutputItemKey: "StackSetOperation"}, + "DescribeStacks": {Verb: "Get", Resource: "Stack", OutputListKey: "Stacks", OutputItemKey: ""}, + "DescribeType": {Verb: "Get", Resource: "Type", OutputListKey: "RequiredActivatedTypes", OutputItemKey: "LoggingConfig"}, + "DescribeTypeRegistration": {Verb: "Get", Resource: "TypeRegistration", OutputListKey: "", OutputItemKey: ""}, + "GetGeneratedTemplate": {Verb: "Get", Resource: "GeneratedTemplate", OutputListKey: "", OutputItemKey: ""}, + "GetHookResult": {Verb: "Get", Resource: "HookResult", OutputListKey: "Annotations", OutputItemKey: "Target"}, + "GetStackPolicy": {Verb: "Get", Resource: "StackPolicy", OutputListKey: "", OutputItemKey: ""}, + "GetTemplate": {Verb: "Get", Resource: "Template", OutputListKey: "StagesAvailable", OutputItemKey: ""}, + "GetTemplateSummary": {Verb: "Get", Resource: "TemplateSummary", OutputListKey: "Capabilities", OutputItemKey: "Warnings"}, + "ListChangeSets": {Verb: "List", Resource: "ChangeSet", OutputListKey: "Summaries", OutputItemKey: ""}, + "ListExports": {Verb: "List", Resource: "Export", OutputListKey: "Exports", OutputItemKey: ""}, + "ListGeneratedTemplates": {Verb: "List", Resource: "GeneratedTemplate", OutputListKey: "Summaries", OutputItemKey: ""}, + "ListHookResults": {Verb: "List", Resource: "HookResult", OutputListKey: "HookResults", OutputItemKey: ""}, + "ListImports": {Verb: "List", Resource: "Import", OutputListKey: "Imports", OutputItemKey: ""}, + "ListResourceScanRelatedResources": {Verb: "List", Resource: "ResourceScanRelatedResource", OutputListKey: "RelatedResources", OutputItemKey: ""}, + "ListResourceScanResources": {Verb: "List", Resource: "ResourceScanResource", OutputListKey: "Resources", OutputItemKey: ""}, + "ListResourceScans": {Verb: "List", Resource: "ResourceScan", OutputListKey: "ResourceScanSummaries", OutputItemKey: ""}, + "ListStackInstanceResourceDrifts": {Verb: "List", Resource: "StackInstanceResourceDrift", OutputListKey: "Summaries", OutputItemKey: ""}, + "ListStackInstances": {Verb: "List", Resource: "StackInstance", OutputListKey: "Summaries", OutputItemKey: ""}, + "ListStackRefactorActions": {Verb: "List", Resource: "StackRefactorAction", OutputListKey: "StackRefactorActions", OutputItemKey: ""}, + "ListStackRefactors": {Verb: "List", Resource: "StackRefactor", OutputListKey: "StackRefactorSummaries", OutputItemKey: ""}, + "ListStackResources": {Verb: "List", Resource: "StackResource", OutputListKey: "StackResourceSummaries", OutputItemKey: ""}, + "ListStackSetAutoDeploymentTargets": {Verb: "List", Resource: "StackSetAutoDeploymentTarget", OutputListKey: "Summaries", OutputItemKey: ""}, + "ListStackSetOperationResults": {Verb: "List", Resource: "StackSetOperationResult", OutputListKey: "Summaries", OutputItemKey: ""}, + "ListStackSetOperations": {Verb: "List", Resource: "StackSetOperation", OutputListKey: "Summaries", OutputItemKey: ""}, + "ListStackSets": {Verb: "List", Resource: "StackSet", OutputListKey: "Summaries", OutputItemKey: ""}, + "ListStacks": {Verb: "List", Resource: "Stack", OutputListKey: "StackSummaries", OutputItemKey: ""}, + "ListTypeRegistrations": {Verb: "List", Resource: "TypeRegistration", OutputListKey: "RegistrationTokenList", OutputItemKey: ""}, + "ListTypeVersions": {Verb: "List", Resource: "TypeVersion", OutputListKey: "TypeVersionSummaries", OutputItemKey: ""}, + "ListTypes": {Verb: "List", Resource: "Type", OutputListKey: "TypeSummaries", OutputItemKey: ""}, + "RegisterPublisher": {Verb: "Create", Resource: "Publisher", OutputListKey: "", OutputItemKey: ""}, + "RegisterType": {Verb: "Create", Resource: "Type", OutputListKey: "", OutputItemKey: ""}, + "UpdateGeneratedTemplate": {Verb: "Update", Resource: "GeneratedTemplate", OutputListKey: "", OutputItemKey: ""}, + "UpdateStack": {Verb: "Update", Resource: "Stack", OutputListKey: "", OutputItemKey: ""}, + "UpdateStackInstances": {Verb: "Update", Resource: "StackInstance", OutputListKey: "", OutputItemKey: ""}, + "UpdateStackSet": {Verb: "Update", Resource: "StackSet", OutputListKey: "", OutputItemKey: ""}, + "UpdateTerminationProtection": {Verb: "Update", Resource: "TerminationProtection", OutputListKey: "", OutputItemKey: ""}, + }) + crud.Register("cloudfront", map[string]crud.OpMeta{ + "CreateAnycastIpList": {Verb: "Create", Resource: "AnycastIpList", OutputListKey: "", OutputItemKey: "AnycastIpList", Method: "POST", URI: "/2020-05-31/anycast-ip-list"}, + "CreateCachePolicy": {Verb: "Create", Resource: "CachePolicy", OutputListKey: "", OutputItemKey: "CachePolicy", Method: "POST", URI: "/2020-05-31/cache-policy"}, + "CreateCloudFrontOriginAccessIdentity": {Verb: "Create", Resource: "CloudFrontOriginAccessIdentity", OutputListKey: "", OutputItemKey: "CloudFrontOriginAccessIdentity", Method: "POST", URI: "/2020-05-31/origin-access-identity/cloudfront"}, + "CreateConnectionFunction": {Verb: "Create", Resource: "ConnectionFunction", OutputListKey: "", OutputItemKey: "ConnectionFunctionSummary", Method: "POST", URI: "/2020-05-31/connection-function"}, + "CreateConnectionGroup": {Verb: "Create", Resource: "ConnectionGroup", OutputListKey: "", OutputItemKey: "ConnectionGroup", Method: "POST", URI: "/2020-05-31/connection-group"}, + "CreateContinuousDeploymentPolicy": {Verb: "Create", Resource: "ContinuousDeploymentPolicy", OutputListKey: "", OutputItemKey: "ContinuousDeploymentPolicy", Method: "POST", URI: "/2020-05-31/continuous-deployment-policy"}, + "CreateDistribution": {Verb: "Create", Resource: "Distribution", OutputListKey: "", OutputItemKey: "Distribution", Method: "POST", URI: "/2020-05-31/distribution"}, + "CreateDistributionTenant": {Verb: "Create", Resource: "DistributionTenant", OutputListKey: "", OutputItemKey: "DistributionTenant", Method: "POST", URI: "/2020-05-31/distribution-tenant"}, + "CreateDistributionWithTags": {Verb: "Create", Resource: "DistributionWithTag", OutputListKey: "", OutputItemKey: "Distribution", Method: "POST", URI: "/2020-05-31/distribution?WithTags"}, + "CreateFieldLevelEncryptionConfig": {Verb: "Create", Resource: "FieldLevelEncryptionConfig", OutputListKey: "", OutputItemKey: "FieldLevelEncryption", Method: "POST", URI: "/2020-05-31/field-level-encryption"}, + "CreateFieldLevelEncryptionProfile": {Verb: "Create", Resource: "FieldLevelEncryptionProfile", OutputListKey: "", OutputItemKey: "FieldLevelEncryptionProfile", Method: "POST", URI: "/2020-05-31/field-level-encryption-profile"}, + "CreateFunction": {Verb: "Create", Resource: "Function", OutputListKey: "", OutputItemKey: "FunctionSummary", Method: "POST", URI: "/2020-05-31/function"}, + "CreateInvalidation": {Verb: "Create", Resource: "Invalidation", OutputListKey: "", OutputItemKey: "Invalidation", Method: "POST", URI: "/2020-05-31/distribution/{DistributionId}/invalidation"}, + "CreateInvalidationForDistributionTenant": {Verb: "Create", Resource: "InvalidationForDistributionTenant", OutputListKey: "", OutputItemKey: "Invalidation", Method: "POST", URI: "/2020-05-31/distribution-tenant/{Id}/invalidation"}, + "CreateKeyGroup": {Verb: "Create", Resource: "KeyGroup", OutputListKey: "", OutputItemKey: "KeyGroup", Method: "POST", URI: "/2020-05-31/key-group"}, + "CreateKeyValueStore": {Verb: "Create", Resource: "KeyValueStore", OutputListKey: "", OutputItemKey: "KeyValueStore", Method: "POST", URI: "/2020-05-31/key-value-store"}, + "CreateMonitoringSubscription": {Verb: "Create", Resource: "MonitoringSubscription", OutputListKey: "", OutputItemKey: "MonitoringSubscription", Method: "POST", URI: "/2020-05-31/distributions/{DistributionId}/monitoring-subscription"}, + "CreateOriginAccessControl": {Verb: "Create", Resource: "OriginAccessControl", OutputListKey: "", OutputItemKey: "OriginAccessControl", Method: "POST", URI: "/2020-05-31/origin-access-control"}, + "CreateOriginRequestPolicy": {Verb: "Create", Resource: "OriginRequestPolicy", OutputListKey: "", OutputItemKey: "OriginRequestPolicy", Method: "POST", URI: "/2020-05-31/origin-request-policy"}, + "CreatePublicKey": {Verb: "Create", Resource: "PublicKey", OutputListKey: "", OutputItemKey: "PublicKey", Method: "POST", URI: "/2020-05-31/public-key"}, + "CreateRealtimeLogConfig": {Verb: "Create", Resource: "RealtimeLogConfig", OutputListKey: "", OutputItemKey: "RealtimeLogConfig", Method: "POST", URI: "/2020-05-31/realtime-log-config"}, + "CreateResponseHeadersPolicy": {Verb: "Create", Resource: "ResponseHeadersPolicy", OutputListKey: "", OutputItemKey: "ResponseHeadersPolicy", Method: "POST", URI: "/2020-05-31/response-headers-policy"}, + "CreateStreamingDistribution": {Verb: "Create", Resource: "StreamingDistribution", OutputListKey: "", OutputItemKey: "StreamingDistribution", Method: "POST", URI: "/2020-05-31/streaming-distribution"}, + "CreateStreamingDistributionWithTags": {Verb: "Create", Resource: "StreamingDistributionWithTag", OutputListKey: "", OutputItemKey: "StreamingDistribution", Method: "POST", URI: "/2020-05-31/streaming-distribution?WithTags"}, + "CreateTrustStore": {Verb: "Create", Resource: "TrustStore", OutputListKey: "", OutputItemKey: "TrustStore", Method: "POST", URI: "/2020-05-31/trust-store"}, + "CreateVpcOrigin": {Verb: "Create", Resource: "VpcOrigin", OutputListKey: "", OutputItemKey: "VpcOrigin", Method: "POST", URI: "/2020-05-31/vpc-origin"}, + "DeleteAnycastIpList": {Verb: "Delete", Resource: "AnycastIpList", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2020-05-31/anycast-ip-list/{Id}"}, + "DeleteCachePolicy": {Verb: "Delete", Resource: "CachePolicy", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2020-05-31/cache-policy/{Id}"}, + "DeleteCloudFrontOriginAccessIdentity": {Verb: "Delete", Resource: "CloudFrontOriginAccessIdentity", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2020-05-31/origin-access-identity/cloudfront/{Id}"}, + "DeleteConnectionFunction": {Verb: "Delete", Resource: "ConnectionFunction", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2020-05-31/connection-function/{Id}"}, + "DeleteConnectionGroup": {Verb: "Delete", Resource: "ConnectionGroup", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2020-05-31/connection-group/{Id}"}, + "DeleteContinuousDeploymentPolicy": {Verb: "Delete", Resource: "ContinuousDeploymentPolicy", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2020-05-31/continuous-deployment-policy/{Id}"}, + "DeleteDistribution": {Verb: "Delete", Resource: "Distribution", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2020-05-31/distribution/{Id}"}, + "DeleteDistributionTenant": {Verb: "Delete", Resource: "DistributionTenant", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2020-05-31/distribution-tenant/{Id}"}, + "DeleteFieldLevelEncryptionConfig": {Verb: "Delete", Resource: "FieldLevelEncryptionConfig", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2020-05-31/field-level-encryption/{Id}"}, + "DeleteFieldLevelEncryptionProfile": {Verb: "Delete", Resource: "FieldLevelEncryptionProfile", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2020-05-31/field-level-encryption-profile/{Id}"}, + "DeleteFunction": {Verb: "Delete", Resource: "Function", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2020-05-31/function/{Name}"}, + "DeleteKeyGroup": {Verb: "Delete", Resource: "KeyGroup", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2020-05-31/key-group/{Id}"}, + "DeleteKeyValueStore": {Verb: "Delete", Resource: "KeyValueStore", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2020-05-31/key-value-store/{Name}"}, + "DeleteMonitoringSubscription": {Verb: "Delete", Resource: "MonitoringSubscription", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2020-05-31/distributions/{DistributionId}/monitoring-subscription"}, + "DeleteOriginAccessControl": {Verb: "Delete", Resource: "OriginAccessControl", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2020-05-31/origin-access-control/{Id}"}, + "DeleteOriginRequestPolicy": {Verb: "Delete", Resource: "OriginRequestPolicy", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2020-05-31/origin-request-policy/{Id}"}, + "DeletePublicKey": {Verb: "Delete", Resource: "PublicKey", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2020-05-31/public-key/{Id}"}, + "DeleteRealtimeLogConfig": {Verb: "Delete", Resource: "RealtimeLogConfig", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/2020-05-31/delete-realtime-log-config"}, + "DeleteResourcePolicy": {Verb: "Delete", Resource: "ResourcePolicy", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/2020-05-31/delete-resource-policy"}, + "DeleteResponseHeadersPolicy": {Verb: "Delete", Resource: "ResponseHeadersPolicy", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2020-05-31/response-headers-policy/{Id}"}, + "DeleteStreamingDistribution": {Verb: "Delete", Resource: "StreamingDistribution", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2020-05-31/streaming-distribution/{Id}"}, + "DeleteTrustStore": {Verb: "Delete", Resource: "TrustStore", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2020-05-31/trust-store/{Id}"}, + "DeleteVpcOrigin": {Verb: "Delete", Resource: "VpcOrigin", OutputListKey: "", OutputItemKey: "VpcOrigin", Method: "DELETE", URI: "/2020-05-31/vpc-origin/{Id}"}, + "DescribeConnectionFunction": {Verb: "Get", Resource: "ConnectionFunction", OutputListKey: "", OutputItemKey: "ConnectionFunctionSummary", Method: "GET", URI: "/2020-05-31/connection-function/{Identifier}/describe"}, + "DescribeFunction": {Verb: "Get", Resource: "Function", OutputListKey: "", OutputItemKey: "FunctionSummary", Method: "GET", URI: "/2020-05-31/function/{Name}/describe"}, + "DescribeKeyValueStore": {Verb: "Get", Resource: "KeyValueStore", OutputListKey: "", OutputItemKey: "KeyValueStore", Method: "GET", URI: "/2020-05-31/key-value-store/{Name}"}, + "GetAnycastIpList": {Verb: "Get", Resource: "AnycastIpList", OutputListKey: "", OutputItemKey: "AnycastIpList", Method: "GET", URI: "/2020-05-31/anycast-ip-list/{Id}"}, + "GetCachePolicy": {Verb: "Get", Resource: "CachePolicy", OutputListKey: "", OutputItemKey: "CachePolicy", Method: "GET", URI: "/2020-05-31/cache-policy/{Id}"}, + "GetCachePolicyConfig": {Verb: "Get", Resource: "CachePolicyConfig", OutputListKey: "", OutputItemKey: "CachePolicyConfig", Method: "GET", URI: "/2020-05-31/cache-policy/{Id}/config"}, + "GetCloudFrontOriginAccessIdentity": {Verb: "Get", Resource: "CloudFrontOriginAccessIdentity", OutputListKey: "", OutputItemKey: "CloudFrontOriginAccessIdentity", Method: "GET", URI: "/2020-05-31/origin-access-identity/cloudfront/{Id}"}, + "GetCloudFrontOriginAccessIdentityConfig": {Verb: "Get", Resource: "CloudFrontOriginAccessIdentityConfig", OutputListKey: "", OutputItemKey: "CloudFrontOriginAccessIdentityConfig", Method: "GET", URI: "/2020-05-31/origin-access-identity/cloudfront/{Id}/config"}, + "GetConnectionFunction": {Verb: "Get", Resource: "ConnectionFunction", OutputListKey: "", OutputItemKey: "", Method: "GET", URI: "/2020-05-31/connection-function/{Identifier}"}, + "GetConnectionGroup": {Verb: "Get", Resource: "ConnectionGroup", OutputListKey: "", OutputItemKey: "ConnectionGroup", Method: "GET", URI: "/2020-05-31/connection-group/{Identifier}"}, + "GetConnectionGroupByRoutingEndpoint": {Verb: "Get", Resource: "ConnectionGroupByRoutingEndpoint", OutputListKey: "", OutputItemKey: "ConnectionGroup", Method: "GET", URI: "/2020-05-31/connection-group"}, + "GetContinuousDeploymentPolicy": {Verb: "Get", Resource: "ContinuousDeploymentPolicy", OutputListKey: "", OutputItemKey: "ContinuousDeploymentPolicy", Method: "GET", URI: "/2020-05-31/continuous-deployment-policy/{Id}"}, + "GetContinuousDeploymentPolicyConfig": {Verb: "Get", Resource: "ContinuousDeploymentPolicyConfig", OutputListKey: "", OutputItemKey: "ContinuousDeploymentPolicyConfig", Method: "GET", URI: "/2020-05-31/continuous-deployment-policy/{Id}/config"}, + "GetDistribution": {Verb: "Get", Resource: "Distribution", OutputListKey: "", OutputItemKey: "Distribution", Method: "GET", URI: "/2020-05-31/distribution/{Id}"}, + "GetDistributionConfig": {Verb: "Get", Resource: "DistributionConfig", OutputListKey: "", OutputItemKey: "DistributionConfig", Method: "GET", URI: "/2020-05-31/distribution/{Id}/config"}, + "GetDistributionTenant": {Verb: "Get", Resource: "DistributionTenant", OutputListKey: "", OutputItemKey: "DistributionTenant", Method: "GET", URI: "/2020-05-31/distribution-tenant/{Identifier}"}, + "GetDistributionTenantByDomain": {Verb: "Get", Resource: "DistributionTenantByDomain", OutputListKey: "", OutputItemKey: "DistributionTenant", Method: "GET", URI: "/2020-05-31/distribution-tenant"}, + "GetFieldLevelEncryption": {Verb: "Get", Resource: "FieldLevelEncryption", OutputListKey: "", OutputItemKey: "FieldLevelEncryption", Method: "GET", URI: "/2020-05-31/field-level-encryption/{Id}"}, + "GetFieldLevelEncryptionConfig": {Verb: "Get", Resource: "FieldLevelEncryptionConfig", OutputListKey: "", OutputItemKey: "FieldLevelEncryptionConfig", Method: "GET", URI: "/2020-05-31/field-level-encryption/{Id}/config"}, + "GetFieldLevelEncryptionProfile": {Verb: "Get", Resource: "FieldLevelEncryptionProfile", OutputListKey: "", OutputItemKey: "FieldLevelEncryptionProfile", Method: "GET", URI: "/2020-05-31/field-level-encryption-profile/{Id}"}, + "GetFieldLevelEncryptionProfileConfig": {Verb: "Get", Resource: "FieldLevelEncryptionProfileConfig", OutputListKey: "", OutputItemKey: "FieldLevelEncryptionProfileConfig", Method: "GET", URI: "/2020-05-31/field-level-encryption-profile/{Id}/config"}, + "GetFunction": {Verb: "Get", Resource: "Function", OutputListKey: "", OutputItemKey: "", Method: "GET", URI: "/2020-05-31/function/{Name}"}, + "GetInvalidation": {Verb: "Get", Resource: "Invalidation", OutputListKey: "", OutputItemKey: "Invalidation", Method: "GET", URI: "/2020-05-31/distribution/{DistributionId}/invalidation/{Id}"}, + "GetInvalidationForDistributionTenant": {Verb: "Get", Resource: "InvalidationForDistributionTenant", OutputListKey: "", OutputItemKey: "Invalidation", Method: "GET", URI: "/2020-05-31/distribution-tenant/{DistributionTenantId}/invalidation/{Id}"}, + "GetKeyGroup": {Verb: "Get", Resource: "KeyGroup", OutputListKey: "", OutputItemKey: "KeyGroup", Method: "GET", URI: "/2020-05-31/key-group/{Id}"}, + "GetKeyGroupConfig": {Verb: "Get", Resource: "KeyGroupConfig", OutputListKey: "", OutputItemKey: "KeyGroupConfig", Method: "GET", URI: "/2020-05-31/key-group/{Id}/config"}, + "GetManagedCertificateDetails": {Verb: "Get", Resource: "ManagedCertificateDetail", OutputListKey: "", OutputItemKey: "ManagedCertificateDetails", Method: "GET", URI: "/2020-05-31/managed-certificate/{Identifier}"}, + "GetMonitoringSubscription": {Verb: "Get", Resource: "MonitoringSubscription", OutputListKey: "", OutputItemKey: "MonitoringSubscription", Method: "GET", URI: "/2020-05-31/distributions/{DistributionId}/monitoring-subscription"}, + "GetOriginAccessControl": {Verb: "Get", Resource: "OriginAccessControl", OutputListKey: "", OutputItemKey: "OriginAccessControl", Method: "GET", URI: "/2020-05-31/origin-access-control/{Id}"}, + "GetOriginAccessControlConfig": {Verb: "Get", Resource: "OriginAccessControlConfig", OutputListKey: "", OutputItemKey: "OriginAccessControlConfig", Method: "GET", URI: "/2020-05-31/origin-access-control/{Id}/config"}, + "GetOriginRequestPolicy": {Verb: "Get", Resource: "OriginRequestPolicy", OutputListKey: "", OutputItemKey: "OriginRequestPolicy", Method: "GET", URI: "/2020-05-31/origin-request-policy/{Id}"}, + "GetOriginRequestPolicyConfig": {Verb: "Get", Resource: "OriginRequestPolicyConfig", OutputListKey: "", OutputItemKey: "OriginRequestPolicyConfig", Method: "GET", URI: "/2020-05-31/origin-request-policy/{Id}/config"}, + "GetPublicKey": {Verb: "Get", Resource: "PublicKey", OutputListKey: "", OutputItemKey: "PublicKey", Method: "GET", URI: "/2020-05-31/public-key/{Id}"}, + "GetPublicKeyConfig": {Verb: "Get", Resource: "PublicKeyConfig", OutputListKey: "", OutputItemKey: "PublicKeyConfig", Method: "GET", URI: "/2020-05-31/public-key/{Id}/config"}, + "GetRealtimeLogConfig": {Verb: "Get", Resource: "RealtimeLogConfig", OutputListKey: "", OutputItemKey: "RealtimeLogConfig", Method: "POST", URI: "/2020-05-31/get-realtime-log-config"}, + "GetResourcePolicy": {Verb: "Get", Resource: "ResourcePolicy", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/2020-05-31/get-resource-policy"}, + "GetResponseHeadersPolicy": {Verb: "Get", Resource: "ResponseHeadersPolicy", OutputListKey: "", OutputItemKey: "ResponseHeadersPolicy", Method: "GET", URI: "/2020-05-31/response-headers-policy/{Id}"}, + "GetResponseHeadersPolicyConfig": {Verb: "Get", Resource: "ResponseHeadersPolicyConfig", OutputListKey: "", OutputItemKey: "ResponseHeadersPolicyConfig", Method: "GET", URI: "/2020-05-31/response-headers-policy/{Id}/config"}, + "GetStreamingDistribution": {Verb: "Get", Resource: "StreamingDistribution", OutputListKey: "", OutputItemKey: "StreamingDistribution", Method: "GET", URI: "/2020-05-31/streaming-distribution/{Id}"}, + "GetStreamingDistributionConfig": {Verb: "Get", Resource: "StreamingDistributionConfig", OutputListKey: "", OutputItemKey: "StreamingDistributionConfig", Method: "GET", URI: "/2020-05-31/streaming-distribution/{Id}/config"}, + "GetTrustStore": {Verb: "Get", Resource: "TrustStore", OutputListKey: "", OutputItemKey: "TrustStore", Method: "GET", URI: "/2020-05-31/trust-store/{Identifier}"}, + "GetVpcOrigin": {Verb: "Get", Resource: "VpcOrigin", OutputListKey: "", OutputItemKey: "VpcOrigin", Method: "GET", URI: "/2020-05-31/vpc-origin/{Id}"}, + "ListAnycastIpLists": {Verb: "List", Resource: "AnycastIpList", OutputListKey: "", OutputItemKey: "AnycastIpLists", Method: "GET", URI: "/2020-05-31/anycast-ip-list"}, + "ListCachePolicies": {Verb: "List", Resource: "CachePolicy", OutputListKey: "", OutputItemKey: "CachePolicyList", Method: "GET", URI: "/2020-05-31/cache-policy"}, + "ListCloudFrontOriginAccessIdentities": {Verb: "List", Resource: "CloudFrontOriginAccessIdentity", OutputListKey: "", OutputItemKey: "CloudFrontOriginAccessIdentityList", Method: "GET", URI: "/2020-05-31/origin-access-identity/cloudfront"}, + "ListConflictingAliases": {Verb: "List", Resource: "ConflictingAliase", OutputListKey: "", OutputItemKey: "ConflictingAliasesList", Method: "GET", URI: "/2020-05-31/conflicting-alias"}, + "ListConnectionFunctions": {Verb: "List", Resource: "ConnectionFunction", OutputListKey: "ConnectionFunctions", OutputItemKey: "", Method: "POST", URI: "/2020-05-31/connection-functions"}, + "ListConnectionGroups": {Verb: "List", Resource: "ConnectionGroup", OutputListKey: "ConnectionGroups", OutputItemKey: "", Method: "POST", URI: "/2020-05-31/connection-groups"}, + "ListContinuousDeploymentPolicies": {Verb: "List", Resource: "ContinuousDeploymentPolicy", OutputListKey: "", OutputItemKey: "ContinuousDeploymentPolicyList", Method: "GET", URI: "/2020-05-31/continuous-deployment-policy"}, + "ListDistributionTenants": {Verb: "List", Resource: "DistributionTenant", OutputListKey: "DistributionTenantList", OutputItemKey: "", Method: "POST", URI: "/2020-05-31/distribution-tenants"}, + "ListDistributionTenantsByCustomization": {Verb: "List", Resource: "DistributionTenantsByCustomization", OutputListKey: "DistributionTenantList", OutputItemKey: "", Method: "POST", URI: "/2020-05-31/distribution-tenants-by-customization"}, + "ListDistributions": {Verb: "List", Resource: "Distribution", OutputListKey: "", OutputItemKey: "DistributionList", Method: "GET", URI: "/2020-05-31/distribution"}, + "ListDistributionsByAnycastIpListId": {Verb: "List", Resource: "DistributionsByAnycastIpListId", OutputListKey: "", OutputItemKey: "DistributionList", Method: "GET", URI: "/2020-05-31/distributionsByAnycastIpListId/{AnycastIpListId}"}, + "ListDistributionsByCachePolicyId": {Verb: "List", Resource: "DistributionsByCachePolicyId", OutputListKey: "", OutputItemKey: "DistributionIdList", Method: "GET", URI: "/2020-05-31/distributionsByCachePolicyId/{CachePolicyId}"}, + "ListDistributionsByConnectionFunction": {Verb: "List", Resource: "DistributionsByConnectionFunction", OutputListKey: "", OutputItemKey: "DistributionList", Method: "GET", URI: "/2020-05-31/distributionsByConnectionFunction"}, + "ListDistributionsByConnectionMode": {Verb: "List", Resource: "DistributionsByConnectionMode", OutputListKey: "", OutputItemKey: "DistributionList", Method: "GET", URI: "/2020-05-31/distributionsByConnectionMode/{ConnectionMode}"}, + "ListDistributionsByKeyGroup": {Verb: "List", Resource: "DistributionsByKeyGroup", OutputListKey: "", OutputItemKey: "DistributionIdList", Method: "GET", URI: "/2020-05-31/distributionsByKeyGroupId/{KeyGroupId}"}, + "ListDistributionsByOriginRequestPolicyId": {Verb: "List", Resource: "DistributionsByOriginRequestPolicyId", OutputListKey: "", OutputItemKey: "DistributionIdList", Method: "GET", URI: "/2020-05-31/distributionsByOriginRequestPolicyId/{OriginRequestPolicyId}"}, + "ListDistributionsByOwnedResource": {Verb: "List", Resource: "DistributionsByOwnedResource", OutputListKey: "", OutputItemKey: "DistributionList", Method: "GET", URI: "/2020-05-31/distributionsByOwnedResource/{ResourceArn}"}, + "ListDistributionsByRealtimeLogConfig": {Verb: "List", Resource: "DistributionsByRealtimeLogConfig", OutputListKey: "", OutputItemKey: "DistributionList", Method: "POST", URI: "/2020-05-31/distributionsByRealtimeLogConfig"}, + "ListDistributionsByResponseHeadersPolicyId": {Verb: "List", Resource: "DistributionsByResponseHeadersPolicyId", OutputListKey: "", OutputItemKey: "DistributionIdList", Method: "GET", URI: "/2020-05-31/distributionsByResponseHeadersPolicyId/{ResponseHeadersPolicyId}"}, + "ListDistributionsByTrustStore": {Verb: "List", Resource: "DistributionsByTrustStore", OutputListKey: "", OutputItemKey: "DistributionList", Method: "GET", URI: "/2020-05-31/distributionsByTrustStore"}, + "ListDistributionsByVpcOriginId": {Verb: "List", Resource: "DistributionsByVpcOriginId", OutputListKey: "", OutputItemKey: "DistributionIdList", Method: "GET", URI: "/2020-05-31/distributionsByVpcOriginId/{VpcOriginId}"}, + "ListDistributionsByWebACLId": {Verb: "List", Resource: "DistributionsByWebACLId", OutputListKey: "", OutputItemKey: "DistributionList", Method: "GET", URI: "/2020-05-31/distributionsByWebACLId/{WebACLId}"}, + "ListDomainConflicts": {Verb: "List", Resource: "DomainConflict", OutputListKey: "DomainConflicts", OutputItemKey: "", Method: "POST", URI: "/2020-05-31/domain-conflicts"}, + "ListFieldLevelEncryptionConfigs": {Verb: "List", Resource: "FieldLevelEncryptionConfig", OutputListKey: "", OutputItemKey: "FieldLevelEncryptionList", Method: "GET", URI: "/2020-05-31/field-level-encryption"}, + "ListFieldLevelEncryptionProfiles": {Verb: "List", Resource: "FieldLevelEncryptionProfile", OutputListKey: "", OutputItemKey: "FieldLevelEncryptionProfileList", Method: "GET", URI: "/2020-05-31/field-level-encryption-profile"}, + "ListFunctions": {Verb: "List", Resource: "Function", OutputListKey: "", OutputItemKey: "FunctionList", Method: "GET", URI: "/2020-05-31/function"}, + "ListInvalidations": {Verb: "List", Resource: "Invalidation", OutputListKey: "", OutputItemKey: "InvalidationList", Method: "GET", URI: "/2020-05-31/distribution/{DistributionId}/invalidation"}, + "ListInvalidationsForDistributionTenant": {Verb: "List", Resource: "InvalidationsForDistributionTenant", OutputListKey: "", OutputItemKey: "InvalidationList", Method: "GET", URI: "/2020-05-31/distribution-tenant/{Id}/invalidation"}, + "ListKeyGroups": {Verb: "List", Resource: "KeyGroup", OutputListKey: "", OutputItemKey: "KeyGroupList", Method: "GET", URI: "/2020-05-31/key-group"}, + "ListKeyValueStores": {Verb: "List", Resource: "KeyValueStore", OutputListKey: "", OutputItemKey: "KeyValueStoreList", Method: "GET", URI: "/2020-05-31/key-value-store"}, + "ListOriginAccessControls": {Verb: "List", Resource: "OriginAccessControl", OutputListKey: "", OutputItemKey: "OriginAccessControlList", Method: "GET", URI: "/2020-05-31/origin-access-control"}, + "ListOriginRequestPolicies": {Verb: "List", Resource: "OriginRequestPolicy", OutputListKey: "", OutputItemKey: "OriginRequestPolicyList", Method: "GET", URI: "/2020-05-31/origin-request-policy"}, + "ListPublicKeys": {Verb: "List", Resource: "PublicKey", OutputListKey: "", OutputItemKey: "PublicKeyList", Method: "GET", URI: "/2020-05-31/public-key"}, + "ListRealtimeLogConfigs": {Verb: "List", Resource: "RealtimeLogConfig", OutputListKey: "", OutputItemKey: "RealtimeLogConfigs", Method: "GET", URI: "/2020-05-31/realtime-log-config"}, + "ListResponseHeadersPolicies": {Verb: "List", Resource: "ResponseHeadersPolicy", OutputListKey: "", OutputItemKey: "ResponseHeadersPolicyList", Method: "GET", URI: "/2020-05-31/response-headers-policy"}, + "ListStreamingDistributions": {Verb: "List", Resource: "StreamingDistribution", OutputListKey: "", OutputItemKey: "StreamingDistributionList", Method: "GET", URI: "/2020-05-31/streaming-distribution"}, + "ListTagsForResource": {Verb: "List", Resource: "TagsForResource", OutputListKey: "", OutputItemKey: "Tags", Method: "GET", URI: "/2020-05-31/tagging"}, + "ListTrustStores": {Verb: "List", Resource: "TrustStore", OutputListKey: "TrustStoreList", OutputItemKey: "", Method: "POST", URI: "/2020-05-31/trust-stores"}, + "ListVpcOrigins": {Verb: "List", Resource: "VpcOrigin", OutputListKey: "", OutputItemKey: "VpcOriginList", Method: "GET", URI: "/2020-05-31/vpc-origin"}, + "PutResourcePolicy": {Verb: "Update", Resource: "ResourcePolicy", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/2020-05-31/put-resource-policy"}, + "TagResource": {Verb: "Tag", Resource: "Resource", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/2020-05-31/tagging?Operation=Tag"}, + "UntagResource": {Verb: "Untag", Resource: "Resource", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/2020-05-31/tagging?Operation=Untag"}, + "UpdateAnycastIpList": {Verb: "Update", Resource: "AnycastIpList", OutputListKey: "", OutputItemKey: "AnycastIpList", Method: "PUT", URI: "/2020-05-31/anycast-ip-list/{Id}"}, + "UpdateCachePolicy": {Verb: "Update", Resource: "CachePolicy", OutputListKey: "", OutputItemKey: "CachePolicy", Method: "PUT", URI: "/2020-05-31/cache-policy/{Id}"}, + "UpdateCloudFrontOriginAccessIdentity": {Verb: "Update", Resource: "CloudFrontOriginAccessIdentity", OutputListKey: "", OutputItemKey: "CloudFrontOriginAccessIdentity", Method: "PUT", URI: "/2020-05-31/origin-access-identity/cloudfront/{Id}/config"}, + "UpdateConnectionFunction": {Verb: "Update", Resource: "ConnectionFunction", OutputListKey: "", OutputItemKey: "ConnectionFunctionSummary", Method: "PUT", URI: "/2020-05-31/connection-function/{Id}"}, + "UpdateConnectionGroup": {Verb: "Update", Resource: "ConnectionGroup", OutputListKey: "", OutputItemKey: "ConnectionGroup", Method: "PUT", URI: "/2020-05-31/connection-group/{Id}"}, + "UpdateContinuousDeploymentPolicy": {Verb: "Update", Resource: "ContinuousDeploymentPolicy", OutputListKey: "", OutputItemKey: "ContinuousDeploymentPolicy", Method: "PUT", URI: "/2020-05-31/continuous-deployment-policy/{Id}"}, + "UpdateDistribution": {Verb: "Update", Resource: "Distribution", OutputListKey: "", OutputItemKey: "Distribution", Method: "PUT", URI: "/2020-05-31/distribution/{Id}/config"}, + "UpdateDistributionTenant": {Verb: "Update", Resource: "DistributionTenant", OutputListKey: "", OutputItemKey: "DistributionTenant", Method: "PUT", URI: "/2020-05-31/distribution-tenant/{Id}"}, + "UpdateDistributionWithStagingConfig": {Verb: "Update", Resource: "DistributionWithStagingConfig", OutputListKey: "", OutputItemKey: "Distribution", Method: "PUT", URI: "/2020-05-31/distribution/{Id}/promote-staging-config"}, + "UpdateDomainAssociation": {Verb: "Update", Resource: "DomainAssociation", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/2020-05-31/domain-association"}, + "UpdateFieldLevelEncryptionConfig": {Verb: "Update", Resource: "FieldLevelEncryptionConfig", OutputListKey: "", OutputItemKey: "FieldLevelEncryption", Method: "PUT", URI: "/2020-05-31/field-level-encryption/{Id}/config"}, + "UpdateFieldLevelEncryptionProfile": {Verb: "Update", Resource: "FieldLevelEncryptionProfile", OutputListKey: "", OutputItemKey: "FieldLevelEncryptionProfile", Method: "PUT", URI: "/2020-05-31/field-level-encryption-profile/{Id}/config"}, + "UpdateFunction": {Verb: "Update", Resource: "Function", OutputListKey: "", OutputItemKey: "FunctionSummary", Method: "PUT", URI: "/2020-05-31/function/{Name}"}, + "UpdateKeyGroup": {Verb: "Update", Resource: "KeyGroup", OutputListKey: "", OutputItemKey: "KeyGroup", Method: "PUT", URI: "/2020-05-31/key-group/{Id}"}, + "UpdateKeyValueStore": {Verb: "Update", Resource: "KeyValueStore", OutputListKey: "", OutputItemKey: "KeyValueStore", Method: "PUT", URI: "/2020-05-31/key-value-store/{Name}"}, + "UpdateOriginAccessControl": {Verb: "Update", Resource: "OriginAccessControl", OutputListKey: "", OutputItemKey: "OriginAccessControl", Method: "PUT", URI: "/2020-05-31/origin-access-control/{Id}/config"}, + "UpdateOriginRequestPolicy": {Verb: "Update", Resource: "OriginRequestPolicy", OutputListKey: "", OutputItemKey: "OriginRequestPolicy", Method: "PUT", URI: "/2020-05-31/origin-request-policy/{Id}"}, + "UpdatePublicKey": {Verb: "Update", Resource: "PublicKey", OutputListKey: "", OutputItemKey: "PublicKey", Method: "PUT", URI: "/2020-05-31/public-key/{Id}/config"}, + "UpdateRealtimeLogConfig": {Verb: "Update", Resource: "RealtimeLogConfig", OutputListKey: "", OutputItemKey: "RealtimeLogConfig", Method: "PUT", URI: "/2020-05-31/realtime-log-config"}, + "UpdateResponseHeadersPolicy": {Verb: "Update", Resource: "ResponseHeadersPolicy", OutputListKey: "", OutputItemKey: "ResponseHeadersPolicy", Method: "PUT", URI: "/2020-05-31/response-headers-policy/{Id}"}, + "UpdateStreamingDistribution": {Verb: "Update", Resource: "StreamingDistribution", OutputListKey: "", OutputItemKey: "StreamingDistribution", Method: "PUT", URI: "/2020-05-31/streaming-distribution/{Id}/config"}, + "UpdateTrustStore": {Verb: "Update", Resource: "TrustStore", OutputListKey: "", OutputItemKey: "TrustStore", Method: "PUT", URI: "/2020-05-31/trust-store/{Id}"}, + "UpdateVpcOrigin": {Verb: "Update", Resource: "VpcOrigin", OutputListKey: "", OutputItemKey: "VpcOrigin", Method: "PUT", URI: "/2020-05-31/vpc-origin/{Id}"}, + }) crud.Register("cloudhsmv2", map[string]crud.OpMeta{ "CreateCluster": {Verb: "Create", Resource: "Cluster", OutputListKey: "", OutputItemKey: "Cluster"}, "CreateHsm": {Verb: "Create", Resource: "Hsm", OutputListKey: "", OutputItemKey: "Hsm"}, @@ -1280,6 +1546,28 @@ func init() { "TagResource": {Verb: "Tag", Resource: "Resource", OutputListKey: "", OutputItemKey: ""}, "UntagResource": {Verb: "Untag", Resource: "Resource", OutputListKey: "", OutputItemKey: ""}, }) + crud.Register("cloudsearch", map[string]crud.OpMeta{ + "CreateDomain": {Verb: "Create", Resource: "Domain", OutputListKey: "", OutputItemKey: "DomainStatus"}, + "DeleteAnalysisScheme": {Verb: "Delete", Resource: "AnalysisScheme", OutputListKey: "", OutputItemKey: "AnalysisScheme"}, + "DeleteDomain": {Verb: "Delete", Resource: "Domain", OutputListKey: "", OutputItemKey: "DomainStatus"}, + "DeleteExpression": {Verb: "Delete", Resource: "Expression", OutputListKey: "", OutputItemKey: "Expression"}, + "DeleteIndexField": {Verb: "Delete", Resource: "IndexField", OutputListKey: "", OutputItemKey: "IndexField"}, + "DeleteSuggester": {Verb: "Delete", Resource: "Suggester", OutputListKey: "", OutputItemKey: "Suggester"}, + "DescribeAnalysisSchemes": {Verb: "Get", Resource: "AnalysisScheme", OutputListKey: "AnalysisSchemes", OutputItemKey: ""}, + "DescribeAvailabilityOptions": {Verb: "Get", Resource: "AvailabilityOption", OutputListKey: "", OutputItemKey: "AvailabilityOptions"}, + "DescribeDomainEndpointOptions": {Verb: "Get", Resource: "DomainEndpointOption", OutputListKey: "", OutputItemKey: "DomainEndpointOptions"}, + "DescribeDomains": {Verb: "Get", Resource: "Domain", OutputListKey: "DomainStatusList", OutputItemKey: ""}, + "DescribeExpressions": {Verb: "Get", Resource: "Expression", OutputListKey: "Expressions", OutputItemKey: ""}, + "DescribeIndexFields": {Verb: "Get", Resource: "IndexField", OutputListKey: "IndexFields", OutputItemKey: ""}, + "DescribeScalingParameters": {Verb: "Get", Resource: "ScalingParameter", OutputListKey: "", OutputItemKey: "ScalingParameters"}, + "DescribeServiceAccessPolicies": {Verb: "Get", Resource: "ServiceAccessPolicy", OutputListKey: "", OutputItemKey: "AccessPolicies"}, + "DescribeSuggesters": {Verb: "Get", Resource: "Suggester", OutputListKey: "Suggesters", OutputItemKey: ""}, + "ListDomainNames": {Verb: "List", Resource: "DomainName", OutputListKey: "", OutputItemKey: ""}, + "UpdateAvailabilityOptions": {Verb: "Update", Resource: "AvailabilityOption", OutputListKey: "", OutputItemKey: "AvailabilityOptions"}, + "UpdateDomainEndpointOptions": {Verb: "Update", Resource: "DomainEndpointOption", OutputListKey: "", OutputItemKey: "DomainEndpointOptions"}, + "UpdateScalingParameters": {Verb: "Update", Resource: "ScalingParameter", OutputListKey: "", OutputItemKey: "ScalingParameters"}, + "UpdateServiceAccessPolicies": {Verb: "Update", Resource: "ServiceAccessPolicy", OutputListKey: "", OutputItemKey: "AccessPolicies"}, + }) crud.Register("cloudtrail", map[string]crud.OpMeta{ "CreateChannel": {Verb: "Create", Resource: "Channel", OutputListKey: "Destinations", OutputItemKey: ""}, "CreateDashboard": {Verb: "Create", Resource: "Dashboard", OutputListKey: "TagsList", OutputItemKey: "RefreshSchedule"}, @@ -2658,6 +2946,46 @@ func init() { "UpdateSettings": {Verb: "Update", Resource: "Setting", OutputListKey: "", OutputItemKey: ""}, "UpdateTrust": {Verb: "Update", Resource: "Trust", OutputListKey: "", OutputItemKey: ""}, }) + crud.Register("docdb", map[string]crud.OpMeta{ + "CreateDBCluster": {Verb: "Create", Resource: "DBCluster", OutputListKey: "", OutputItemKey: "DBCluster"}, + "CreateDBClusterParameterGroup": {Verb: "Create", Resource: "DBClusterParameterGroup", OutputListKey: "", OutputItemKey: "DBClusterParameterGroup"}, + "CreateDBClusterSnapshot": {Verb: "Create", Resource: "DBClusterSnapshot", OutputListKey: "", OutputItemKey: "DBClusterSnapshot"}, + "CreateDBInstance": {Verb: "Create", Resource: "DBInstance", OutputListKey: "", OutputItemKey: "DBInstance"}, + "CreateDBSubnetGroup": {Verb: "Create", Resource: "DBSubnetGroup", OutputListKey: "", OutputItemKey: "DBSubnetGroup"}, + "CreateEventSubscription": {Verb: "Create", Resource: "EventSubscription", OutputListKey: "", OutputItemKey: "EventSubscription"}, + "CreateGlobalCluster": {Verb: "Create", Resource: "GlobalCluster", OutputListKey: "", OutputItemKey: "GlobalCluster"}, + "DeleteDBCluster": {Verb: "Delete", Resource: "DBCluster", OutputListKey: "", OutputItemKey: "DBCluster"}, + "DeleteDBClusterParameterGroup": {Verb: "Delete", Resource: "DBClusterParameterGroup", OutputListKey: "", OutputItemKey: ""}, + "DeleteDBClusterSnapshot": {Verb: "Delete", Resource: "DBClusterSnapshot", OutputListKey: "", OutputItemKey: "DBClusterSnapshot"}, + "DeleteDBInstance": {Verb: "Delete", Resource: "DBInstance", OutputListKey: "", OutputItemKey: "DBInstance"}, + "DeleteDBSubnetGroup": {Verb: "Delete", Resource: "DBSubnetGroup", OutputListKey: "", OutputItemKey: ""}, + "DeleteEventSubscription": {Verb: "Delete", Resource: "EventSubscription", OutputListKey: "", OutputItemKey: "EventSubscription"}, + "DeleteGlobalCluster": {Verb: "Delete", Resource: "GlobalCluster", OutputListKey: "", OutputItemKey: "GlobalCluster"}, + "DescribeCertificates": {Verb: "Get", Resource: "Certificate", OutputListKey: "Certificates", OutputItemKey: ""}, + "DescribeDBClusterParameterGroups": {Verb: "Get", Resource: "DBClusterParameterGroup", OutputListKey: "DBClusterParameterGroups", OutputItemKey: ""}, + "DescribeDBClusterParameters": {Verb: "Get", Resource: "DBClusterParameter", OutputListKey: "Parameters", OutputItemKey: ""}, + "DescribeDBClusterSnapshotAttributes": {Verb: "Get", Resource: "DBClusterSnapshotAttribute", OutputListKey: "", OutputItemKey: "DBClusterSnapshotAttributesResult"}, + "DescribeDBClusterSnapshots": {Verb: "Get", Resource: "DBClusterSnapshot", OutputListKey: "DBClusterSnapshots", OutputItemKey: ""}, + "DescribeDBClusters": {Verb: "Get", Resource: "DBCluster", OutputListKey: "DBClusters", OutputItemKey: ""}, + "DescribeDBEngineVersions": {Verb: "Get", Resource: "DBEngineVersion", OutputListKey: "DBEngineVersions", OutputItemKey: ""}, + "DescribeDBInstances": {Verb: "Get", Resource: "DBInstance", OutputListKey: "DBInstances", OutputItemKey: ""}, + "DescribeDBSubnetGroups": {Verb: "Get", Resource: "DBSubnetGroup", OutputListKey: "DBSubnetGroups", OutputItemKey: ""}, + "DescribeEngineDefaultClusterParameters": {Verb: "Get", Resource: "EngineDefaultClusterParameter", OutputListKey: "", OutputItemKey: "EngineDefaults"}, + "DescribeEventCategories": {Verb: "Get", Resource: "EventCategory", OutputListKey: "EventCategoriesMapList", OutputItemKey: ""}, + "DescribeEventSubscriptions": {Verb: "Get", Resource: "EventSubscription", OutputListKey: "EventSubscriptionsList", OutputItemKey: ""}, + "DescribeEvents": {Verb: "Get", Resource: "Event", OutputListKey: "Events", OutputItemKey: ""}, + "DescribeGlobalClusters": {Verb: "Get", Resource: "GlobalCluster", OutputListKey: "GlobalClusters", OutputItemKey: ""}, + "DescribeOrderableDBInstanceOptions": {Verb: "Get", Resource: "OrderableDBInstanceOption", OutputListKey: "OrderableDBInstanceOptions", OutputItemKey: ""}, + "DescribePendingMaintenanceActions": {Verb: "Get", Resource: "PendingMaintenanceAction", OutputListKey: "PendingMaintenanceActions", OutputItemKey: ""}, + "ListTagsForResource": {Verb: "List", Resource: "TagsForResource", OutputListKey: "TagList", OutputItemKey: ""}, + "ModifyDBCluster": {Verb: "Update", Resource: "DBCluster", OutputListKey: "", OutputItemKey: "DBCluster"}, + "ModifyDBClusterParameterGroup": {Verb: "Update", Resource: "DBClusterParameterGroup", OutputListKey: "", OutputItemKey: ""}, + "ModifyDBClusterSnapshotAttribute": {Verb: "Update", Resource: "DBClusterSnapshotAttribute", OutputListKey: "", OutputItemKey: "DBClusterSnapshotAttributesResult"}, + "ModifyDBInstance": {Verb: "Update", Resource: "DBInstance", OutputListKey: "", OutputItemKey: "DBInstance"}, + "ModifyDBSubnetGroup": {Verb: "Update", Resource: "DBSubnetGroup", OutputListKey: "", OutputItemKey: "DBSubnetGroup"}, + "ModifyEventSubscription": {Verb: "Update", Resource: "EventSubscription", OutputListKey: "", OutputItemKey: "EventSubscription"}, + "ModifyGlobalCluster": {Verb: "Update", Resource: "GlobalCluster", OutputListKey: "", OutputItemKey: "GlobalCluster"}, + }) crud.Register("dsql", map[string]crud.OpMeta{ "CreateCluster": {Verb: "Create", Resource: "Cluster", OutputListKey: "", OutputItemKey: "encryptionDetails", Method: "POST", URI: "/cluster"}, "CreateStream": {Verb: "Create", Resource: "Stream", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/stream/{clusterIdentifier}"}, @@ -2946,6 +3274,159 @@ func init() { "UpdateNodegroupVersion": {Verb: "Update", Resource: "NodegroupVersion", OutputListKey: "", OutputItemKey: "update", Method: "POST", URI: "/clusters/{clusterName}/node-groups/{nodegroupName}/update-version"}, "UpdatePodIdentityAssociation": {Verb: "Update", Resource: "PodIdentityAssociation", OutputListKey: "", OutputItemKey: "association", Method: "POST", URI: "/clusters/{clusterName}/pod-identity-associations/{associationId}"}, }) + crud.Register("elasticache", map[string]crud.OpMeta{ + "CreateCacheCluster": {Verb: "Create", Resource: "CacheCluster", OutputListKey: "", OutputItemKey: "CacheCluster"}, + "CreateCacheParameterGroup": {Verb: "Create", Resource: "CacheParameterGroup", OutputListKey: "", OutputItemKey: "CacheParameterGroup"}, + "CreateCacheSecurityGroup": {Verb: "Create", Resource: "CacheSecurityGroup", OutputListKey: "", OutputItemKey: "CacheSecurityGroup"}, + "CreateCacheSubnetGroup": {Verb: "Create", Resource: "CacheSubnetGroup", OutputListKey: "", OutputItemKey: "CacheSubnetGroup"}, + "CreateGlobalReplicationGroup": {Verb: "Create", Resource: "GlobalReplicationGroup", OutputListKey: "", OutputItemKey: "GlobalReplicationGroup"}, + "CreateReplicationGroup": {Verb: "Create", Resource: "ReplicationGroup", OutputListKey: "", OutputItemKey: "ReplicationGroup"}, + "CreateServerlessCache": {Verb: "Create", Resource: "ServerlessCache", OutputListKey: "", OutputItemKey: "ServerlessCache"}, + "CreateServerlessCacheSnapshot": {Verb: "Create", Resource: "ServerlessCacheSnapshot", OutputListKey: "", OutputItemKey: "ServerlessCacheSnapshot"}, + "CreateSnapshot": {Verb: "Create", Resource: "Snapshot", OutputListKey: "", OutputItemKey: "Snapshot"}, + "CreateUser": {Verb: "Create", Resource: "User", OutputListKey: "UserGroupIds", OutputItemKey: "Authentication"}, + "CreateUserGroup": {Verb: "Create", Resource: "UserGroup", OutputListKey: "ReplicationGroups", OutputItemKey: "PendingChanges"}, + "DeleteCacheCluster": {Verb: "Delete", Resource: "CacheCluster", OutputListKey: "", OutputItemKey: "CacheCluster"}, + "DeleteCacheParameterGroup": {Verb: "Delete", Resource: "CacheParameterGroup", OutputListKey: "", OutputItemKey: ""}, + "DeleteCacheSecurityGroup": {Verb: "Delete", Resource: "CacheSecurityGroup", OutputListKey: "", OutputItemKey: ""}, + "DeleteCacheSubnetGroup": {Verb: "Delete", Resource: "CacheSubnetGroup", OutputListKey: "", OutputItemKey: ""}, + "DeleteGlobalReplicationGroup": {Verb: "Delete", Resource: "GlobalReplicationGroup", OutputListKey: "", OutputItemKey: "GlobalReplicationGroup"}, + "DeleteReplicationGroup": {Verb: "Delete", Resource: "ReplicationGroup", OutputListKey: "", OutputItemKey: "ReplicationGroup"}, + "DeleteServerlessCache": {Verb: "Delete", Resource: "ServerlessCache", OutputListKey: "", OutputItemKey: "ServerlessCache"}, + "DeleteServerlessCacheSnapshot": {Verb: "Delete", Resource: "ServerlessCacheSnapshot", OutputListKey: "", OutputItemKey: "ServerlessCacheSnapshot"}, + "DeleteSnapshot": {Verb: "Delete", Resource: "Snapshot", OutputListKey: "", OutputItemKey: "Snapshot"}, + "DeleteUser": {Verb: "Delete", Resource: "User", OutputListKey: "UserGroupIds", OutputItemKey: "Authentication"}, + "DeleteUserGroup": {Verb: "Delete", Resource: "UserGroup", OutputListKey: "ReplicationGroups", OutputItemKey: "PendingChanges"}, + "DescribeCacheClusters": {Verb: "Get", Resource: "CacheCluster", OutputListKey: "CacheClusters", OutputItemKey: ""}, + "DescribeCacheEngineVersions": {Verb: "Get", Resource: "CacheEngineVersion", OutputListKey: "CacheEngineVersions", OutputItemKey: ""}, + "DescribeCacheParameterGroups": {Verb: "Get", Resource: "CacheParameterGroup", OutputListKey: "CacheParameterGroups", OutputItemKey: ""}, + "DescribeCacheParameters": {Verb: "Get", Resource: "CacheParameter", OutputListKey: "CacheNodeTypeSpecificParameters", OutputItemKey: ""}, + "DescribeCacheSecurityGroups": {Verb: "Get", Resource: "CacheSecurityGroup", OutputListKey: "CacheSecurityGroups", OutputItemKey: ""}, + "DescribeCacheSubnetGroups": {Verb: "Get", Resource: "CacheSubnetGroup", OutputListKey: "CacheSubnetGroups", OutputItemKey: ""}, + "DescribeEngineDefaultParameters": {Verb: "Get", Resource: "EngineDefaultParameter", OutputListKey: "", OutputItemKey: "EngineDefaults"}, + "DescribeEvents": {Verb: "Get", Resource: "Event", OutputListKey: "Events", OutputItemKey: ""}, + "DescribeGlobalReplicationGroups": {Verb: "Get", Resource: "GlobalReplicationGroup", OutputListKey: "GlobalReplicationGroups", OutputItemKey: ""}, + "DescribeReplicationGroups": {Verb: "Get", Resource: "ReplicationGroup", OutputListKey: "ReplicationGroups", OutputItemKey: ""}, + "DescribeReservedCacheNodes": {Verb: "Get", Resource: "ReservedCacheNode", OutputListKey: "ReservedCacheNodes", OutputItemKey: ""}, + "DescribeReservedCacheNodesOfferings": {Verb: "Get", Resource: "ReservedCacheNodesOffering", OutputListKey: "ReservedCacheNodesOfferings", OutputItemKey: ""}, + "DescribeServerlessCacheSnapshots": {Verb: "Get", Resource: "ServerlessCacheSnapshot", OutputListKey: "ServerlessCacheSnapshots", OutputItemKey: ""}, + "DescribeServerlessCaches": {Verb: "Get", Resource: "ServerlessCache", OutputListKey: "ServerlessCaches", OutputItemKey: ""}, + "DescribeServiceUpdates": {Verb: "Get", Resource: "ServiceUpdate", OutputListKey: "ServiceUpdates", OutputItemKey: ""}, + "DescribeSnapshots": {Verb: "Get", Resource: "Snapshot", OutputListKey: "Snapshots", OutputItemKey: ""}, + "DescribeUpdateActions": {Verb: "Get", Resource: "UpdateAction", OutputListKey: "UpdateActions", OutputItemKey: ""}, + "DescribeUserGroups": {Verb: "Get", Resource: "UserGroup", OutputListKey: "UserGroups", OutputItemKey: ""}, + "DescribeUsers": {Verb: "Get", Resource: "User", OutputListKey: "Users", OutputItemKey: ""}, + "ListAllowedNodeTypeModifications": {Verb: "List", Resource: "AllowedNodeTypeModification", OutputListKey: "ScaleDownModifications", OutputItemKey: ""}, + "ListTagsForResource": {Verb: "List", Resource: "TagsForResource", OutputListKey: "TagList", OutputItemKey: ""}, + "ModifyCacheCluster": {Verb: "Update", Resource: "CacheCluster", OutputListKey: "", OutputItemKey: "CacheCluster"}, + "ModifyCacheParameterGroup": {Verb: "Update", Resource: "CacheParameterGroup", OutputListKey: "", OutputItemKey: ""}, + "ModifyCacheSubnetGroup": {Verb: "Update", Resource: "CacheSubnetGroup", OutputListKey: "", OutputItemKey: "CacheSubnetGroup"}, + "ModifyGlobalReplicationGroup": {Verb: "Update", Resource: "GlobalReplicationGroup", OutputListKey: "", OutputItemKey: "GlobalReplicationGroup"}, + "ModifyReplicationGroup": {Verb: "Update", Resource: "ReplicationGroup", OutputListKey: "", OutputItemKey: "ReplicationGroup"}, + "ModifyReplicationGroupShardConfiguration": {Verb: "Update", Resource: "ReplicationGroupShardConfiguration", OutputListKey: "", OutputItemKey: "ReplicationGroup"}, + "ModifyServerlessCache": {Verb: "Update", Resource: "ServerlessCache", OutputListKey: "", OutputItemKey: "ServerlessCache"}, + "ModifyUser": {Verb: "Update", Resource: "User", OutputListKey: "UserGroupIds", OutputItemKey: "Authentication"}, + "ModifyUserGroup": {Verb: "Update", Resource: "UserGroup", OutputListKey: "ReplicationGroups", OutputItemKey: "PendingChanges"}, + }) + crud.Register("elasticbeanstalk", map[string]crud.OpMeta{ + "CreateApplication": {Verb: "Create", Resource: "Application", OutputListKey: "", OutputItemKey: "Application"}, + "CreateApplicationVersion": {Verb: "Create", Resource: "ApplicationVersion", OutputListKey: "", OutputItemKey: "ApplicationVersion"}, + "CreateConfigurationTemplate": {Verb: "Create", Resource: "ConfigurationTemplate", OutputListKey: "OptionSettings", OutputItemKey: ""}, + "CreateEnvironment": {Verb: "Create", Resource: "Environment", OutputListKey: "EnvironmentLinks", OutputItemKey: "Resources"}, + "CreatePlatformVersion": {Verb: "Create", Resource: "PlatformVersion", OutputListKey: "", OutputItemKey: "Builder"}, + "CreateStorageLocation": {Verb: "Create", Resource: "StorageLocation", OutputListKey: "", OutputItemKey: ""}, + "DeleteApplication": {Verb: "Delete", Resource: "Application", OutputListKey: "", OutputItemKey: ""}, + "DeleteApplicationVersion": {Verb: "Delete", Resource: "ApplicationVersion", OutputListKey: "", OutputItemKey: ""}, + "DeleteConfigurationTemplate": {Verb: "Delete", Resource: "ConfigurationTemplate", OutputListKey: "", OutputItemKey: ""}, + "DeleteEnvironmentConfiguration": {Verb: "Delete", Resource: "EnvironmentConfiguration", OutputListKey: "", OutputItemKey: ""}, + "DeletePlatformVersion": {Verb: "Delete", Resource: "PlatformVersion", OutputListKey: "", OutputItemKey: "PlatformSummary"}, + "DescribeAccountAttributes": {Verb: "Get", Resource: "AccountAttribute", OutputListKey: "", OutputItemKey: "ResourceQuotas"}, + "DescribeApplicationVersions": {Verb: "Get", Resource: "ApplicationVersion", OutputListKey: "ApplicationVersions", OutputItemKey: ""}, + "DescribeApplications": {Verb: "Get", Resource: "Application", OutputListKey: "Applications", OutputItemKey: ""}, + "DescribeConfigurationOptions": {Verb: "Get", Resource: "ConfigurationOption", OutputListKey: "Options", OutputItemKey: ""}, + "DescribeConfigurationSettings": {Verb: "Get", Resource: "ConfigurationSetting", OutputListKey: "ConfigurationSettings", OutputItemKey: ""}, + "DescribeEnvironmentHealth": {Verb: "Get", Resource: "EnvironmentHealth", OutputListKey: "Causes", OutputItemKey: "ApplicationMetrics"}, + "DescribeEnvironmentManagedActionHistory": {Verb: "Get", Resource: "EnvironmentManagedActionHistory", OutputListKey: "ManagedActionHistoryItems", OutputItemKey: ""}, + "DescribeEnvironmentManagedActions": {Verb: "Get", Resource: "EnvironmentManagedAction", OutputListKey: "ManagedActions", OutputItemKey: ""}, + "DescribeEnvironmentResources": {Verb: "Get", Resource: "EnvironmentResource", OutputListKey: "", OutputItemKey: "EnvironmentResources"}, + "DescribeEnvironments": {Verb: "Get", Resource: "Environment", OutputListKey: "Environments", OutputItemKey: ""}, + "DescribeEvents": {Verb: "Get", Resource: "Event", OutputListKey: "Events", OutputItemKey: ""}, + "DescribeInstancesHealth": {Verb: "Get", Resource: "InstancesHealth", OutputListKey: "InstanceHealthList", OutputItemKey: ""}, + "DescribePlatformVersion": {Verb: "Get", Resource: "PlatformVersion", OutputListKey: "", OutputItemKey: "PlatformDescription"}, + "ListAvailableSolutionStacks": {Verb: "List", Resource: "AvailableSolutionStack", OutputListKey: "SolutionStackDetails", OutputItemKey: ""}, + "ListPlatformBranches": {Verb: "List", Resource: "PlatformBranche", OutputListKey: "PlatformBranchSummaryList", OutputItemKey: ""}, + "ListPlatformVersions": {Verb: "List", Resource: "PlatformVersion", OutputListKey: "PlatformSummaryList", OutputItemKey: ""}, + "ListTagsForResource": {Verb: "List", Resource: "TagsForResource", OutputListKey: "ResourceTags", OutputItemKey: ""}, + "UpdateApplication": {Verb: "Update", Resource: "Application", OutputListKey: "", OutputItemKey: "Application"}, + "UpdateApplicationResourceLifecycle": {Verb: "Update", Resource: "ApplicationResourceLifecycle", OutputListKey: "", OutputItemKey: "ResourceLifecycleConfig"}, + "UpdateApplicationVersion": {Verb: "Update", Resource: "ApplicationVersion", OutputListKey: "", OutputItemKey: "ApplicationVersion"}, + "UpdateConfigurationTemplate": {Verb: "Update", Resource: "ConfigurationTemplate", OutputListKey: "OptionSettings", OutputItemKey: ""}, + "UpdateEnvironment": {Verb: "Update", Resource: "Environment", OutputListKey: "EnvironmentLinks", OutputItemKey: "Resources"}, + "UpdateTagsForResource": {Verb: "Update", Resource: "TagsForResource", OutputListKey: "", OutputItemKey: ""}, + }) + crud.Register("elasticloadbalancing", map[string]crud.OpMeta{ + "CreateAppCookieStickinessPolicy": {Verb: "Create", Resource: "AppCookieStickinessPolicy", OutputListKey: "", OutputItemKey: ""}, + "CreateLBCookieStickinessPolicy": {Verb: "Create", Resource: "LBCookieStickinessPolicy", OutputListKey: "", OutputItemKey: ""}, + "CreateLoadBalancer": {Verb: "Create", Resource: "LoadBalancer", OutputListKey: "", OutputItemKey: ""}, + "CreateLoadBalancerListeners": {Verb: "Create", Resource: "LoadBalancerListener", OutputListKey: "", OutputItemKey: ""}, + "CreateLoadBalancerPolicy": {Verb: "Create", Resource: "LoadBalancerPolicy", OutputListKey: "", OutputItemKey: ""}, + "DeleteLoadBalancer": {Verb: "Delete", Resource: "LoadBalancer", OutputListKey: "", OutputItemKey: ""}, + "DeleteLoadBalancerListeners": {Verb: "Delete", Resource: "LoadBalancerListener", OutputListKey: "", OutputItemKey: ""}, + "DeleteLoadBalancerPolicy": {Verb: "Delete", Resource: "LoadBalancerPolicy", OutputListKey: "", OutputItemKey: ""}, + "DeregisterInstancesFromLoadBalancer": {Verb: "Delete", Resource: "InstancesFromLoadBalancer", OutputListKey: "Instances", OutputItemKey: ""}, + "DescribeAccountLimits": {Verb: "Get", Resource: "AccountLimit", OutputListKey: "Limits", OutputItemKey: ""}, + "DescribeInstanceHealth": {Verb: "Get", Resource: "InstanceHealth", OutputListKey: "InstanceStates", OutputItemKey: ""}, + "DescribeLoadBalancerAttributes": {Verb: "Get", Resource: "LoadBalancerAttribute", OutputListKey: "", OutputItemKey: "LoadBalancerAttributes"}, + "DescribeLoadBalancerPolicies": {Verb: "Get", Resource: "LoadBalancerPolicy", OutputListKey: "PolicyDescriptions", OutputItemKey: ""}, + "DescribeLoadBalancerPolicyTypes": {Verb: "Get", Resource: "LoadBalancerPolicyType", OutputListKey: "PolicyTypeDescriptions", OutputItemKey: ""}, + "DescribeLoadBalancers": {Verb: "Get", Resource: "LoadBalancer", OutputListKey: "LoadBalancerDescriptions", OutputItemKey: ""}, + "DescribeTags": {Verb: "Get", Resource: "Tag", OutputListKey: "TagDescriptions", OutputItemKey: ""}, + "ModifyLoadBalancerAttributes": {Verb: "Update", Resource: "LoadBalancerAttribute", OutputListKey: "", OutputItemKey: "LoadBalancerAttributes"}, + "RegisterInstancesWithLoadBalancer": {Verb: "Create", Resource: "InstancesWithLoadBalancer", OutputListKey: "Instances", OutputItemKey: ""}, + }) + crud.Register("elasticloadbalancingv2", map[string]crud.OpMeta{ + "CreateListener": {Verb: "Create", Resource: "Listener", OutputListKey: "Listeners", OutputItemKey: ""}, + "CreateLoadBalancer": {Verb: "Create", Resource: "LoadBalancer", OutputListKey: "LoadBalancers", OutputItemKey: ""}, + "CreateRule": {Verb: "Create", Resource: "Rule", OutputListKey: "Rules", OutputItemKey: ""}, + "CreateTargetGroup": {Verb: "Create", Resource: "TargetGroup", OutputListKey: "TargetGroups", OutputItemKey: ""}, + "CreateTrustStore": {Verb: "Create", Resource: "TrustStore", OutputListKey: "TrustStores", OutputItemKey: ""}, + "DeleteListener": {Verb: "Delete", Resource: "Listener", OutputListKey: "", OutputItemKey: ""}, + "DeleteLoadBalancer": {Verb: "Delete", Resource: "LoadBalancer", OutputListKey: "", OutputItemKey: ""}, + "DeleteRule": {Verb: "Delete", Resource: "Rule", OutputListKey: "", OutputItemKey: ""}, + "DeleteSharedTrustStoreAssociation": {Verb: "Delete", Resource: "SharedTrustStoreAssociation", OutputListKey: "", OutputItemKey: ""}, + "DeleteTargetGroup": {Verb: "Delete", Resource: "TargetGroup", OutputListKey: "", OutputItemKey: ""}, + "DeleteTrustStore": {Verb: "Delete", Resource: "TrustStore", OutputListKey: "", OutputItemKey: ""}, + "DeregisterTargets": {Verb: "Delete", Resource: "Target", OutputListKey: "", OutputItemKey: ""}, + "DescribeAccountLimits": {Verb: "Get", Resource: "AccountLimit", OutputListKey: "Limits", OutputItemKey: ""}, + "DescribeCapacityReservation": {Verb: "Get", Resource: "CapacityReservation", OutputListKey: "CapacityReservationState", OutputItemKey: "MinimumLoadBalancerCapacity"}, + "DescribeListenerAttributes": {Verb: "Get", Resource: "ListenerAttribute", OutputListKey: "Attributes", OutputItemKey: ""}, + "DescribeListenerCertificates": {Verb: "Get", Resource: "ListenerCertificate", OutputListKey: "Certificates", OutputItemKey: ""}, + "DescribeListeners": {Verb: "Get", Resource: "Listener", OutputListKey: "Listeners", OutputItemKey: ""}, + "DescribeLoadBalancerAttributes": {Verb: "Get", Resource: "LoadBalancerAttribute", OutputListKey: "Attributes", OutputItemKey: ""}, + "DescribeLoadBalancers": {Verb: "Get", Resource: "LoadBalancer", OutputListKey: "LoadBalancers", OutputItemKey: ""}, + "DescribeRules": {Verb: "Get", Resource: "Rule", OutputListKey: "Rules", OutputItemKey: ""}, + "DescribeSSLPolicies": {Verb: "Get", Resource: "SSLPolicy", OutputListKey: "SslPolicies", OutputItemKey: ""}, + "DescribeTags": {Verb: "Get", Resource: "Tag", OutputListKey: "TagDescriptions", OutputItemKey: ""}, + "DescribeTargetGroupAttributes": {Verb: "Get", Resource: "TargetGroupAttribute", OutputListKey: "Attributes", OutputItemKey: ""}, + "DescribeTargetGroups": {Verb: "Get", Resource: "TargetGroup", OutputListKey: "TargetGroups", OutputItemKey: ""}, + "DescribeTargetHealth": {Verb: "Get", Resource: "TargetHealth", OutputListKey: "TargetHealthDescriptions", OutputItemKey: ""}, + "DescribeTrustStoreAssociations": {Verb: "Get", Resource: "TrustStoreAssociation", OutputListKey: "TrustStoreAssociations", OutputItemKey: ""}, + "DescribeTrustStoreRevocations": {Verb: "Get", Resource: "TrustStoreRevocation", OutputListKey: "TrustStoreRevocations", OutputItemKey: ""}, + "DescribeTrustStores": {Verb: "Get", Resource: "TrustStore", OutputListKey: "TrustStores", OutputItemKey: ""}, + "GetResourcePolicy": {Verb: "Get", Resource: "ResourcePolicy", OutputListKey: "", OutputItemKey: ""}, + "GetTrustStoreCaCertificatesBundle": {Verb: "Get", Resource: "TrustStoreCaCertificatesBundle", OutputListKey: "", OutputItemKey: ""}, + "GetTrustStoreRevocationContent": {Verb: "Get", Resource: "TrustStoreRevocationContent", OutputListKey: "", OutputItemKey: ""}, + "ModifyCapacityReservation": {Verb: "Update", Resource: "CapacityReservation", OutputListKey: "CapacityReservationState", OutputItemKey: "MinimumLoadBalancerCapacity"}, + "ModifyIpPools": {Verb: "Update", Resource: "IpPool", OutputListKey: "", OutputItemKey: "IpamPools"}, + "ModifyListener": {Verb: "Update", Resource: "Listener", OutputListKey: "Listeners", OutputItemKey: ""}, + "ModifyListenerAttributes": {Verb: "Update", Resource: "ListenerAttribute", OutputListKey: "Attributes", OutputItemKey: ""}, + "ModifyLoadBalancerAttributes": {Verb: "Update", Resource: "LoadBalancerAttribute", OutputListKey: "Attributes", OutputItemKey: ""}, + "ModifyRule": {Verb: "Update", Resource: "Rule", OutputListKey: "Rules", OutputItemKey: ""}, + "ModifyTargetGroup": {Verb: "Update", Resource: "TargetGroup", OutputListKey: "TargetGroups", OutputItemKey: ""}, + "ModifyTargetGroupAttributes": {Verb: "Update", Resource: "TargetGroupAttribute", OutputListKey: "Attributes", OutputItemKey: ""}, + "ModifyTrustStore": {Verb: "Update", Resource: "TrustStore", OutputListKey: "TrustStores", OutputItemKey: ""}, + "RegisterTargets": {Verb: "Create", Resource: "Target", OutputListKey: "", OutputItemKey: ""}, + }) crud.Register("elasticsearchservice", map[string]crud.OpMeta{ "CreateElasticsearchDomain": {Verb: "Create", Resource: "ElasticsearchDomain", OutputListKey: "", OutputItemKey: "DomainStatus", Method: "POST", URI: "/2015-01-01/es/domain"}, "CreateOutboundCrossClusterSearchConnection": {Verb: "Create", Resource: "OutboundCrossClusterSearchConnection", OutputListKey: "", OutputItemKey: "ConnectionStatus", Method: "POST", URI: "/2015-01-01/es/ccs/outboundConnection"}, @@ -3813,6 +4294,147 @@ func init() { "UpdateFHIRDatastore": {Verb: "Update", Resource: "FHIRDatastore", OutputListKey: "", OutputItemKey: "DatastoreProperties"}, "UpdateProfileWithAgent": {Verb: "Update", Resource: "ProfileWithAgent", OutputListKey: "", OutputItemKey: "AgentResponse", Method: "POST", URI: "/update-profile-with-agent"}, }) + crud.Register("iam", map[string]crud.OpMeta{ + "CreateAccessKey": {Verb: "Create", Resource: "AccessKey", OutputListKey: "", OutputItemKey: "AccessKey"}, + "CreateAccountAlias": {Verb: "Create", Resource: "AccountAlia", OutputListKey: "", OutputItemKey: ""}, + "CreateDelegationRequest": {Verb: "Create", Resource: "DelegationRequest", OutputListKey: "", OutputItemKey: ""}, + "CreateGroup": {Verb: "Create", Resource: "Group", OutputListKey: "", OutputItemKey: "Group"}, + "CreateInstanceProfile": {Verb: "Create", Resource: "InstanceProfile", OutputListKey: "", OutputItemKey: "InstanceProfile"}, + "CreateLoginProfile": {Verb: "Create", Resource: "LoginProfile", OutputListKey: "", OutputItemKey: "LoginProfile"}, + "CreateOpenIDConnectProvider": {Verb: "Create", Resource: "OpenIDConnectProvider", OutputListKey: "Tags", OutputItemKey: ""}, + "CreatePolicy": {Verb: "Create", Resource: "Policy", OutputListKey: "", OutputItemKey: "Policy"}, + "CreatePolicyVersion": {Verb: "Create", Resource: "PolicyVersion", OutputListKey: "", OutputItemKey: "PolicyVersion"}, + "CreateRole": {Verb: "Create", Resource: "Role", OutputListKey: "", OutputItemKey: "Role"}, + "CreateSAMLProvider": {Verb: "Create", Resource: "SAMLProvider", OutputListKey: "Tags", OutputItemKey: ""}, + "CreateServiceLinkedRole": {Verb: "Create", Resource: "ServiceLinkedRole", OutputListKey: "", OutputItemKey: "Role"}, + "CreateServiceSpecificCredential": {Verb: "Create", Resource: "ServiceSpecificCredential", OutputListKey: "", OutputItemKey: "ServiceSpecificCredential"}, + "CreateUser": {Verb: "Create", Resource: "User", OutputListKey: "", OutputItemKey: "User"}, + "CreateVirtualMFADevice": {Verb: "Create", Resource: "VirtualMFADevice", OutputListKey: "", OutputItemKey: "VirtualMFADevice"}, + "DeleteAccessKey": {Verb: "Delete", Resource: "AccessKey", OutputListKey: "", OutputItemKey: ""}, + "DeleteAccountAlias": {Verb: "Delete", Resource: "AccountAlia", OutputListKey: "", OutputItemKey: ""}, + "DeleteAccountPasswordPolicy": {Verb: "Delete", Resource: "AccountPasswordPolicy", OutputListKey: "", OutputItemKey: ""}, + "DeleteGroup": {Verb: "Delete", Resource: "Group", OutputListKey: "", OutputItemKey: ""}, + "DeleteGroupPolicy": {Verb: "Delete", Resource: "GroupPolicy", OutputListKey: "", OutputItemKey: ""}, + "DeleteInstanceProfile": {Verb: "Delete", Resource: "InstanceProfile", OutputListKey: "", OutputItemKey: ""}, + "DeleteLoginProfile": {Verb: "Delete", Resource: "LoginProfile", OutputListKey: "", OutputItemKey: ""}, + "DeleteOpenIDConnectProvider": {Verb: "Delete", Resource: "OpenIDConnectProvider", OutputListKey: "", OutputItemKey: ""}, + "DeletePolicy": {Verb: "Delete", Resource: "Policy", OutputListKey: "", OutputItemKey: ""}, + "DeletePolicyVersion": {Verb: "Delete", Resource: "PolicyVersion", OutputListKey: "", OutputItemKey: ""}, + "DeleteRole": {Verb: "Delete", Resource: "Role", OutputListKey: "", OutputItemKey: ""}, + "DeleteRolePermissionsBoundary": {Verb: "Delete", Resource: "RolePermissionsBoundary", OutputListKey: "", OutputItemKey: ""}, + "DeleteRolePolicy": {Verb: "Delete", Resource: "RolePolicy", OutputListKey: "", OutputItemKey: ""}, + "DeleteSAMLProvider": {Verb: "Delete", Resource: "SAMLProvider", OutputListKey: "", OutputItemKey: ""}, + "DeleteSSHPublicKey": {Verb: "Delete", Resource: "SSHPublicKey", OutputListKey: "", OutputItemKey: ""}, + "DeleteServerCertificate": {Verb: "Delete", Resource: "ServerCertificate", OutputListKey: "", OutputItemKey: ""}, + "DeleteServiceLinkedRole": {Verb: "Delete", Resource: "ServiceLinkedRole", OutputListKey: "", OutputItemKey: ""}, + "DeleteServiceSpecificCredential": {Verb: "Delete", Resource: "ServiceSpecificCredential", OutputListKey: "", OutputItemKey: ""}, + "DeleteSigningCertificate": {Verb: "Delete", Resource: "SigningCertificate", OutputListKey: "", OutputItemKey: ""}, + "DeleteUser": {Verb: "Delete", Resource: "User", OutputListKey: "", OutputItemKey: ""}, + "DeleteUserPermissionsBoundary": {Verb: "Delete", Resource: "UserPermissionsBoundary", OutputListKey: "", OutputItemKey: ""}, + "DeleteUserPolicy": {Verb: "Delete", Resource: "UserPolicy", OutputListKey: "", OutputItemKey: ""}, + "DeleteVirtualMFADevice": {Verb: "Delete", Resource: "VirtualMFADevice", OutputListKey: "", OutputItemKey: ""}, + "GetAccessKeyLastUsed": {Verb: "Get", Resource: "AccessKeyLastUsed", OutputListKey: "", OutputItemKey: "AccessKeyLastUsed"}, + "GetAccountAuthorizationDetails": {Verb: "Get", Resource: "AccountAuthorizationDetail", OutputListKey: "GroupDetailList", OutputItemKey: ""}, + "GetAccountPasswordPolicy": {Verb: "Get", Resource: "AccountPasswordPolicy", OutputListKey: "", OutputItemKey: "PasswordPolicy"}, + "GetAccountSummary": {Verb: "Get", Resource: "AccountSummary", OutputListKey: "", OutputItemKey: ""}, + "GetContextKeysForCustomPolicy": {Verb: "Get", Resource: "ContextKeysForCustomPolicy", OutputListKey: "ContextKeyNames", OutputItemKey: ""}, + "GetContextKeysForPrincipalPolicy": {Verb: "Get", Resource: "ContextKeysForPrincipalPolicy", OutputListKey: "ContextKeyNames", OutputItemKey: ""}, + "GetCredentialReport": {Verb: "Get", Resource: "CredentialReport", OutputListKey: "", OutputItemKey: ""}, + "GetDelegationRequest": {Verb: "Get", Resource: "DelegationRequest", OutputListKey: "", OutputItemKey: "DelegationRequest"}, + "GetGroup": {Verb: "Get", Resource: "Group", OutputListKey: "Users", OutputItemKey: "Group"}, + "GetGroupPolicy": {Verb: "Get", Resource: "GroupPolicy", OutputListKey: "", OutputItemKey: ""}, + "GetHumanReadableSummary": {Verb: "Get", Resource: "HumanReadableSummary", OutputListKey: "", OutputItemKey: ""}, + "GetInstanceProfile": {Verb: "Get", Resource: "InstanceProfile", OutputListKey: "", OutputItemKey: "InstanceProfile"}, + "GetLoginProfile": {Verb: "Get", Resource: "LoginProfile", OutputListKey: "", OutputItemKey: "LoginProfile"}, + "GetMFADevice": {Verb: "Get", Resource: "MFADevice", OutputListKey: "", OutputItemKey: ""}, + "GetOpenIDConnectProvider": {Verb: "Get", Resource: "OpenIDConnectProvider", OutputListKey: "ClientIDList", OutputItemKey: ""}, + "GetOrganizationsAccessReport": {Verb: "Get", Resource: "OrganizationsAccessReport", OutputListKey: "AccessDetails", OutputItemKey: "ErrorDetails"}, + "GetOutboundWebIdentityFederationInfo": {Verb: "Get", Resource: "OutboundWebIdentityFederationInfo", OutputListKey: "", OutputItemKey: ""}, + "GetPolicy": {Verb: "Get", Resource: "Policy", OutputListKey: "", OutputItemKey: "Policy"}, + "GetPolicyVersion": {Verb: "Get", Resource: "PolicyVersion", OutputListKey: "", OutputItemKey: "PolicyVersion"}, + "GetRole": {Verb: "Get", Resource: "Role", OutputListKey: "", OutputItemKey: "Role"}, + "GetRolePolicy": {Verb: "Get", Resource: "RolePolicy", OutputListKey: "", OutputItemKey: ""}, + "GetSAMLProvider": {Verb: "Get", Resource: "SAMLProvider", OutputListKey: "PrivateKeyList", OutputItemKey: ""}, + "GetSSHPublicKey": {Verb: "Get", Resource: "SSHPublicKey", OutputListKey: "", OutputItemKey: "SSHPublicKey"}, + "GetServerCertificate": {Verb: "Get", Resource: "ServerCertificate", OutputListKey: "", OutputItemKey: "ServerCertificate"}, + "GetServiceLastAccessedDetails": {Verb: "Get", Resource: "ServiceLastAccessedDetail", OutputListKey: "ServicesLastAccessed", OutputItemKey: "Error"}, + "GetServiceLastAccessedDetailsWithEntities": {Verb: "Get", Resource: "ServiceLastAccessedDetailsWithEntity", OutputListKey: "EntityDetailsList", OutputItemKey: "Error"}, + "GetServiceLinkedRoleDeletionStatus": {Verb: "Get", Resource: "ServiceLinkedRoleDeletionStatu", OutputListKey: "", OutputItemKey: "Reason"}, + "GetUser": {Verb: "Get", Resource: "User", OutputListKey: "", OutputItemKey: "User"}, + "GetUserPolicy": {Verb: "Get", Resource: "UserPolicy", OutputListKey: "", OutputItemKey: ""}, + "ListAccessKeys": {Verb: "List", Resource: "AccessKey", OutputListKey: "AccessKeyMetadata", OutputItemKey: ""}, + "ListAccountAliases": {Verb: "List", Resource: "AccountAliase", OutputListKey: "AccountAliases", OutputItemKey: ""}, + "ListAttachedGroupPolicies": {Verb: "List", Resource: "AttachedGroupPolicy", OutputListKey: "AttachedPolicies", OutputItemKey: ""}, + "ListAttachedRolePolicies": {Verb: "List", Resource: "AttachedRolePolicy", OutputListKey: "AttachedPolicies", OutputItemKey: ""}, + "ListAttachedUserPolicies": {Verb: "List", Resource: "AttachedUserPolicy", OutputListKey: "AttachedPolicies", OutputItemKey: ""}, + "ListDelegationRequests": {Verb: "List", Resource: "DelegationRequest", OutputListKey: "DelegationRequests", OutputItemKey: ""}, + "ListEntitiesForPolicy": {Verb: "List", Resource: "EntitiesForPolicy", OutputListKey: "PolicyGroups", OutputItemKey: ""}, + "ListGroupPolicies": {Verb: "List", Resource: "GroupPolicy", OutputListKey: "PolicyNames", OutputItemKey: ""}, + "ListGroups": {Verb: "List", Resource: "Group", OutputListKey: "Groups", OutputItemKey: ""}, + "ListGroupsForUser": {Verb: "List", Resource: "GroupsForUser", OutputListKey: "Groups", OutputItemKey: ""}, + "ListInstanceProfileTags": {Verb: "List", Resource: "InstanceProfileTag", OutputListKey: "Tags", OutputItemKey: ""}, + "ListInstanceProfiles": {Verb: "List", Resource: "InstanceProfile", OutputListKey: "InstanceProfiles", OutputItemKey: ""}, + "ListInstanceProfilesForRole": {Verb: "List", Resource: "InstanceProfilesForRole", OutputListKey: "InstanceProfiles", OutputItemKey: ""}, + "ListMFADeviceTags": {Verb: "List", Resource: "MFADeviceTag", OutputListKey: "Tags", OutputItemKey: ""}, + "ListMFADevices": {Verb: "List", Resource: "MFADevice", OutputListKey: "MFADevices", OutputItemKey: ""}, + "ListOpenIDConnectProviderTags": {Verb: "List", Resource: "OpenIDConnectProviderTag", OutputListKey: "Tags", OutputItemKey: ""}, + "ListOpenIDConnectProviders": {Verb: "List", Resource: "OpenIDConnectProvider", OutputListKey: "OpenIDConnectProviderList", OutputItemKey: ""}, + "ListOrganizationsFeatures": {Verb: "List", Resource: "OrganizationsFeature", OutputListKey: "EnabledFeatures", OutputItemKey: ""}, + "ListPolicies": {Verb: "List", Resource: "Policy", OutputListKey: "Policies", OutputItemKey: ""}, + "ListPoliciesGrantingServiceAccess": {Verb: "List", Resource: "PoliciesGrantingServiceAccess", OutputListKey: "PoliciesGrantingServiceAccess", OutputItemKey: ""}, + "ListPolicyTags": {Verb: "List", Resource: "PolicyTag", OutputListKey: "Tags", OutputItemKey: ""}, + "ListPolicyVersions": {Verb: "List", Resource: "PolicyVersion", OutputListKey: "Versions", OutputItemKey: ""}, + "ListRolePolicies": {Verb: "List", Resource: "RolePolicy", OutputListKey: "PolicyNames", OutputItemKey: ""}, + "ListRoleTags": {Verb: "List", Resource: "RoleTag", OutputListKey: "Tags", OutputItemKey: ""}, + "ListRoles": {Verb: "List", Resource: "Role", OutputListKey: "Roles", OutputItemKey: ""}, + "ListSAMLProviderTags": {Verb: "List", Resource: "SAMLProviderTag", OutputListKey: "Tags", OutputItemKey: ""}, + "ListSAMLProviders": {Verb: "List", Resource: "SAMLProvider", OutputListKey: "SAMLProviderList", OutputItemKey: ""}, + "ListSSHPublicKeys": {Verb: "List", Resource: "SSHPublicKey", OutputListKey: "SSHPublicKeys", OutputItemKey: ""}, + "ListServerCertificateTags": {Verb: "List", Resource: "ServerCertificateTag", OutputListKey: "Tags", OutputItemKey: ""}, + "ListServerCertificates": {Verb: "List", Resource: "ServerCertificate", OutputListKey: "ServerCertificateMetadataList", OutputItemKey: ""}, + "ListServiceSpecificCredentials": {Verb: "List", Resource: "ServiceSpecificCredential", OutputListKey: "ServiceSpecificCredentials", OutputItemKey: ""}, + "ListSigningCertificates": {Verb: "List", Resource: "SigningCertificate", OutputListKey: "Certificates", OutputItemKey: ""}, + "ListUserPolicies": {Verb: "List", Resource: "UserPolicy", OutputListKey: "PolicyNames", OutputItemKey: ""}, + "ListUserTags": {Verb: "List", Resource: "UserTag", OutputListKey: "Tags", OutputItemKey: ""}, + "ListUsers": {Verb: "List", Resource: "User", OutputListKey: "Users", OutputItemKey: ""}, + "ListVirtualMFADevices": {Verb: "List", Resource: "VirtualMFADevice", OutputListKey: "VirtualMFADevices", OutputItemKey: ""}, + "PutGroupPolicy": {Verb: "Update", Resource: "GroupPolicy", OutputListKey: "", OutputItemKey: ""}, + "PutRolePermissionsBoundary": {Verb: "Update", Resource: "RolePermissionsBoundary", OutputListKey: "", OutputItemKey: ""}, + "PutRolePolicy": {Verb: "Update", Resource: "RolePolicy", OutputListKey: "", OutputItemKey: ""}, + "PutUserPermissionsBoundary": {Verb: "Update", Resource: "UserPermissionsBoundary", OutputListKey: "", OutputItemKey: ""}, + "PutUserPolicy": {Verb: "Update", Resource: "UserPolicy", OutputListKey: "", OutputItemKey: ""}, + "TagInstanceProfile": {Verb: "Tag", Resource: "InstanceProfile", OutputListKey: "", OutputItemKey: ""}, + "TagMFADevice": {Verb: "Tag", Resource: "MFADevice", OutputListKey: "", OutputItemKey: ""}, + "TagOpenIDConnectProvider": {Verb: "Tag", Resource: "OpenIDConnectProvider", OutputListKey: "", OutputItemKey: ""}, + "TagPolicy": {Verb: "Tag", Resource: "Policy", OutputListKey: "", OutputItemKey: ""}, + "TagRole": {Verb: "Tag", Resource: "Role", OutputListKey: "", OutputItemKey: ""}, + "TagSAMLProvider": {Verb: "Tag", Resource: "SAMLProvider", OutputListKey: "", OutputItemKey: ""}, + "TagServerCertificate": {Verb: "Tag", Resource: "ServerCertificate", OutputListKey: "", OutputItemKey: ""}, + "TagUser": {Verb: "Tag", Resource: "User", OutputListKey: "", OutputItemKey: ""}, + "UntagInstanceProfile": {Verb: "Untag", Resource: "InstanceProfile", OutputListKey: "", OutputItemKey: ""}, + "UntagMFADevice": {Verb: "Untag", Resource: "MFADevice", OutputListKey: "", OutputItemKey: ""}, + "UntagOpenIDConnectProvider": {Verb: "Untag", Resource: "OpenIDConnectProvider", OutputListKey: "", OutputItemKey: ""}, + "UntagPolicy": {Verb: "Untag", Resource: "Policy", OutputListKey: "", OutputItemKey: ""}, + "UntagRole": {Verb: "Untag", Resource: "Role", OutputListKey: "", OutputItemKey: ""}, + "UntagSAMLProvider": {Verb: "Untag", Resource: "SAMLProvider", OutputListKey: "", OutputItemKey: ""}, + "UntagServerCertificate": {Verb: "Untag", Resource: "ServerCertificate", OutputListKey: "", OutputItemKey: ""}, + "UntagUser": {Verb: "Untag", Resource: "User", OutputListKey: "", OutputItemKey: ""}, + "UpdateAccessKey": {Verb: "Update", Resource: "AccessKey", OutputListKey: "", OutputItemKey: ""}, + "UpdateAccountPasswordPolicy": {Verb: "Update", Resource: "AccountPasswordPolicy", OutputListKey: "", OutputItemKey: ""}, + "UpdateAssumeRolePolicy": {Verb: "Update", Resource: "AssumeRolePolicy", OutputListKey: "", OutputItemKey: ""}, + "UpdateDelegationRequest": {Verb: "Update", Resource: "DelegationRequest", OutputListKey: "", OutputItemKey: ""}, + "UpdateGroup": {Verb: "Update", Resource: "Group", OutputListKey: "", OutputItemKey: ""}, + "UpdateLoginProfile": {Verb: "Update", Resource: "LoginProfile", OutputListKey: "", OutputItemKey: ""}, + "UpdateOpenIDConnectProviderThumbprint": {Verb: "Update", Resource: "OpenIDConnectProviderThumbprint", OutputListKey: "", OutputItemKey: ""}, + "UpdateRole": {Verb: "Update", Resource: "Role", OutputListKey: "", OutputItemKey: ""}, + "UpdateRoleDescription": {Verb: "Update", Resource: "RoleDescription", OutputListKey: "", OutputItemKey: "Role"}, + "UpdateSAMLProvider": {Verb: "Update", Resource: "SAMLProvider", OutputListKey: "", OutputItemKey: ""}, + "UpdateSSHPublicKey": {Verb: "Update", Resource: "SSHPublicKey", OutputListKey: "", OutputItemKey: ""}, + "UpdateServerCertificate": {Verb: "Update", Resource: "ServerCertificate", OutputListKey: "", OutputItemKey: ""}, + "UpdateServiceSpecificCredential": {Verb: "Update", Resource: "ServiceSpecificCredential", OutputListKey: "", OutputItemKey: ""}, + "UpdateSigningCertificate": {Verb: "Update", Resource: "SigningCertificate", OutputListKey: "", OutputItemKey: ""}, + "UpdateUser": {Verb: "Update", Resource: "User", OutputListKey: "", OutputItemKey: ""}, + }) crud.Register("inspector2", map[string]crud.OpMeta{ "BatchGetAccountStatus": {Verb: "List", Resource: "AccountStatu", OutputListKey: "accounts", OutputItemKey: "", Method: "POST", URI: "/status/batch/get"}, "BatchGetCodeSnippet": {Verb: "List", Resource: "CodeSnippet", OutputListKey: "codeSnippetResults", OutputItemKey: "", Method: "POST", URI: "/codesnippet/batchget"}, @@ -5223,6 +5845,56 @@ func init() { "UntagResource": {Verb: "Untag", Resource: "Resource", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/tags/{ResourceArn}"}, "UpdateEnvironment": {Verb: "Update", Resource: "Environment", OutputListKey: "", OutputItemKey: "", Method: "PATCH", URI: "/environments/{Name}"}, }) + crud.Register("neptune", map[string]crud.OpMeta{ + "CreateDBCluster": {Verb: "Create", Resource: "DBCluster", OutputListKey: "", OutputItemKey: "DBCluster"}, + "CreateDBClusterEndpoint": {Verb: "Create", Resource: "DBClusterEndpoint", OutputListKey: "ExcludedMembers", OutputItemKey: ""}, + "CreateDBClusterParameterGroup": {Verb: "Create", Resource: "DBClusterParameterGroup", OutputListKey: "", OutputItemKey: "DBClusterParameterGroup"}, + "CreateDBClusterSnapshot": {Verb: "Create", Resource: "DBClusterSnapshot", OutputListKey: "", OutputItemKey: "DBClusterSnapshot"}, + "CreateDBInstance": {Verb: "Create", Resource: "DBInstance", OutputListKey: "", OutputItemKey: "DBInstance"}, + "CreateDBParameterGroup": {Verb: "Create", Resource: "DBParameterGroup", OutputListKey: "", OutputItemKey: "DBParameterGroup"}, + "CreateDBSubnetGroup": {Verb: "Create", Resource: "DBSubnetGroup", OutputListKey: "", OutputItemKey: "DBSubnetGroup"}, + "CreateEventSubscription": {Verb: "Create", Resource: "EventSubscription", OutputListKey: "", OutputItemKey: "EventSubscription"}, + "CreateGlobalCluster": {Verb: "Create", Resource: "GlobalCluster", OutputListKey: "", OutputItemKey: "GlobalCluster"}, + "DeleteDBCluster": {Verb: "Delete", Resource: "DBCluster", OutputListKey: "", OutputItemKey: "DBCluster"}, + "DeleteDBClusterEndpoint": {Verb: "Delete", Resource: "DBClusterEndpoint", OutputListKey: "ExcludedMembers", OutputItemKey: ""}, + "DeleteDBClusterParameterGroup": {Verb: "Delete", Resource: "DBClusterParameterGroup", OutputListKey: "", OutputItemKey: ""}, + "DeleteDBClusterSnapshot": {Verb: "Delete", Resource: "DBClusterSnapshot", OutputListKey: "", OutputItemKey: "DBClusterSnapshot"}, + "DeleteDBInstance": {Verb: "Delete", Resource: "DBInstance", OutputListKey: "", OutputItemKey: "DBInstance"}, + "DeleteDBParameterGroup": {Verb: "Delete", Resource: "DBParameterGroup", OutputListKey: "", OutputItemKey: ""}, + "DeleteDBSubnetGroup": {Verb: "Delete", Resource: "DBSubnetGroup", OutputListKey: "", OutputItemKey: ""}, + "DeleteEventSubscription": {Verb: "Delete", Resource: "EventSubscription", OutputListKey: "", OutputItemKey: "EventSubscription"}, + "DeleteGlobalCluster": {Verb: "Delete", Resource: "GlobalCluster", OutputListKey: "", OutputItemKey: "GlobalCluster"}, + "DescribeDBClusterEndpoints": {Verb: "Get", Resource: "DBClusterEndpoint", OutputListKey: "DBClusterEndpoints", OutputItemKey: ""}, + "DescribeDBClusterParameterGroups": {Verb: "Get", Resource: "DBClusterParameterGroup", OutputListKey: "DBClusterParameterGroups", OutputItemKey: ""}, + "DescribeDBClusterParameters": {Verb: "Get", Resource: "DBClusterParameter", OutputListKey: "Parameters", OutputItemKey: ""}, + "DescribeDBClusterSnapshotAttributes": {Verb: "Get", Resource: "DBClusterSnapshotAttribute", OutputListKey: "", OutputItemKey: "DBClusterSnapshotAttributesResult"}, + "DescribeDBClusterSnapshots": {Verb: "Get", Resource: "DBClusterSnapshot", OutputListKey: "DBClusterSnapshots", OutputItemKey: ""}, + "DescribeDBClusters": {Verb: "Get", Resource: "DBCluster", OutputListKey: "DBClusters", OutputItemKey: ""}, + "DescribeDBEngineVersions": {Verb: "Get", Resource: "DBEngineVersion", OutputListKey: "DBEngineVersions", OutputItemKey: ""}, + "DescribeDBInstances": {Verb: "Get", Resource: "DBInstance", OutputListKey: "DBInstances", OutputItemKey: ""}, + "DescribeDBParameterGroups": {Verb: "Get", Resource: "DBParameterGroup", OutputListKey: "DBParameterGroups", OutputItemKey: ""}, + "DescribeDBParameters": {Verb: "Get", Resource: "DBParameter", OutputListKey: "Parameters", OutputItemKey: ""}, + "DescribeDBSubnetGroups": {Verb: "Get", Resource: "DBSubnetGroup", OutputListKey: "DBSubnetGroups", OutputItemKey: ""}, + "DescribeEngineDefaultClusterParameters": {Verb: "Get", Resource: "EngineDefaultClusterParameter", OutputListKey: "", OutputItemKey: "EngineDefaults"}, + "DescribeEngineDefaultParameters": {Verb: "Get", Resource: "EngineDefaultParameter", OutputListKey: "", OutputItemKey: "EngineDefaults"}, + "DescribeEventCategories": {Verb: "Get", Resource: "EventCategory", OutputListKey: "EventCategoriesMapList", OutputItemKey: ""}, + "DescribeEventSubscriptions": {Verb: "Get", Resource: "EventSubscription", OutputListKey: "EventSubscriptionsList", OutputItemKey: ""}, + "DescribeEvents": {Verb: "Get", Resource: "Event", OutputListKey: "Events", OutputItemKey: ""}, + "DescribeGlobalClusters": {Verb: "Get", Resource: "GlobalCluster", OutputListKey: "GlobalClusters", OutputItemKey: ""}, + "DescribeOrderableDBInstanceOptions": {Verb: "Get", Resource: "OrderableDBInstanceOption", OutputListKey: "OrderableDBInstanceOptions", OutputItemKey: ""}, + "DescribePendingMaintenanceActions": {Verb: "Get", Resource: "PendingMaintenanceAction", OutputListKey: "PendingMaintenanceActions", OutputItemKey: ""}, + "DescribeValidDBInstanceModifications": {Verb: "Get", Resource: "ValidDBInstanceModification", OutputListKey: "", OutputItemKey: "ValidDBInstanceModificationsMessage"}, + "ListTagsForResource": {Verb: "List", Resource: "TagsForResource", OutputListKey: "TagList", OutputItemKey: ""}, + "ModifyDBCluster": {Verb: "Update", Resource: "DBCluster", OutputListKey: "", OutputItemKey: "DBCluster"}, + "ModifyDBClusterEndpoint": {Verb: "Update", Resource: "DBClusterEndpoint", OutputListKey: "ExcludedMembers", OutputItemKey: ""}, + "ModifyDBClusterParameterGroup": {Verb: "Update", Resource: "DBClusterParameterGroup", OutputListKey: "", OutputItemKey: ""}, + "ModifyDBClusterSnapshotAttribute": {Verb: "Update", Resource: "DBClusterSnapshotAttribute", OutputListKey: "", OutputItemKey: "DBClusterSnapshotAttributesResult"}, + "ModifyDBInstance": {Verb: "Update", Resource: "DBInstance", OutputListKey: "", OutputItemKey: "DBInstance"}, + "ModifyDBParameterGroup": {Verb: "Update", Resource: "DBParameterGroup", OutputListKey: "", OutputItemKey: ""}, + "ModifyDBSubnetGroup": {Verb: "Update", Resource: "DBSubnetGroup", OutputListKey: "", OutputItemKey: "DBSubnetGroup"}, + "ModifyEventSubscription": {Verb: "Update", Resource: "EventSubscription", OutputListKey: "", OutputItemKey: "EventSubscription"}, + "ModifyGlobalCluster": {Verb: "Update", Resource: "GlobalCluster", OutputListKey: "", OutputItemKey: "GlobalCluster"}, + }) crud.Register("networkfirewall", map[string]crud.OpMeta{ "CreateContainerAssociation": {Verb: "Create", Resource: "ContainerAssociation", OutputListKey: "ContainerMonitoringConfigurations", OutputItemKey: ""}, "CreateFirewall": {Verb: "Create", Resource: "Firewall", OutputListKey: "", OutputItemKey: "Firewall"}, @@ -6288,6 +6960,233 @@ func init() { "UntagResource": {Verb: "Untag", Resource: "Resource", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/untagresource"}, "UpdateResourceShare": {Verb: "Update", Resource: "ResourceShare", OutputListKey: "", OutputItemKey: "resourceShare", Method: "POST", URI: "/updateresourceshare"}, }) + crud.Register("rds", map[string]crud.OpMeta{ + "CreateBlueGreenDeployment": {Verb: "Create", Resource: "BlueGreenDeployment", OutputListKey: "", OutputItemKey: "BlueGreenDeployment"}, + "CreateCustomDBEngineVersion": {Verb: "Create", Resource: "CustomDBEngineVersion", OutputListKey: "DatabaseInstallationFiles", OutputItemKey: "DefaultCharacterSet"}, + "CreateDBCluster": {Verb: "Create", Resource: "DBCluster", OutputListKey: "", OutputItemKey: "DBCluster"}, + "CreateDBClusterEndpoint": {Verb: "Create", Resource: "DBClusterEndpoint", OutputListKey: "ExcludedMembers", OutputItemKey: ""}, + "CreateDBClusterParameterGroup": {Verb: "Create", Resource: "DBClusterParameterGroup", OutputListKey: "", OutputItemKey: "DBClusterParameterGroup"}, + "CreateDBClusterSnapshot": {Verb: "Create", Resource: "DBClusterSnapshot", OutputListKey: "", OutputItemKey: "DBClusterSnapshot"}, + "CreateDBInstance": {Verb: "Create", Resource: "DBInstance", OutputListKey: "", OutputItemKey: "DBInstance"}, + "CreateDBInstanceReadReplica": {Verb: "Create", Resource: "DBInstanceReadReplica", OutputListKey: "", OutputItemKey: "DBInstance"}, + "CreateDBParameterGroup": {Verb: "Create", Resource: "DBParameterGroup", OutputListKey: "", OutputItemKey: "DBParameterGroup"}, + "CreateDBProxy": {Verb: "Create", Resource: "DBProxy", OutputListKey: "", OutputItemKey: "DBProxy"}, + "CreateDBProxyEndpoint": {Verb: "Create", Resource: "DBProxyEndpoint", OutputListKey: "", OutputItemKey: "DBProxyEndpoint"}, + "CreateDBSecurityGroup": {Verb: "Create", Resource: "DBSecurityGroup", OutputListKey: "", OutputItemKey: "DBSecurityGroup"}, + "CreateDBShardGroup": {Verb: "Create", Resource: "DBShardGroup", OutputListKey: "TagList", OutputItemKey: ""}, + "CreateDBSnapshot": {Verb: "Create", Resource: "DBSnapshot", OutputListKey: "", OutputItemKey: "DBSnapshot"}, + "CreateDBSubnetGroup": {Verb: "Create", Resource: "DBSubnetGroup", OutputListKey: "", OutputItemKey: "DBSubnetGroup"}, + "CreateEventSubscription": {Verb: "Create", Resource: "EventSubscription", OutputListKey: "", OutputItemKey: "EventSubscription"}, + "CreateGlobalCluster": {Verb: "Create", Resource: "GlobalCluster", OutputListKey: "", OutputItemKey: "GlobalCluster"}, + "CreateIntegration": {Verb: "Create", Resource: "Integration", OutputListKey: "Errors", OutputItemKey: ""}, + "CreateOptionGroup": {Verb: "Create", Resource: "OptionGroup", OutputListKey: "", OutputItemKey: "OptionGroup"}, + "CreateTenantDatabase": {Verb: "Create", Resource: "TenantDatabase", OutputListKey: "", OutputItemKey: "TenantDatabase"}, + "DeleteBlueGreenDeployment": {Verb: "Delete", Resource: "BlueGreenDeployment", OutputListKey: "", OutputItemKey: "BlueGreenDeployment"}, + "DeleteCustomDBEngineVersion": {Verb: "Delete", Resource: "CustomDBEngineVersion", OutputListKey: "DatabaseInstallationFiles", OutputItemKey: "DefaultCharacterSet"}, + "DeleteDBCluster": {Verb: "Delete", Resource: "DBCluster", OutputListKey: "", OutputItemKey: "DBCluster"}, + "DeleteDBClusterAutomatedBackup": {Verb: "Delete", Resource: "DBClusterAutomatedBackup", OutputListKey: "", OutputItemKey: "DBClusterAutomatedBackup"}, + "DeleteDBClusterEndpoint": {Verb: "Delete", Resource: "DBClusterEndpoint", OutputListKey: "ExcludedMembers", OutputItemKey: ""}, + "DeleteDBClusterParameterGroup": {Verb: "Delete", Resource: "DBClusterParameterGroup", OutputListKey: "", OutputItemKey: ""}, + "DeleteDBClusterSnapshot": {Verb: "Delete", Resource: "DBClusterSnapshot", OutputListKey: "", OutputItemKey: "DBClusterSnapshot"}, + "DeleteDBInstance": {Verb: "Delete", Resource: "DBInstance", OutputListKey: "", OutputItemKey: "DBInstance"}, + "DeleteDBInstanceAutomatedBackup": {Verb: "Delete", Resource: "DBInstanceAutomatedBackup", OutputListKey: "", OutputItemKey: "DBInstanceAutomatedBackup"}, + "DeleteDBParameterGroup": {Verb: "Delete", Resource: "DBParameterGroup", OutputListKey: "", OutputItemKey: ""}, + "DeleteDBProxy": {Verb: "Delete", Resource: "DBProxy", OutputListKey: "", OutputItemKey: "DBProxy"}, + "DeleteDBProxyEndpoint": {Verb: "Delete", Resource: "DBProxyEndpoint", OutputListKey: "", OutputItemKey: "DBProxyEndpoint"}, + "DeleteDBSecurityGroup": {Verb: "Delete", Resource: "DBSecurityGroup", OutputListKey: "", OutputItemKey: ""}, + "DeleteDBShardGroup": {Verb: "Delete", Resource: "DBShardGroup", OutputListKey: "TagList", OutputItemKey: ""}, + "DeleteDBSnapshot": {Verb: "Delete", Resource: "DBSnapshot", OutputListKey: "", OutputItemKey: "DBSnapshot"}, + "DeleteDBSubnetGroup": {Verb: "Delete", Resource: "DBSubnetGroup", OutputListKey: "", OutputItemKey: ""}, + "DeleteEventSubscription": {Verb: "Delete", Resource: "EventSubscription", OutputListKey: "", OutputItemKey: "EventSubscription"}, + "DeleteGlobalCluster": {Verb: "Delete", Resource: "GlobalCluster", OutputListKey: "", OutputItemKey: "GlobalCluster"}, + "DeleteIntegration": {Verb: "Delete", Resource: "Integration", OutputListKey: "Errors", OutputItemKey: ""}, + "DeleteOptionGroup": {Verb: "Delete", Resource: "OptionGroup", OutputListKey: "", OutputItemKey: ""}, + "DeleteTenantDatabase": {Verb: "Delete", Resource: "TenantDatabase", OutputListKey: "", OutputItemKey: "TenantDatabase"}, + "DeregisterDBProxyTargets": {Verb: "Delete", Resource: "DBProxyTarget", OutputListKey: "", OutputItemKey: ""}, + "DescribeAccountAttributes": {Verb: "Get", Resource: "AccountAttribute", OutputListKey: "AccountQuotas", OutputItemKey: ""}, + "DescribeBlueGreenDeployments": {Verb: "Get", Resource: "BlueGreenDeployment", OutputListKey: "BlueGreenDeployments", OutputItemKey: ""}, + "DescribeCertificates": {Verb: "Get", Resource: "Certificate", OutputListKey: "Certificates", OutputItemKey: ""}, + "DescribeDBClusterAutomatedBackups": {Verb: "Get", Resource: "DBClusterAutomatedBackup", OutputListKey: "DBClusterAutomatedBackups", OutputItemKey: ""}, + "DescribeDBClusterBacktracks": {Verb: "Get", Resource: "DBClusterBacktrack", OutputListKey: "DBClusterBacktracks", OutputItemKey: ""}, + "DescribeDBClusterEndpoints": {Verb: "Get", Resource: "DBClusterEndpoint", OutputListKey: "DBClusterEndpoints", OutputItemKey: ""}, + "DescribeDBClusterParameterGroups": {Verb: "Get", Resource: "DBClusterParameterGroup", OutputListKey: "DBClusterParameterGroups", OutputItemKey: ""}, + "DescribeDBClusterParameters": {Verb: "Get", Resource: "DBClusterParameter", OutputListKey: "Parameters", OutputItemKey: ""}, + "DescribeDBClusterSnapshotAttributes": {Verb: "Get", Resource: "DBClusterSnapshotAttribute", OutputListKey: "", OutputItemKey: "DBClusterSnapshotAttributesResult"}, + "DescribeDBClusterSnapshots": {Verb: "Get", Resource: "DBClusterSnapshot", OutputListKey: "DBClusterSnapshots", OutputItemKey: ""}, + "DescribeDBClusters": {Verb: "Get", Resource: "DBCluster", OutputListKey: "DBClusters", OutputItemKey: ""}, + "DescribeDBEngineVersions": {Verb: "Get", Resource: "DBEngineVersion", OutputListKey: "DBEngineVersions", OutputItemKey: ""}, + "DescribeDBInstanceAutomatedBackups": {Verb: "Get", Resource: "DBInstanceAutomatedBackup", OutputListKey: "DBInstanceAutomatedBackups", OutputItemKey: ""}, + "DescribeDBInstances": {Verb: "Get", Resource: "DBInstance", OutputListKey: "DBInstances", OutputItemKey: ""}, + "DescribeDBLogFiles": {Verb: "Get", Resource: "DBLogFile", OutputListKey: "DescribeDBLogFiles", OutputItemKey: ""}, + "DescribeDBMajorEngineVersions": {Verb: "Get", Resource: "DBMajorEngineVersion", OutputListKey: "DBMajorEngineVersions", OutputItemKey: ""}, + "DescribeDBParameterGroups": {Verb: "Get", Resource: "DBParameterGroup", OutputListKey: "DBParameterGroups", OutputItemKey: ""}, + "DescribeDBParameters": {Verb: "Get", Resource: "DBParameter", OutputListKey: "Parameters", OutputItemKey: ""}, + "DescribeDBProxies": {Verb: "Get", Resource: "DBProxy", OutputListKey: "DBProxies", OutputItemKey: ""}, + "DescribeDBProxyEndpoints": {Verb: "Get", Resource: "DBProxyEndpoint", OutputListKey: "DBProxyEndpoints", OutputItemKey: ""}, + "DescribeDBProxyTargetGroups": {Verb: "Get", Resource: "DBProxyTargetGroup", OutputListKey: "TargetGroups", OutputItemKey: ""}, + "DescribeDBProxyTargets": {Verb: "Get", Resource: "DBProxyTarget", OutputListKey: "Targets", OutputItemKey: ""}, + "DescribeDBRecommendations": {Verb: "Get", Resource: "DBRecommendation", OutputListKey: "DBRecommendations", OutputItemKey: ""}, + "DescribeDBSecurityGroups": {Verb: "Get", Resource: "DBSecurityGroup", OutputListKey: "DBSecurityGroups", OutputItemKey: ""}, + "DescribeDBShardGroups": {Verb: "Get", Resource: "DBShardGroup", OutputListKey: "DBShardGroups", OutputItemKey: ""}, + "DescribeDBSnapshotAttributes": {Verb: "Get", Resource: "DBSnapshotAttribute", OutputListKey: "", OutputItemKey: "DBSnapshotAttributesResult"}, + "DescribeDBSnapshotTenantDatabases": {Verb: "Get", Resource: "DBSnapshotTenantDatabase", OutputListKey: "DBSnapshotTenantDatabases", OutputItemKey: ""}, + "DescribeDBSnapshots": {Verb: "Get", Resource: "DBSnapshot", OutputListKey: "DBSnapshots", OutputItemKey: ""}, + "DescribeDBSubnetGroups": {Verb: "Get", Resource: "DBSubnetGroup", OutputListKey: "DBSubnetGroups", OutputItemKey: ""}, + "DescribeEngineDefaultClusterParameters": {Verb: "Get", Resource: "EngineDefaultClusterParameter", OutputListKey: "", OutputItemKey: "EngineDefaults"}, + "DescribeEngineDefaultParameters": {Verb: "Get", Resource: "EngineDefaultParameter", OutputListKey: "", OutputItemKey: "EngineDefaults"}, + "DescribeEventCategories": {Verb: "Get", Resource: "EventCategory", OutputListKey: "EventCategoriesMapList", OutputItemKey: ""}, + "DescribeEventSubscriptions": {Verb: "Get", Resource: "EventSubscription", OutputListKey: "EventSubscriptionsList", OutputItemKey: ""}, + "DescribeEvents": {Verb: "Get", Resource: "Event", OutputListKey: "Events", OutputItemKey: ""}, + "DescribeExportTasks": {Verb: "Get", Resource: "ExportTask", OutputListKey: "ExportTasks", OutputItemKey: ""}, + "DescribeGlobalClusters": {Verb: "Get", Resource: "GlobalCluster", OutputListKey: "GlobalClusters", OutputItemKey: ""}, + "DescribeIntegrations": {Verb: "Get", Resource: "Integration", OutputListKey: "Integrations", OutputItemKey: ""}, + "DescribeOptionGroupOptions": {Verb: "Get", Resource: "OptionGroupOption", OutputListKey: "OptionGroupOptions", OutputItemKey: ""}, + "DescribeOptionGroups": {Verb: "Get", Resource: "OptionGroup", OutputListKey: "OptionGroupsList", OutputItemKey: ""}, + "DescribeOrderableDBInstanceOptions": {Verb: "Get", Resource: "OrderableDBInstanceOption", OutputListKey: "OrderableDBInstanceOptions", OutputItemKey: ""}, + "DescribePendingMaintenanceActions": {Verb: "Get", Resource: "PendingMaintenanceAction", OutputListKey: "PendingMaintenanceActions", OutputItemKey: ""}, + "DescribeReservedDBInstances": {Verb: "Get", Resource: "ReservedDBInstance", OutputListKey: "ReservedDBInstances", OutputItemKey: ""}, + "DescribeReservedDBInstancesOfferings": {Verb: "Get", Resource: "ReservedDBInstancesOffering", OutputListKey: "ReservedDBInstancesOfferings", OutputItemKey: ""}, + "DescribeSourceRegions": {Verb: "Get", Resource: "SourceRegion", OutputListKey: "SourceRegions", OutputItemKey: ""}, + "DescribeTenantDatabases": {Verb: "Get", Resource: "TenantDatabase", OutputListKey: "TenantDatabases", OutputItemKey: ""}, + "DescribeValidDBInstanceModifications": {Verb: "Get", Resource: "ValidDBInstanceModification", OutputListKey: "", OutputItemKey: "ValidDBInstanceModificationsMessage"}, + "ListTagsForResource": {Verb: "List", Resource: "TagsForResource", OutputListKey: "TagList", OutputItemKey: ""}, + "ModifyActivityStream": {Verb: "Update", Resource: "ActivityStream", OutputListKey: "", OutputItemKey: ""}, + "ModifyCertificates": {Verb: "Update", Resource: "Certificate", OutputListKey: "", OutputItemKey: "Certificate"}, + "ModifyCurrentDBClusterCapacity": {Verb: "Update", Resource: "CurrentDBClusterCapacity", OutputListKey: "", OutputItemKey: ""}, + "ModifyCustomDBEngineVersion": {Verb: "Update", Resource: "CustomDBEngineVersion", OutputListKey: "DatabaseInstallationFiles", OutputItemKey: "DefaultCharacterSet"}, + "ModifyDBCluster": {Verb: "Update", Resource: "DBCluster", OutputListKey: "", OutputItemKey: "DBCluster"}, + "ModifyDBClusterEndpoint": {Verb: "Update", Resource: "DBClusterEndpoint", OutputListKey: "ExcludedMembers", OutputItemKey: ""}, + "ModifyDBClusterParameterGroup": {Verb: "Update", Resource: "DBClusterParameterGroup", OutputListKey: "", OutputItemKey: ""}, + "ModifyDBClusterSnapshotAttribute": {Verb: "Update", Resource: "DBClusterSnapshotAttribute", OutputListKey: "", OutputItemKey: "DBClusterSnapshotAttributesResult"}, + "ModifyDBInstance": {Verb: "Update", Resource: "DBInstance", OutputListKey: "", OutputItemKey: "DBInstance"}, + "ModifyDBParameterGroup": {Verb: "Update", Resource: "DBParameterGroup", OutputListKey: "", OutputItemKey: ""}, + "ModifyDBProxy": {Verb: "Update", Resource: "DBProxy", OutputListKey: "", OutputItemKey: "DBProxy"}, + "ModifyDBProxyEndpoint": {Verb: "Update", Resource: "DBProxyEndpoint", OutputListKey: "", OutputItemKey: "DBProxyEndpoint"}, + "ModifyDBProxyTargetGroup": {Verb: "Update", Resource: "DBProxyTargetGroup", OutputListKey: "", OutputItemKey: "DBProxyTargetGroup"}, + "ModifyDBRecommendation": {Verb: "Update", Resource: "DBRecommendation", OutputListKey: "", OutputItemKey: "DBRecommendation"}, + "ModifyDBShardGroup": {Verb: "Update", Resource: "DBShardGroup", OutputListKey: "TagList", OutputItemKey: ""}, + "ModifyDBSnapshot": {Verb: "Update", Resource: "DBSnapshot", OutputListKey: "", OutputItemKey: "DBSnapshot"}, + "ModifyDBSnapshotAttribute": {Verb: "Update", Resource: "DBSnapshotAttribute", OutputListKey: "", OutputItemKey: "DBSnapshotAttributesResult"}, + "ModifyDBSubnetGroup": {Verb: "Update", Resource: "DBSubnetGroup", OutputListKey: "", OutputItemKey: "DBSubnetGroup"}, + "ModifyEventSubscription": {Verb: "Update", Resource: "EventSubscription", OutputListKey: "", OutputItemKey: "EventSubscription"}, + "ModifyGlobalCluster": {Verb: "Update", Resource: "GlobalCluster", OutputListKey: "", OutputItemKey: "GlobalCluster"}, + "ModifyIntegration": {Verb: "Update", Resource: "Integration", OutputListKey: "Errors", OutputItemKey: ""}, + "ModifyOptionGroup": {Verb: "Update", Resource: "OptionGroup", OutputListKey: "", OutputItemKey: "OptionGroup"}, + "ModifyTenantDatabase": {Verb: "Update", Resource: "TenantDatabase", OutputListKey: "", OutputItemKey: "TenantDatabase"}, + "RegisterDBProxyTargets": {Verb: "Create", Resource: "DBProxyTarget", OutputListKey: "DBProxyTargets", OutputItemKey: ""}, + }) + crud.Register("redshift", map[string]crud.OpMeta{ + "CreateAuthenticationProfile": {Verb: "Create", Resource: "AuthenticationProfile", OutputListKey: "", OutputItemKey: ""}, + "CreateCluster": {Verb: "Create", Resource: "Cluster", OutputListKey: "", OutputItemKey: "Cluster"}, + "CreateClusterParameterGroup": {Verb: "Create", Resource: "ClusterParameterGroup", OutputListKey: "", OutputItemKey: "ClusterParameterGroup"}, + "CreateClusterSecurityGroup": {Verb: "Create", Resource: "ClusterSecurityGroup", OutputListKey: "", OutputItemKey: "ClusterSecurityGroup"}, + "CreateClusterSnapshot": {Verb: "Create", Resource: "ClusterSnapshot", OutputListKey: "", OutputItemKey: "Snapshot"}, + "CreateClusterSubnetGroup": {Verb: "Create", Resource: "ClusterSubnetGroup", OutputListKey: "", OutputItemKey: "ClusterSubnetGroup"}, + "CreateCustomDomainAssociation": {Verb: "Create", Resource: "CustomDomainAssociation", OutputListKey: "", OutputItemKey: ""}, + "CreateEndpointAccess": {Verb: "Create", Resource: "EndpointAccess", OutputListKey: "VpcSecurityGroups", OutputItemKey: "VpcEndpoint"}, + "CreateEventSubscription": {Verb: "Create", Resource: "EventSubscription", OutputListKey: "", OutputItemKey: "EventSubscription"}, + "CreateHsmClientCertificate": {Verb: "Create", Resource: "HsmClientCertificate", OutputListKey: "", OutputItemKey: "HsmClientCertificate"}, + "CreateHsmConfiguration": {Verb: "Create", Resource: "HsmConfiguration", OutputListKey: "", OutputItemKey: "HsmConfiguration"}, + "CreateIntegration": {Verb: "Create", Resource: "Integration", OutputListKey: "Errors", OutputItemKey: ""}, + "CreateRedshiftIdcApplication": {Verb: "Create", Resource: "RedshiftIdcApplication", OutputListKey: "", OutputItemKey: "RedshiftIdcApplication"}, + "CreateScheduledAction": {Verb: "Create", Resource: "ScheduledAction", OutputListKey: "NextInvocations", OutputItemKey: "TargetAction"}, + "CreateSnapshotCopyGrant": {Verb: "Create", Resource: "SnapshotCopyGrant", OutputListKey: "", OutputItemKey: "SnapshotCopyGrant"}, + "CreateSnapshotSchedule": {Verb: "Create", Resource: "SnapshotSchedule", OutputListKey: "AssociatedClusters", OutputItemKey: ""}, + "CreateTags": {Verb: "Create", Resource: "Tag", OutputListKey: "", OutputItemKey: ""}, + "CreateUsageLimit": {Verb: "Create", Resource: "UsageLimit", OutputListKey: "Tags", OutputItemKey: ""}, + "DeleteAuthenticationProfile": {Verb: "Delete", Resource: "AuthenticationProfile", OutputListKey: "", OutputItemKey: ""}, + "DeleteCluster": {Verb: "Delete", Resource: "Cluster", OutputListKey: "", OutputItemKey: "Cluster"}, + "DeleteClusterParameterGroup": {Verb: "Delete", Resource: "ClusterParameterGroup", OutputListKey: "", OutputItemKey: ""}, + "DeleteClusterSecurityGroup": {Verb: "Delete", Resource: "ClusterSecurityGroup", OutputListKey: "", OutputItemKey: ""}, + "DeleteClusterSnapshot": {Verb: "Delete", Resource: "ClusterSnapshot", OutputListKey: "", OutputItemKey: "Snapshot"}, + "DeleteClusterSubnetGroup": {Verb: "Delete", Resource: "ClusterSubnetGroup", OutputListKey: "", OutputItemKey: ""}, + "DeleteCustomDomainAssociation": {Verb: "Delete", Resource: "CustomDomainAssociation", OutputListKey: "", OutputItemKey: ""}, + "DeleteEndpointAccess": {Verb: "Delete", Resource: "EndpointAccess", OutputListKey: "VpcSecurityGroups", OutputItemKey: "VpcEndpoint"}, + "DeleteEventSubscription": {Verb: "Delete", Resource: "EventSubscription", OutputListKey: "", OutputItemKey: ""}, + "DeleteHsmClientCertificate": {Verb: "Delete", Resource: "HsmClientCertificate", OutputListKey: "", OutputItemKey: ""}, + "DeleteHsmConfiguration": {Verb: "Delete", Resource: "HsmConfiguration", OutputListKey: "", OutputItemKey: ""}, + "DeleteIntegration": {Verb: "Delete", Resource: "Integration", OutputListKey: "Errors", OutputItemKey: ""}, + "DeletePartner": {Verb: "Delete", Resource: "Partner", OutputListKey: "", OutputItemKey: ""}, + "DeleteRedshiftIdcApplication": {Verb: "Delete", Resource: "RedshiftIdcApplication", OutputListKey: "", OutputItemKey: ""}, + "DeleteResourcePolicy": {Verb: "Delete", Resource: "ResourcePolicy", OutputListKey: "", OutputItemKey: ""}, + "DeleteScheduledAction": {Verb: "Delete", Resource: "ScheduledAction", OutputListKey: "", OutputItemKey: ""}, + "DeleteSnapshotCopyGrant": {Verb: "Delete", Resource: "SnapshotCopyGrant", OutputListKey: "", OutputItemKey: ""}, + "DeleteSnapshotSchedule": {Verb: "Delete", Resource: "SnapshotSchedule", OutputListKey: "", OutputItemKey: ""}, + "DeleteTags": {Verb: "Delete", Resource: "Tag", OutputListKey: "", OutputItemKey: ""}, + "DeleteUsageLimit": {Verb: "Delete", Resource: "UsageLimit", OutputListKey: "", OutputItemKey: ""}, + "DeregisterNamespace": {Verb: "Delete", Resource: "Namespace", OutputListKey: "", OutputItemKey: ""}, + "DescribeAccountAttributes": {Verb: "Get", Resource: "AccountAttribute", OutputListKey: "AccountAttributes", OutputItemKey: ""}, + "DescribeAuthenticationProfiles": {Verb: "Get", Resource: "AuthenticationProfile", OutputListKey: "AuthenticationProfiles", OutputItemKey: ""}, + "DescribeClusterDbRevisions": {Verb: "Get", Resource: "ClusterDbRevision", OutputListKey: "ClusterDbRevisions", OutputItemKey: ""}, + "DescribeClusterParameterGroups": {Verb: "Get", Resource: "ClusterParameterGroup", OutputListKey: "ParameterGroups", OutputItemKey: ""}, + "DescribeClusterParameters": {Verb: "Get", Resource: "ClusterParameter", OutputListKey: "Parameters", OutputItemKey: ""}, + "DescribeClusterSecurityGroups": {Verb: "Get", Resource: "ClusterSecurityGroup", OutputListKey: "ClusterSecurityGroups", OutputItemKey: ""}, + "DescribeClusterSnapshots": {Verb: "Get", Resource: "ClusterSnapshot", OutputListKey: "Snapshots", OutputItemKey: ""}, + "DescribeClusterSubnetGroups": {Verb: "Get", Resource: "ClusterSubnetGroup", OutputListKey: "ClusterSubnetGroups", OutputItemKey: ""}, + "DescribeClusterTracks": {Verb: "Get", Resource: "ClusterTrack", OutputListKey: "MaintenanceTracks", OutputItemKey: ""}, + "DescribeClusterVersions": {Verb: "Get", Resource: "ClusterVersion", OutputListKey: "ClusterVersions", OutputItemKey: ""}, + "DescribeClusters": {Verb: "Get", Resource: "Cluster", OutputListKey: "Clusters", OutputItemKey: ""}, + "DescribeCustomDomainAssociations": {Verb: "Get", Resource: "CustomDomainAssociation", OutputListKey: "Associations", OutputItemKey: ""}, + "DescribeDataShares": {Verb: "Get", Resource: "DataShare", OutputListKey: "DataShares", OutputItemKey: ""}, + "DescribeDataSharesForConsumer": {Verb: "Get", Resource: "DataSharesForConsumer", OutputListKey: "DataShares", OutputItemKey: ""}, + "DescribeDataSharesForProducer": {Verb: "Get", Resource: "DataSharesForProducer", OutputListKey: "DataShares", OutputItemKey: ""}, + "DescribeDefaultClusterParameters": {Verb: "Get", Resource: "DefaultClusterParameter", OutputListKey: "", OutputItemKey: "DefaultClusterParameters"}, + "DescribeEndpointAccess": {Verb: "Get", Resource: "EndpointAccess", OutputListKey: "EndpointAccessList", OutputItemKey: ""}, + "DescribeEndpointAuthorization": {Verb: "Get", Resource: "EndpointAuthorization", OutputListKey: "EndpointAuthorizationList", OutputItemKey: ""}, + "DescribeEventCategories": {Verb: "Get", Resource: "EventCategory", OutputListKey: "EventCategoriesMapList", OutputItemKey: ""}, + "DescribeEventSubscriptions": {Verb: "Get", Resource: "EventSubscription", OutputListKey: "EventSubscriptionsList", OutputItemKey: ""}, + "DescribeEvents": {Verb: "Get", Resource: "Event", OutputListKey: "Events", OutputItemKey: ""}, + "DescribeHsmClientCertificates": {Verb: "Get", Resource: "HsmClientCertificate", OutputListKey: "HsmClientCertificates", OutputItemKey: ""}, + "DescribeHsmConfigurations": {Verb: "Get", Resource: "HsmConfiguration", OutputListKey: "HsmConfigurations", OutputItemKey: ""}, + "DescribeInboundIntegrations": {Verb: "Get", Resource: "InboundIntegration", OutputListKey: "InboundIntegrations", OutputItemKey: ""}, + "DescribeIntegrations": {Verb: "Get", Resource: "Integration", OutputListKey: "Integrations", OutputItemKey: ""}, + "DescribeLoggingStatus": {Verb: "Get", Resource: "LoggingStatu", OutputListKey: "LogExports", OutputItemKey: ""}, + "DescribeNodeConfigurationOptions": {Verb: "Get", Resource: "NodeConfigurationOption", OutputListKey: "NodeConfigurationOptionList", OutputItemKey: ""}, + "DescribeOrderableClusterOptions": {Verb: "Get", Resource: "OrderableClusterOption", OutputListKey: "OrderableClusterOptions", OutputItemKey: ""}, + "DescribePartners": {Verb: "Get", Resource: "Partner", OutputListKey: "PartnerIntegrationInfoList", OutputItemKey: ""}, + "DescribeRedshiftIdcApplications": {Verb: "Get", Resource: "RedshiftIdcApplication", OutputListKey: "RedshiftIdcApplications", OutputItemKey: ""}, + "DescribeReservedNodeExchangeStatus": {Verb: "Get", Resource: "ReservedNodeExchangeStatu", OutputListKey: "ReservedNodeExchangeStatusDetails", OutputItemKey: ""}, + "DescribeReservedNodeOfferings": {Verb: "Get", Resource: "ReservedNodeOffering", OutputListKey: "ReservedNodeOfferings", OutputItemKey: ""}, + "DescribeReservedNodes": {Verb: "Get", Resource: "ReservedNode", OutputListKey: "ReservedNodes", OutputItemKey: ""}, + "DescribeResize": {Verb: "Get", Resource: "Resize", OutputListKey: "ImportTablesCompleted", OutputItemKey: ""}, + "DescribeScheduledActions": {Verb: "Get", Resource: "ScheduledAction", OutputListKey: "ScheduledActions", OutputItemKey: ""}, + "DescribeSnapshotCopyGrants": {Verb: "Get", Resource: "SnapshotCopyGrant", OutputListKey: "SnapshotCopyGrants", OutputItemKey: ""}, + "DescribeSnapshotSchedules": {Verb: "Get", Resource: "SnapshotSchedule", OutputListKey: "SnapshotSchedules", OutputItemKey: ""}, + "DescribeStorage": {Verb: "Get", Resource: "Storage", OutputListKey: "", OutputItemKey: ""}, + "DescribeTableRestoreStatus": {Verb: "Get", Resource: "TableRestoreStatu", OutputListKey: "TableRestoreStatusDetails", OutputItemKey: ""}, + "DescribeTags": {Verb: "Get", Resource: "Tag", OutputListKey: "TaggedResources", OutputItemKey: ""}, + "DescribeUsageLimits": {Verb: "Get", Resource: "UsageLimit", OutputListKey: "UsageLimits", OutputItemKey: ""}, + "GetClusterCredentials": {Verb: "Get", Resource: "ClusterCredential", OutputListKey: "", OutputItemKey: ""}, + "GetClusterCredentialsWithIAM": {Verb: "Get", Resource: "ClusterCredentialsWithIAM", OutputListKey: "", OutputItemKey: ""}, + "GetIdentityCenterAuthToken": {Verb: "Get", Resource: "IdentityCenterAuthToken", OutputListKey: "", OutputItemKey: ""}, + "GetReservedNodeExchangeConfigurationOptions": {Verb: "Get", Resource: "ReservedNodeExchangeConfigurationOption", OutputListKey: "ReservedNodeConfigurationOptionList", OutputItemKey: ""}, + "GetReservedNodeExchangeOfferings": {Verb: "Get", Resource: "ReservedNodeExchangeOffering", OutputListKey: "ReservedNodeOfferings", OutputItemKey: ""}, + "GetResourcePolicy": {Verb: "Get", Resource: "ResourcePolicy", OutputListKey: "", OutputItemKey: "ResourcePolicy"}, + "ListRecommendations": {Verb: "List", Resource: "Recommendation", OutputListKey: "Recommendations", OutputItemKey: ""}, + "ModifyAquaConfiguration": {Verb: "Update", Resource: "AquaConfiguration", OutputListKey: "", OutputItemKey: "AquaConfiguration"}, + "ModifyAuthenticationProfile": {Verb: "Update", Resource: "AuthenticationProfile", OutputListKey: "", OutputItemKey: ""}, + "ModifyCluster": {Verb: "Update", Resource: "Cluster", OutputListKey: "", OutputItemKey: "Cluster"}, + "ModifyClusterDbRevision": {Verb: "Update", Resource: "ClusterDbRevision", OutputListKey: "", OutputItemKey: "Cluster"}, + "ModifyClusterIamRoles": {Verb: "Update", Resource: "ClusterIamRole", OutputListKey: "", OutputItemKey: "Cluster"}, + "ModifyClusterMaintenance": {Verb: "Update", Resource: "ClusterMaintenance", OutputListKey: "", OutputItemKey: "Cluster"}, + "ModifyClusterParameterGroup": {Verb: "Update", Resource: "ClusterParameterGroup", OutputListKey: "", OutputItemKey: ""}, + "ModifyClusterSnapshot": {Verb: "Update", Resource: "ClusterSnapshot", OutputListKey: "", OutputItemKey: "Snapshot"}, + "ModifyClusterSnapshotSchedule": {Verb: "Update", Resource: "ClusterSnapshotSchedule", OutputListKey: "", OutputItemKey: ""}, + "ModifyClusterSubnetGroup": {Verb: "Update", Resource: "ClusterSubnetGroup", OutputListKey: "", OutputItemKey: "ClusterSubnetGroup"}, + "ModifyCustomDomainAssociation": {Verb: "Update", Resource: "CustomDomainAssociation", OutputListKey: "", OutputItemKey: ""}, + "ModifyEndpointAccess": {Verb: "Update", Resource: "EndpointAccess", OutputListKey: "VpcSecurityGroups", OutputItemKey: "VpcEndpoint"}, + "ModifyEventSubscription": {Verb: "Update", Resource: "EventSubscription", OutputListKey: "", OutputItemKey: "EventSubscription"}, + "ModifyIntegration": {Verb: "Update", Resource: "Integration", OutputListKey: "Errors", OutputItemKey: ""}, + "ModifyLakehouseConfiguration": {Verb: "Update", Resource: "LakehouseConfiguration", OutputListKey: "", OutputItemKey: ""}, + "ModifyRedshiftIdcApplication": {Verb: "Update", Resource: "RedshiftIdcApplication", OutputListKey: "", OutputItemKey: "RedshiftIdcApplication"}, + "ModifyScheduledAction": {Verb: "Update", Resource: "ScheduledAction", OutputListKey: "NextInvocations", OutputItemKey: "TargetAction"}, + "ModifySnapshotCopyRetentionPeriod": {Verb: "Update", Resource: "SnapshotCopyRetentionPeriod", OutputListKey: "", OutputItemKey: "Cluster"}, + "ModifySnapshotSchedule": {Verb: "Update", Resource: "SnapshotSchedule", OutputListKey: "AssociatedClusters", OutputItemKey: ""}, + "ModifyUsageLimit": {Verb: "Update", Resource: "UsageLimit", OutputListKey: "Tags", OutputItemKey: ""}, + "PutResourcePolicy": {Verb: "Update", Resource: "ResourcePolicy", OutputListKey: "", OutputItemKey: "ResourcePolicy"}, + "RegisterNamespace": {Verb: "Create", Resource: "Namespace", OutputListKey: "", OutputItemKey: ""}, + "UpdatePartnerStatus": {Verb: "Update", Resource: "PartnerStatu", OutputListKey: "", OutputItemKey: ""}, + }) crud.Register("redshiftdata", map[string]crud.OpMeta{ "DescribeStatement": {Verb: "Get", Resource: "Statement", OutputListKey: "QueryParameters", OutputItemKey: ""}, "DescribeTable": {Verb: "Get", Resource: "Table", OutputListKey: "ColumnList", OutputItemKey: ""}, @@ -6428,6 +7327,69 @@ func init() { "TagResources": {Verb: "Tag", Resource: "Resource", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/TagResources"}, "UntagResources": {Verb: "Untag", Resource: "Resource", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/UntagResources"}, }) + crud.Register("route53", map[string]crud.OpMeta{ + "CreateCidrCollection": {Verb: "Create", Resource: "CidrCollection", OutputListKey: "", OutputItemKey: "Collection", Method: "POST", URI: "/2013-04-01/cidrcollection"}, + "CreateHealthCheck": {Verb: "Create", Resource: "HealthCheck", OutputListKey: "", OutputItemKey: "HealthCheck", Method: "POST", URI: "/2013-04-01/healthcheck"}, + "CreateHostedZone": {Verb: "Create", Resource: "HostedZone", OutputListKey: "", OutputItemKey: "ChangeInfo", Method: "POST", URI: "/2013-04-01/hostedzone"}, + "CreateKeySigningKey": {Verb: "Create", Resource: "KeySigningKey", OutputListKey: "", OutputItemKey: "ChangeInfo", Method: "POST", URI: "/2013-04-01/keysigningkey"}, + "CreateQueryLoggingConfig": {Verb: "Create", Resource: "QueryLoggingConfig", OutputListKey: "", OutputItemKey: "QueryLoggingConfig", Method: "POST", URI: "/2013-04-01/queryloggingconfig"}, + "CreateReusableDelegationSet": {Verb: "Create", Resource: "ReusableDelegationSet", OutputListKey: "", OutputItemKey: "DelegationSet", Method: "POST", URI: "/2013-04-01/delegationset"}, + "CreateTrafficPolicy": {Verb: "Create", Resource: "TrafficPolicy", OutputListKey: "", OutputItemKey: "TrafficPolicy", Method: "POST", URI: "/2013-04-01/trafficpolicy"}, + "CreateTrafficPolicyInstance": {Verb: "Create", Resource: "TrafficPolicyInstance", OutputListKey: "", OutputItemKey: "TrafficPolicyInstance", Method: "POST", URI: "/2013-04-01/trafficpolicyinstance"}, + "CreateTrafficPolicyVersion": {Verb: "Create", Resource: "TrafficPolicyVersion", OutputListKey: "", OutputItemKey: "TrafficPolicy", Method: "POST", URI: "/2013-04-01/trafficpolicy/{Id}"}, + "CreateVPCAssociationAuthorization": {Verb: "Create", Resource: "VPCAssociationAuthorization", OutputListKey: "", OutputItemKey: "VPC", Method: "POST", URI: "/2013-04-01/hostedzone/{HostedZoneId}/authorizevpcassociation"}, + "DeleteCidrCollection": {Verb: "Delete", Resource: "CidrCollection", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2013-04-01/cidrcollection/{Id}"}, + "DeleteHealthCheck": {Verb: "Delete", Resource: "HealthCheck", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2013-04-01/healthcheck/{HealthCheckId}"}, + "DeleteHostedZone": {Verb: "Delete", Resource: "HostedZone", OutputListKey: "", OutputItemKey: "ChangeInfo", Method: "DELETE", URI: "/2013-04-01/hostedzone/{Id}"}, + "DeleteKeySigningKey": {Verb: "Delete", Resource: "KeySigningKey", OutputListKey: "", OutputItemKey: "ChangeInfo", Method: "DELETE", URI: "/2013-04-01/keysigningkey/{HostedZoneId}/{Name}"}, + "DeleteQueryLoggingConfig": {Verb: "Delete", Resource: "QueryLoggingConfig", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2013-04-01/queryloggingconfig/{Id}"}, + "DeleteReusableDelegationSet": {Verb: "Delete", Resource: "ReusableDelegationSet", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2013-04-01/delegationset/{Id}"}, + "DeleteTrafficPolicy": {Verb: "Delete", Resource: "TrafficPolicy", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2013-04-01/trafficpolicy/{Id}/{Version}"}, + "DeleteTrafficPolicyInstance": {Verb: "Delete", Resource: "TrafficPolicyInstance", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/2013-04-01/trafficpolicyinstance/{Id}"}, + "DeleteVPCAssociationAuthorization": {Verb: "Delete", Resource: "VPCAssociationAuthorization", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/2013-04-01/hostedzone/{HostedZoneId}/deauthorizevpcassociation"}, + "GetAccountLimit": {Verb: "Get", Resource: "AccountLimit", OutputListKey: "", OutputItemKey: "Limit", Method: "GET", URI: "/2013-04-01/accountlimit/{Type}"}, + "GetChange": {Verb: "Get", Resource: "Change", OutputListKey: "", OutputItemKey: "ChangeInfo", Method: "GET", URI: "/2013-04-01/change/{Id}"}, + "GetCheckerIpRanges": {Verb: "Get", Resource: "CheckerIpRange", OutputListKey: "CheckerIpRanges", OutputItemKey: "", Method: "GET", URI: "/2013-04-01/checkeripranges"}, + "GetDNSSEC": {Verb: "Get", Resource: "DNSSEC", OutputListKey: "KeySigningKeys", OutputItemKey: "Status", Method: "GET", URI: "/2013-04-01/hostedzone/{HostedZoneId}/dnssec"}, + "GetGeoLocation": {Verb: "Get", Resource: "GeoLocation", OutputListKey: "", OutputItemKey: "GeoLocationDetails", Method: "GET", URI: "/2013-04-01/geolocation"}, + "GetHealthCheck": {Verb: "Get", Resource: "HealthCheck", OutputListKey: "", OutputItemKey: "HealthCheck", Method: "GET", URI: "/2013-04-01/healthcheck/{HealthCheckId}"}, + "GetHealthCheckCount": {Verb: "Get", Resource: "HealthCheckCount", OutputListKey: "", OutputItemKey: "", Method: "GET", URI: "/2013-04-01/healthcheckcount"}, + "GetHealthCheckLastFailureReason": {Verb: "Get", Resource: "HealthCheckLastFailureReason", OutputListKey: "HealthCheckObservations", OutputItemKey: "", Method: "GET", URI: "/2013-04-01/healthcheck/{HealthCheckId}/lastfailurereason"}, + "GetHealthCheckStatus": {Verb: "Get", Resource: "HealthCheckStatu", OutputListKey: "HealthCheckObservations", OutputItemKey: "", Method: "GET", URI: "/2013-04-01/healthcheck/{HealthCheckId}/status"}, + "GetHostedZone": {Verb: "Get", Resource: "HostedZone", OutputListKey: "VPCs", OutputItemKey: "DelegationSet", Method: "GET", URI: "/2013-04-01/hostedzone/{Id}"}, + "GetHostedZoneCount": {Verb: "Get", Resource: "HostedZoneCount", OutputListKey: "", OutputItemKey: "", Method: "GET", URI: "/2013-04-01/hostedzonecount"}, + "GetHostedZoneLimit": {Verb: "Get", Resource: "HostedZoneLimit", OutputListKey: "", OutputItemKey: "Limit", Method: "GET", URI: "/2013-04-01/hostedzonelimit/{HostedZoneId}/{Type}"}, + "GetQueryLoggingConfig": {Verb: "Get", Resource: "QueryLoggingConfig", OutputListKey: "", OutputItemKey: "QueryLoggingConfig", Method: "GET", URI: "/2013-04-01/queryloggingconfig/{Id}"}, + "GetReusableDelegationSet": {Verb: "Get", Resource: "ReusableDelegationSet", OutputListKey: "", OutputItemKey: "DelegationSet", Method: "GET", URI: "/2013-04-01/delegationset/{Id}"}, + "GetReusableDelegationSetLimit": {Verb: "Get", Resource: "ReusableDelegationSetLimit", OutputListKey: "", OutputItemKey: "Limit", Method: "GET", URI: "/2013-04-01/reusabledelegationsetlimit/{DelegationSetId}/{Type}"}, + "GetTrafficPolicy": {Verb: "Get", Resource: "TrafficPolicy", OutputListKey: "", OutputItemKey: "TrafficPolicy", Method: "GET", URI: "/2013-04-01/trafficpolicy/{Id}/{Version}"}, + "GetTrafficPolicyInstance": {Verb: "Get", Resource: "TrafficPolicyInstance", OutputListKey: "", OutputItemKey: "TrafficPolicyInstance", Method: "GET", URI: "/2013-04-01/trafficpolicyinstance/{Id}"}, + "GetTrafficPolicyInstanceCount": {Verb: "Get", Resource: "TrafficPolicyInstanceCount", OutputListKey: "", OutputItemKey: "", Method: "GET", URI: "/2013-04-01/trafficpolicyinstancecount"}, + "ListCidrBlocks": {Verb: "List", Resource: "CidrBlock", OutputListKey: "CidrBlocks", OutputItemKey: "", Method: "GET", URI: "/2013-04-01/cidrcollection/{CollectionId}/cidrblocks"}, + "ListCidrCollections": {Verb: "List", Resource: "CidrCollection", OutputListKey: "CidrCollections", OutputItemKey: "", Method: "GET", URI: "/2013-04-01/cidrcollection"}, + "ListCidrLocations": {Verb: "List", Resource: "CidrLocation", OutputListKey: "CidrLocations", OutputItemKey: "", Method: "GET", URI: "/2013-04-01/cidrcollection/{CollectionId}"}, + "ListGeoLocations": {Verb: "List", Resource: "GeoLocation", OutputListKey: "GeoLocationDetailsList", OutputItemKey: "", Method: "GET", URI: "/2013-04-01/geolocations"}, + "ListHealthChecks": {Verb: "List", Resource: "HealthCheck", OutputListKey: "HealthChecks", OutputItemKey: "", Method: "GET", URI: "/2013-04-01/healthcheck"}, + "ListHostedZones": {Verb: "List", Resource: "HostedZone", OutputListKey: "HostedZones", OutputItemKey: "", Method: "GET", URI: "/2013-04-01/hostedzone"}, + "ListHostedZonesByName": {Verb: "List", Resource: "HostedZonesByName", OutputListKey: "HostedZones", OutputItemKey: "", Method: "GET", URI: "/2013-04-01/hostedzonesbyname"}, + "ListHostedZonesByVPC": {Verb: "List", Resource: "HostedZonesByVPC", OutputListKey: "HostedZoneSummaries", OutputItemKey: "", Method: "GET", URI: "/2013-04-01/hostedzonesbyvpc"}, + "ListQueryLoggingConfigs": {Verb: "List", Resource: "QueryLoggingConfig", OutputListKey: "QueryLoggingConfigs", OutputItemKey: "", Method: "GET", URI: "/2013-04-01/queryloggingconfig"}, + "ListResourceRecordSets": {Verb: "List", Resource: "ResourceRecordSet", OutputListKey: "ResourceRecordSets", OutputItemKey: "", Method: "GET", URI: "/2013-04-01/hostedzone/{HostedZoneId}/rrset"}, + "ListReusableDelegationSets": {Verb: "List", Resource: "ReusableDelegationSet", OutputListKey: "DelegationSets", OutputItemKey: "", Method: "GET", URI: "/2013-04-01/delegationset"}, + "ListTagsForResource": {Verb: "List", Resource: "TagsForResource", OutputListKey: "", OutputItemKey: "ResourceTagSet", Method: "GET", URI: "/2013-04-01/tags/{ResourceType}/{ResourceId}"}, + "ListTagsForResources": {Verb: "List", Resource: "TagsForResource", OutputListKey: "ResourceTagSets", OutputItemKey: "", Method: "POST", URI: "/2013-04-01/tags/{ResourceType}"}, + "ListTrafficPolicies": {Verb: "List", Resource: "TrafficPolicy", OutputListKey: "TrafficPolicySummaries", OutputItemKey: "", Method: "GET", URI: "/2013-04-01/trafficpolicies"}, + "ListTrafficPolicyInstances": {Verb: "List", Resource: "TrafficPolicyInstance", OutputListKey: "TrafficPolicyInstances", OutputItemKey: "", Method: "GET", URI: "/2013-04-01/trafficpolicyinstances"}, + "ListTrafficPolicyInstancesByHostedZone": {Verb: "List", Resource: "TrafficPolicyInstancesByHostedZone", OutputListKey: "TrafficPolicyInstances", OutputItemKey: "", Method: "GET", URI: "/2013-04-01/trafficpolicyinstances/hostedzone"}, + "ListTrafficPolicyInstancesByPolicy": {Verb: "List", Resource: "TrafficPolicyInstancesByPolicy", OutputListKey: "TrafficPolicyInstances", OutputItemKey: "", Method: "GET", URI: "/2013-04-01/trafficpolicyinstances/trafficpolicy"}, + "ListTrafficPolicyVersions": {Verb: "List", Resource: "TrafficPolicyVersion", OutputListKey: "TrafficPolicies", OutputItemKey: "", Method: "GET", URI: "/2013-04-01/trafficpolicies/{Id}/versions"}, + "ListVPCAssociationAuthorizations": {Verb: "List", Resource: "VPCAssociationAuthorization", OutputListKey: "VPCs", OutputItemKey: "", Method: "GET", URI: "/2013-04-01/hostedzone/{HostedZoneId}/authorizevpcassociation"}, + "UpdateHealthCheck": {Verb: "Update", Resource: "HealthCheck", OutputListKey: "", OutputItemKey: "HealthCheck", Method: "POST", URI: "/2013-04-01/healthcheck/{HealthCheckId}"}, + "UpdateHostedZoneComment": {Verb: "Update", Resource: "HostedZoneComment", OutputListKey: "", OutputItemKey: "HostedZone", Method: "POST", URI: "/2013-04-01/hostedzone/{Id}"}, + "UpdateHostedZoneFeatures": {Verb: "Update", Resource: "HostedZoneFeature", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/2013-04-01/hostedzone/{HostedZoneId}/features"}, + "UpdateTrafficPolicyComment": {Verb: "Update", Resource: "TrafficPolicyComment", OutputListKey: "", OutputItemKey: "TrafficPolicy", Method: "POST", URI: "/2013-04-01/trafficpolicy/{Id}/{Version}"}, + "UpdateTrafficPolicyInstance": {Verb: "Update", Resource: "TrafficPolicyInstance", OutputListKey: "", OutputItemKey: "TrafficPolicyInstance", Method: "POST", URI: "/2013-04-01/trafficpolicyinstance/{Id}"}, + }) crud.Register("route53domains", map[string]crud.OpMeta{ "DeleteDomain": {Verb: "Delete", Resource: "Domain", OutputListKey: "", OutputItemKey: ""}, "DeleteTagsForDomain": {Verb: "Delete", Resource: "TagsForDomain", OutputListKey: "", OutputItemKey: ""}, @@ -6506,6 +7468,200 @@ func init() { "UpdateResolverEndpoint": {Verb: "Update", Resource: "ResolverEndpoint", OutputListKey: "", OutputItemKey: "ResolverEndpoint"}, "UpdateResolverRule": {Verb: "Update", Resource: "ResolverRule", OutputListKey: "", OutputItemKey: "ResolverRule"}, }) + crud.Register("s3", map[string]crud.OpMeta{ + "CreateBucket": {Verb: "Create", Resource: "Bucket", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}"}, + "CreateBucketMetadataConfiguration": {Verb: "Create", Resource: "BucketMetadataConfiguration", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/{Bucket}?metadataConfiguration"}, + "CreateBucketMetadataTableConfiguration": {Verb: "Create", Resource: "BucketMetadataTableConfiguration", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/{Bucket}?metadataTable"}, + "CreateMultipartUpload": {Verb: "Create", Resource: "MultipartUpload", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/{Bucket}/{Key+}?uploads"}, + "CreateSession": {Verb: "Create", Resource: "Session", OutputListKey: "", OutputItemKey: "Credentials", Method: "GET", URI: "/{Bucket}?session"}, + "DeleteBucket": {Verb: "Delete", Resource: "Bucket", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/{Bucket}"}, + "DeleteBucketAnalyticsConfiguration": {Verb: "Delete", Resource: "BucketAnalyticsConfiguration", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/{Bucket}?analytics"}, + "DeleteBucketCors": {Verb: "Delete", Resource: "BucketCor", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/{Bucket}?cors"}, + "DeleteBucketEncryption": {Verb: "Delete", Resource: "BucketEncryption", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/{Bucket}?encryption"}, + "DeleteBucketIntelligentTieringConfiguration": {Verb: "Delete", Resource: "BucketIntelligentTieringConfiguration", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/{Bucket}?intelligent-tiering"}, + "DeleteBucketInventoryConfiguration": {Verb: "Delete", Resource: "BucketInventoryConfiguration", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/{Bucket}?inventory"}, + "DeleteBucketLifecycle": {Verb: "Delete", Resource: "BucketLifecycle", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/{Bucket}?lifecycle"}, + "DeleteBucketMetadataConfiguration": {Verb: "Delete", Resource: "BucketMetadataConfiguration", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/{Bucket}?metadataConfiguration"}, + "DeleteBucketMetadataTableConfiguration": {Verb: "Delete", Resource: "BucketMetadataTableConfiguration", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/{Bucket}?metadataTable"}, + "DeleteBucketMetricsConfiguration": {Verb: "Delete", Resource: "BucketMetricsConfiguration", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/{Bucket}?metrics"}, + "DeleteBucketOwnershipControls": {Verb: "Delete", Resource: "BucketOwnershipControl", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/{Bucket}?ownershipControls"}, + "DeleteBucketPolicy": {Verb: "Delete", Resource: "BucketPolicy", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/{Bucket}?policy"}, + "DeleteBucketReplication": {Verb: "Delete", Resource: "BucketReplication", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/{Bucket}?replication"}, + "DeleteBucketTagging": {Verb: "Delete", Resource: "BucketTagging", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/{Bucket}?tagging"}, + "DeleteBucketWebsite": {Verb: "Delete", Resource: "BucketWebsite", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/{Bucket}?website"}, + "DeleteObject": {Verb: "Delete", Resource: "Object", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/{Bucket}/{Key+}?x-id=DeleteObject"}, + "DeleteObjectTagging": {Verb: "Delete", Resource: "ObjectTagging", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/{Bucket}/{Key+}?tagging"}, + "DeleteObjects": {Verb: "Delete", Resource: "Object", OutputListKey: "Deleted", OutputItemKey: "", Method: "POST", URI: "/{Bucket}?delete"}, + "DeletePublicAccessBlock": {Verb: "Delete", Resource: "PublicAccessBlock", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/{Bucket}?publicAccessBlock"}, + "GetBucketAbac": {Verb: "Get", Resource: "BucketAbac", OutputListKey: "", OutputItemKey: "AbacStatus", Method: "GET", URI: "/{Bucket}?abac"}, + "GetBucketAccelerateConfiguration": {Verb: "Get", Resource: "BucketAccelerateConfiguration", OutputListKey: "", OutputItemKey: "", Method: "GET", URI: "/{Bucket}?accelerate"}, + "GetBucketAcl": {Verb: "Get", Resource: "BucketAcl", OutputListKey: "Grants", OutputItemKey: "Owner", Method: "GET", URI: "/{Bucket}?acl"}, + "GetBucketAnalyticsConfiguration": {Verb: "Get", Resource: "BucketAnalyticsConfiguration", OutputListKey: "", OutputItemKey: "AnalyticsConfiguration", Method: "GET", URI: "/{Bucket}?analytics&x-id=GetBucketAnalyticsConfiguration"}, + "GetBucketCors": {Verb: "Get", Resource: "BucketCor", OutputListKey: "CORSRules", OutputItemKey: "", Method: "GET", URI: "/{Bucket}?cors"}, + "GetBucketEncryption": {Verb: "Get", Resource: "BucketEncryption", OutputListKey: "", OutputItemKey: "ServerSideEncryptionConfiguration", Method: "GET", URI: "/{Bucket}?encryption"}, + "GetBucketIntelligentTieringConfiguration": {Verb: "Get", Resource: "BucketIntelligentTieringConfiguration", OutputListKey: "", OutputItemKey: "IntelligentTieringConfiguration", Method: "GET", URI: "/{Bucket}?intelligent-tiering&x-id=GetBucketIntelligentTieringConfiguration"}, + "GetBucketInventoryConfiguration": {Verb: "Get", Resource: "BucketInventoryConfiguration", OutputListKey: "", OutputItemKey: "InventoryConfiguration", Method: "GET", URI: "/{Bucket}?inventory&x-id=GetBucketInventoryConfiguration"}, + "GetBucketLifecycleConfiguration": {Verb: "Get", Resource: "BucketLifecycleConfiguration", OutputListKey: "Rules", OutputItemKey: "", Method: "GET", URI: "/{Bucket}?lifecycle"}, + "GetBucketLocation": {Verb: "Get", Resource: "BucketLocation", OutputListKey: "", OutputItemKey: "", Method: "GET", URI: "/{Bucket}?location"}, + "GetBucketLogging": {Verb: "Get", Resource: "BucketLogging", OutputListKey: "", OutputItemKey: "LoggingEnabled", Method: "GET", URI: "/{Bucket}?logging"}, + "GetBucketMetadataConfiguration": {Verb: "Get", Resource: "BucketMetadataConfiguration", OutputListKey: "", OutputItemKey: "GetBucketMetadataConfigurationResult", Method: "GET", URI: "/{Bucket}?metadataConfiguration"}, + "GetBucketMetadataTableConfiguration": {Verb: "Get", Resource: "BucketMetadataTableConfiguration", OutputListKey: "", OutputItemKey: "GetBucketMetadataTableConfigurationResult", Method: "GET", URI: "/{Bucket}?metadataTable"}, + "GetBucketMetricsConfiguration": {Verb: "Get", Resource: "BucketMetricsConfiguration", OutputListKey: "", OutputItemKey: "MetricsConfiguration", Method: "GET", URI: "/{Bucket}?metrics&x-id=GetBucketMetricsConfiguration"}, + "GetBucketNotificationConfiguration": {Verb: "Get", Resource: "BucketNotificationConfiguration", OutputListKey: "LambdaFunctionConfigurations", OutputItemKey: "EventBridgeConfiguration", Method: "GET", URI: "/{Bucket}?notification"}, + "GetBucketOwnershipControls": {Verb: "Get", Resource: "BucketOwnershipControl", OutputListKey: "", OutputItemKey: "OwnershipControls", Method: "GET", URI: "/{Bucket}?ownershipControls"}, + "GetBucketPolicy": {Verb: "Get", Resource: "BucketPolicy", OutputListKey: "", OutputItemKey: "", Method: "GET", URI: "/{Bucket}?policy"}, + "GetBucketPolicyStatus": {Verb: "Get", Resource: "BucketPolicyStatu", OutputListKey: "", OutputItemKey: "PolicyStatus", Method: "GET", URI: "/{Bucket}?policyStatus"}, + "GetBucketReplication": {Verb: "Get", Resource: "BucketReplication", OutputListKey: "", OutputItemKey: "ReplicationConfiguration", Method: "GET", URI: "/{Bucket}?replication"}, + "GetBucketRequestPayment": {Verb: "Get", Resource: "BucketRequestPayment", OutputListKey: "", OutputItemKey: "", Method: "GET", URI: "/{Bucket}?requestPayment"}, + "GetBucketTagging": {Verb: "Get", Resource: "BucketTagging", OutputListKey: "TagSet", OutputItemKey: "", Method: "GET", URI: "/{Bucket}?tagging"}, + "GetBucketVersioning": {Verb: "Get", Resource: "BucketVersioning", OutputListKey: "", OutputItemKey: "", Method: "GET", URI: "/{Bucket}?versioning"}, + "GetBucketWebsite": {Verb: "Get", Resource: "BucketWebsite", OutputListKey: "RoutingRules", OutputItemKey: "ErrorDocument", Method: "GET", URI: "/{Bucket}?website"}, + "GetObject": {Verb: "Get", Resource: "Object", OutputListKey: "", OutputItemKey: "", Method: "GET", URI: "/{Bucket}/{Key+}?x-id=GetObject"}, + "GetObjectAcl": {Verb: "Get", Resource: "ObjectAcl", OutputListKey: "Grants", OutputItemKey: "Owner", Method: "GET", URI: "/{Bucket}/{Key+}?acl"}, + "GetObjectAttributes": {Verb: "Get", Resource: "ObjectAttribute", OutputListKey: "", OutputItemKey: "Checksum", Method: "GET", URI: "/{Bucket}/{Key+}?attributes"}, + "GetObjectLegalHold": {Verb: "Get", Resource: "ObjectLegalHold", OutputListKey: "", OutputItemKey: "LegalHold", Method: "GET", URI: "/{Bucket}/{Key+}?legal-hold"}, + "GetObjectLockConfiguration": {Verb: "Get", Resource: "ObjectLockConfiguration", OutputListKey: "", OutputItemKey: "ObjectLockConfiguration", Method: "GET", URI: "/{Bucket}?object-lock"}, + "GetObjectRetention": {Verb: "Get", Resource: "ObjectRetention", OutputListKey: "", OutputItemKey: "Retention", Method: "GET", URI: "/{Bucket}/{Key+}?retention"}, + "GetObjectTagging": {Verb: "Get", Resource: "ObjectTagging", OutputListKey: "TagSet", OutputItemKey: "", Method: "GET", URI: "/{Bucket}/{Key+}?tagging"}, + "GetObjectTorrent": {Verb: "Get", Resource: "ObjectTorrent", OutputListKey: "", OutputItemKey: "", Method: "GET", URI: "/{Bucket}/{Key+}?torrent"}, + "GetPublicAccessBlock": {Verb: "Get", Resource: "PublicAccessBlock", OutputListKey: "", OutputItemKey: "PublicAccessBlockConfiguration", Method: "GET", URI: "/{Bucket}?publicAccessBlock"}, + "ListBucketAnalyticsConfigurations": {Verb: "List", Resource: "BucketAnalyticsConfiguration", OutputListKey: "AnalyticsConfigurationList", OutputItemKey: "", Method: "GET", URI: "/{Bucket}?analytics&x-id=ListBucketAnalyticsConfigurations"}, + "ListBucketIntelligentTieringConfigurations": {Verb: "List", Resource: "BucketIntelligentTieringConfiguration", OutputListKey: "IntelligentTieringConfigurationList", OutputItemKey: "", Method: "GET", URI: "/{Bucket}?intelligent-tiering&x-id=ListBucketIntelligentTieringConfigurations"}, + "ListBucketInventoryConfigurations": {Verb: "List", Resource: "BucketInventoryConfiguration", OutputListKey: "InventoryConfigurationList", OutputItemKey: "", Method: "GET", URI: "/{Bucket}?inventory&x-id=ListBucketInventoryConfigurations"}, + "ListBucketMetricsConfigurations": {Verb: "List", Resource: "BucketMetricsConfiguration", OutputListKey: "MetricsConfigurationList", OutputItemKey: "", Method: "GET", URI: "/{Bucket}?metrics&x-id=ListBucketMetricsConfigurations"}, + "ListBuckets": {Verb: "List", Resource: "Bucket", OutputListKey: "Buckets", OutputItemKey: "Owner", Method: "GET", URI: "/?x-id=ListBuckets"}, + "ListDirectoryBuckets": {Verb: "List", Resource: "DirectoryBucket", OutputListKey: "Buckets", OutputItemKey: "", Method: "GET", URI: "/?x-id=ListDirectoryBuckets"}, + "ListMultipartUploads": {Verb: "List", Resource: "MultipartUpload", OutputListKey: "CommonPrefixes", OutputItemKey: "", Method: "GET", URI: "/{Bucket}?uploads"}, + "ListObjectVersions": {Verb: "List", Resource: "ObjectVersion", OutputListKey: "CommonPrefixes", OutputItemKey: "", Method: "GET", URI: "/{Bucket}?versions"}, + "ListObjects": {Verb: "List", Resource: "Object", OutputListKey: "CommonPrefixes", OutputItemKey: "", Method: "GET", URI: "/{Bucket}"}, + "ListObjectsV2": {Verb: "List", Resource: "ObjectsV2", OutputListKey: "CommonPrefixes", OutputItemKey: "", Method: "GET", URI: "/{Bucket}?list-type=2"}, + "ListParts": {Verb: "List", Resource: "Part", OutputListKey: "Parts", OutputItemKey: "Initiator", Method: "GET", URI: "/{Bucket}/{Key+}?x-id=ListParts"}, + "PutBucketAbac": {Verb: "Update", Resource: "BucketAbac", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}?abac"}, + "PutBucketAccelerateConfiguration": {Verb: "Update", Resource: "BucketAccelerateConfiguration", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}?accelerate"}, + "PutBucketAcl": {Verb: "Update", Resource: "BucketAcl", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}?acl"}, + "PutBucketAnalyticsConfiguration": {Verb: "Update", Resource: "BucketAnalyticsConfiguration", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}?analytics"}, + "PutBucketCors": {Verb: "Update", Resource: "BucketCor", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}?cors"}, + "PutBucketEncryption": {Verb: "Update", Resource: "BucketEncryption", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}?encryption"}, + "PutBucketIntelligentTieringConfiguration": {Verb: "Update", Resource: "BucketIntelligentTieringConfiguration", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}?intelligent-tiering"}, + "PutBucketInventoryConfiguration": {Verb: "Update", Resource: "BucketInventoryConfiguration", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}?inventory"}, + "PutBucketLifecycleConfiguration": {Verb: "Update", Resource: "BucketLifecycleConfiguration", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}?lifecycle"}, + "PutBucketLogging": {Verb: "Update", Resource: "BucketLogging", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}?logging"}, + "PutBucketMetricsConfiguration": {Verb: "Update", Resource: "BucketMetricsConfiguration", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}?metrics"}, + "PutBucketNotificationConfiguration": {Verb: "Update", Resource: "BucketNotificationConfiguration", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}?notification"}, + "PutBucketOwnershipControls": {Verb: "Update", Resource: "BucketOwnershipControl", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}?ownershipControls"}, + "PutBucketPolicy": {Verb: "Update", Resource: "BucketPolicy", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}?policy"}, + "PutBucketReplication": {Verb: "Update", Resource: "BucketReplication", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}?replication"}, + "PutBucketRequestPayment": {Verb: "Update", Resource: "BucketRequestPayment", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}?requestPayment"}, + "PutBucketTagging": {Verb: "Update", Resource: "BucketTagging", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}?tagging"}, + "PutBucketVersioning": {Verb: "Update", Resource: "BucketVersioning", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}?versioning"}, + "PutBucketWebsite": {Verb: "Update", Resource: "BucketWebsite", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}?website"}, + "PutObject": {Verb: "Update", Resource: "Object", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}/{Key+}?x-id=PutObject"}, + "PutObjectAcl": {Verb: "Update", Resource: "ObjectAcl", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}/{Key+}?acl"}, + "PutObjectLegalHold": {Verb: "Update", Resource: "ObjectLegalHold", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}/{Key+}?legal-hold"}, + "PutObjectLockConfiguration": {Verb: "Update", Resource: "ObjectLockConfiguration", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}?object-lock"}, + "PutObjectRetention": {Verb: "Update", Resource: "ObjectRetention", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}/{Key+}?retention"}, + "PutObjectTagging": {Verb: "Update", Resource: "ObjectTagging", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}/{Key+}?tagging"}, + "PutPublicAccessBlock": {Verb: "Update", Resource: "PublicAccessBlock", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}?publicAccessBlock"}, + "UpdateBucketMetadataInventoryTableConfiguration": {Verb: "Update", Resource: "BucketMetadataInventoryTableConfiguration", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}?metadataInventoryTable"}, + "UpdateBucketMetadataJournalTableConfiguration": {Verb: "Update", Resource: "BucketMetadataJournalTableConfiguration", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}?metadataJournalTable"}, + "UpdateObjectEncryption": {Verb: "Update", Resource: "ObjectEncryption", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/{Bucket}/{Key+}?encryption"}, + }) + crud.Register("s3control", map[string]crud.OpMeta{ + "CreateAccessGrant": {Verb: "Create", Resource: "AccessGrant", OutputListKey: "", OutputItemKey: "AccessGrantsLocationConfiguration", Method: "POST", URI: "/v20180820/accessgrantsinstance/grant"}, + "CreateAccessGrantsInstance": {Verb: "Create", Resource: "AccessGrantsInstance", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/v20180820/accessgrantsinstance"}, + "CreateAccessGrantsLocation": {Verb: "Create", Resource: "AccessGrantsLocation", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/v20180820/accessgrantsinstance/location"}, + "CreateAccessPoint": {Verb: "Create", Resource: "AccessPoint", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/v20180820/accesspoint/{Name}"}, + "CreateAccessPointForObjectLambda": {Verb: "Create", Resource: "AccessPointForObjectLambda", OutputListKey: "", OutputItemKey: "Alias", Method: "PUT", URI: "/v20180820/accesspointforobjectlambda/{Name}"}, + "CreateBucket": {Verb: "Create", Resource: "Bucket", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/v20180820/bucket/{Bucket}"}, + "CreateJob": {Verb: "Create", Resource: "Job", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/v20180820/jobs"}, + "CreateMultiRegionAccessPoint": {Verb: "Create", Resource: "MultiRegionAccessPoint", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/v20180820/async-requests/mrap/create"}, + "CreateStorageLensGroup": {Verb: "Create", Resource: "StorageLensGroup", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/v20180820/storagelensgroup"}, + "DeleteAccessGrant": {Verb: "Delete", Resource: "AccessGrant", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/v20180820/accessgrantsinstance/grant/{AccessGrantId}"}, + "DeleteAccessGrantsInstance": {Verb: "Delete", Resource: "AccessGrantsInstance", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/v20180820/accessgrantsinstance"}, + "DeleteAccessGrantsInstanceResourcePolicy": {Verb: "Delete", Resource: "AccessGrantsInstanceResourcePolicy", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/v20180820/accessgrantsinstance/resourcepolicy"}, + "DeleteAccessGrantsLocation": {Verb: "Delete", Resource: "AccessGrantsLocation", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/v20180820/accessgrantsinstance/location/{AccessGrantsLocationId}"}, + "DeleteAccessPoint": {Verb: "Delete", Resource: "AccessPoint", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/v20180820/accesspoint/{Name}"}, + "DeleteAccessPointForObjectLambda": {Verb: "Delete", Resource: "AccessPointForObjectLambda", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/v20180820/accesspointforobjectlambda/{Name}"}, + "DeleteAccessPointPolicy": {Verb: "Delete", Resource: "AccessPointPolicy", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/v20180820/accesspoint/{Name}/policy"}, + "DeleteAccessPointPolicyForObjectLambda": {Verb: "Delete", Resource: "AccessPointPolicyForObjectLambda", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/v20180820/accesspointforobjectlambda/{Name}/policy"}, + "DeleteAccessPointScope": {Verb: "Delete", Resource: "AccessPointScope", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/v20180820/accesspoint/{Name}/scope"}, + "DeleteBucket": {Verb: "Delete", Resource: "Bucket", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/v20180820/bucket/{Bucket}"}, + "DeleteBucketLifecycleConfiguration": {Verb: "Delete", Resource: "BucketLifecycleConfiguration", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/v20180820/bucket/{Bucket}/lifecycleconfiguration"}, + "DeleteBucketPolicy": {Verb: "Delete", Resource: "BucketPolicy", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/v20180820/bucket/{Bucket}/policy"}, + "DeleteBucketReplication": {Verb: "Delete", Resource: "BucketReplication", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/v20180820/bucket/{Bucket}/replication"}, + "DeleteBucketTagging": {Verb: "Delete", Resource: "BucketTagging", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/v20180820/bucket/{Bucket}/tagging"}, + "DeleteJobTagging": {Verb: "Delete", Resource: "JobTagging", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/v20180820/jobs/{JobId}/tagging"}, + "DeleteMultiRegionAccessPoint": {Verb: "Delete", Resource: "MultiRegionAccessPoint", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/v20180820/async-requests/mrap/delete"}, + "DeletePublicAccessBlock": {Verb: "Delete", Resource: "PublicAccessBlock", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/v20180820/configuration/publicAccessBlock"}, + "DeleteStorageLensConfiguration": {Verb: "Delete", Resource: "StorageLensConfiguration", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/v20180820/storagelens/{ConfigId}"}, + "DeleteStorageLensConfigurationTagging": {Verb: "Delete", Resource: "StorageLensConfigurationTagging", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/v20180820/storagelens/{ConfigId}/tagging"}, + "DeleteStorageLensGroup": {Verb: "Delete", Resource: "StorageLensGroup", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/v20180820/storagelensgroup/{Name}"}, + "DescribeJob": {Verb: "Get", Resource: "Job", OutputListKey: "", OutputItemKey: "Job", Method: "GET", URI: "/v20180820/jobs/{JobId}"}, + "DescribeMultiRegionAccessPointOperation": {Verb: "Get", Resource: "MultiRegionAccessPointOperation", OutputListKey: "", OutputItemKey: "AsyncOperation", Method: "GET", URI: "/v20180820/async-requests/mrap/{RequestTokenARN+}"}, + "GetAccessGrant": {Verb: "Get", Resource: "AccessGrant", OutputListKey: "", OutputItemKey: "AccessGrantsLocationConfiguration", Method: "GET", URI: "/v20180820/accessgrantsinstance/grant/{AccessGrantId}"}, + "GetAccessGrantsInstance": {Verb: "Get", Resource: "AccessGrantsInstance", OutputListKey: "", OutputItemKey: "", Method: "GET", URI: "/v20180820/accessgrantsinstance"}, + "GetAccessGrantsInstanceForPrefix": {Verb: "Get", Resource: "AccessGrantsInstanceForPrefix", OutputListKey: "", OutputItemKey: "", Method: "GET", URI: "/v20180820/accessgrantsinstance/prefix"}, + "GetAccessGrantsInstanceResourcePolicy": {Verb: "Get", Resource: "AccessGrantsInstanceResourcePolicy", OutputListKey: "", OutputItemKey: "", Method: "GET", URI: "/v20180820/accessgrantsinstance/resourcepolicy"}, + "GetAccessGrantsLocation": {Verb: "Get", Resource: "AccessGrantsLocation", OutputListKey: "", OutputItemKey: "", Method: "GET", URI: "/v20180820/accessgrantsinstance/location/{AccessGrantsLocationId}"}, + "GetAccessPoint": {Verb: "Get", Resource: "AccessPoint", OutputListKey: "", OutputItemKey: "PublicAccessBlockConfiguration", Method: "GET", URI: "/v20180820/accesspoint/{Name}"}, + "GetAccessPointConfigurationForObjectLambda": {Verb: "Get", Resource: "AccessPointConfigurationForObjectLambda", OutputListKey: "", OutputItemKey: "Configuration", Method: "GET", URI: "/v20180820/accesspointforobjectlambda/{Name}/configuration"}, + "GetAccessPointForObjectLambda": {Verb: "Get", Resource: "AccessPointForObjectLambda", OutputListKey: "", OutputItemKey: "Alias", Method: "GET", URI: "/v20180820/accesspointforobjectlambda/{Name}"}, + "GetAccessPointPolicy": {Verb: "Get", Resource: "AccessPointPolicy", OutputListKey: "", OutputItemKey: "", Method: "GET", URI: "/v20180820/accesspoint/{Name}/policy"}, + "GetAccessPointPolicyForObjectLambda": {Verb: "Get", Resource: "AccessPointPolicyForObjectLambda", OutputListKey: "", OutputItemKey: "", Method: "GET", URI: "/v20180820/accesspointforobjectlambda/{Name}/policy"}, + "GetAccessPointPolicyStatus": {Verb: "Get", Resource: "AccessPointPolicyStatu", OutputListKey: "", OutputItemKey: "PolicyStatus", Method: "GET", URI: "/v20180820/accesspoint/{Name}/policyStatus"}, + "GetAccessPointPolicyStatusForObjectLambda": {Verb: "Get", Resource: "AccessPointPolicyStatusForObjectLambda", OutputListKey: "", OutputItemKey: "PolicyStatus", Method: "GET", URI: "/v20180820/accesspointforobjectlambda/{Name}/policyStatus"}, + "GetAccessPointScope": {Verb: "Get", Resource: "AccessPointScope", OutputListKey: "", OutputItemKey: "Scope", Method: "GET", URI: "/v20180820/accesspoint/{Name}/scope"}, + "GetBucket": {Verb: "Get", Resource: "Bucket", OutputListKey: "", OutputItemKey: "", Method: "GET", URI: "/v20180820/bucket/{Bucket}"}, + "GetBucketLifecycleConfiguration": {Verb: "Get", Resource: "BucketLifecycleConfiguration", OutputListKey: "Rules", OutputItemKey: "", Method: "GET", URI: "/v20180820/bucket/{Bucket}/lifecycleconfiguration"}, + "GetBucketPolicy": {Verb: "Get", Resource: "BucketPolicy", OutputListKey: "", OutputItemKey: "", Method: "GET", URI: "/v20180820/bucket/{Bucket}/policy"}, + "GetBucketReplication": {Verb: "Get", Resource: "BucketReplication", OutputListKey: "", OutputItemKey: "ReplicationConfiguration", Method: "GET", URI: "/v20180820/bucket/{Bucket}/replication"}, + "GetBucketTagging": {Verb: "Get", Resource: "BucketTagging", OutputListKey: "TagSet", OutputItemKey: "", Method: "GET", URI: "/v20180820/bucket/{Bucket}/tagging"}, + "GetBucketVersioning": {Verb: "Get", Resource: "BucketVersioning", OutputListKey: "", OutputItemKey: "", Method: "GET", URI: "/v20180820/bucket/{Bucket}/versioning"}, + "GetDataAccess": {Verb: "Get", Resource: "DataAccess", OutputListKey: "", OutputItemKey: "Credentials", Method: "GET", URI: "/v20180820/accessgrantsinstance/dataaccess"}, + "GetJobTagging": {Verb: "Get", Resource: "JobTagging", OutputListKey: "Tags", OutputItemKey: "", Method: "GET", URI: "/v20180820/jobs/{JobId}/tagging"}, + "GetMultiRegionAccessPoint": {Verb: "Get", Resource: "MultiRegionAccessPoint", OutputListKey: "", OutputItemKey: "AccessPoint", Method: "GET", URI: "/v20180820/mrap/instances/{Name+}"}, + "GetMultiRegionAccessPointPolicy": {Verb: "Get", Resource: "MultiRegionAccessPointPolicy", OutputListKey: "", OutputItemKey: "Policy", Method: "GET", URI: "/v20180820/mrap/instances/{Name+}/policy"}, + "GetMultiRegionAccessPointPolicyStatus": {Verb: "Get", Resource: "MultiRegionAccessPointPolicyStatu", OutputListKey: "", OutputItemKey: "Established", Method: "GET", URI: "/v20180820/mrap/instances/{Name+}/policystatus"}, + "GetMultiRegionAccessPointRoutes": {Verb: "Get", Resource: "MultiRegionAccessPointRoute", OutputListKey: "Routes", OutputItemKey: "", Method: "GET", URI: "/v20180820/mrap/instances/{Mrap+}/routes"}, + "GetPublicAccessBlock": {Verb: "Get", Resource: "PublicAccessBlock", OutputListKey: "", OutputItemKey: "PublicAccessBlockConfiguration", Method: "GET", URI: "/v20180820/configuration/publicAccessBlock"}, + "GetStorageLensConfiguration": {Verb: "Get", Resource: "StorageLensConfiguration", OutputListKey: "", OutputItemKey: "StorageLensConfiguration", Method: "GET", URI: "/v20180820/storagelens/{ConfigId}"}, + "GetStorageLensConfigurationTagging": {Verb: "Get", Resource: "StorageLensConfigurationTagging", OutputListKey: "Tags", OutputItemKey: "", Method: "GET", URI: "/v20180820/storagelens/{ConfigId}/tagging"}, + "GetStorageLensGroup": {Verb: "Get", Resource: "StorageLensGroup", OutputListKey: "", OutputItemKey: "StorageLensGroup", Method: "GET", URI: "/v20180820/storagelensgroup/{Name}"}, + "ListAccessGrants": {Verb: "List", Resource: "AccessGrant", OutputListKey: "AccessGrantsList", OutputItemKey: "", Method: "GET", URI: "/v20180820/accessgrantsinstance/grants"}, + "ListAccessGrantsInstances": {Verb: "List", Resource: "AccessGrantsInstance", OutputListKey: "AccessGrantsInstancesList", OutputItemKey: "", Method: "GET", URI: "/v20180820/accessgrantsinstances"}, + "ListAccessGrantsLocations": {Verb: "List", Resource: "AccessGrantsLocation", OutputListKey: "AccessGrantsLocationsList", OutputItemKey: "", Method: "GET", URI: "/v20180820/accessgrantsinstance/locations"}, + "ListAccessPoints": {Verb: "List", Resource: "AccessPoint", OutputListKey: "AccessPointList", OutputItemKey: "", Method: "GET", URI: "/v20180820/accesspoint"}, + "ListAccessPointsForDirectoryBuckets": {Verb: "List", Resource: "AccessPointsForDirectoryBucket", OutputListKey: "AccessPointList", OutputItemKey: "", Method: "GET", URI: "/v20180820/accesspointfordirectory"}, + "ListAccessPointsForObjectLambda": {Verb: "List", Resource: "AccessPointsForObjectLambda", OutputListKey: "ObjectLambdaAccessPointList", OutputItemKey: "", Method: "GET", URI: "/v20180820/accesspointforobjectlambda"}, + "ListCallerAccessGrants": {Verb: "List", Resource: "CallerAccessGrant", OutputListKey: "CallerAccessGrantsList", OutputItemKey: "", Method: "GET", URI: "/v20180820/accessgrantsinstance/caller/grants"}, + "ListJobs": {Verb: "List", Resource: "Job", OutputListKey: "Jobs", OutputItemKey: "", Method: "GET", URI: "/v20180820/jobs"}, + "ListMultiRegionAccessPoints": {Verb: "List", Resource: "MultiRegionAccessPoint", OutputListKey: "AccessPoints", OutputItemKey: "", Method: "GET", URI: "/v20180820/mrap/instances"}, + "ListRegionalBuckets": {Verb: "List", Resource: "RegionalBucket", OutputListKey: "RegionalBucketList", OutputItemKey: "", Method: "GET", URI: "/v20180820/bucket"}, + "ListStorageLensConfigurations": {Verb: "List", Resource: "StorageLensConfiguration", OutputListKey: "StorageLensConfigurationList", OutputItemKey: "", Method: "GET", URI: "/v20180820/storagelens"}, + "ListStorageLensGroups": {Verb: "List", Resource: "StorageLensGroup", OutputListKey: "StorageLensGroupList", OutputItemKey: "", Method: "GET", URI: "/v20180820/storagelensgroup"}, + "ListTagsForResource": {Verb: "List", Resource: "TagsForResource", OutputListKey: "Tags", OutputItemKey: "", Method: "GET", URI: "/v20180820/tags/{ResourceArn+}"}, + "PutAccessGrantsInstanceResourcePolicy": {Verb: "Update", Resource: "AccessGrantsInstanceResourcePolicy", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/v20180820/accessgrantsinstance/resourcepolicy"}, + "PutAccessPointConfigurationForObjectLambda": {Verb: "Update", Resource: "AccessPointConfigurationForObjectLambda", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/v20180820/accesspointforobjectlambda/{Name}/configuration"}, + "PutAccessPointPolicy": {Verb: "Update", Resource: "AccessPointPolicy", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/v20180820/accesspoint/{Name}/policy"}, + "PutAccessPointPolicyForObjectLambda": {Verb: "Update", Resource: "AccessPointPolicyForObjectLambda", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/v20180820/accesspointforobjectlambda/{Name}/policy"}, + "PutAccessPointScope": {Verb: "Update", Resource: "AccessPointScope", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/v20180820/accesspoint/{Name}/scope"}, + "PutBucketLifecycleConfiguration": {Verb: "Update", Resource: "BucketLifecycleConfiguration", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/v20180820/bucket/{Bucket}/lifecycleconfiguration"}, + "PutBucketPolicy": {Verb: "Update", Resource: "BucketPolicy", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/v20180820/bucket/{Bucket}/policy"}, + "PutBucketReplication": {Verb: "Update", Resource: "BucketReplication", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/v20180820/bucket/{Bucket}/replication"}, + "PutBucketTagging": {Verb: "Update", Resource: "BucketTagging", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/v20180820/bucket/{Bucket}/tagging"}, + "PutBucketVersioning": {Verb: "Update", Resource: "BucketVersioning", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/v20180820/bucket/{Bucket}/versioning"}, + "PutJobTagging": {Verb: "Update", Resource: "JobTagging", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/v20180820/jobs/{JobId}/tagging"}, + "PutMultiRegionAccessPointPolicy": {Verb: "Update", Resource: "MultiRegionAccessPointPolicy", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/v20180820/async-requests/mrap/put-policy"}, + "PutPublicAccessBlock": {Verb: "Update", Resource: "PublicAccessBlock", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/v20180820/configuration/publicAccessBlock"}, + "PutStorageLensConfiguration": {Verb: "Update", Resource: "StorageLensConfiguration", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/v20180820/storagelens/{ConfigId}"}, + "PutStorageLensConfigurationTagging": {Verb: "Update", Resource: "StorageLensConfigurationTagging", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/v20180820/storagelens/{ConfigId}/tagging"}, + "TagResource": {Verb: "Tag", Resource: "Resource", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/v20180820/tags/{ResourceArn+}"}, + "UntagResource": {Verb: "Untag", Resource: "Resource", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/v20180820/tags/{ResourceArn+}"}, + "UpdateAccessGrantsLocation": {Verb: "Update", Resource: "AccessGrantsLocation", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/v20180820/accessgrantsinstance/location/{AccessGrantsLocationId}"}, + "UpdateJobPriority": {Verb: "Update", Resource: "JobPriority", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/v20180820/jobs/{JobId}/priority"}, + "UpdateJobStatus": {Verb: "Update", Resource: "JobStatu", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/v20180820/jobs/{JobId}/status"}, + "UpdateStorageLensGroup": {Verb: "Update", Resource: "StorageLensGroup", OutputListKey: "", OutputItemKey: "", Method: "PUT", URI: "/v20180820/storagelensgroup/{Name}"}, + }) crud.Register("s3vectors", map[string]crud.OpMeta{ "CreateIndex": {Verb: "Create", Resource: "Index", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/CreateIndex"}, "CreateVectorBucket": {Verb: "Create", Resource: "VectorBucket", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/CreateVectorBucket"}, @@ -7146,6 +8302,59 @@ func init() { "UntagResource": {Verb: "Untag", Resource: "Resource", OutputListKey: "", OutputItemKey: ""}, "UpdateAutoManagement": {Verb: "Update", Resource: "AutoManagement", OutputListKey: "", OutputItemKey: ""}, }) + crud.Register("ses", map[string]crud.OpMeta{ + "CreateConfigurationSet": {Verb: "Create", Resource: "ConfigurationSet", OutputListKey: "", OutputItemKey: ""}, + "CreateConfigurationSetEventDestination": {Verb: "Create", Resource: "ConfigurationSetEventDestination", OutputListKey: "", OutputItemKey: ""}, + "CreateConfigurationSetTrackingOptions": {Verb: "Create", Resource: "ConfigurationSetTrackingOption", OutputListKey: "", OutputItemKey: ""}, + "CreateCustomVerificationEmailTemplate": {Verb: "Create", Resource: "CustomVerificationEmailTemplate", OutputListKey: "", OutputItemKey: ""}, + "CreateReceiptFilter": {Verb: "Create", Resource: "ReceiptFilter", OutputListKey: "", OutputItemKey: ""}, + "CreateReceiptRule": {Verb: "Create", Resource: "ReceiptRule", OutputListKey: "", OutputItemKey: ""}, + "CreateReceiptRuleSet": {Verb: "Create", Resource: "ReceiptRuleSet", OutputListKey: "", OutputItemKey: ""}, + "CreateTemplate": {Verb: "Create", Resource: "Template", OutputListKey: "", OutputItemKey: ""}, + "DeleteConfigurationSet": {Verb: "Delete", Resource: "ConfigurationSet", OutputListKey: "", OutputItemKey: ""}, + "DeleteConfigurationSetEventDestination": {Verb: "Delete", Resource: "ConfigurationSetEventDestination", OutputListKey: "", OutputItemKey: ""}, + "DeleteConfigurationSetTrackingOptions": {Verb: "Delete", Resource: "ConfigurationSetTrackingOption", OutputListKey: "", OutputItemKey: ""}, + "DeleteCustomVerificationEmailTemplate": {Verb: "Delete", Resource: "CustomVerificationEmailTemplate", OutputListKey: "", OutputItemKey: ""}, + "DeleteIdentity": {Verb: "Delete", Resource: "Identity", OutputListKey: "", OutputItemKey: ""}, + "DeleteIdentityPolicy": {Verb: "Delete", Resource: "IdentityPolicy", OutputListKey: "", OutputItemKey: ""}, + "DeleteReceiptFilter": {Verb: "Delete", Resource: "ReceiptFilter", OutputListKey: "", OutputItemKey: ""}, + "DeleteReceiptRule": {Verb: "Delete", Resource: "ReceiptRule", OutputListKey: "", OutputItemKey: ""}, + "DeleteReceiptRuleSet": {Verb: "Delete", Resource: "ReceiptRuleSet", OutputListKey: "", OutputItemKey: ""}, + "DeleteTemplate": {Verb: "Delete", Resource: "Template", OutputListKey: "", OutputItemKey: ""}, + "DeleteVerifiedEmailAddress": {Verb: "Delete", Resource: "VerifiedEmailAddress", OutputListKey: "", OutputItemKey: ""}, + "DescribeActiveReceiptRuleSet": {Verb: "Get", Resource: "ActiveReceiptRuleSet", OutputListKey: "Rules", OutputItemKey: "Metadata"}, + "DescribeConfigurationSet": {Verb: "Get", Resource: "ConfigurationSet", OutputListKey: "EventDestinations", OutputItemKey: "ConfigurationSet"}, + "DescribeReceiptRule": {Verb: "Get", Resource: "ReceiptRule", OutputListKey: "", OutputItemKey: "Rule"}, + "DescribeReceiptRuleSet": {Verb: "Get", Resource: "ReceiptRuleSet", OutputListKey: "Rules", OutputItemKey: "Metadata"}, + "GetAccountSendingEnabled": {Verb: "Get", Resource: "AccountSendingEnabled", OutputListKey: "", OutputItemKey: ""}, + "GetCustomVerificationEmailTemplate": {Verb: "Get", Resource: "CustomVerificationEmailTemplate", OutputListKey: "", OutputItemKey: ""}, + "GetIdentityDkimAttributes": {Verb: "Get", Resource: "IdentityDkimAttribute", OutputListKey: "", OutputItemKey: ""}, + "GetIdentityMailFromDomainAttributes": {Verb: "Get", Resource: "IdentityMailFromDomainAttribute", OutputListKey: "", OutputItemKey: ""}, + "GetIdentityNotificationAttributes": {Verb: "Get", Resource: "IdentityNotificationAttribute", OutputListKey: "", OutputItemKey: ""}, + "GetIdentityPolicies": {Verb: "Get", Resource: "IdentityPolicy", OutputListKey: "", OutputItemKey: ""}, + "GetIdentityVerificationAttributes": {Verb: "Get", Resource: "IdentityVerificationAttribute", OutputListKey: "", OutputItemKey: ""}, + "GetSendQuota": {Verb: "Get", Resource: "SendQuota", OutputListKey: "", OutputItemKey: ""}, + "GetSendStatistics": {Verb: "Get", Resource: "SendStatistic", OutputListKey: "SendDataPoints", OutputItemKey: ""}, + "GetTemplate": {Verb: "Get", Resource: "Template", OutputListKey: "", OutputItemKey: "Template"}, + "ListConfigurationSets": {Verb: "List", Resource: "ConfigurationSet", OutputListKey: "ConfigurationSets", OutputItemKey: ""}, + "ListCustomVerificationEmailTemplates": {Verb: "List", Resource: "CustomVerificationEmailTemplate", OutputListKey: "CustomVerificationEmailTemplates", OutputItemKey: ""}, + "ListIdentities": {Verb: "List", Resource: "Identity", OutputListKey: "Identities", OutputItemKey: ""}, + "ListIdentityPolicies": {Verb: "List", Resource: "IdentityPolicy", OutputListKey: "PolicyNames", OutputItemKey: ""}, + "ListReceiptFilters": {Verb: "List", Resource: "ReceiptFilter", OutputListKey: "Filters", OutputItemKey: ""}, + "ListReceiptRuleSets": {Verb: "List", Resource: "ReceiptRuleSet", OutputListKey: "RuleSets", OutputItemKey: ""}, + "ListTemplates": {Verb: "List", Resource: "Template", OutputListKey: "TemplatesMetadata", OutputItemKey: ""}, + "ListVerifiedEmailAddresses": {Verb: "List", Resource: "VerifiedEmailAddress", OutputListKey: "VerifiedEmailAddresses", OutputItemKey: ""}, + "PutConfigurationSetDeliveryOptions": {Verb: "Update", Resource: "ConfigurationSetDeliveryOption", OutputListKey: "", OutputItemKey: ""}, + "PutIdentityPolicy": {Verb: "Update", Resource: "IdentityPolicy", OutputListKey: "", OutputItemKey: ""}, + "UpdateAccountSendingEnabled": {Verb: "Update", Resource: "AccountSendingEnabled", OutputListKey: "", OutputItemKey: ""}, + "UpdateConfigurationSetEventDestination": {Verb: "Update", Resource: "ConfigurationSetEventDestination", OutputListKey: "", OutputItemKey: ""}, + "UpdateConfigurationSetReputationMetricsEnabled": {Verb: "Update", Resource: "ConfigurationSetReputationMetricsEnabled", OutputListKey: "", OutputItemKey: ""}, + "UpdateConfigurationSetSendingEnabled": {Verb: "Update", Resource: "ConfigurationSetSendingEnabled", OutputListKey: "", OutputItemKey: ""}, + "UpdateConfigurationSetTrackingOptions": {Verb: "Update", Resource: "ConfigurationSetTrackingOption", OutputListKey: "", OutputItemKey: ""}, + "UpdateCustomVerificationEmailTemplate": {Verb: "Update", Resource: "CustomVerificationEmailTemplate", OutputListKey: "", OutputItemKey: ""}, + "UpdateReceiptRule": {Verb: "Update", Resource: "ReceiptRule", OutputListKey: "", OutputItemKey: ""}, + "UpdateTemplate": {Verb: "Update", Resource: "Template", OutputListKey: "", OutputItemKey: ""}, + }) crud.Register("sesv2", map[string]crud.OpMeta{ "BatchGetMetricData": {Verb: "List", Resource: "MetricData", OutputListKey: "Errors", OutputItemKey: "", Method: "POST", URI: "/v2/email/metrics/batch"}, "CreateConfigurationSet": {Verb: "Create", Resource: "ConfigurationSet", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/v2/email/configuration-sets"}, @@ -7323,6 +8532,35 @@ func init() { "TagResource": {Verb: "Tag", Resource: "Resource", OutputListKey: "", OutputItemKey: "", Method: "POST", URI: "/tags/{resourceArn}"}, "UntagResource": {Verb: "Untag", Resource: "Resource", OutputListKey: "", OutputItemKey: "", Method: "DELETE", URI: "/tags/{resourceArn}"}, }) + crud.Register("sns", map[string]crud.OpMeta{ + "CreatePlatformApplication": {Verb: "Create", Resource: "PlatformApplication", OutputListKey: "", OutputItemKey: ""}, + "CreatePlatformEndpoint": {Verb: "Create", Resource: "PlatformEndpoint", OutputListKey: "", OutputItemKey: ""}, + "CreateSMSSandboxPhoneNumber": {Verb: "Create", Resource: "SMSSandboxPhoneNumber", OutputListKey: "", OutputItemKey: ""}, + "CreateTopic": {Verb: "Create", Resource: "Topic", OutputListKey: "", OutputItemKey: ""}, + "DeleteEndpoint": {Verb: "Delete", Resource: "Endpoint", OutputListKey: "", OutputItemKey: ""}, + "DeletePlatformApplication": {Verb: "Delete", Resource: "PlatformApplication", OutputListKey: "", OutputItemKey: ""}, + "DeleteSMSSandboxPhoneNumber": {Verb: "Delete", Resource: "SMSSandboxPhoneNumber", OutputListKey: "", OutputItemKey: ""}, + "DeleteTopic": {Verb: "Delete", Resource: "Topic", OutputListKey: "", OutputItemKey: ""}, + "GetDataProtectionPolicy": {Verb: "Get", Resource: "DataProtectionPolicy", OutputListKey: "", OutputItemKey: ""}, + "GetEndpointAttributes": {Verb: "Get", Resource: "EndpointAttribute", OutputListKey: "", OutputItemKey: ""}, + "GetPlatformApplicationAttributes": {Verb: "Get", Resource: "PlatformApplicationAttribute", OutputListKey: "", OutputItemKey: ""}, + "GetSMSAttributes": {Verb: "Get", Resource: "SMSAttribute", OutputListKey: "", OutputItemKey: ""}, + "GetSMSSandboxAccountStatus": {Verb: "Get", Resource: "SMSSandboxAccountStatu", OutputListKey: "", OutputItemKey: ""}, + "GetSubscriptionAttributes": {Verb: "Get", Resource: "SubscriptionAttribute", OutputListKey: "", OutputItemKey: ""}, + "GetTopicAttributes": {Verb: "Get", Resource: "TopicAttribute", OutputListKey: "", OutputItemKey: ""}, + "ListEndpointsByPlatformApplication": {Verb: "List", Resource: "EndpointsByPlatformApplication", OutputListKey: "Endpoints", OutputItemKey: ""}, + "ListOriginationNumbers": {Verb: "List", Resource: "OriginationNumber", OutputListKey: "PhoneNumbers", OutputItemKey: ""}, + "ListPhoneNumbersOptedOut": {Verb: "List", Resource: "PhoneNumbersOptedOut", OutputListKey: "phoneNumbers", OutputItemKey: ""}, + "ListPlatformApplications": {Verb: "List", Resource: "PlatformApplication", OutputListKey: "PlatformApplications", OutputItemKey: ""}, + "ListSMSSandboxPhoneNumbers": {Verb: "List", Resource: "SMSSandboxPhoneNumber", OutputListKey: "PhoneNumbers", OutputItemKey: ""}, + "ListSubscriptions": {Verb: "List", Resource: "Subscription", OutputListKey: "Subscriptions", OutputItemKey: ""}, + "ListSubscriptionsByTopic": {Verb: "List", Resource: "SubscriptionsByTopic", OutputListKey: "Subscriptions", OutputItemKey: ""}, + "ListTagsForResource": {Verb: "List", Resource: "TagsForResource", OutputListKey: "Tags", OutputItemKey: ""}, + "ListTopics": {Verb: "List", Resource: "Topic", OutputListKey: "Topics", OutputItemKey: ""}, + "PutDataProtectionPolicy": {Verb: "Update", Resource: "DataProtectionPolicy", OutputListKey: "", OutputItemKey: ""}, + "TagResource": {Verb: "Tag", Resource: "Resource", OutputListKey: "", OutputItemKey: ""}, + "UntagResource": {Verb: "Untag", Resource: "Resource", OutputListKey: "", OutputItemKey: ""}, + }) crud.Register("sqs", map[string]crud.OpMeta{ "CreateQueue": {Verb: "Create", Resource: "Queue", OutputListKey: "", OutputItemKey: ""}, "DeleteMessage": {Verb: "Delete", Resource: "Message", OutputListKey: "", OutputItemKey: ""}, diff --git a/internal/generated/fidelity/manifest_gen.go b/internal/generated/fidelity/manifest_gen.go index 2d772a95..2321eaf0 100644 --- a/internal/generated/fidelity/manifest_gen.go +++ b/internal/generated/fidelity/manifest_gen.go @@ -5129,27 +5129,27 @@ var Services = map[string]Service{ "ApplySecurityGroupsToLoadBalancer": TierUnimplemented, "AttachLoadBalancerToSubnets": TierUnimplemented, "ConfigureHealthCheck": TierUnimplemented, - "CreateAppCookieStickinessPolicy": TierUnimplemented, - "CreateLBCookieStickinessPolicy": TierUnimplemented, - "CreateLoadBalancer": TierUnimplemented, - "CreateLoadBalancerListeners": TierUnimplemented, - "CreateLoadBalancerPolicy": TierUnimplemented, - "DeleteLoadBalancer": TierUnimplemented, - "DeleteLoadBalancerListeners": TierUnimplemented, - "DeleteLoadBalancerPolicy": TierUnimplemented, - "DeregisterInstancesFromLoadBalancer": TierUnimplemented, - "DescribeAccountLimits": TierUnimplemented, - "DescribeInstanceHealth": TierUnimplemented, - "DescribeLoadBalancerAttributes": TierUnimplemented, - "DescribeLoadBalancerPolicies": TierUnimplemented, - "DescribeLoadBalancerPolicyTypes": TierUnimplemented, - "DescribeLoadBalancers": TierUnimplemented, - "DescribeTags": TierUnimplemented, + "CreateAppCookieStickinessPolicy": TierAutoCRUD, + "CreateLBCookieStickinessPolicy": TierAutoCRUD, + "CreateLoadBalancer": TierAutoCRUD, + "CreateLoadBalancerListeners": TierAutoCRUD, + "CreateLoadBalancerPolicy": TierAutoCRUD, + "DeleteLoadBalancer": TierAutoCRUD, + "DeleteLoadBalancerListeners": TierAutoCRUD, + "DeleteLoadBalancerPolicy": TierAutoCRUD, + "DeregisterInstancesFromLoadBalancer": TierAutoCRUD, + "DescribeAccountLimits": TierAutoCRUD, + "DescribeInstanceHealth": TierAutoCRUD, + "DescribeLoadBalancerAttributes": TierAutoCRUD, + "DescribeLoadBalancerPolicies": TierAutoCRUD, + "DescribeLoadBalancerPolicyTypes": TierAutoCRUD, + "DescribeLoadBalancers": TierAutoCRUD, + "DescribeTags": TierAutoCRUD, "DetachLoadBalancerFromSubnets": TierUnimplemented, "DisableAvailabilityZonesForLoadBalancer": TierUnimplemented, "EnableAvailabilityZonesForLoadBalancer": TierUnimplemented, - "ModifyLoadBalancerAttributes": TierUnimplemented, - "RegisterInstancesWithLoadBalancer": TierUnimplemented, + "ModifyLoadBalancerAttributes": TierAutoCRUD, + "RegisterInstancesWithLoadBalancer": TierAutoCRUD, "RemoveTags": TierUnimplemented, "SetLoadBalancerListenerSSLCertificate": TierUnimplemented, "SetLoadBalancerPoliciesForBackendServer": TierUnimplemented, @@ -10403,102 +10403,102 @@ var Services = map[string]Service{ }}, "s3control": {Protocol: "rest-xml", ModelBacked: true, EngineWired: true, Operations: map[string]Tier{ "AssociateAccessGrantsIdentityCenter": TierUnimplemented, - "CreateAccessGrant": TierUnimplemented, - "CreateAccessGrantsInstance": TierUnimplemented, - "CreateAccessGrantsLocation": TierUnimplemented, - "CreateAccessPoint": TierUnimplemented, - "CreateAccessPointForObjectLambda": TierUnimplemented, - "CreateBucket": TierUnimplemented, - "CreateJob": TierUnimplemented, - "CreateMultiRegionAccessPoint": TierUnimplemented, - "CreateStorageLensGroup": TierUnimplemented, - "DeleteAccessGrant": TierUnimplemented, - "DeleteAccessGrantsInstance": TierUnimplemented, - "DeleteAccessGrantsInstanceResourcePolicy": TierUnimplemented, - "DeleteAccessGrantsLocation": TierUnimplemented, - "DeleteAccessPoint": TierUnimplemented, - "DeleteAccessPointForObjectLambda": TierUnimplemented, - "DeleteAccessPointPolicy": TierUnimplemented, - "DeleteAccessPointPolicyForObjectLambda": TierUnimplemented, - "DeleteAccessPointScope": TierUnimplemented, - "DeleteBucket": TierUnimplemented, - "DeleteBucketLifecycleConfiguration": TierUnimplemented, - "DeleteBucketPolicy": TierUnimplemented, - "DeleteBucketReplication": TierUnimplemented, - "DeleteBucketTagging": TierUnimplemented, - "DeleteJobTagging": TierUnimplemented, - "DeleteMultiRegionAccessPoint": TierUnimplemented, - "DeletePublicAccessBlock": TierUnimplemented, - "DeleteStorageLensConfiguration": TierUnimplemented, - "DeleteStorageLensConfigurationTagging": TierUnimplemented, - "DeleteStorageLensGroup": TierUnimplemented, - "DescribeJob": TierUnimplemented, - "DescribeMultiRegionAccessPointOperation": TierUnimplemented, + "CreateAccessGrant": TierAutoCRUD, + "CreateAccessGrantsInstance": TierAutoCRUD, + "CreateAccessGrantsLocation": TierAutoCRUD, + "CreateAccessPoint": TierAutoCRUD, + "CreateAccessPointForObjectLambda": TierAutoCRUD, + "CreateBucket": TierAutoCRUD, + "CreateJob": TierAutoCRUD, + "CreateMultiRegionAccessPoint": TierAutoCRUD, + "CreateStorageLensGroup": TierAutoCRUD, + "DeleteAccessGrant": TierAutoCRUD, + "DeleteAccessGrantsInstance": TierAutoCRUD, + "DeleteAccessGrantsInstanceResourcePolicy": TierAutoCRUD, + "DeleteAccessGrantsLocation": TierAutoCRUD, + "DeleteAccessPoint": TierAutoCRUD, + "DeleteAccessPointForObjectLambda": TierAutoCRUD, + "DeleteAccessPointPolicy": TierAutoCRUD, + "DeleteAccessPointPolicyForObjectLambda": TierAutoCRUD, + "DeleteAccessPointScope": TierAutoCRUD, + "DeleteBucket": TierAutoCRUD, + "DeleteBucketLifecycleConfiguration": TierAutoCRUD, + "DeleteBucketPolicy": TierAutoCRUD, + "DeleteBucketReplication": TierAutoCRUD, + "DeleteBucketTagging": TierAutoCRUD, + "DeleteJobTagging": TierAutoCRUD, + "DeleteMultiRegionAccessPoint": TierAutoCRUD, + "DeletePublicAccessBlock": TierAutoCRUD, + "DeleteStorageLensConfiguration": TierAutoCRUD, + "DeleteStorageLensConfigurationTagging": TierAutoCRUD, + "DeleteStorageLensGroup": TierAutoCRUD, + "DescribeJob": TierAutoCRUD, + "DescribeMultiRegionAccessPointOperation": TierAutoCRUD, "DissociateAccessGrantsIdentityCenter": TierUnimplemented, - "GetAccessGrant": TierUnimplemented, - "GetAccessGrantsInstance": TierUnimplemented, - "GetAccessGrantsInstanceForPrefix": TierUnimplemented, - "GetAccessGrantsInstanceResourcePolicy": TierUnimplemented, - "GetAccessGrantsLocation": TierUnimplemented, - "GetAccessPoint": TierUnimplemented, - "GetAccessPointConfigurationForObjectLambda": TierUnimplemented, - "GetAccessPointForObjectLambda": TierUnimplemented, - "GetAccessPointPolicy": TierUnimplemented, - "GetAccessPointPolicyForObjectLambda": TierUnimplemented, - "GetAccessPointPolicyStatus": TierUnimplemented, - "GetAccessPointPolicyStatusForObjectLambda": TierUnimplemented, - "GetAccessPointScope": TierUnimplemented, - "GetBucket": TierUnimplemented, - "GetBucketLifecycleConfiguration": TierUnimplemented, - "GetBucketPolicy": TierUnimplemented, - "GetBucketReplication": TierUnimplemented, - "GetBucketTagging": TierUnimplemented, - "GetBucketVersioning": TierUnimplemented, - "GetDataAccess": TierUnimplemented, - "GetJobTagging": TierUnimplemented, - "GetMultiRegionAccessPoint": TierUnimplemented, - "GetMultiRegionAccessPointPolicy": TierUnimplemented, - "GetMultiRegionAccessPointPolicyStatus": TierUnimplemented, - "GetMultiRegionAccessPointRoutes": TierUnimplemented, - "GetPublicAccessBlock": TierUnimplemented, - "GetStorageLensConfiguration": TierUnimplemented, - "GetStorageLensConfigurationTagging": TierUnimplemented, - "GetStorageLensGroup": TierUnimplemented, - "ListAccessGrants": TierUnimplemented, - "ListAccessGrantsInstances": TierUnimplemented, - "ListAccessGrantsLocations": TierUnimplemented, - "ListAccessPoints": TierUnimplemented, - "ListAccessPointsForDirectoryBuckets": TierUnimplemented, - "ListAccessPointsForObjectLambda": TierUnimplemented, - "ListCallerAccessGrants": TierUnimplemented, - "ListJobs": TierUnimplemented, - "ListMultiRegionAccessPoints": TierUnimplemented, - "ListRegionalBuckets": TierUnimplemented, - "ListStorageLensConfigurations": TierUnimplemented, - "ListStorageLensGroups": TierUnimplemented, - "ListTagsForResource": TierUnimplemented, - "PutAccessGrantsInstanceResourcePolicy": TierUnimplemented, - "PutAccessPointConfigurationForObjectLambda": TierUnimplemented, - "PutAccessPointPolicy": TierUnimplemented, - "PutAccessPointPolicyForObjectLambda": TierUnimplemented, - "PutAccessPointScope": TierUnimplemented, - "PutBucketLifecycleConfiguration": TierUnimplemented, - "PutBucketPolicy": TierUnimplemented, - "PutBucketReplication": TierUnimplemented, - "PutBucketTagging": TierUnimplemented, - "PutBucketVersioning": TierUnimplemented, - "PutJobTagging": TierUnimplemented, - "PutMultiRegionAccessPointPolicy": TierUnimplemented, - "PutPublicAccessBlock": TierUnimplemented, - "PutStorageLensConfiguration": TierUnimplemented, - "PutStorageLensConfigurationTagging": TierUnimplemented, + "GetAccessGrant": TierAutoCRUD, + "GetAccessGrantsInstance": TierAutoCRUD, + "GetAccessGrantsInstanceForPrefix": TierAutoCRUD, + "GetAccessGrantsInstanceResourcePolicy": TierAutoCRUD, + "GetAccessGrantsLocation": TierAutoCRUD, + "GetAccessPoint": TierAutoCRUD, + "GetAccessPointConfigurationForObjectLambda": TierAutoCRUD, + "GetAccessPointForObjectLambda": TierAutoCRUD, + "GetAccessPointPolicy": TierAutoCRUD, + "GetAccessPointPolicyForObjectLambda": TierAutoCRUD, + "GetAccessPointPolicyStatus": TierAutoCRUD, + "GetAccessPointPolicyStatusForObjectLambda": TierAutoCRUD, + "GetAccessPointScope": TierAutoCRUD, + "GetBucket": TierAutoCRUD, + "GetBucketLifecycleConfiguration": TierAutoCRUD, + "GetBucketPolicy": TierAutoCRUD, + "GetBucketReplication": TierAutoCRUD, + "GetBucketTagging": TierAutoCRUD, + "GetBucketVersioning": TierAutoCRUD, + "GetDataAccess": TierAutoCRUD, + "GetJobTagging": TierAutoCRUD, + "GetMultiRegionAccessPoint": TierAutoCRUD, + "GetMultiRegionAccessPointPolicy": TierAutoCRUD, + "GetMultiRegionAccessPointPolicyStatus": TierAutoCRUD, + "GetMultiRegionAccessPointRoutes": TierAutoCRUD, + "GetPublicAccessBlock": TierAutoCRUD, + "GetStorageLensConfiguration": TierAutoCRUD, + "GetStorageLensConfigurationTagging": TierAutoCRUD, + "GetStorageLensGroup": TierAutoCRUD, + "ListAccessGrants": TierAutoCRUD, + "ListAccessGrantsInstances": TierAutoCRUD, + "ListAccessGrantsLocations": TierAutoCRUD, + "ListAccessPoints": TierAutoCRUD, + "ListAccessPointsForDirectoryBuckets": TierAutoCRUD, + "ListAccessPointsForObjectLambda": TierAutoCRUD, + "ListCallerAccessGrants": TierAutoCRUD, + "ListJobs": TierAutoCRUD, + "ListMultiRegionAccessPoints": TierAutoCRUD, + "ListRegionalBuckets": TierAutoCRUD, + "ListStorageLensConfigurations": TierAutoCRUD, + "ListStorageLensGroups": TierAutoCRUD, + "ListTagsForResource": TierAutoCRUD, + "PutAccessGrantsInstanceResourcePolicy": TierAutoCRUD, + "PutAccessPointConfigurationForObjectLambda": TierAutoCRUD, + "PutAccessPointPolicy": TierAutoCRUD, + "PutAccessPointPolicyForObjectLambda": TierAutoCRUD, + "PutAccessPointScope": TierAutoCRUD, + "PutBucketLifecycleConfiguration": TierAutoCRUD, + "PutBucketPolicy": TierAutoCRUD, + "PutBucketReplication": TierAutoCRUD, + "PutBucketTagging": TierAutoCRUD, + "PutBucketVersioning": TierAutoCRUD, + "PutJobTagging": TierAutoCRUD, + "PutMultiRegionAccessPointPolicy": TierAutoCRUD, + "PutPublicAccessBlock": TierAutoCRUD, + "PutStorageLensConfiguration": TierAutoCRUD, + "PutStorageLensConfigurationTagging": TierAutoCRUD, "SubmitMultiRegionAccessPointRoutes": TierUnimplemented, - "TagResource": TierUnimplemented, - "UntagResource": TierUnimplemented, - "UpdateAccessGrantsLocation": TierUnimplemented, - "UpdateJobPriority": TierUnimplemented, - "UpdateJobStatus": TierUnimplemented, - "UpdateStorageLensGroup": TierUnimplemented, + "TagResource": TierAutoCRUD, + "UntagResource": TierAutoCRUD, + "UpdateAccessGrantsLocation": TierAutoCRUD, + "UpdateJobPriority": TierAutoCRUD, + "UpdateJobStatus": TierAutoCRUD, + "UpdateStorageLensGroup": TierAutoCRUD, }}, "s3tables": {Protocol: "", ModelBacked: false, EngineWired: false, Operations: map[string]Tier{ "CreateNamespace": TierHandVerified, diff --git a/internal/shared/crud/crud.go b/internal/shared/crud/crud.go index efeb04df..beaca3f3 100644 --- a/internal/shared/crud/crud.go +++ b/internal/shared/crud/crud.go @@ -69,6 +69,7 @@ type Result struct { const ( jsonContentType = "application/x-amz-json-1.1" restJSONType = "application/json" + xmlContentType = "application/xml" protocolJSON10 = "json-1.0" protocolRESTJSON = "rest-json" @@ -132,13 +133,40 @@ func JSONProtocol(protocol string) bool { // Servable reports whether the engine can serve requests for a protocol. // -// The JSON protocols carry the operation name in a header. rest-json does not, -// but its model binds every operation to a method and URI template, which the -// route table turns back into an operation name. query and rest-xml have -// neither, so a request for one of them cannot be classified at all and is -// declined rather than guessed at. +// Each protocol says which operation it means in a different place, and the +// engine now reads all three: the JSON protocols put it in an X-Amz-Target +// header; rest-json and rest-xml bind every operation to a method and URI +// template, which the route table turns back into a name; query puts it in the +// Action field of a form body. +// +// ec2-query is the one left out. It is form-encoded like query but not +// interchangeable with it, and no registered service speaks it except EC2, +// whose provider is hand-written and never reaches the engine. +// +// This is deliberately the same question codegen's engineServable answers. The +// two must agree: a protocol admitted there but refused here registers +// operations nothing can reach, and the fidelity manifest would call them +// auto-crud. func Servable(protocol string) bool { - return JSONProtocol(protocol) || protocol == protocolRESTJSON + return JSONProtocol(protocol) || protocol == protocolRESTJSON || + protocol == protocolRESTXML || protocol == protocolQuery +} + +// NeedsBody reports whether the gateway must buffer the request body before +// calling Handle. +// +// It is not the same question as Servable, and rest-xml is where the two come +// apart. The engine can classify a rest-xml request from its route table, but +// S3 speaks rest-xml and S3 bodies are large binary uploads; buffering those +// would turn a streaming path into a memory one, to serve a provider that never +// returns ErrUnhandledOp in the first place. Nothing is lost by it: every +// CRUD-shaped S3 Control operation addresses its resource with a path label or +// a query term, so the engine has what it needs without the body. +// +// query is the mirror image: servable, and unservable without the body, because +// the operation name itself is a field in it. +func NeedsBody(protocol string) bool { + return JSONProtocol(protocol) || protocol == protocolRESTJSON || protocol == protocolQuery } // Handle attempts to serve a call from the service's registered operations. It @@ -147,12 +175,23 @@ func Servable(protocol string) bool { func Handle(c Call) (*Result, error) { op := c.Op var labels httproute.Params + var form map[string]any rest := false switch { case JSONProtocol(c.Protocol): // The operation name arrived in X-Amz-Target; nothing to resolve. - case c.Protocol == protocolRESTJSON: + case c.Protocol == protocolQuery: + // query names its operation in neither a header nor a path: Action is + // a field of the form body, which is why it outlived the two REST + // protocols as a gap. An absent or empty Action is not a request this + // engine can classify — the other fields describe a resource, not an + // operation, and picking one from them would be a guess. + op, form = parseQueryForm(c.Body) + if op == "" { + return nil, ErrUnclassified + } + case c.Protocol == protocolRESTJSON, c.Protocol == protocolRESTXML: rest = true mu.RLock() rs := routes[c.Service] @@ -161,6 +200,10 @@ func Handle(c Call) (*Result, error) { // refused to classify, or a path this service does not model. All // three must decline — see docs/coverage.md on why a registered // service must never fabricate a success. + // + // It matters most for rest-xml, because S3 speaks it: an S3-shaped + // path reaching this engine must come back unclassified rather than be + // answered out of the generic store. if op, labels = httproute.Match(rs, c.Method, c.URI); op == "" { return nil, ErrUnclassified } @@ -184,12 +227,19 @@ func Handle(c Call) (*Result, error) { if rest { maps.Copy(params, queryParams(c.URI)) } - if len(c.Body) > 0 { + switch { + case c.Protocol == protocolQuery: + // Already decoded above. A query body is form-encoded, not JSON, so it + // must not reach the branch below — parsing it as JSON fails, and + // reporting that as a SerializationException would decline every query + // request with an error about a format it never claimed to send. + maps.Copy(params, form) + case len(c.Body) > 0: var body map[string]any if err := json.Unmarshal(c.Body, &body); err != nil { // Malformed body: real services reject with SerializationException // rather than fabricating a success from empty params. - return withContentType(serializationError(), c.Protocol), nil + return withContentType(serializationError(c.Protocol), c.Protocol), nil } maps.Copy(params, body) } @@ -197,10 +247,43 @@ func Handle(c Call) (*Result, error) { params[k] = v } - res, err := dispatch(c.Service, m, params) + res, err := dispatch(c.Service, c.Protocol, op, m, params) return withContentType(res, c.Protocol), err } +// parseQueryForm reads a Query-protocol form body, returning the operation name +// from Action and the remaining fields as engine parameters. +// +// Action and Version are dropped from the parameters. They describe the +// request, not the resource, and the engine echoes what it stores — leaving +// them in would put CreateLoadBalancer inside a result element +// where no SDK expects a member by that name, and would make Version part of +// the stored document forever. +// +// Structured members arrive flattened, as "Listeners.member.1.Protocol". They +// are kept here and dropped at the serializer (see sortedKeys), so that a +// dotted key can still be a resource identifier if some model ever binds one, +// without being emitted as a bogus element. +func parseQueryForm(body []byte) (action string, params map[string]any) { + // ParseQuery returns what it could parse alongside any error, so a + // malformed tail cannot discard the terms before it. + values, _ := url.ParseQuery(string(body)) + params = make(map[string]any, len(values)) + for k, vs := range values { + if len(vs) == 0 { + continue + } + switch k { + case "Action": + action = vs[0] + case "Version": + default: + params[k] = vs[0] + } + } + return action, params +} + // queryParams reads the request URI's query string as engine parameters. A // repeated key keeps its first value: the engine has no list-valued parameter, // and dropping the key entirely would lose a resource identifier. @@ -221,9 +304,16 @@ func queryParams(uri string) map[string]any { return out } +// xmlProtocol reports whether a protocol's bodies are XML. It is the +// serialization question, not the routing one: query and rest-xml resolve their +// operation in completely different ways but write the same kind of body. +func xmlProtocol(protocol string) bool { + return protocol == protocolRESTXML || protocol == protocolQuery +} + // withContentType stamps the protocol-appropriate content type so a json-1.0 // service is not served a 1.1 one, and a rest-json service is not served an -// X-Amz-Target type it never uses. dispatch/okJSON default to amz-json 1.1. +// X-Amz-Target type it never uses. dispatch/okBody default to amz-json 1.1. func withContentType(res *Result, protocol string) *Result { if res == nil { return res @@ -237,40 +327,44 @@ func withContentType(res *Result, protocol string) *Result { return res } -func dispatch(service string, m OpMeta, params map[string]any) (*Result, error) { +// dispatch runs the generic CRUD behaviour for one classified operation. It +// takes the protocol and operation name only to serialize the result: the two +// XML dialects need the operation to build their envelope, and the behaviour +// above the serializer is identical for every protocol. +func dispatch(service, protocol, op string, m OpMeta, params map[string]any) (*Result, error) { switch m.Verb { case "Create": id := resourceID(m.Resource, params) item := maps.Clone(params) stamp(item, service, m.Resource, id) put(service, m.Resource, id, item) - return okJSON(wrapItem(m, item)) + return okBody(protocol, op, wrapItem(m, item)) case "Get": // A Describe*/Get* whose output is a collection (list key, no single-item // 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 okJSON(map[string]any{m.OutputListKey: list(service, m.Resource)}) + return okBody(protocol, op, map[string]any{m.OutputListKey: list(service, m.Resource)}) } id := resourceID(m.Resource, params) item, found := get(service, m.Resource, id) if !found { - return notFound(m.Resource), nil + return notFound(protocol, m.Resource), nil } - return okJSON(wrapItem(m, item)) + return okBody(protocol, op, wrapItem(m, item)) case "List": key := m.OutputListKey if key == "" { key = m.Resource + "s" } - return okJSON(map[string]any{key: list(service, m.Resource)}) + return okBody(protocol, op, map[string]any{key: list(service, m.Resource)}) case "Delete": id := resourceID(m.Resource, params) del(service, m.Resource, id) - return okJSON(map[string]any{}) + return okBody(protocol, op, map[string]any{}) case "Update": id := resourceID(m.Resource, params) @@ -284,11 +378,11 @@ func dispatch(service string, m OpMeta, params map[string]any) (*Result, error) } } put(service, m.Resource, id, item) - return okJSON(wrapItem(m, item)) + return okBody(protocol, op, wrapItem(m, item)) case "Tag", "Untag", "Relate", "Toggle": // Relationship / tag / status flips: acknowledge without modelling state. - return okJSON(map[string]any{}) + return okBody(protocol, op, map[string]any{}) default: return nil, ErrUnclassified @@ -371,7 +465,13 @@ func list(service, resource string) []map[string]any { // --- helpers --- -func okJSON(v any) (*Result, error) { +// okBody serializes a successful response in the protocol's own encoding. The +// JSON protocols marshal the map directly; the XML dialects go through +// encodeXML, which needs the operation name to build its envelope. +func okBody(protocol, op string, v map[string]any) (*Result, error) { + if xmlProtocol(protocol) { + return &Result{Status: 200, Body: encodeXML(protocol, op, v), ContentType: xmlContentType}, nil + } b, err := json.Marshal(v) if err != nil { return nil, err @@ -379,19 +479,32 @@ func okJSON(v any) (*Result, error) { return &Result{Status: 200, Body: b, ContentType: jsonContentType}, nil } -func notFound(resource string) *Result { - b, _ := json.Marshal(map[string]string{ - "__type": "ResourceNotFoundException", - "message": resource + " not found", - }) - return &Result{Status: 400, Body: b, ContentType: jsonContentType} +func notFound(protocol, resource string) *Result { + return errorResult(protocol, "ResourceNotFoundException", resource+" not found") +} + +func serializationError(protocol string) *Result { + return errorResult(protocol, "SerializationException", "failed to deserialize request body") } -func serializationError() *Result { - b, _ := json.Marshal(map[string]string{ - "__type": "SerializationException", - "message": "failed to deserialize request body", - }) +// errorResult renders one of the engine's own errors in the protocol's error +// vocabulary. The XML dialects do not share an envelope: botocore's query +// parser looks for Error *inside* ErrorResponse and returns a code-less +// ClientError given a bare Error, while rest-xml expects the bare one. The +// gateway's writeAWSError makes the same distinction for the errors it writes; +// these are the ones the engine produces after it has already taken the request. +func errorResult(protocol, code, message string) *Result { + if xmlProtocol(protocol) { + body := xmlHeader + if protocol == protocolQuery { + body += "Sender" + code + + "" + message + "" + } else { + body += "" + code + "" + message + "" + } + return &Result{Status: 400, Body: []byte(body), ContentType: xmlContentType} + } + b, _ := json.Marshal(map[string]string{"__type": code, "message": message}) return &Result{Status: 400, Body: b, ContentType: jsonContentType} } diff --git a/internal/shared/crud/crud_test.go b/internal/shared/crud/crud_test.go index f90d5429..0f45798e 100644 --- a/internal/shared/crud/crud_test.go +++ b/internal/shared/crud/crud_test.go @@ -4,6 +4,8 @@ package crud import ( "encoding/json" + "net/url" + "strings" "sync" "testing" ) @@ -86,8 +88,10 @@ func TestEngineUnclassified(t *testing.T) { if _, err := handleJSON(t, svc, "SomeCustomOp", nil); err != ErrUnclassified { t.Fatalf("unknown op: want ErrUnclassified, got %v", err) } - if _, err := Handle(Call{Service: svc, Protocol: "query", Op: "CreateWidget", Body: []byte("{}")}); err != ErrUnclassified { - t.Fatalf("non-json protocol: want ErrUnclassified, got %v", err) + // ec2-query is the protocol still outside the engine: unlike query, it is + // not form-encoded with an Action field the engine can read. + if _, err := Handle(Call{Service: svc, Protocol: "ec2-query", Op: "CreateWidget", Body: []byte("{}")}); err != ErrUnclassified { + t.Fatalf("unservable protocol: want ErrUnclassified, got %v", err) } if _, err := handleJSON(t, "unregistered", "CreateThing", nil); err != ErrUnclassified { t.Fatalf("unregistered service: want ErrUnclassified, got %v", err) @@ -294,21 +298,306 @@ func TestEngineRESTJSONUnroutedOperationIsUnclassified(t *testing.T) { } } -// TestEngineRESTXMLStillDeclines pins the boundary. rest-xml and query carry no -// route table into the engine, and admitting them would serve S3 traffic from -// the generic store. -func TestEngineRESTXMLStillDeclines(t *testing.T) { - const svc = "xmlsvc" +// --- query --- + +func handleQuery(t *testing.T, service string, form url.Values) (*Result, error) { + t.Helper() + // Query is a form POST to "/": no path, no header, everything in the body. + return Handle(Call{ + Service: service, Protocol: "query", + Method: "POST", URI: "/", Body: []byte(form.Encode()), + }) +} + +// TestEngineQueryRoundTrip is the last protocol. query is the one that names +// its operation neither in a header nor in a path — Action is a field in the +// form body, which is why it outlived rest-json and rest-xml as a gap. +func TestEngineQueryRoundTrip(t *testing.T) { + const svc = "elbtest" + Register(svc, map[string]OpMeta{ + "CreateLoadBalancer": {Verb: "Create", Resource: "LoadBalancer", OutputItemKey: "LoadBalancer"}, + "DescribeLoadBalancers": {Verb: "Get", Resource: "LoadBalancer", + OutputListKey: "LoadBalancerDescriptions"}, + "DeleteLoadBalancer": {Verb: "Delete", Resource: "LoadBalancer"}, + }) + + // A Describe whose output is a collection reads as a list, so an empty + // store answers 200 with an empty element rather than NotFound. + r, err := handleQuery(t, svc, url.Values{ + "Action": {"DescribeLoadBalancers"}, + "Version": {"2012-06-01"}, + }) + if err != nil || r.Status != 200 { + t.Fatalf("describe on empty store: status=%d err=%v", statusOf(r), err) + } + if got := string(r.Body); !strings.Contains(got, "") { + t.Fatalf("not a query envelope: %s", got) + } + + r, err = handleQuery(t, svc, url.Values{ + "Action": {"CreateLoadBalancer"}, + "Version": {"2012-06-01"}, + "LoadBalancerName": {"my-lb"}, + }) + if err != nil || r.Status != 200 { + t.Fatalf("create: status=%d err=%v", statusOf(r), err) + } + if got := string(r.Body); !strings.Contains(got, "my-lb") { + t.Fatalf("create did not echo the form parameter: %s", got) + } + + // The round trip that matters: the name the caller sent comes back. + r, _ = handleQuery(t, svc, url.Values{"Action": {"DescribeLoadBalancers"}}) + if got := string(r.Body); !strings.Contains(got, "my-lb") { + t.Fatalf("describe did not return the created load balancer: %s", got) + } + + if _, err := handleQuery(t, svc, url.Values{ + "Action": {"DeleteLoadBalancer"}, "LoadBalancerName": {"my-lb"}, + }); err != nil { + t.Fatalf("delete: %v", err) + } + r, _ = handleQuery(t, svc, url.Values{"Action": {"DescribeLoadBalancers"}}) + if got := string(r.Body); strings.Contains(got, "my-lb") { + t.Fatalf("resource survived delete: %s", got) + } +} + +// TestEngineQueryDropsProtocolFields keeps Action and Version out of the stored +// resource. They describe the request, not the thing being created, and echoing +// them back puts CreateLoadBalancer inside a result element +// where no SDK expects a member by that name. +func TestEngineQueryDropsProtocolFields(t *testing.T) { + const svc = "qfieldsvc" Register(svc, map[string]OpMeta{ - "ListThings": {Verb: "List", Resource: "XThing", OutputListKey: "Things", + "CreateThing": {Verb: "Create", Resource: "QFThing", OutputItemKey: "Thing"}, + }) + + r, err := handleQuery(t, svc, url.Values{ + "Action": {"CreateThing"}, "Version": {"2012-06-01"}, "QFThingName": {"t1"}, + }) + if err != nil { + t.Fatalf("create: %v", err) + } + body := string(r.Body) + if strings.Contains(body, "") || strings.Contains(body, "") { + t.Errorf("protocol envelope fields leaked into the resource: %s", body) + } + if !strings.Contains(body, "t1") { + t.Errorf("real parameter was dropped: %s", body) + } +} + +// TestEngineQueryDeclines covers every way a query request must fail rather +// than be answered from the generic store. +func TestEngineQueryDeclines(t *testing.T) { + const svc = "qmisssvc" + Register(svc, map[string]OpMeta{ + "CreateThing": {Verb: "Create", Resource: "QMThing"}, + }) + + cases := []struct { + name string + form url.Values + }{ + // Not CRUD-shaped, so codegen registered nothing for it. + {"unknown_action", url.Values{"Action": {"ConfigureHealthCheck"}}}, + // A form body with no Action at all is not a query request the engine + // can classify; guessing an operation from the other fields would be + // exactly the fabrication the coverage claim forbids. + {"no_action", url.Values{"LoadBalancerName": {"x"}}}, + {"empty_action", url.Values{"Action": {""}}}, + } + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + if _, err := handleQuery(t, svc, c.form); err != ErrUnclassified { + t.Errorf("want ErrUnclassified, got %v", err) + } + }) + } + + if _, err := handleQuery(t, "unregistered", url.Values{"Action": {"CreateThing"}}); err != ErrUnclassified { + t.Errorf("unregistered service: want ErrUnclassified, got %v", err) + } +} + +// TestEngineQueryBodyIsNotJSON guards the branch that would otherwise reject +// every query request. Handle parses the body as JSON for the protocols that +// send JSON; a form-encoded body is not JSON, and treating a failure to parse +// it as a SerializationException would decline every query call with the wrong +// error. +func TestEngineQueryBodyIsNotJSON(t *testing.T) { + const svc = "qjsonsvc" + Register(svc, map[string]OpMeta{ + "ListThings": {Verb: "List", Resource: "QJThing", OutputListKey: "Things"}, + }) + + r, err := handleQuery(t, svc, url.Values{"Action": {"ListThings"}}) + if err != nil { + t.Fatalf("list: %v", err) + } + if r.Status != 200 { + t.Fatalf("form body was rejected as malformed JSON: %d %s", r.Status, r.Body) + } +} + +func TestEngineQueryContentType(t *testing.T) { + const svc = "qctsvc" + Register(svc, map[string]OpMeta{ + "ListThings": {Verb: "List", Resource: "QCThing", OutputListKey: "Things"}, + }) + + r, err := handleQuery(t, svc, url.Values{"Action": {"ListThings"}}) + if err != nil { + t.Fatalf("list: %v", err) + } + if r.ContentType != "application/xml" { + t.Errorf("ContentType = %q, want application/xml", r.ContentType) + } +} + +// TestServableAndNeedsBody separates two questions the engine used to answer +// with one predicate. +// +// "Can the engine serve this protocol" and "must the gateway buffer the body +// before calling it" are not the same question, and rest-xml is where they come +// apart: the engine can classify it from the route table, but S3 speaks it and +// S3 bodies are large binary uploads. Buffering those to serve a service that +// never reaches the engine would turn a streaming path into a memory one. +func TestServableAndNeedsBody(t *testing.T) { + cases := []struct { + protocol string + servable, needsBody bool + }{ + {"json-1.0", true, true}, + {"json-1.1", true, true}, + {"json", true, true}, + {"rest-json", true, true}, + // The whole reason the predicates are separate. + {"rest-xml", true, false}, + // The mirror image: servable, and its operation name is in the body, so + // it must be buffered before it can be read. + {"query", true, true}, + {"ec2-query", false, false}, + {"nonsense", false, false}, + } + for _, c := range cases { + t.Run(c.protocol, func(t *testing.T) { + if got := Servable(c.protocol); got != c.servable { + t.Errorf("Servable(%q) = %v, want %v", c.protocol, got, c.servable) + } + if got := NeedsBody(c.protocol); got != c.needsBody { + t.Errorf("NeedsBody(%q) = %v, want %v", c.protocol, got, c.needsBody) + } + }) + } +} + +// --- rest-xml --- + +func handleXML(t *testing.T, service, method, uri string) (*Result, error) { + t.Helper() + // Deliberately no body: rest-xml is not buffered by the gateway, so the + // engine must serve it from the path and query alone. + return Handle(Call{Service: service, Protocol: "rest-xml", Method: method, URI: uri}) +} + +// TestEngineRESTXMLRoundTrip uses S3 Control's own routes, because it is the +// service this unlocks and its identifiers all arrive as path labels. +func TestEngineRESTXMLRoundTrip(t *testing.T) { + const svc = "s3controltest" + Register(svc, map[string]OpMeta{ + "CreateAccessPoint": {Verb: "Create", Resource: "AccessPoint", OutputItemKey: "AccessPoint", + Method: "PUT", URI: "/v20180820/accesspoint/{Name}"}, + "GetAccessPoint": {Verb: "Get", Resource: "AccessPoint", OutputItemKey: "AccessPoint", + Method: "GET", URI: "/v20180820/accesspoint/{Name}"}, + "ListAccessPoints": {Verb: "List", Resource: "AccessPoint", OutputListKey: "AccessPointList", + Method: "GET", URI: "/v20180820/accesspoint"}, + "DeleteAccessPoint": {Verb: "Delete", Resource: "AccessPoint", + Method: "DELETE", URI: "/v20180820/accesspoint/{Name}"}, + }) + + // The parameterless read on an empty store, which is what the compat smoke + // test performs for every engine-served service. + r, err := handleXML(t, svc, "GET", "/v20180820/accesspoint") + if err != nil || r.Status != 200 { + t.Fatalf("list on empty store: status=%d err=%v", statusOf(r), err) + } + if got := string(r.Body); !strings.Contains(got, "") { + t.Fatalf("empty list not rendered as an empty element: %s", got) + } + + // Create: the only parameter is the path label, and there is no body at all. + r, err = handleXML(t, svc, "PUT", "/v20180820/accesspoint/ap1") + if err != nil || r.Status != 200 { + t.Fatalf("create: status=%d err=%v", statusOf(r), err) + } + if got := string(r.Body); !strings.Contains(got, "ap1") { + t.Fatalf("create did not echo the path label: %s", got) + } + + // Get addresses the same resource by the same label. + r, err = handleXML(t, svc, "GET", "/v20180820/accesspoint/ap1") + if err != nil || r.Status != 200 { + t.Fatalf("get: status=%d err=%v", statusOf(r), err) + } + if got := string(r.Body); !strings.Contains(got, "ap1") { + t.Fatalf("get returned the wrong resource: %s", got) + } + + // It is in the list, wrapped as a member. + r, _ = handleXML(t, svc, "GET", "/v20180820/accesspoint") + if got := string(r.Body); !strings.Contains(got, "") { + t.Fatalf("created resource is not in the list: %s", got) + } + + // Delete, then the list is empty again. + if _, err := handleXML(t, svc, "DELETE", "/v20180820/accesspoint/ap1"); err != nil { + t.Fatalf("delete: %v", err) + } + r, _ = handleXML(t, svc, "GET", "/v20180820/accesspoint") + if got := string(r.Body); strings.Contains(got, "") { + t.Fatalf("resource survived delete: %s", got) + } +} + +func TestEngineRESTXMLContentType(t *testing.T) { + const svc = "xmlctsvc" + Register(svc, map[string]OpMeta{ + "ListThings": {Verb: "List", Resource: "XCThing", OutputListKey: "Things", Method: "GET", URI: "/things"}, }) - for _, proto := range []string{"rest-xml", "query"} { - _, err := Handle(Call{Service: svc, Protocol: proto, Method: "GET", URI: "/things"}) - if err != ErrUnclassified { - t.Errorf("%s: want ErrUnclassified, got %v", proto, err) - } + r, err := handleXML(t, svc, "GET", "/things") + if err != nil { + t.Fatalf("list: %v", err) + } + if r.ContentType != "application/xml" { + t.Errorf("ContentType = %q, want application/xml", r.ContentType) + } + if !strings.HasPrefix(string(r.Body), xmlHeader) { + t.Errorf("body is not XML: %s", r.Body) + } +} + +// TestEngineRESTXMLUnmatchedPathIsUnclassified is the guarantee that matters +// most for this protocol, because S3 speaks it. A path the route table does not +// know must decline rather than answer from the generic store. +func TestEngineRESTXMLUnmatchedPathIsUnclassified(t *testing.T) { + const svc = "xmlmisssvc" + Register(svc, map[string]OpMeta{ + "ListThings": {Verb: "List", Resource: "XMThing", OutputListKey: "Things", + Method: "GET", URI: "/v20180820/things"}, + }) + + if _, err := handleXML(t, svc, "GET", "/my-bucket/my-key"); err != ErrUnclassified { + t.Errorf("an S3-shaped path: want ErrUnclassified, got %v", err) + } + if _, err := handleXML(t, svc, "POST", "/v20180820/things"); err != ErrUnclassified { + t.Errorf("known path, wrong method: want ErrUnclassified, got %v", err) + } + if _, err := handleXML(t, "unregistered", "GET", "/v20180820/things"); err != ErrUnclassified { + t.Errorf("unregistered service: want ErrUnclassified, got %v", err) } } diff --git a/internal/shared/crud/xml.go b/internal/shared/crud/xml.go new file mode 100644 index 00000000..91f9dd0a --- /dev/null +++ b/internal/shared/crud/xml.go @@ -0,0 +1,119 @@ +// SPDX-License-Identifier: Apache-2.0 + +package crud + +import ( + "encoding/xml" + "fmt" + "sort" + "strings" +) + +const xmlHeader = `` + +const ( + protocolQuery = "query" + protocolRESTXML = "rest-xml" +) + +// encodeXML renders an engine response as an AWS XML body. +// +// The two dialects differ only in the envelope. botocore's query parser looks +// for nested inside and returns a result +// with nothing in it when the nesting is absent; its rest-xml parser maps the +// root element's children straight onto the output shape and ignores the root's +// name. So query gets both wrappers and rest-xml gets one. +// +// No xmlns is emitted. botocore strips the namespace from every element before +// matching it, so declaring one would be bytes on the wire that nothing reads. +// If that ever stops being true the namespace belongs on OpMeta, from the +// model's xmlNamespace trait, rather than guessed at here. +// +// This is the same "plausible, not faithful" contract as the JSON path: the +// body echoes what the caller stored, in the shape an SDK can parse. It is not +// derived from the model's output shape, so a member the model flattens or +// renames is emitted in its default form. +func encodeXML(protocol, op string, v map[string]any) []byte { + var b strings.Builder + b.WriteString(xmlHeader) + + if protocol == protocolQuery { + b.WriteString("<" + op + "Response>") + } + writeElement(&b, op+"Result", v) + if protocol == protocolQuery { + // RequestId is not optional: botocore's query parser reads + // ResponseMetadata into every response's metadata, and an SDK that logs + // or retries on it gets an empty string otherwise. + b.WriteString("" + randHex(8) + "") + b.WriteString("") + } + return []byte(b.String()) +} + +// writeElement writes one … element whose content is value. +func writeElement(b *strings.Builder, name string, value any) { + b.WriteString("<" + name + ">") + writeValue(b, value) + b.WriteString("") +} + +// writeValue writes the content of an element: nested elements for a map, +// entries for a list, escaped text for anything else. +func writeValue(b *strings.Builder, value any) { + switch val := value.(type) { + case nil: + + case map[string]any: + for _, k := range sortedKeys(val) { + writeElement(b, k, val[k]) + } + + case []map[string]any: + // AWS wraps list entries in for both dialects unless the model + // flattens the list. The engine has no flattening information, so it + // emits the default rather than guessing per service. + for _, item := range val { + writeElement(b, "member", item) + } + + case []any: + // The engine's own list() produces []map[string]any, but a list echoed + // back from a caller's JSON body arrives as []any. + for _, item := range val { + writeElement(b, "member", item) + } + + case string: + // The error is the Writer's, and a strings.Builder never fails a write. + _ = xml.EscapeText(b, []byte(val)) + + default: + // Numbers and bools. fmt renders these the way AWS does, and escaping + // is applied anyway because the branch is reachable from a caller's + // arbitrary JSON body, not only from the two types named. + _ = xml.EscapeText(b, []byte(fmt.Sprint(val))) + } +} + +// sortedKeys returns the emittable keys of a response map in a stable order. +// +// Sorted because Go map iteration is randomised and an unsorted body would make +// the same stored resource serialize differently between runs of the same +// binary — the same reason Register sorts the route table. +// +// A key containing "." is dropped. Query input is flat form-encoding, so a +// structured member arrives as "Listeners.member.1.Protocol"; there is nowhere +// to put it in a generic store, and no SDK expects an element by that name, so +// echoing it back would be noise in a response rather than information. +func sortedKeys(m map[string]any) []string { + keys := make([]string, 0, len(m)) + for k := range m { + if strings.Contains(k, ".") { + continue + } + keys = append(keys, k) + } + sort.Strings(keys) + return keys +} diff --git a/internal/shared/crud/xml_test.go b/internal/shared/crud/xml_test.go new file mode 100644 index 00000000..9178df4a --- /dev/null +++ b/internal/shared/crud/xml_test.go @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: Apache-2.0 + +package crud + +import ( + "regexp" + "strings" + "testing" +) + +// requestIDPattern strips the synthesized RequestId so envelope assertions can +// compare a fixed string. +var requestIDPattern = regexp.MustCompile(`[0-9a-f]+`) + +func normalize(b []byte) string { + s := requestIDPattern.ReplaceAllString(string(b), "ID") + return strings.TrimPrefix(s, xmlHeader) +} + +// TestEncodeXMLEnvelopes pins the two dialects apart. botocore's query parser +// looks for inside ; its rest-xml parser +// maps the root element's children straight onto the output shape and ignores +// the root's name. +func TestEncodeXMLEnvelopes(t *testing.T) { + body := map[string]any{"DNSName": "lb-1.example.com"} + + got := normalize(encodeXML(protocolQuery, "CreateLoadBalancer", body)) + want := "" + + "lb-1.example.com" + + "ID" + + "" + if got != want { + t.Errorf("query envelope:\n got %s\nwant %s", got, want) + } + + got = normalize(encodeXML(protocolRESTXML, "CreateAccessPoint", body)) + want = "lb-1.example.com" + if got != want { + t.Errorf("rest-xml envelope:\n got %s\nwant %s", got, want) + } +} + +func TestEncodeXMLValues(t *testing.T) { + cases := []struct { + name string + in map[string]any + want string + }{ + { + // Keys are sorted so the same store produces the same bytes across + // runs — Go map iteration is randomised, same reason Register sorts + // the route table. + name: "keys_are_sorted", + in: map[string]any{"Zeta": "z", "Alpha": "a", "Mu": "m"}, + want: "amz", + }, + { + name: "scalars", + in: map[string]any{"B": true, "N": 42, "F": 1.5, "S": "x"}, + want: "true1.542x", + }, + { + // AWS wraps list entries in for both dialects unless the + // model flattens them. The engine has no flattening information, so + // it emits the default. + name: "list_wraps_members", + in: map[string]any{"Things": []map[string]any{ + {"Name": "a"}, {"Name": "b"}, + }}, + want: "ab", + }, + { + // The engine's own list() returns []map[string]any, but a value + // echoed back from a caller's JSON body arrives as []any. + name: "any_slice_wraps_members", + in: map[string]any{"Names": []any{"a", "b"}}, + want: "ab", + }, + { + // An empty collection must be an empty element, not an omitted one: + // botocore reads a missing key as absent rather than as empty. + name: "empty_list_is_an_empty_element", + in: map[string]any{"Things": []map[string]any{}}, + want: "", + }, + { + name: "nested_map", + in: map[string]any{"Outer": map[string]any{"Inner": "v"}}, + want: "v", + }, + { + // Query input is flat form-encoding, so a structured member arrives + // as "Listeners.member.1.Protocol". There is nowhere to put it in a + // generic store and it is not a name any SDK expects back, so it is + // dropped rather than emitted as a bogus element. + name: "dotted_keys_are_dropped", + in: map[string]any{ + "LoadBalancerName": "lb", + "Listeners.member.1.Protocol": "HTTP", + }, + want: "lb", + }, + { + // A caller controls these values. Emitting them raw produces a body + // botocore cannot parse at all, which reads as a transport failure + // rather than as the echo it is. + name: "values_are_escaped", + in: map[string]any{"S": `a"d"`}, + want: "a<b&c>"d"", + }, + { + // Nothing in the engine produces nil, but a caller's JSON body can. + name: "nil_is_an_empty_element", + in: map[string]any{"S": nil}, + want: "", + }, + } + + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + got := normalize(encodeXML(protocolRESTXML, "Op", c.in)) + want := "" + c.want + "" + if got != want { + t.Errorf("\n got %s\nwant %s", got, want) + } + }) + } +} + +// TestEncodeXMLIsDeterministic guards the sorting above against a regression +// that only shows up as a flaky diff between runs. +func TestEncodeXMLIsDeterministic(t *testing.T) { + in := map[string]any{"A": "1", "B": "2", "C": "3", "D": "4", "E": "5", "F": "6"} + first := normalize(encodeXML(protocolRESTXML, "Op", in)) + for i := 0; i < 50; i++ { + if got := normalize(encodeXML(protocolRESTXML, "Op", in)); got != first { + t.Fatalf("run %d differs:\n got %s\nfirst %s", i, got, first) + } + } +} + +// TestEncodeXMLDeclaresItsHeader keeps the XML declaration on the body: botocore +// tolerates its absence, but the gateway's own error envelopes emit it and a +// response that differs from an error only in that respect is a needless +// difference. +func TestEncodeXMLDeclaresItsHeader(t *testing.T) { + if !strings.HasPrefix(string(encodeXML(protocolQuery, "Op", nil)), xmlHeader) { + t.Error("body does not start with the XML declaration") + } +} diff --git a/tests/compatibility/test_elb.py b/tests/compatibility/test_elb.py new file mode 100644 index 00000000..20e4c4a4 --- /dev/null +++ b/tests/compatibility/test_elb.py @@ -0,0 +1,90 @@ +"""Elastic Load Balancing v1, served by the generic CRUD engine over Query. + +query was the last protocol the engine could not read. Its operation is neither +an X-Amz-Target header nor a modelled path but the Action field of a form body, +and its responses are XML in a dialect of their own: botocore's query parser +looks for nested inside and, given +anything else, returns a result with nothing in it rather than an error. + +That failure mode is why these tests assert on parsed members instead of on +status codes. A 200 whose body botocore silently discards looks identical to a +working service from Go's side of the wire. +""" + +import pytest +from botocore.exceptions import ClientError + +from conftest import _make_client + + +@pytest.fixture +def elb_client(devcloud_server): + return _make_client("elb") + + +def test_describe_on_empty_store(elb_client): + """The parameterless read, and the first thing that would break if the + query envelope were wrong: an empty collection must parse as an empty list, + not as a missing key.""" + got = elb_client.describe_load_balancers() + assert got["LoadBalancerDescriptions"] == [] + + +def test_create_then_describe_round_trips(elb_client): + """The name the caller sent in a form field comes back through the XML. + + This is the whole query path end to end: Action picks the operation, + LoadBalancerName is stored as the identifier, and the response is re-parsed + by botocore into a modelled member. + """ + elb_client.create_load_balancer( + LoadBalancerName="my-lb", + Listeners=[{"Protocol": "HTTP", "LoadBalancerPort": 80, "InstancePort": 8080}], + ) + + got = elb_client.describe_load_balancers() + names = [lb["LoadBalancerName"] for lb in got["LoadBalancerDescriptions"]] + assert "my-lb" in names + + +def test_delete_removes_it(elb_client): + elb_client.create_load_balancer(LoadBalancerName="doomed-lb", Listeners=[]) + elb_client.delete_load_balancer(LoadBalancerName="doomed-lb") + + got = elb_client.describe_load_balancers() + names = [lb["LoadBalancerName"] for lb in got["LoadBalancerDescriptions"]] + assert "doomed-lb" not in names + + +def test_unclassifiable_operation_declines(elb_client): + """The floor is a floor. Eleven of ELB's 29 operations are not CRUD-shaped, + so codegen registers nothing for them and they must return a clean AWS error + rather than an empty success. + + ConfigureHealthCheck is the one worth naming: a Terraform aws_elb resource + calls it, so this is the honest edge of what "elb is covered" means. + """ + with pytest.raises(ClientError) as exc: + elb_client.configure_health_check( + LoadBalancerName="my-lb", + HealthCheck={ + "Target": "HTTP:80/", + "Interval": 30, + "Timeout": 5, + "UnhealthyThreshold": 2, + "HealthyThreshold": 2, + }, + ) + # The code has to survive botocore's query parser. A bare envelope + # here would produce a ClientError with no Code at all, which tells the + # caller nothing about why the call failed. + assert exc.value.response["Error"]["Code"], "botocore parsed no error code" + + +def test_elbv2_is_unaffected(devcloud_server): + """ELB v1 and v2 share the signing name "elasticloadbalancing" and both + speak query, so only the API version in the request body separates them. + v2 has a hand-written provider and must keep reaching it.""" + v2 = _make_client("elbv2") + got = v2.describe_load_balancers() + assert "LoadBalancers" in got diff --git a/tests/compatibility/test_s3control.py b/tests/compatibility/test_s3control.py index 026ee459..169ba527 100644 --- a/tests/compatibility/test_s3control.py +++ b/tests/compatibility/test_s3control.py @@ -70,6 +70,53 @@ def test_s3control_answers_as_itself_not_as_s3(s3control_client): ) +def test_s3control_is_engine_served(s3control_client): + """s3control's floor, proved here rather than in test_service_smoke.py. + + It cannot go in that harness's ENGINE_SERVED_SERVICES list: the list picks a + parameterless List*/Describe* from the model, and all 97 of s3control's + operations take a required AccountId. This is the budgets precedent — the + service is served, and the proof needs one fixture instead of none. + + rest-xml is why it was the last protocol but one: botocore's RestXMLParser + maps the response root's children onto the output shape, so this asserts the + engine's generic XML is something a real parser accepts, not merely that Go + produced a 200. + """ + got = s3control_client.list_access_points(AccountId=ACCOUNT_ID) + assert "AccessPointList" in got, f"no modelled member came back: {got}" + + +def test_s3control_round_trips_a_resource(s3control_client): + """Create then read, through botocore both ways. + + The identifier arrives only as a path label — PUT /v20180820/accesspoint/ + {Name} — with no request body at all, because the gateway deliberately does + not buffer rest-xml bodies. If the label were not read, the resource would + be stored under a generated id and this read would come back empty. + """ + name = "round-trip-ap" + s3control_client.create_access_point( + AccountId=ACCOUNT_ID, Name=name, Bucket="some-bucket" + ) + + listed = s3control_client.list_access_points(AccountId=ACCOUNT_ID) + names = [ap.get("Name") for ap in listed.get("AccessPointList", [])] + assert name in names, f"created access point is not in the list: {listed}" + + +def test_s3control_unclassifiable_operation_declines(s3control_client): + """The floor is a floor. AssociateAccessGrantsIdentityCenter is one of the + three s3control operations that is not CRUD-shaped, so codegen registers + nothing for it and it must decline rather than answer from the store.""" + code = _error_code( + s3control_client.associate_access_grants_identity_center, + AccountId=ACCOUNT_ID, + IdentityCenterArn="arn:aws:sso:::instance/ssoins-000000000000", + ) + assert code is not None, "an unclassifiable operation returned a success" + + def test_s3_is_unaffected_by_the_split(s3_client): """The split must cost S3 nothing for any normal bucket or key.""" s3_client.create_bucket(Bucket="split-guard-bucket") diff --git a/tests/compatibility/test_service_smoke.py b/tests/compatibility/test_service_smoke.py index daa4613b..bd52cb5f 100644 --- a/tests/compatibility/test_service_smoke.py +++ b/tests/compatibility/test_service_smoke.py @@ -19,10 +19,10 @@ # name is the point: the test asserts what a user typing it actually gets. # # Services whose coverage comes from the generic CRUD engine rather than a -# hand-written provider. The engine serves the awsJson1_0 / awsJson1_1 -# protocols, which carry the operation name in X-Amz-Target, and rest-json, -# whose operation is recovered from the request method and path via the model's -# route table. A query or rest-xml service cannot be listed here and be served. +# hand-written provider. The engine reads every protocol DevCloud registers, +# each naming its operation somewhere different: awsJson1_0 / awsJson1_1 in the +# X-Amz-Target header, rest-json and rest-xml in the request method and path via +# the model's route table, query in the Action field of the form body. ENGINE_SERVED_SERVICES = [ "comprehend", # rest-json, and the proof the engine reaches that protocol at all. All @@ -111,19 +111,37 @@ "vpc-lattice", "workspaces", "workspaces-web", + # --- the non-JSON surface (Milestone 5) --- + # The last two of the 57, and the reason they were last. Neither protocol + # names its operation the way the engine originally required: elb is query, + # so the operation is the Action field of a form body, and s3control is + # rest-xml, so it comes from the method and path. Both are read now, and + # this entry is what proves it against a real botocore parser rather than + # against Go's idea of the wire format. + # + # s3control is served too — 94 auto-crud operations in the manifest — but + # is absent here on purpose: every one of its 97 operations takes a required + # AccountId, so this harness has no parameterless read to prove it with. The + # budgets precedent, and tests/compatibility/test_s3control.py is where it + # is proved instead. + "elb", # Served, but not provable here: apigateway and apigatewaymanagementapi # read with Get* rather than List*/Describe*, and budgets requires an # account id on every operation. The fidelity manifest is their record, # as for bedrock-data-automation-runtime. ] -# Services registered so the gateway routes them, but served by nothing: their -# protocol carries no operation name for the CRUD engine to classify, and no -# provider implements them by hand. They must answer with a clean AWS error — -# never a fabricated success, and never an unrouted UnknownService, which would +# Services registered so the gateway routes them, but served by nothing: no +# operation in their whole API is CRUD-shaped, and no provider implements them +# by hand. They must answer with a clean AWS error — never a fabricated success, and never an unrouted UnknownService, which would # send a caller back to real AWS. They are deliberately NOT counted as covered; # see docs/coverage.md. # +# The protocol reason for being on this list is gone. The engine reads all five +# protocols now — X-Amz-Target for the JSON family, method and path for the two +# REST ones, the Action form field for query — so what is left here is only the +# services whose operations are not CRUD-shaped at all. +# # personalize-runtime left this list when the engine gained rest-json: # GetRecommendations classifies as a Get, so it is served now. It is not in # ENGINE_SERVED_SERVICES either, because both its operations take required @@ -137,15 +155,14 @@ # no route to match. Same case as forecastquery. "sagemaker-runtime", # --- the demand set (Milestone 4) --- - # The three of 57 that do not meet the floor, and why each is different: - # elb query protocol — the engine cannot read it; Milestone 5 - # s3control rest-xml protocol — same; Milestone 5 + # One of the 57 does not meet the floor. elb and s3control were here too, + # for the protocol reason Milestone 5 removed: the engine now reads query + # from the Action form field and rest-xml from the method and path. # rds-data rest-json and readable, but its whole API is # ExecuteStatement / BeginTransaction / Commit / Rollback, - # none of which is CRUD-shaped. No protocol change helps it. - "elb", + # none of which is CRUD-shaped. No protocol change helps it, + # which is why it is the one that stays. "rds-data", - "s3control", ]