From 65e066d9f6478f1763cbd8cbeda0e60d208e1f82 Mon Sep 17 00:00:00 2001 From: sk593 Date: Mon, 12 Jun 2023 16:07:04 -0700 Subject: [PATCH 01/16] adding extender support --- cadl/Applications.Link/extenders.cadl | 6 + .../extender_conversion.go | 10 +- .../backend/controller/deleteresource.go | 2 + pkg/linkrp/backend/service.go | 5 + pkg/linkrp/datamodel/extender.go | 10 +- pkg/linkrp/frontend/controller/types.go | 5 + pkg/linkrp/frontend/handler/routes.go | 54 ++++-- pkg/linkrp/processors/extenders/doc.go | 18 ++ pkg/linkrp/processors/extenders/processor.go | 67 +++++++ .../processors/extenders/processor_test.go | 175 ++++++++++++++++++ pkg/linkrp/processors/validator.go | 12 ++ 11 files changed, 350 insertions(+), 14 deletions(-) create mode 100644 pkg/linkrp/processors/extenders/doc.go create mode 100644 pkg/linkrp/processors/extenders/processor.go create mode 100644 pkg/linkrp/processors/extenders/processor_test.go diff --git a/cadl/Applications.Link/extenders.cadl b/cadl/Applications.Link/extenders.cadl index 30198a2dd3..689e60a9b4 100644 --- a/cadl/Applications.Link/extenders.cadl +++ b/cadl/Applications.Link/extenders.cadl @@ -67,6 +67,12 @@ model ExtenderProperties extends BasicResourceProperties { @doc("The secrets value for the resource") secrets?: ExtenderSecrets; + + @doc("The recipe used to automatically deploy underlying infrastructure for the Extender") + recipe?: Recipe; + + @doc("Specifies how the underlying service/resource is provisioned and managed.") + resourceProvisioning?: ResourceProvisioning; } #suppress "@azure-tools/cadl-azure-resource-manager/arm-resource-operation-outside-interface" "This is an interface template" diff --git a/pkg/linkrp/api/v20220315privatepreview/extender_conversion.go b/pkg/linkrp/api/v20220315privatepreview/extender_conversion.go index 1ec85146b2..9a73337f0e 100644 --- a/pkg/linkrp/api/v20220315privatepreview/extender_conversion.go +++ b/pkg/linkrp/api/v20220315privatepreview/extender_conversion.go @@ -46,8 +46,15 @@ func (src *ExtenderResource) ConvertTo() (v1.DataModelInterface, error) { }, AdditionalProperties: src.Properties.AdditionalProperties, Secrets: src.Properties.Secrets, + Recipe: toRecipeDataModel(src.Properties.Recipe), }, } + + var err error + converted.Properties.ResourceProvisioning, err = toResourceProvisiongDataModel(src.Properties.ResourceProvisioning) + if err != nil { + return nil, err + } return converted, nil } @@ -72,7 +79,8 @@ func (dst *ExtenderResource) ConvertFrom(src v1.DataModelInterface) error { Environment: to.Ptr(extender.Properties.Environment), Application: to.Ptr(extender.Properties.Application), AdditionalProperties: extender.Properties.AdditionalProperties, - + Recipe: fromRecipeDataModel(extender.Properties.Recipe), + ResourceProvisioning: fromResourceProvisioningDataModel(extender.Properties.ResourceProvisioning), // Secrets are omitted. } return nil diff --git a/pkg/linkrp/backend/controller/deleteresource.go b/pkg/linkrp/backend/controller/deleteresource.go index 122a3fec92..eb942c881f 100644 --- a/pkg/linkrp/backend/controller/deleteresource.go +++ b/pkg/linkrp/backend/controller/deleteresource.go @@ -101,6 +101,8 @@ func getDataModel(id resources.ID) (v1.ResourceDataModel, error) { return &datamodel.DaprSecretStore{}, nil case strings.ToLower(linkrp.DaprPubSubBrokersResourceType): return &datamodel.DaprPubSubBroker{}, nil + case strings.ToLower(linkrp.ExtendersResourceType): + return &datamodel.Extender{}, nil default: return nil, fmt.Errorf("async delete operation unsupported on resource type: %q. Resource ID: %q", resourceType, id.String()) } diff --git a/pkg/linkrp/backend/service.go b/pkg/linkrp/backend/service.go index c769e25c5c..8e1cb32ce1 100644 --- a/pkg/linkrp/backend/service.go +++ b/pkg/linkrp/backend/service.go @@ -32,6 +32,7 @@ import ( "github.com/project-radius/radius/pkg/linkrp/processors/daprpubsubbrokers" "github.com/project-radius/radius/pkg/linkrp/processors/daprsecretstores" "github.com/project-radius/radius/pkg/linkrp/processors/daprstatestores" + "github.com/project-radius/radius/pkg/linkrp/processors/extenders" "github.com/project-radius/radius/pkg/linkrp/processors/mongodatabases" "github.com/project-radius/radius/pkg/linkrp/processors/rabbitmqmessagequeues" "github.com/project-radius/radius/pkg/linkrp/processors/rediscaches" @@ -134,6 +135,10 @@ func (s *Service) Run(ctx context.Context) error { processor := &daprpubsubbrokers.Processor{Client: runtimeClient} return backend_ctrl.NewCreateOrUpdateResource[*datamodel.DaprPubSubBroker, datamodel.DaprPubSubBroker](processor, engine, client, configLoader, options) }}, + {linkrp.ExtendersResourceType, func(options ctrl.Options) (ctrl.Controller, error) { + processor := &extenders.Processor{} + return backend_ctrl.NewCreateOrUpdateResource[*datamodel.Extender, datamodel.Extender](processor, engine, client, configLoader, options) + }}, } opts := ctrl.Options{ diff --git a/pkg/linkrp/datamodel/extender.go b/pkg/linkrp/datamodel/extender.go index 1d54eacbf5..e9f204409e 100644 --- a/pkg/linkrp/datamodel/extender.go +++ b/pkg/linkrp/datamodel/extender.go @@ -56,6 +56,14 @@ func (extender *Extender) ResourceTypeName() string { // ExtenderProperties represents the properties of Extender resource. type ExtenderProperties struct { rpv1.BasicResourceProperties + // Additional properties for the resource AdditionalProperties map[string]any `json:"additionalProperties,omitempty"` - Secrets map[string]any `json:"secrets,omitempty"` + // Secrets values provided for the resource + Secrets map[string]any `json:"secrets,omitempty"` + // The recipe used to automatically deploy underlying infrastructure for the MongoDB link + Recipe linkrp.LinkRecipe `json:"recipe,omitempty"` + // List of the resource IDs that support the MongoDB resource + Resources []*linkrp.ResourceReference `json:"resources,omitempty"` + // Specifies how the underlying service/resource is provisioned and managed + ResourceProvisioning linkrp.ResourceProvisioning `json:"resourceProvisioning,omitempty"` } diff --git a/pkg/linkrp/frontend/controller/types.go b/pkg/linkrp/frontend/controller/types.go index 3c706e399f..ffa8f4d237 100644 --- a/pkg/linkrp/frontend/controller/types.go +++ b/pkg/linkrp/frontend/controller/types.go @@ -55,4 +55,9 @@ var ( AsyncCreateOrUpdateDaprPubSubBrokerTimeout = time.Duration(60) * time.Minute // AsyncDeleteDaprPubSubBrokerTimeout is the timeout for async delete dapr pub sub broker AsyncDeleteDaprPubSubBrokerTimeout = time.Duration(30) * time.Minute + + // AsyncCreateOrUpdateDaprPubSubBrokerTimeout is the timeout for async create or update dapr pub sub broker + AsyncCreateOrUpdateExtenderTimeout = time.Duration(60) * time.Minute + // AsyncDeleteDaprPubSubBrokerTimeout is the timeout for async delete dapr pub sub broker + AsyncDeleteExtenderTimeout = time.Duration(30) * time.Minute ) diff --git a/pkg/linkrp/frontend/handler/routes.go b/pkg/linkrp/frontend/handler/routes.go index c40570c61e..05700355e0 100644 --- a/pkg/linkrp/frontend/handler/routes.go +++ b/pkg/linkrp/frontend/handler/routes.go @@ -773,22 +773,52 @@ func AddRoutes(ctx context.Context, router *mux.Router, isARM bool, ctrlOpts fro }, }, { - ParentRouter: extenderResourceRouter, - ResourceType: linkrp.ExtendersResourceType, - Method: v1.OperationPut, - HandlerFactory: extender_ctrl.NewCreateOrUpdateExtender, + ParentRouter: extenderResourceRouter, + ResourceType: linkrp.ExtendersResourceType, + Method: v1.OperationPut, + HandlerFactory: func(opt frontend_ctrl.Options) (frontend_ctrl.Controller, error) { + return defaultoperation.NewDefaultAsyncPut(opt, + frontend_ctrl.ResourceOptions[datamodel.Extender]{ + RequestConverter: converter.ExtenderDataModelFromVersioned, + ResponseConverter: converter.ExtenderDataModelToVersioned, + UpdateFilters: []frontend_ctrl.UpdateFilter[datamodel.Extender]{ + rp_frontend.PrepareRadiusResource[*datamodel.Extender], + }, + AsyncOperationTimeout: link_frontend_ctrl.AsyncCreateOrUpdateExtenderTimeout, + }, + ) + }, }, { - ParentRouter: extenderResourceRouter, - ResourceType: linkrp.ExtendersResourceType, - Method: v1.OperationPatch, - HandlerFactory: extender_ctrl.NewCreateOrUpdateExtender, + ParentRouter: extenderResourceRouter, + ResourceType: linkrp.ExtendersResourceType, + Method: v1.OperationPatch, + HandlerFactory: func(opt frontend_ctrl.Options) (frontend_ctrl.Controller, error) { + return defaultoperation.NewDefaultAsyncPut(opt, + frontend_ctrl.ResourceOptions[datamodel.Extender]{ + RequestConverter: converter.ExtenderDataModelFromVersioned, + ResponseConverter: converter.ExtenderDataModelToVersioned, + UpdateFilters: []frontend_ctrl.UpdateFilter[datamodel.Extender]{ + rp_frontend.PrepareRadiusResource[*datamodel.Extender], + }, + AsyncOperationTimeout: link_frontend_ctrl.AsyncCreateOrUpdateExtenderTimeout, + }, + ) + }, }, { - ParentRouter: extenderResourceRouter, - ResourceType: linkrp.ExtendersResourceType, - Method: v1.OperationDelete, - HandlerFactory: extender_ctrl.NewDeleteExtender, + ParentRouter: extenderResourceRouter, + ResourceType: linkrp.ExtendersResourceType, + Method: v1.OperationDelete, + HandlerFactory: func(opt frontend_ctrl.Options) (frontend_ctrl.Controller, error) { + return defaultoperation.NewDefaultAsyncDelete(opt, + frontend_ctrl.ResourceOptions[datamodel.Extender]{ + RequestConverter: converter.ExtenderDataModelFromVersioned, + ResponseConverter: converter.ExtenderDataModelToVersioned, + AsyncOperationTimeout: link_frontend_ctrl.AsyncDeleteExtenderTimeout, + }, + ) + }, }, { ParentRouter: extenderResourceRouter.PathPrefix("/listsecrets").Subrouter(), diff --git a/pkg/linkrp/processors/extenders/doc.go b/pkg/linkrp/processors/extenders/doc.go new file mode 100644 index 0000000000..70871bf83a --- /dev/null +++ b/pkg/linkrp/processors/extenders/doc.go @@ -0,0 +1,18 @@ +/* +Copyright 2023 The Radius Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// extenders contains the resource processor for extenders. See the processors package for more information. +package extenders diff --git a/pkg/linkrp/processors/extenders/processor.go b/pkg/linkrp/processors/extenders/processor.go new file mode 100644 index 0000000000..58048c542b --- /dev/null +++ b/pkg/linkrp/processors/extenders/processor.go @@ -0,0 +1,67 @@ +package extenders + +import ( + "context" + "fmt" + + "github.com/project-radius/radius/pkg/linkrp/datamodel" + "github.com/project-radius/radius/pkg/linkrp/processors" + "github.com/project-radius/radius/pkg/recipes" +) + +// Processor is a processor for RedisCache resources. +type Processor struct { +} + +// Process implements the processors.Processor interface for RedisCache resources. +func (p *Processor) Process(ctx context.Context, resource *datamodel.Extender, options processors.Options) error { + validator := processors.NewValidator(&resource.ComputedValues, &resource.SecretValues, &resource.Properties.Status.OutputResources) + + computedValues := createOutputValues(resource.Properties.AdditionalProperties, options.RecipeOutput, false) + for k, val := range computedValues { + validator.AddOptionalComputedField(k, val) + } + + secretValues := createOutputValues(resource.Properties.Secrets, options.RecipeOutput, true) + for k, val := range secretValues { + if secret, ok := val.(string); !ok { + return &processors.ValidationError{fmt.Sprintf("secret '%s' must be of type string", k)} + } else { + validator.AddOptionalSecretField(k, &secret) + } + } + + err := validator.SetAndValidate(options.RecipeOutput) + if err != nil { + return err + } + + if options.RecipeOutput != nil { + resource.Properties.AdditionalProperties = options.RecipeOutput.Values + resource.Properties.Secrets = options.RecipeOutput.Secrets + } + + return nil +} + +func createOutputValues(properties map[string]any, recipeOutput *recipes.RecipeOutput, secret bool) map[string]any { + values := make(map[string]any) + for k, val := range properties { + values[k] = val + } + if recipeOutput == nil { + return values + } + + var recipeProperties map[string]any + if secret { + recipeProperties = recipeOutput.Secrets + } else { + recipeProperties = recipeOutput.Values + } + + for k, val := range recipeProperties { + values[k] = val + } + return values +} diff --git a/pkg/linkrp/processors/extenders/processor_test.go b/pkg/linkrp/processors/extenders/processor_test.go new file mode 100644 index 0000000000..9dc7f724f7 --- /dev/null +++ b/pkg/linkrp/processors/extenders/processor_test.go @@ -0,0 +1,175 @@ +/* +Copyright 2023 The Radius Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package extenders + +import ( + "context" + "testing" + + "github.com/project-radius/radius/pkg/linkrp/datamodel" + "github.com/project-radius/radius/pkg/linkrp/processors" + "github.com/project-radius/radius/pkg/recipes" + rpv1 "github.com/project-radius/radius/pkg/rp/v1" + "github.com/stretchr/testify/require" +) + +func Test_Process(t *testing.T) { + processor := Processor{} + + const extenderResourceID1 = "/planes/aws/aws/accounts/123341234/regions/us-west-2/providers/AWS.S3/Bucket/myBucket" + const extenderResourceID2 = "/planes/aws/aws/accounts/123341234/regions/us-west-2/providers/AWS.S3/Bucket/myBucket2" + + const password = "testpassword" + + t.Run("success - recipe", func(t *testing.T) { + resource := &datamodel.Extender{} + options := processors.Options{ + RecipeOutput: &recipes.RecipeOutput{ + Resources: []string{ + extenderResourceID1, + }, + Values: map[string]any{ + "bucketName": "myBucket", + }, + Secrets: map[string]any{ + "databaseSecret": password, + }, + }, + } + + err := processor.Process(context.Background(), resource, options) + require.NoError(t, err) + + require.Equal(t, "myBucket", resource.Properties.AdditionalProperties["bucketName"]) + require.Equal(t, password, resource.Properties.Secrets["databaseSecret"]) + + expectedValues := map[string]any{ + "bucketName": "myBucket", + } + expectedSecrets := map[string]rpv1.SecretValueReference{ + "databaseSecret": { + Value: password, + }, + } + + expectedOutputResources, err := processors.GetOutputResourcesFromRecipe(options.RecipeOutput) + require.NoError(t, err) + + require.Equal(t, expectedValues, resource.ComputedValues) + require.Equal(t, expectedSecrets, resource.SecretValues) + require.Equal(t, expectedOutputResources, resource.Properties.Status.OutputResources) + }) + + t.Run("success - manual", func(t *testing.T) { + resource := &datamodel.Extender{ + Properties: datamodel.ExtenderProperties{ + AdditionalProperties: map[string]any{"bucketName": "myBucket"}, + Secrets: map[string]any{ + "databaseSecret": password, + }, + }, + } + err := processor.Process(context.Background(), resource, processors.Options{}) + require.NoError(t, err) + + require.Equal(t, "myBucket", resource.Properties.AdditionalProperties["bucketName"]) + require.Equal(t, password, resource.Properties.Secrets["databaseSecret"]) + + expectedValues := map[string]any{ + "bucketName": "myBucket", + } + + expectedSecrets := map[string]rpv1.SecretValueReference{ + "databaseSecret": { + Value: password, + }, + } + require.NoError(t, err) + + require.Equal(t, expectedValues, resource.ComputedValues) + require.Equal(t, expectedSecrets, resource.SecretValues) + }) + + t.Run("success - recipe with value overrides", func(t *testing.T) { + resource := &datamodel.Extender{ + Properties: datamodel.ExtenderProperties{ + AdditionalProperties: map[string]any{ + "bucketName": "myBucket", + }, + Secrets: map[string]any{ + "databaseSecret": password, + }, + }, + } + options := processors.Options{ + RecipeOutput: &recipes.RecipeOutput{ + Resources: []string{ + extenderResourceID2, + }, + // Values and secrets will be overridden by the resource. + Values: map[string]any{ + "bucketName": "myBucket2", + }, + Secrets: map[string]any{ + "databaseSecret": "overridepassword", + }, + }, + } + + err := processor.Process(context.Background(), resource, options) + require.NoError(t, err) + + require.Equal(t, "myBucket2", resource.Properties.AdditionalProperties["bucketName"]) + require.Equal(t, "overridepassword", resource.Properties.Secrets["databaseSecret"]) + + expectedValues := map[string]any{ + "bucketName": "myBucket2", + } + expectedSecrets := map[string]rpv1.SecretValueReference{ + "databaseSecret": { + Value: "overridepassword", + }, + } + + expectedOutputResources := []rpv1.OutputResource{} + + recipeOutputResources, err := processors.GetOutputResourcesFromRecipe(options.RecipeOutput) + require.NoError(t, err) + expectedOutputResources = append(expectedOutputResources, recipeOutputResources...) + + require.Equal(t, expectedValues, resource.ComputedValues) + require.Equal(t, expectedSecrets, resource.SecretValues) + require.Equal(t, expectedOutputResources, resource.Properties.Status.OutputResources) + }) + + t.Run("failure - missing required values", func(t *testing.T) { + resource := &datamodel.Extender{ + Properties: datamodel.ExtenderProperties{ + Secrets: map[string]any{ + "databaseSecret": 24, + }, + }, + } + options := processors.Options{RecipeOutput: &recipes.RecipeOutput{}} + + err := processor.Process(context.Background(), resource, options) + require.Error(t, err) + require.IsType(t, &processors.ValidationError{}, err) + require.Equal(t, `secret 'databaseSecret' must be of type string`, err.Error()) + + }) +} diff --git a/pkg/linkrp/processors/validator.go b/pkg/linkrp/processors/validator.go index 2fce47147b..44100d7a8b 100644 --- a/pkg/linkrp/processors/validator.go +++ b/pkg/linkrp/processors/validator.go @@ -106,6 +106,18 @@ func (v *Validator) AddOptionalSecretField(name string, ref *string) { v.fields = append(v.fields, bind(v, name, ref, false, true, "string", convertToString, nil)) } +// AddComputedStringField registers a field containing a computed string connection value. The empty string will be treated as an "unset" value. +// +// The compute function will be called if the value is not already set or provided by the recipe. Inside the compute function +// it is safe to assume that other non-computed fields have been populated already. +// +// The compute function will not be called if a validation error has previously occurred. +func (v *Validator) AddOptionalComputedField(name string, ref any) { + // Note: secrets are always strings + // v.computedFields = append(v.computedFields, bind(v, name, ref, false, false, "string", convertToString, nil)) + v.recordValue(name, ref, false) +} + // AddComputedStringField registers a field containing a computed string connection value. The empty string will be treated as an "unset" value. // // The compute function will be called if the value is not already set or provided by the recipe. Inside the compute function From 3ee070eb4ec196f1979e2f35e8a519a93c8986f0 Mon Sep 17 00:00:00 2001 From: sk593 Date: Mon, 12 Jun 2023 17:21:48 -0700 Subject: [PATCH 02/16] updating tests --- .../2022-03-15-privatepreview/types.json | 2 +- .../2022-03-15-privatepreview/types.md | 2 + hack/bicep-types-radius/generated/index.json | 2 +- .../testdata/extenderresource.json | 3 +- .../testdata/extenderresource2.json | 3 +- .../testdata/extenderresource_recipe.json | 21 ++++++++++ .../testdata/extenderresourcedatamodel.json | 3 +- .../testdata/extenderresourcedatamodel2.json | 3 +- .../extenderresourcedatamodel_recipe.json | 32 +++++++++++++++ .../extenderresponseresourcedatamodel.json | 3 +- .../zz_generated_models.go | 6 +++ .../zz_generated_models_serde.go | 8 ++++ .../2022-03-15-privatepreview/extenders.json | 8 ++++ .../corerp/resources/extender_test.go | 38 +++++++++++++++++ .../corerp-resources-extender-recipe.bicep | 41 +++++++++++++++++++ .../testdata/corerp-resources-extender.bicep | 1 + 16 files changed, 169 insertions(+), 7 deletions(-) create mode 100644 pkg/linkrp/api/v20220315privatepreview/testdata/extenderresource_recipe.json create mode 100644 pkg/linkrp/api/v20220315privatepreview/testdata/extenderresourcedatamodel_recipe.json create mode 100644 test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep diff --git a/hack/bicep-types-radius/generated/applications/applications.link/2022-03-15-privatepreview/types.json b/hack/bicep-types-radius/generated/applications/applications.link/2022-03-15-privatepreview/types.json index 5829678006..0b9f8100bf 100644 --- a/hack/bicep-types-radius/generated/applications/applications.link/2022-03-15-privatepreview/types.json +++ b/hack/bicep-types-radius/generated/applications/applications.link/2022-03-15-privatepreview/types.json @@ -1 +1 @@ -[{"1":{"Kind":1}},{"1":{"Kind":2}},{"1":{"Kind":3}},{"1":{"Kind":4}},{"1":{"Kind":5}},{"1":{"Kind":6}},{"1":{"Kind":7}},{"1":{"Kind":8}},{"6":{"Value":"Applications.Link/daprPubSubBrokers"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprPubSubBrokers","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":8,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":9,"Flags":10,"Description":"The resource api version"},"properties":{"Type":11,"Flags":0,"Description":"DaprPubSubBroker link properties"},"tags":{"Type":28,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprPubSubBrokerProperties","Properties":{"provisioningState":{"Type":19,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"resourceProvisioning":{"Type":22,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"metadata":{"Type":0,"Flags":0,"Description":"Any object"},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":25,"Flags":0,"Description":"A collection of references to resources associated with the daprPubSubBroker"},"type":{"Type":4,"Flags":0,"Description":"DaprPubSubBroker type. These strings match the format used by Dapr Kubernetes configuration format."},"version":{"Type":4,"Flags":0,"Description":"Dapr component version"},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[12,13,14,15,16,17,18]}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[20,21]}},{"2":{"Name":"Recipe","Properties":{"name":{"Type":4,"Flags":1,"Description":"The name of the recipe within the environment to use"},"parameters":{"Type":0,"Flags":0,"Description":"Any object"}}}},{"2":{"Name":"ResourceReference","Properties":{"id":{"Type":4,"Flags":1,"Description":"Resource id of an existing resource"}}}},{"3":{"ItemType":24}},{"2":{"Name":"ResourceStatus","Properties":{"outputResources":{"Type":27,"Flags":0,"Description":"Properties of an output resource"}}}},{"3":{"ItemType":0}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"2":{"Name":"SystemData","Properties":{"createdBy":{"Type":4,"Flags":0,"Description":"The identity that created the resource."},"createdByType":{"Type":34,"Flags":0,"Description":"The type of identity that created the resource."},"createdAt":{"Type":4,"Flags":0,"Description":"The timestamp of resource creation (UTC)."},"lastModifiedBy":{"Type":4,"Flags":0,"Description":"The identity that last modified the resource."},"lastModifiedByType":{"Type":39,"Flags":0,"Description":"The type of identity that created the resource."},"lastModifiedAt":{"Type":4,"Flags":0,"Description":"The timestamp of resource last modification (UTC)"}}}},{"6":{"Value":"User"}},{"6":{"Value":"Application"}},{"6":{"Value":"ManagedIdentity"}},{"6":{"Value":"Key"}},{"5":{"Elements":[30,31,32,33]}},{"6":{"Value":"User"}},{"6":{"Value":"Application"}},{"6":{"Value":"ManagedIdentity"}},{"6":{"Value":"Key"}},{"5":{"Elements":[35,36,37,38]}},{"4":{"Name":"Applications.Link/daprPubSubBrokers@2022-03-15-privatepreview","ScopeType":0,"Body":10}},{"6":{"Value":"Applications.Link/daprSecretStores"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprSecretStores","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":41,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":42,"Flags":10,"Description":"The resource api version"},"properties":{"Type":44,"Flags":0,"Description":"DaprSecretStore link properties"},"tags":{"Type":56,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprSecretStoreProperties","Properties":{"provisioningState":{"Type":52,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"type":{"Type":4,"Flags":0,"Description":"Dapr Secret Store type. These strings match the types defined in Dapr Component format: https://docs.dapr.io/reference/components-reference/supported-secret-stores/"},"version":{"Type":4,"Flags":0,"Description":"Dapr component version"},"metadata":{"Type":0,"Flags":0,"Description":"Any object"},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resourceProvisioning":{"Type":55,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[45,46,47,48,49,50,51]}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[53,54]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/daprSecretStores@2022-03-15-privatepreview","ScopeType":0,"Body":43}},{"6":{"Value":"Applications.Link/daprStateStores"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprStateStores","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":58,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":59,"Flags":10,"Description":"The resource api version"},"properties":{"Type":61,"Flags":0,"Description":"DaprStateStore link properties"},"tags":{"Type":74,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprStateStoreProperties","Properties":{"provisioningState":{"Type":69,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"resourceProvisioning":{"Type":72,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"metadata":{"Type":0,"Flags":0,"Description":"Any object"},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":73,"Flags":0,"Description":"A collection of references to resources associated with the state store"},"type":{"Type":4,"Flags":0,"Description":"Dapr StateStore type. These strings match the format used by Dapr Kubernetes configuration format."},"version":{"Type":4,"Flags":0,"Description":"Dapr component version"},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[62,63,64,65,66,67,68]}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[70,71]}},{"3":{"ItemType":24}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/daprStateStores@2022-03-15-privatepreview","ScopeType":0,"Body":60}},{"6":{"Value":"Applications.Link/mongoDatabases"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/mongoDatabases","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":76,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":77,"Flags":10,"Description":"The resource api version"},"properties":{"Type":79,"Flags":0,"Description":"MongoDatabase link properties"},"tags":{"Type":93,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"MongoDatabaseProperties","Properties":{"provisioningState":{"Type":87,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"secrets":{"Type":88,"Flags":0,"Description":"The secret values for the given MongoDatabase resource"},"host":{"Type":4,"Flags":0,"Description":"Host name of the target Mongo database"},"port":{"Type":3,"Flags":0,"Description":"Port value of the target Mongo database"},"database":{"Type":4,"Flags":0,"Description":"Database name of the target Mongo database"},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":89,"Flags":0,"Description":"List of the resource IDs that support the MongoDB resource"},"resourceProvisioning":{"Type":92,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"username":{"Type":4,"Flags":0,"Description":"Username to use when connecting to the target Mongo database"},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[80,81,82,83,84,85,86]}},{"2":{"Name":"MongoDatabaseSecrets","Properties":{"password":{"Type":4,"Flags":0,"Description":"Password to use when connecting to the target Mongo database"},"connectionString":{"Type":4,"Flags":0,"Description":"Connection string used to connect to the target Mongo database"}}}},{"3":{"ItemType":24}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[90,91]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/mongoDatabases@2022-03-15-privatepreview","ScopeType":0,"Body":78}},{"6":{"Value":"Applications.Link/rabbitMQMessageQueues"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/rabbitMQMessageQueues","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":95,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":96,"Flags":10,"Description":"The resource api version"},"properties":{"Type":98,"Flags":0,"Description":"RabbitMQMessageQueue link properties"},"tags":{"Type":111,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"RabbitMQMessageQueueProperties","Properties":{"provisioningState":{"Type":106,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"secrets":{"Type":107,"Flags":0,"Description":"The secret values for the given RabbitMQMessageQueue resource"},"queue":{"Type":4,"Flags":0,"Description":"The name of the queue"},"resourceProvisioning":{"Type":110,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[99,100,101,102,103,104,105]}},{"2":{"Name":"RabbitMQSecrets","Properties":{"connectionString":{"Type":4,"Flags":0,"Description":"The connection string used to connect to this RabbitMQ instance"}}}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[108,109]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/rabbitMQMessageQueues@2022-03-15-privatepreview","ScopeType":0,"Body":97}},{"6":{"Value":"Applications.Link/redisCaches"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/redisCaches","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":113,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":114,"Flags":10,"Description":"The resource api version"},"properties":{"Type":116,"Flags":0,"Description":"RedisCache link properties"},"tags":{"Type":130,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"RedisCacheProperties","Properties":{"provisioningState":{"Type":124,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"secrets":{"Type":125,"Flags":0,"Description":"The secret values for the given RedisCache resource"},"host":{"Type":4,"Flags":0,"Description":"The host name of the target Redis cache"},"port":{"Type":3,"Flags":0,"Description":"The port value of the target Redis cache"},"username":{"Type":4,"Flags":0,"Description":"The username for Redis cache"},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":126,"Flags":0,"Description":"List of the resource IDs that support the Redis resource"},"resourceProvisioning":{"Type":129,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[117,118,119,120,121,122,123]}},{"2":{"Name":"RedisCacheSecrets","Properties":{"connectionString":{"Type":4,"Flags":0,"Description":"The connection string used to connect to the Redis cache"},"password":{"Type":4,"Flags":0,"Description":"The password for this Redis cache instance"}}}},{"3":{"ItemType":24}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[127,128]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/redisCaches@2022-03-15-privatepreview","ScopeType":0,"Body":115}},{"6":{"Value":"Applications.Link/sqlDatabases"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/sqlDatabases","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":132,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":133,"Flags":10,"Description":"The resource api version"},"properties":{"Type":135,"Flags":0,"Description":"SqlDatabase properties"},"tags":{"Type":149,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"SqlDatabaseProperties","Properties":{"provisioningState":{"Type":143,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"database":{"Type":4,"Flags":0,"Description":"The name of the Sql database."},"server":{"Type":4,"Flags":0,"Description":"The fully qualified domain name of the Sql database."},"port":{"Type":3,"Flags":0,"Description":"Port value of the target Sql database"},"username":{"Type":4,"Flags":0,"Description":"Username to use when connecting to the target Sql database"},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":144,"Flags":0,"Description":"List of the resource IDs that support the SqlDatabase resource"},"resourceProvisioning":{"Type":147,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"secrets":{"Type":148,"Flags":0,"Description":"The secret values for the given SqlDatabase resource"},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[136,137,138,139,140,141,142]}},{"3":{"ItemType":24}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[145,146]}},{"2":{"Name":"SqlDatabaseSecrets","Properties":{"password":{"Type":4,"Flags":0,"Description":"Password to use when connecting to the target Sql database"},"connectionString":{"Type":4,"Flags":0,"Description":"Connection string used to connect to the target Sql database"}}}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/sqlDatabases@2022-03-15-privatepreview","ScopeType":0,"Body":134}},{"6":{"Value":"Applications.Link/extenders"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/extenders","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":151,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":152,"Flags":10,"Description":"The resource api version"},"properties":{"Type":154,"Flags":1,"Description":"Extender link properties"},"tags":{"Type":164,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"ExtenderProperties","Properties":{"secrets":{"Type":155,"Flags":4,"Description":"The secret values for the given Extender resource"},"provisioningState":{"Type":163,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}},"AdditionalProperties":0}},{"2":{"Name":"ExtenderSecrets","Properties":{},"AdditionalProperties":0}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[156,157,158,159,160,161,162]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/extenders@2022-03-15-privatepreview","ScopeType":0,"Body":153}},{"2":{"Name":"MongoDatabaseListSecretsResult","Properties":{"password":{"Type":4,"Flags":2,"Description":"Password to use when connecting to the target Mongo database"},"connectionString":{"Type":4,"Flags":2,"Description":"Connection string used to connect to the target Mongo database"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/mongoDatabases","ApiVersion":"2022-03-15-privatepreview","Output":166}},{"2":{"Name":"RabbitMQListSecretsResult","Properties":{"connectionString":{"Type":4,"Flags":2,"Description":"The connection string used to connect to this RabbitMQ instance"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/rabbitMQMessageQueues","ApiVersion":"2022-03-15-privatepreview","Output":168}},{"2":{"Name":"RedisCacheListSecretsResult","Properties":{"connectionString":{"Type":4,"Flags":2,"Description":"The connection string used to connect to the Redis cache"},"password":{"Type":4,"Flags":2,"Description":"The password for this Redis cache instance"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/redisCaches","ApiVersion":"2022-03-15-privatepreview","Output":170}},{"2":{"Name":"SqlDatabaseListSecretsResult","Properties":{"password":{"Type":4,"Flags":2,"Description":"Password to use when connecting to the target Sql database"},"connectionString":{"Type":4,"Flags":2,"Description":"Connection string used to connect to the target Sql database"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/sqlDatabases","ApiVersion":"2022-03-15-privatepreview","Output":172}},{"2":{"Name":"ExtenderSecrets","Properties":{},"AdditionalProperties":0}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/extenders","ApiVersion":"2022-03-15-privatepreview","Output":174}}] \ No newline at end of file +[{"1":{"Kind":1}},{"1":{"Kind":2}},{"1":{"Kind":3}},{"1":{"Kind":4}},{"1":{"Kind":5}},{"1":{"Kind":6}},{"1":{"Kind":7}},{"1":{"Kind":8}},{"6":{"Value":"Applications.Link/daprInvokeHttpRoutes"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprInvokeHttpRoutes","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":8,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":9,"Flags":10,"Description":"The resource api version"},"properties":{"Type":11,"Flags":0,"Description":"DaprInvokeHttpRoute link properties"},"tags":{"Type":23,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprInvokeHttpRouteProperties","Properties":{"provisioningState":{"Type":19,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"appId":{"Type":4,"Flags":1,"Description":"The Dapr appId used for the route"},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[12,13,14,15,16,17,18]}},{"2":{"Name":"Recipe","Properties":{"name":{"Type":4,"Flags":1,"Description":"The name of the recipe within the environment to use"},"parameters":{"Type":0,"Flags":0,"Description":"Any object"}}}},{"2":{"Name":"ResourceStatus","Properties":{"outputResources":{"Type":22,"Flags":0,"Description":"Properties of an output resource"}}}},{"3":{"ItemType":0}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"2":{"Name":"SystemData","Properties":{"createdBy":{"Type":4,"Flags":0,"Description":"The identity that created the resource."},"createdByType":{"Type":29,"Flags":0,"Description":"The type of identity that created the resource."},"createdAt":{"Type":4,"Flags":0,"Description":"The timestamp of resource creation (UTC)."},"lastModifiedBy":{"Type":4,"Flags":0,"Description":"The identity that last modified the resource."},"lastModifiedByType":{"Type":34,"Flags":0,"Description":"The type of identity that created the resource."},"lastModifiedAt":{"Type":4,"Flags":0,"Description":"The timestamp of resource last modification (UTC)"}}}},{"6":{"Value":"User"}},{"6":{"Value":"Application"}},{"6":{"Value":"ManagedIdentity"}},{"6":{"Value":"Key"}},{"5":{"Elements":[25,26,27,28]}},{"6":{"Value":"User"}},{"6":{"Value":"Application"}},{"6":{"Value":"ManagedIdentity"}},{"6":{"Value":"Key"}},{"5":{"Elements":[30,31,32,33]}},{"4":{"Name":"Applications.Link/daprInvokeHttpRoutes@2022-03-15-privatepreview","ScopeType":0,"Body":10}},{"6":{"Value":"Applications.Link/daprPubSubBrokers"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprPubSubBrokers","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":36,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":37,"Flags":10,"Description":"The resource api version"},"properties":{"Type":39,"Flags":0,"Description":"DaprPubSubBroker link properties"},"tags":{"Type":53,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprPubSubBrokerProperties","Properties":{"provisioningState":{"Type":47,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"resourceProvisioning":{"Type":50,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"metadata":{"Type":0,"Flags":0,"Description":"Any object"},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":52,"Flags":0,"Description":"A collection of references to resources associated with the daprPubSubBroker"},"type":{"Type":4,"Flags":0,"Description":"DaprPubSubBroker type. These strings match the format used by Dapr Kubernetes configuration format."},"version":{"Type":4,"Flags":0,"Description":"Dapr component version"},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[40,41,42,43,44,45,46]}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[48,49]}},{"2":{"Name":"ResourceReference","Properties":{"id":{"Type":4,"Flags":1,"Description":"Resource id of an existing resource"}}}},{"3":{"ItemType":51}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/daprPubSubBrokers@2022-03-15-privatepreview","ScopeType":0,"Body":38}},{"6":{"Value":"Applications.Link/daprSecretStores"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprSecretStores","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":55,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":56,"Flags":10,"Description":"The resource api version"},"properties":{"Type":58,"Flags":0,"Description":"DaprSecretStore link properties"},"tags":{"Type":70,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprSecretStoreProperties","Properties":{"provisioningState":{"Type":66,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"type":{"Type":4,"Flags":0,"Description":"Dapr Secret Store type. These strings match the types defined in Dapr Component format: https://docs.dapr.io/reference/components-reference/supported-secret-stores/"},"version":{"Type":4,"Flags":0,"Description":"Dapr component version"},"metadata":{"Type":0,"Flags":0,"Description":"Any object"},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resourceProvisioning":{"Type":69,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[59,60,61,62,63,64,65]}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[67,68]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/daprSecretStores@2022-03-15-privatepreview","ScopeType":0,"Body":57}},{"6":{"Value":"Applications.Link/daprStateStores"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprStateStores","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":72,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":73,"Flags":10,"Description":"The resource api version"},"properties":{"Type":75,"Flags":0,"Description":"DaprStateStore link properties"},"tags":{"Type":88,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprStateStoreProperties","Properties":{"provisioningState":{"Type":83,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"resourceProvisioning":{"Type":86,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"metadata":{"Type":0,"Flags":0,"Description":"Any object"},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":87,"Flags":0,"Description":"A collection of references to resources associated with the state store"},"type":{"Type":4,"Flags":0,"Description":"Dapr StateStore type. These strings match the format used by Dapr Kubernetes configuration format."},"version":{"Type":4,"Flags":0,"Description":"Dapr component version"},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[76,77,78,79,80,81,82]}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[84,85]}},{"3":{"ItemType":51}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/daprStateStores@2022-03-15-privatepreview","ScopeType":0,"Body":74}},{"6":{"Value":"Applications.Link/mongoDatabases"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/mongoDatabases","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":90,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":91,"Flags":10,"Description":"The resource api version"},"properties":{"Type":93,"Flags":0,"Description":"MongoDatabase link properties"},"tags":{"Type":107,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"MongoDatabaseProperties","Properties":{"provisioningState":{"Type":101,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"secrets":{"Type":102,"Flags":0,"Description":"The secret values for the given MongoDatabase resource"},"host":{"Type":4,"Flags":0,"Description":"Host name of the target Mongo database"},"port":{"Type":3,"Flags":0,"Description":"Port value of the target Mongo database"},"database":{"Type":4,"Flags":2,"Description":"Database name of the target Mongo database"},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":103,"Flags":0,"Description":"List of the resource IDs that support the MongoDB resource"},"resourceProvisioning":{"Type":106,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"username":{"Type":4,"Flags":0,"Description":"Username to use when connecting to the target Mongo database"},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[94,95,96,97,98,99,100]}},{"2":{"Name":"MongoDatabaseSecrets","Properties":{"password":{"Type":4,"Flags":0,"Description":"Password to use when connecting to the target Mongo database"},"connectionString":{"Type":4,"Flags":0,"Description":"Connection string used to connect to the target Mongo database"}}}},{"3":{"ItemType":51}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[104,105]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/mongoDatabases@2022-03-15-privatepreview","ScopeType":0,"Body":92}},{"6":{"Value":"Applications.Link/rabbitMQMessageQueues"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/rabbitMQMessageQueues","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":109,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":110,"Flags":10,"Description":"The resource api version"},"properties":{"Type":112,"Flags":0,"Description":"RabbitMQMessageQueue link properties"},"tags":{"Type":125,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"RabbitMQMessageQueueProperties","Properties":{"provisioningState":{"Type":120,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"secrets":{"Type":121,"Flags":0,"Description":"The secret values for the given RabbitMQMessageQueue resource"},"queue":{"Type":4,"Flags":0,"Description":"The name of the queue"},"resourceProvisioning":{"Type":124,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[113,114,115,116,117,118,119]}},{"2":{"Name":"RabbitMQSecrets","Properties":{"connectionString":{"Type":4,"Flags":0,"Description":"The connection string used to connect to this RabbitMQ instance"}}}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[122,123]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/rabbitMQMessageQueues@2022-03-15-privatepreview","ScopeType":0,"Body":111}},{"6":{"Value":"Applications.Link/redisCaches"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/redisCaches","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":127,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":128,"Flags":10,"Description":"The resource api version"},"properties":{"Type":130,"Flags":0,"Description":"RedisCache link properties"},"tags":{"Type":144,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"RedisCacheProperties","Properties":{"provisioningState":{"Type":138,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"secrets":{"Type":139,"Flags":0,"Description":"The secret values for the given RedisCache resource"},"host":{"Type":4,"Flags":0,"Description":"The host name of the target Redis cache"},"port":{"Type":3,"Flags":0,"Description":"The port value of the target Redis cache"},"username":{"Type":4,"Flags":2,"Description":"The username for Redis cache"},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":140,"Flags":0,"Description":"List of the resource IDs that support the Redis resource"},"resourceProvisioning":{"Type":143,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[131,132,133,134,135,136,137]}},{"2":{"Name":"RedisCacheSecrets","Properties":{"connectionString":{"Type":4,"Flags":0,"Description":"The connection string used to connect to the Redis cache"},"password":{"Type":4,"Flags":0,"Description":"The password for this Redis cache instance"}}}},{"3":{"ItemType":51}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[141,142]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/redisCaches@2022-03-15-privatepreview","ScopeType":0,"Body":129}},{"6":{"Value":"Applications.Link/sqlDatabases"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/sqlDatabases","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":146,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":147,"Flags":10,"Description":"The resource api version"},"properties":{"Type":149,"Flags":0,"Description":"SqlDatabase properties"},"tags":{"Type":162,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"SqlDatabaseProperties","Properties":{"provisioningState":{"Type":157,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"database":{"Type":4,"Flags":0,"Description":"The name of the Sql database."},"server":{"Type":4,"Flags":0,"Description":"The fully qualified domain name of the Sql database."},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":158,"Flags":0,"Description":"List of the resource IDs that support the SqlDatabase resource"},"resourceProvisioning":{"Type":161,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[150,151,152,153,154,155,156]}},{"3":{"ItemType":51}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[159,160]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/sqlDatabases@2022-03-15-privatepreview","ScopeType":0,"Body":148}},{"6":{"Value":"Applications.Link/extenders"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/extenders","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":164,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":165,"Flags":10,"Description":"The resource api version"},"properties":{"Type":167,"Flags":1,"Description":"Extender link properties"},"tags":{"Type":180,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"ExtenderProperties","Properties":{"secrets":{"Type":168,"Flags":4,"Description":"The secret values for the given Extender resource"},"resourceProvisioning":{"Type":171,"Flags":4,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"recipe":{"Type":20,"Flags":4,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"provisioningState":{"Type":179,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}},"AdditionalProperties":0}},{"2":{"Name":"ExtenderSecrets","Properties":{},"AdditionalProperties":0}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[169,170]}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[172,173,174,175,176,177,178]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/extenders@2022-03-15-privatepreview","ScopeType":0,"Body":166}},{"2":{"Name":"MongoDatabaseListSecretsResult","Properties":{"password":{"Type":4,"Flags":2,"Description":"Password to use when connecting to the target Mongo database"},"connectionString":{"Type":4,"Flags":2,"Description":"Connection string used to connect to the target Mongo database"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/mongoDatabases","ApiVersion":"2022-03-15-privatepreview","Output":182}},{"2":{"Name":"RabbitMQListSecretsResult","Properties":{"connectionString":{"Type":4,"Flags":2,"Description":"The connection string used to connect to this RabbitMQ instance"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/rabbitMQMessageQueues","ApiVersion":"2022-03-15-privatepreview","Output":184}},{"2":{"Name":"RedisCacheListSecretsResult","Properties":{"connectionString":{"Type":4,"Flags":2,"Description":"The connection string used to connect to the Redis cache"},"password":{"Type":4,"Flags":2,"Description":"The password for this Redis cache instance"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/redisCaches","ApiVersion":"2022-03-15-privatepreview","Output":186}},{"2":{"Name":"ExtenderSecrets","Properties":{},"AdditionalProperties":0}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/extenders","ApiVersion":"2022-03-15-privatepreview","Output":188}}] diff --git a/hack/bicep-types-radius/generated/applications/applications.link/2022-03-15-privatepreview/types.md b/hack/bicep-types-radius/generated/applications/applications.link/2022-03-15-privatepreview/types.md index 282c6fa002..f67b48153c 100644 --- a/hack/bicep-types-radius/generated/applications/applications.link/2022-03-15-privatepreview/types.md +++ b/hack/bicep-types-radius/generated/applications/applications.link/2022-03-15-privatepreview/types.md @@ -204,6 +204,8 @@ * **application**: string: Fully qualified resource ID for the application that the link is consumed by * **environment**: string (Required): Fully qualified resource ID for the environment that the link is linked to * **provisioningState**: 'Accepted' | 'Canceled' | 'Deleting' | 'Failed' | 'Provisioning' | 'Succeeded' | 'Updating' (ReadOnly): Provisioning state of the link at the time the operation was called +* **recipe**: [Recipe](#recipe) (WriteOnly): The recipe used to automatically deploy underlying infrastructure for a link +* **resourceProvisioning**: 'manual' | 'recipe' (WriteOnly): Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values. * **secrets**: [ExtenderSecrets](#extendersecrets) (WriteOnly): The secret values for the given Extender resource * **status**: [ResourceStatus](#resourcestatus) (ReadOnly): Status of a resource. ### Additional Properties diff --git a/hack/bicep-types-radius/generated/index.json b/hack/bicep-types-radius/generated/index.json index 761238c434..c45baaede5 100644 --- a/hack/bicep-types-radius/generated/index.json +++ b/hack/bicep-types-radius/generated/index.json @@ -1 +1 @@ -{"Resources":{"Applications.Core/environments@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":51},"Applications.Core/applications@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":75},"Applications.Core/httpRoutes@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":89},"Applications.Core/gateways@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":110},"Applications.Core/containers@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":175},"Applications.Core/volumes@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":212},"Applications.Core/secretStores@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":235},"Applications.Core/extenders@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":250},"Applications.Dapr/daprPubSubBrokers@2022-03-15-privatepreview":{"RelativePath":"applications/applications.dapr/2022-03-15-privatepreview/types.json","Index":41},"Applications.Dapr/daprSecretStores@2022-03-15-privatepreview":{"RelativePath":"applications/applications.dapr/2022-03-15-privatepreview/types.json","Index":59},"Applications.Dapr/daprStateStores@2022-03-15-privatepreview":{"RelativePath":"applications/applications.dapr/2022-03-15-privatepreview/types.json","Index":79},"Applications.Datastores/mongoDatabases@2022-03-15-privatepreview":{"RelativePath":"applications/applications.datastores/2022-03-15-privatepreview/types.json","Index":42},"Applications.Datastores/redisCaches@2022-03-15-privatepreview":{"RelativePath":"applications/applications.datastores/2022-03-15-privatepreview/types.json","Index":63},"Applications.Datastores/sqlDatabases@2022-03-15-privatepreview":{"RelativePath":"applications/applications.datastores/2022-03-15-privatepreview/types.json","Index":83},"Applications.Link/daprPubSubBrokers@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":40},"Applications.Link/daprSecretStores@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":57},"Applications.Link/daprStateStores@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":75},"Applications.Link/mongoDatabases@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":94},"Applications.Link/rabbitMQMessageQueues@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":112},"Applications.Link/redisCaches@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":131},"Applications.Link/sqlDatabases@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":150},"Applications.Link/extenders@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":165},"Applications.Messaging/rabbitMQQueues@2022-03-15-privatepreview":{"RelativePath":"applications/applications.messaging/2022-03-15-privatepreview/types.json","Index":40}},"Functions":{"applications.core/secretstores":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":256}]},"applications.core/extenders":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":258}]},"applications.datastores/mongodatabases":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.datastores/2022-03-15-privatepreview/types.json","Index":85}]},"applications.datastores/rediscaches":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.datastores/2022-03-15-privatepreview/types.json","Index":87}]},"applications.link/mongodatabases":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":167}]},"applications.link/rabbitmqmessagequeues":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":169}]},"applications.link/rediscaches":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":171}]},"applications.link/sqldatabases":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":173}]},"applications.link/extenders":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":175}]},"applications.messaging/rabbitmqqueues":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.messaging/2022-03-15-privatepreview/types.json","Index":42}]}}} \ No newline at end of file +{"Resources":{"Applications.Core/environments@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":51},"Applications.Core/applications@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":75},"Applications.Core/httpRoutes@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":89},"Applications.Core/gateways@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":110},"Applications.Core/containers@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":175},"Applications.Core/volumes@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":212},"Applications.Core/secretStores@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":235},"Applications.Core/extenders@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":250},"Applications.Dapr/daprPubSubBrokers@2022-03-15-privatepreview":{"RelativePath":"applications/applications.dapr/2022-03-15-privatepreview/types.json","Index":41},"Applications.Dapr/daprSecretStores@2022-03-15-privatepreview":{"RelativePath":"applications/applications.dapr/2022-03-15-privatepreview/types.json","Index":59},"Applications.Dapr/daprStateStores@2022-03-15-privatepreview":{"RelativePath":"applications/applications.dapr/2022-03-15-privatepreview/types.json","Index":79},"Applications.Datastores/mongoDatabases@2022-03-15-privatepreview":{"RelativePath":"applications/applications.datastores/2022-03-15-privatepreview/types.json","Index":42},"Applications.Datastores/redisCaches@2022-03-15-privatepreview":{"RelativePath":"applications/applications.datastores/2022-03-15-privatepreview/types.json","Index":63},"Applications.Datastores/sqlDatabases@2022-03-15-privatepreview":{"RelativePath":"applications/applications.datastores/2022-03-15-privatepreview/types.json","Index":83},"Applications.Link/daprInvokeHttpRoutes@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":35},"Applications.Link/daprPubSubBrokers@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":54},"Applications.Link/daprSecretStores@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":71},"Applications.Link/daprStateStores@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":89},"Applications.Link/mongoDatabases@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":108},"Applications.Link/rabbitMQMessageQueues@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":126},"Applications.Link/redisCaches@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":145},"Applications.Link/sqlDatabases@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":163},"Applications.Link/extenders@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":181},"Applications.Messaging/rabbitMQQueues@2022-03-15-privatepreview":{"RelativePath":"applications/applications.messaging/2022-03-15-privatepreview/types.json","Index":40}},"Functions":{"applications.core/secretstores":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":256}]},"applications.core/extenders":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":258}]},"applications.datastores/mongodatabases":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.datastores/2022-03-15-privatepreview/types.json","Index":85}]},"applications.datastores/rediscaches":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.datastores/2022-03-15-privatepreview/types.json","Index":87}]},"applications.link/mongodatabases":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":183}]},"applications.link/rabbitmqmessagequeues":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":185}]},"applications.link/rediscaches":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":187}]},"applications.link/extenders":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":189}]},"applications.messaging/rabbitmqqueues":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.messaging/2022-03-15-privatepreview/types.json","Index":42}]}}} diff --git a/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresource.json b/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresource.json index 19c9c05136..d4b647d03f 100644 --- a/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresource.json +++ b/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresource.json @@ -18,6 +18,7 @@ "secrets": { "accountSid": "sid", "authToken:": "token" - } + }, + "resourceProvisioning": "manual" } } \ No newline at end of file diff --git a/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresource2.json b/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresource2.json index de9a72d057..07f4827104 100644 --- a/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresource2.json +++ b/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresource2.json @@ -5,6 +5,7 @@ "properties": { "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Core/environments/env0", - "fromNumber": "222-222-2222" + "fromNumber": "222-222-2222", + "resourceProvisioning": "manual" } } \ No newline at end of file diff --git a/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresource_recipe.json b/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresource_recipe.json new file mode 100644 index 0000000000..a155d3247d --- /dev/null +++ b/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresource_recipe.json @@ -0,0 +1,21 @@ +{ + "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Link/extenders/extender0", + "name": "extender0", + "type": "Applications.Link/extenders", + "properties": { + "status": { + "outputResources": [{ + "LocalID": "Deployment", + "ResourceType": { + "Type": "Extender", + "Provider": "ExtenderProvider" + } + }] + }, + "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Core/applications/testApplication", + "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Core/environments/env0", + "recipe": { + "name": "test-recipe" + } + } +} \ No newline at end of file diff --git a/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresourcedatamodel.json b/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresourcedatamodel.json index 4d40d50fc6..eaa1cbc080 100644 --- a/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresourcedatamodel.json +++ b/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresourcedatamodel.json @@ -31,6 +31,7 @@ "secrets": { "accountSid": "sid", "authToken:": "token" - } + }, + "resourceProvisioning": "manual" } } diff --git a/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresourcedatamodel2.json b/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresourcedatamodel2.json index 5e04cf9a31..cadcd2af02 100644 --- a/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresourcedatamodel2.json +++ b/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresourcedatamodel2.json @@ -18,6 +18,7 @@ "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Core/environments/env0", "additionalProperties":{ "fromNumber": "222-222-2222" - } + }, + "resourceProvisioning": "manual" } } diff --git a/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresourcedatamodel_recipe.json b/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresourcedatamodel_recipe.json new file mode 100644 index 0000000000..e4dcb85310 --- /dev/null +++ b/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresourcedatamodel_recipe.json @@ -0,0 +1,32 @@ +{ + "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Link/extenders/extender0", + "name": "extender0", + "type": "Applications.Link/extenders", + "systemData": { + "createdBy": "fakeid@live.com", + "createdByType": "User", + "createdAt": "2021-09-24T19:09:54.2403864Z", + "lastModifiedBy": "fakeid@live.com", + "lastModifiedByType": "User", + "lastModifiedAt": "2021-09-24T20:09:54.2403864Z" + }, + "tags": { + "env": "dev" + }, + "properties": { + "status": { + "outputResources": [{ + "LocalID": "Deployment", + "ResourceType": { + "Type": "Extender", + "Provider": "ExtenderProvider" + } + }] + }, + "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Core/applications/testApplication", + "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Core/environments/env0", + "recipe": { + "name": "test-recipe" + } + } +} diff --git a/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresponseresourcedatamodel.json b/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresponseresourcedatamodel.json index a1d7be8b42..f793246445 100644 --- a/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresponseresourcedatamodel.json +++ b/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresponseresourcedatamodel.json @@ -27,6 +27,7 @@ "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Core/environments/env0", "additionalProperties":{ "fromNumber": "222-222-2222" - } + }, + "resourceProvisioning": "manual" } } diff --git a/pkg/linkrp/api/v20220315privatepreview/zz_generated_models.go b/pkg/linkrp/api/v20220315privatepreview/zz_generated_models.go index ca3c838aeb..8b7b9bcfc4 100644 --- a/pkg/linkrp/api/v20220315privatepreview/zz_generated_models.go +++ b/pkg/linkrp/api/v20220315privatepreview/zz_generated_models.go @@ -367,6 +367,12 @@ type ExtenderProperties struct { // Fully qualified resource ID for the application that the link is consumed by Application *string `json:"application,omitempty"` + // The recipe used to automatically deploy underlying infrastructure for the daprPubSubBroker link + Recipe *Recipe `json:"recipe,omitempty"` + + // Specifies how the underlying service/resource is provisioned and managed. + ResourceProvisioning *ResourceProvisioning `json:"resourceProvisioning,omitempty"` + // The secret values for the given Extender resource Secrets map[string]interface{} `json:"secrets,omitempty"` diff --git a/pkg/linkrp/api/v20220315privatepreview/zz_generated_models_serde.go b/pkg/linkrp/api/v20220315privatepreview/zz_generated_models_serde.go index 03d7325749..79db050022 100644 --- a/pkg/linkrp/api/v20220315privatepreview/zz_generated_models_serde.go +++ b/pkg/linkrp/api/v20220315privatepreview/zz_generated_models_serde.go @@ -670,6 +670,8 @@ func (e ExtenderProperties) MarshalJSON() ([]byte, error) { populate(objectMap, "application", e.Application) populate(objectMap, "environment", e.Environment) populate(objectMap, "provisioningState", e.ProvisioningState) + populate(objectMap, "recipe", e.Recipe) + populate(objectMap, "resourceProvisioning", e.ResourceProvisioning) populate(objectMap, "secrets", e.Secrets) populate(objectMap, "status", e.Status) if e.AdditionalProperties != nil { @@ -698,6 +700,12 @@ func (e *ExtenderProperties) UnmarshalJSON(data []byte) error { case "provisioningState": err = unpopulate(val, "ProvisioningState", &e.ProvisioningState) delete(rawMsg, key) + case "recipe": + err = unpopulate(val, "Recipe", &e.Recipe) + delete(rawMsg, key) + case "resourceProvisioning": + err = unpopulate(val, "ResourceProvisioning", &e.ResourceProvisioning) + delete(rawMsg, key) case "secrets": err = unpopulate(val, "Secrets", &e.Secrets) delete(rawMsg, key) diff --git a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/extenders.json b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/extenders.json index 65efd7cf1b..fcc6cafce9 100644 --- a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/extenders.json +++ b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/extenders.json @@ -358,6 +358,14 @@ "secrets": { "additionalProperties": true, "$ref": "#/definitions/ExtenderSecrets" + }, + "resourceProvisioning": { + "$ref": "openapi.json#/definitions/ResourceProvisioning", + "description": "Specifies how the underlying service/resource is provisioned and managed." + }, + "recipe": { + "$ref": "openapi.json#/definitions/Recipe", + "description": "The recipe used to automatically deploy underlying infrastructure for the daprPubSubBroker link" } } } diff --git a/test/functional/corerp/resources/extender_test.go b/test/functional/corerp/resources/extender_test.go index 0ad4c91c1b..4f69adc71a 100644 --- a/test/functional/corerp/resources/extender_test.go +++ b/test/functional/corerp/resources/extender_test.go @@ -62,3 +62,41 @@ func Test_Extender(t *testing.T) { test.Test(t) } + +func Test_ExtenderRecipe(t *testing.T) { + template := "testdata/corerp-resources-extender-recipe.bicep" + name := "corerp-resources-extender-recipe" + appNamespace := "default-corerp-resources-extender-recipe" + + test := corerp.NewCoreRPTest(t, name, []corerp.TestStep{ + { + Executor: step.NewDeployExecutor(template, functional.GetMagpieImage()), + CoreRPResources: &validation.CoreRPResourceSet{ + Resources: []validation.CoreRPResource{ + { + Name: name, + Type: validation.ApplicationsResource, + }, + { + Name: "extr-ctnr", + Type: validation.ContainersResource, + App: name, + }, + { + Name: "extr-twilio", + Type: validation.ExtendersResource, + }, + }, + }, + K8sObjects: &validation.K8sObjectSet{ + Namespaces: map[string][]validation.K8sObject{ + appNamespace: { + validation.NewK8sPodForResource(name, "extr-ctnr"), + }, + }, + }, + }, + }) + + test.Test(t) +} diff --git a/test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep b/test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep new file mode 100644 index 0000000000..234f5af63d --- /dev/null +++ b/test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep @@ -0,0 +1,41 @@ +import radius as rad + +param application string +param environment string + +resource s3Extender 'Applications.Link/extenders' = { + name: 's3' + properties: { + environment: environment + application: application + recipe: { + name: 's3' + } + } +} + +resource container 'Applications.Core/containers' = { + name: 'mycontainer' + properties: { + application: application + container: { + image: '*****' + // In this case, I need to set the bucketname to an env name I already use + env: { + // Access property + // User needs to know name of the property (tooling does not) + BUCKETNAME: s3.properties.bucketName + // Access secrets (permissioned separately than properties and not part of the resource body) + DBSECRET: s3.secrets('databaseSecret') + } + } + connections: { + // This sets environment variable(s) on the container + // CONNECTION_S3_BUCKETNAME + // CONNECTION_S3_DATABASESECRET + s3: { + source: s3.id + } + } + } +} diff --git a/test/functional/corerp/resources/testdata/corerp-resources-extender.bicep b/test/functional/corerp/resources/testdata/corerp-resources-extender.bicep index 23140df705..a76500747f 100644 --- a/test/functional/corerp/resources/testdata/corerp-resources-extender.bicep +++ b/test/functional/corerp/resources/testdata/corerp-resources-extender.bicep @@ -38,5 +38,6 @@ resource container 'Applications.Core/containers@2022-03-15-privatepreview' = { } } connections: {} + resourceProvisioning: 'manual' } } From 12d1489eed67eed50d60cdc32cf99839f8ab431b Mon Sep 17 00:00:00 2001 From: sk593 Date: Mon, 12 Jun 2023 19:22:07 -0700 Subject: [PATCH 03/16] fix test files --- .../extender_conversion_test.go | 238 +++++++++++++++--- .../testdata/extenderresource.json | 2 +- pkg/linkrp/datamodel/extender.go | 4 +- .../extenders/createorupdateextender.go | 93 ------- .../extenders/createorupdateextender_test.go | 188 -------------- .../controller/extenders/deleteextender.go | 80 ------ .../extenders/deleteextender_test.go | 160 ------------ .../20220315privatepreview_datamodel.json | 16 +- .../20220315privatepreview_input.json | 3 +- ...20220315privatepreview_input_diff_env.json | 3 +- .../20220315privatepreview_output.json | 1 + ...220315privatepreviewgetandlist_output.json | 1 + .../corerp/resources/extender_test.go | 38 --- 13 files changed, 208 insertions(+), 619 deletions(-) delete mode 100644 pkg/linkrp/frontend/controller/extenders/createorupdateextender.go delete mode 100644 pkg/linkrp/frontend/controller/extenders/createorupdateextender_test.go delete mode 100644 pkg/linkrp/frontend/controller/extenders/deleteextender.go delete mode 100644 pkg/linkrp/frontend/controller/extenders/deleteextender_test.go diff --git a/pkg/linkrp/api/v20220315privatepreview/extender_conversion_test.go b/pkg/linkrp/api/v20220315privatepreview/extender_conversion_test.go index f1cf78d931..1c3b5911ef 100644 --- a/pkg/linkrp/api/v20220315privatepreview/extender_conversion_test.go +++ b/pkg/linkrp/api/v20220315privatepreview/extender_conversion_test.go @@ -24,15 +24,106 @@ import ( "github.com/project-radius/radius/pkg/linkrp" "github.com/project-radius/radius/pkg/linkrp/datamodel" rpv1 "github.com/project-radius/radius/pkg/rp/v1" + "github.com/project-radius/radius/pkg/to" "github.com/stretchr/testify/require" ) func TestExtender_ConvertVersionedToDataModel(t *testing.T) { - testset := []string{"extenderresource.json", "extenderresource2.json"} + testset := []struct { + file string + desc string + expected *datamodel.Extender + }{ + { + file: "extenderresource.json", + desc: "extender resource provisioning manual", + expected: &datamodel.Extender{ + BaseResource: v1.BaseResource{ + TrackedResource: v1.TrackedResource{ + ID: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Link/extenders/extender0", + Name: "extender0", + Type: linkrp.ExtendersResourceType, + Tags: map[string]string{}, + }, + InternalMetadata: v1.InternalMetadata{ + CreatedAPIVersion: "", + UpdatedAPIVersion: "2022-03-15-privatepreview", + AsyncProvisioningState: v1.ProvisioningStateAccepted, + }, + SystemData: v1.SystemData{}, + }, + Properties: datamodel.ExtenderProperties{ + BasicResourceProperties: rpv1.BasicResourceProperties{ + Application: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Core/applications/testApplication", + Environment: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Core/environments/env0", + }, + AdditionalProperties: map[string]any{"fromNumber": "222-222-2222"}, + ResourceProvisioning: linkrp.ResourceProvisioningManual, + Secrets: map[string]any{"accountSid": "sid", "authToken": "token"}, + }, + }, + }, + { + file: "extenderresource2.json", + desc: "extender resource provisioning manual (no secrets)", + expected: &datamodel.Extender{ + BaseResource: v1.BaseResource{ + TrackedResource: v1.TrackedResource{ + ID: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Link/extenders/extender0", + Name: "extender0", + Type: linkrp.ExtendersResourceType, + Tags: map[string]string{}, + }, + InternalMetadata: v1.InternalMetadata{ + CreatedAPIVersion: "", + UpdatedAPIVersion: "2022-03-15-privatepreview", + AsyncProvisioningState: v1.ProvisioningStateAccepted, + }, + SystemData: v1.SystemData{}, + }, + Properties: datamodel.ExtenderProperties{ + BasicResourceProperties: rpv1.BasicResourceProperties{ + Application: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Core/applications/testApplication", + Environment: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Core/environments/env0", + }, + AdditionalProperties: map[string]any{"fromNumber": "222-222-2222"}, + ResourceProvisioning: linkrp.ResourceProvisioningManual, + }, + }, + }, + { + file: "extenderresource_recipe.json", + desc: "extender resource recipe", + expected: &datamodel.Extender{ + BaseResource: v1.BaseResource{ + TrackedResource: v1.TrackedResource{ + ID: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Link/extenders/extender0", + Name: "extender0", + Type: linkrp.ExtendersResourceType, + Tags: map[string]string{}, + }, + InternalMetadata: v1.InternalMetadata{ + CreatedAPIVersion: "", + UpdatedAPIVersion: "2022-03-15-privatepreview", + AsyncProvisioningState: v1.ProvisioningStateAccepted, + }, + SystemData: v1.SystemData{}, + }, + Properties: datamodel.ExtenderProperties{ + BasicResourceProperties: rpv1.BasicResourceProperties{ + Application: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Core/applications/testApplication", + Environment: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Core/environments/env0", + }, + ResourceProvisioning: linkrp.ResourceProvisioningRecipe, + Recipe: linkrp.LinkRecipe{Name: "test-recipe"}, + }, + }, + }, + } for _, payload := range testset { // arrange - rawPayload, err := loadTestData("./testdata/" + payload) + rawPayload, err := loadTestData("./testdata/" + payload.file) require.NoError(t, err) versionedResource := &ExtenderResource{} err = json.Unmarshal(rawPayload, versionedResource) @@ -44,52 +135,117 @@ func TestExtender_ConvertVersionedToDataModel(t *testing.T) { // assert require.NoError(t, err) convertedResource := dm.(*datamodel.Extender) - require.Equal(t, "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Link/extenders/extender0", convertedResource.ID) - require.Equal(t, "extender0", convertedResource.Name) - require.Equal(t, linkrp.ExtendersResourceType, convertedResource.Type) - require.Equal(t, "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Core/applications/testApplication", convertedResource.Properties.Application) - require.Equal(t, "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Core/environments/env0", convertedResource.Properties.Environment) - require.Equal(t, map[string]any{"fromNumber": "222-222-2222"}, convertedResource.Properties.AdditionalProperties) - - if payload == "extenderresource.json" { - require.Equal(t, map[string]any{"accountSid": "sid", "authToken:": "token"}, convertedResource.Properties.Secrets) - require.Equal(t, []rpv1.OutputResource(nil), convertedResource.Properties.Status.OutputResources) - } else { - require.Empty(t, convertedResource.Properties.Secrets) - require.Equal(t, []rpv1.OutputResource(nil), convertedResource.Properties.Status.OutputResources) - } + + require.Equal(t, payload.expected, convertedResource) } } func TestExtender_ConvertDataModelToVersioned(t *testing.T) { - testset := []string{"extenderresourcedatamodel.json", "extenderresourcedatamodel2.json"} + testset := []struct { + file string + desc string + expected *ExtenderResource + }{ + { + desc: "extender resource provisioning manual datamodel", + file: "extenderresourcedatamodel.json", + expected: &ExtenderResource{ + Location: to.Ptr(""), + Properties: &ExtenderProperties{ + Environment: to.Ptr("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Core/environments/env0"), + Application: to.Ptr("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Core/applications/testApplication"), + ResourceProvisioning: to.Ptr(ResourceProvisioningManual), + ProvisioningState: to.Ptr(ProvisioningStateAccepted), + Recipe: &Recipe{Name: to.Ptr(""), Parameters: nil}, + AdditionalProperties: map[string]any{"fromNumber": "222-222-2222"}, + Status: &ResourceStatus{ + OutputResources: []map[string]any{ + { + "Identity": nil, + "LocalID": "Deployment", + "Provider": "ExtenderProvider", + }, + }, + }, + }, + Tags: map[string]*string{ + "env": to.Ptr("dev"), + }, + ID: to.Ptr("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Link/extenders/extender0"), + Name: to.Ptr("extender0"), + Type: to.Ptr(linkrp.ExtendersResourceType), + }, + }, + { + desc: "extender resource provisioning manual datamodel (no secrets)", + file: "extenderresourcedatamodel2.json", + expected: &ExtenderResource{ + Location: to.Ptr(""), + Properties: &ExtenderProperties{ + Environment: to.Ptr("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Core/environments/env0"), + Application: to.Ptr("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Core/applications/testApplication"), + ResourceProvisioning: to.Ptr(ResourceProvisioningManual), + ProvisioningState: to.Ptr(ProvisioningStateAccepted), + Recipe: &Recipe{Name: to.Ptr(""), Parameters: nil}, + AdditionalProperties: map[string]any{"fromNumber": "222-222-2222"}, + Status: &ResourceStatus{}, + }, + Tags: map[string]*string{ + "env": to.Ptr("dev"), + }, + ID: to.Ptr("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Link/extenders/extender0"), + Name: to.Ptr("extender0"), + Type: to.Ptr(linkrp.ExtendersResourceType), + }, + }, + { + desc: "extender resource recipe datamodel", + file: "extenderresourcedatamodel_recipe.json", + expected: &ExtenderResource{ + Location: to.Ptr(""), + Properties: &ExtenderProperties{ + Environment: to.Ptr("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Core/environments/env0"), + Application: to.Ptr("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Core/applications/testApplication"), + ResourceProvisioning: to.Ptr(ResourceProvisioningRecipe), + ProvisioningState: to.Ptr(ProvisioningStateAccepted), + Recipe: &Recipe{Name: to.Ptr("test-recipe"), Parameters: nil}, + Status: &ResourceStatus{ + OutputResources: []map[string]any{ + { + "Identity": nil, + "LocalID": "Deployment", + "Provider": "ExtenderProvider", + }, + }, + }, + }, + Tags: map[string]*string{ + "env": to.Ptr("dev"), + }, + ID: to.Ptr("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Link/extenders/extender0"), + Name: to.Ptr("extender0"), + Type: to.Ptr(linkrp.ExtendersResourceType), + }, + }, + } - for _, payload := range testset { - // arrange - rawPayload, err := loadTestData("./testdata/" + payload) - require.NoError(t, err) - resource := &datamodel.Extender{} - err = json.Unmarshal(rawPayload, resource) - require.NoError(t, err) + for _, tc := range testset { + t.Run(tc.desc, func(t *testing.T) { + rawPayload, err := loadTestData("./testdata/" + tc.file) + require.NoError(t, err) + resource := &datamodel.Extender{} + err = json.Unmarshal(rawPayload, resource) + require.NoError(t, err) - // act - versionedResource := &ExtenderResource{} - err = versionedResource.ConvertFrom(resource) + versionedResource := &ExtenderResource{} + err = versionedResource.ConvertFrom(resource) + require.NoError(t, err) - // assert - require.NoError(t, err) - require.Equal(t, "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Link/extenders/extender0", *versionedResource.ID) - require.Equal(t, "extender0", *versionedResource.Name) - require.Equal(t, linkrp.ExtendersResourceType, *versionedResource.Type) - require.Equal(t, "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Core/applications/testApplication", *versionedResource.Properties.Application) - require.Equal(t, "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/Applications.Core/environments/env0", *versionedResource.Properties.Environment) - require.Equal(t, map[string]any{"fromNumber": "222-222-2222"}, versionedResource.Properties.AdditionalProperties) - require.Empty(t, versionedResource.Properties.Secrets) // Secrets are omitted from the versioned data model. - - if payload == "extenderresourcedatamodel.json" { - require.Equal(t, "Deployment", versionedResource.Properties.Status.OutputResources[0]["LocalID"]) - require.Equal(t, "ExtenderProvider", versionedResource.Properties.Status.OutputResources[0]["Provider"]) - } + // Skip system data comparison + versionedResource.SystemData = nil + + require.Equal(t, tc.expected, versionedResource) + }) } } diff --git a/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresource.json b/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresource.json index d4b647d03f..e32698c8b1 100644 --- a/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresource.json +++ b/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresource.json @@ -17,7 +17,7 @@ "fromNumber": "222-222-2222", "secrets": { "accountSid": "sid", - "authToken:": "token" + "authToken": "token" }, "resourceProvisioning": "manual" } diff --git a/pkg/linkrp/datamodel/extender.go b/pkg/linkrp/datamodel/extender.go index e9f204409e..30c9bf4d0a 100644 --- a/pkg/linkrp/datamodel/extender.go +++ b/pkg/linkrp/datamodel/extender.go @@ -60,10 +60,8 @@ type ExtenderProperties struct { AdditionalProperties map[string]any `json:"additionalProperties,omitempty"` // Secrets values provided for the resource Secrets map[string]any `json:"secrets,omitempty"` - // The recipe used to automatically deploy underlying infrastructure for the MongoDB link + // The recipe used to automatically deploy underlying infrastructure for the Extender Recipe linkrp.LinkRecipe `json:"recipe,omitempty"` - // List of the resource IDs that support the MongoDB resource - Resources []*linkrp.ResourceReference `json:"resources,omitempty"` // Specifies how the underlying service/resource is provisioned and managed ResourceProvisioning linkrp.ResourceProvisioning `json:"resourceProvisioning,omitempty"` } diff --git a/pkg/linkrp/frontend/controller/extenders/createorupdateextender.go b/pkg/linkrp/frontend/controller/extenders/createorupdateextender.go deleted file mode 100644 index fda8566e96..0000000000 --- a/pkg/linkrp/frontend/controller/extenders/createorupdateextender.go +++ /dev/null @@ -1,93 +0,0 @@ -/* -Copyright 2023 The Radius Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package extenders - -import ( - "context" - "net/http" - - v1 "github.com/project-radius/radius/pkg/armrpc/api/v1" - ctrl "github.com/project-radius/radius/pkg/armrpc/frontend/controller" - "github.com/project-radius/radius/pkg/armrpc/rest" - "github.com/project-radius/radius/pkg/linkrp/datamodel" - "github.com/project-radius/radius/pkg/linkrp/datamodel/converter" - rp_frontend "github.com/project-radius/radius/pkg/rp/frontend" - rpv1 "github.com/project-radius/radius/pkg/rp/v1" -) - -var _ ctrl.Controller = (*CreateOrUpdateExtender)(nil) - -// CreateOrUpdateExtender is the controller implementation to create or update Extender link resource. -type CreateOrUpdateExtender struct { - ctrl.Operation[*datamodel.Extender, datamodel.Extender] -} - -// NewCreateOrUpdateExtender creates a new instance of CreateOrUpdateExtender. -func NewCreateOrUpdateExtender(opts ctrl.Options) (ctrl.Controller, error) { - return &CreateOrUpdateExtender{ - Operation: ctrl.NewOperation(opts, - ctrl.ResourceOptions[datamodel.Extender]{ - RequestConverter: converter.ExtenderDataModelFromVersioned, - ResponseConverter: converter.ExtenderDataModelToVersioned, - }), - }, nil -} - -// Run executes CreateOrUpdateExtender operation. -func (extender *CreateOrUpdateExtender) Run(ctx context.Context, w http.ResponseWriter, req *http.Request) (rest.Response, error) { - serviceCtx := v1.ARMRequestContextFromContext(ctx) - - newResource, err := extender.GetResourceFromRequest(ctx, req) - if err != nil { - return nil, err - } - - old, etag, err := extender.GetResource(ctx, serviceCtx.ResourceID) - if err != nil { - return nil, err - } - - r, err := extender.PrepareResource(ctx, req, newResource, old, etag) - if r != nil || err != nil { - return r, err - } - - r, err = rp_frontend.PrepareRadiusResource(ctx, newResource, old, extender.Options()) - if r != nil || err != nil { - return r, err - } - - newResource.Properties.Status.OutputResources = []rpv1.OutputResource{} - newResource.ComputedValues = map[string]any{} - newResource.SecretValues = map[string]rpv1.SecretValueReference{} - - for k, v := range newResource.Properties.AdditionalProperties { - newResource.ComputedValues[k] = v - } - - for k, v := range newResource.Properties.Secrets { - newResource.SecretValues[k] = rpv1.SecretValueReference{Value: v.(string)} - } - - newResource.SetProvisioningState(v1.ProvisioningStateSucceeded) - newEtag, err := extender.SaveResource(ctx, serviceCtx.ResourceID.String(), newResource, etag) - if err != nil { - return nil, err - } - - return extender.ConstructSyncResponse(ctx, req.Method, newEtag, newResource) -} diff --git a/pkg/linkrp/frontend/controller/extenders/createorupdateextender_test.go b/pkg/linkrp/frontend/controller/extenders/createorupdateextender_test.go deleted file mode 100644 index 6fa307fe4f..0000000000 --- a/pkg/linkrp/frontend/controller/extenders/createorupdateextender_test.go +++ /dev/null @@ -1,188 +0,0 @@ -/* -Copyright 2023 The Radius Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package extenders - -import ( - "context" - "encoding/json" - "net/http" - "net/http/httptest" - "testing" - - ctrl "github.com/project-radius/radius/pkg/armrpc/frontend/controller" - "github.com/project-radius/radius/pkg/linkrp/api/v20220315privatepreview" - "github.com/project-radius/radius/pkg/ucp/store" - "github.com/project-radius/radius/test/testutil" - - "github.com/golang/mock/gomock" - "github.com/stretchr/testify/require" -) - -func TestCreateOrUpdateExtender_20220315PrivatePreview(t *testing.T) { - setupTest := func(tb testing.TB) (func(tb testing.TB), *store.MockStorageClient) { - mctrl := gomock.NewController(t) - mds := store.NewMockStorageClient(mctrl) - - return func(tb testing.TB) { - mctrl.Finish() - }, mds - } - createNewResourceTestCases := []struct { - desc string - headerKey string - headerValue string - resourceETag string - expectedStatusCode int - shouldFail bool - }{ - {"create-new-resource-no-if-match", "If-Match", "", "", http.StatusOK, false}, - {"create-new-resource-*-if-match", "If-Match", "*", "", http.StatusPreconditionFailed, true}, - {"create-new-resource-etag-if-match", "If-Match", "random-etag", "", http.StatusPreconditionFailed, true}, - {"create-new-resource-*-if-none-match", "If-None-Match", "*", "", http.StatusOK, false}, - } - - for _, testcase := range createNewResourceTestCases { - t.Run(testcase.desc, func(t *testing.T) { - teardownTest, mds := setupTest(t) - defer teardownTest(t) - - input, dataModel, expectedOutput := getTestModelsForGetAndListApis20220315privatepreview() - w := httptest.NewRecorder() - req, _ := testutil.GetARMTestHTTPRequest(context.Background(), http.MethodGet, testHeaderfile, input) - req.Header.Set(testcase.headerKey, testcase.headerValue) - ctx := testutil.ARMTestContextFromRequest(req) - - mds. - EXPECT(). - Get(gomock.Any(), gomock.Any()). - DoAndReturn(func(ctx context.Context, id string, _ ...store.GetOptions) (*store.Object, error) { - return nil, &store.ErrNotFound{} - }) - - expectedOutput.SystemData.CreatedAt = expectedOutput.SystemData.LastModifiedAt - expectedOutput.SystemData.CreatedBy = expectedOutput.SystemData.LastModifiedBy - expectedOutput.SystemData.CreatedByType = expectedOutput.SystemData.LastModifiedByType - - if !testcase.shouldFail { - mds. - EXPECT(). - Save(gomock.Any(), gomock.Any(), gomock.Any()). - DoAndReturn(func(ctx context.Context, obj *store.Object, opts ...store.SaveOptions) error { - // First time created objects should have the same lastModifiedAt and createdAt - dataModel.SystemData.CreatedAt = dataModel.SystemData.LastModifiedAt - obj.ETag = "new-resource-etag" - obj.Data = dataModel - return nil - }) - } - - opts := ctrl.Options{ - StorageClient: mds, - } - - ctl, err := NewCreateOrUpdateExtender(opts) - require.NoError(t, err) - resp, err := ctl.Run(ctx, w, req) - require.NoError(t, err) - _ = resp.Apply(ctx, w, req) - require.Equal(t, testcase.expectedStatusCode, w.Result().StatusCode) - - if !testcase.shouldFail { - actualOutput := &v20220315privatepreview.ExtenderResponseResource{} - err := json.Unmarshal(w.Body.Bytes(), actualOutput) - require.NoError(t, err) - require.Equal(t, expectedOutput, actualOutput) - - require.Equal(t, "new-resource-etag", w.Header().Get("ETag")) - } - }) - } - - updateExistingResourceTestCases := []struct { - desc string - headerKey string - headerValue string - inputFile string - resourceETag string - expectedStatusCode int - shouldFail bool - }{ - {"update-resource-no-if-match", "If-Match", "", "", "resource-etag", http.StatusOK, false}, - {"update-resource-with-diff-env", "If-Match", "", "20220315privatepreview_input_diff_env.json", "", http.StatusBadRequest, true}, - {"update-resource-*-if-match", "If-Match", "*", "", "resource-etag", http.StatusOK, false}, - {"update-resource-matching-if-match", "If-Match", "matching-etag", "", "matching-etag", http.StatusOK, false}, - {"update-resource-not-matching-if-match", "If-Match", "not-matching-etag", "", "another-etag", http.StatusPreconditionFailed, true}, - {"update-resource-*-if-none-match", "If-None-Match", "*", "", "another-etag", http.StatusPreconditionFailed, true}, - } - - for _, testcase := range updateExistingResourceTestCases { - t.Run(testcase.desc, func(t *testing.T) { - teardownTest, mds := setupTest(t) - defer teardownTest(t) - - input, dataModel, expectedOutput := getTestModelsForGetAndListApis20220315privatepreview() - if testcase.inputFile != "" { - input = &v20220315privatepreview.ExtenderResource{} - _ = json.Unmarshal(testutil.ReadFixture(testcase.inputFile), input) - } - w := httptest.NewRecorder() - req, _ := testutil.GetARMTestHTTPRequest(context.Background(), http.MethodGet, testHeaderfile, input) - req.Header.Set(testcase.headerKey, testcase.headerValue) - ctx := testutil.ARMTestContextFromRequest(req) - - mds. - EXPECT(). - Get(gomock.Any(), gomock.Any()). - DoAndReturn(func(ctx context.Context, id string, _ ...store.GetOptions) (*store.Object, error) { - return &store.Object{ - Metadata: store.Metadata{ID: id, ETag: testcase.resourceETag}, - Data: dataModel, - }, nil - }) - - if !testcase.shouldFail { - mds. - EXPECT(). - Save(gomock.Any(), gomock.Any(), gomock.Any()). - DoAndReturn(func(ctx context.Context, obj *store.Object, opts ...store.SaveOptions) error { - obj.ETag = "updated-resource-etag" - obj.Data = dataModel - return nil - }) - } - - opts := ctrl.Options{ - StorageClient: mds, - } - - ctl, err := NewCreateOrUpdateExtender(opts) - require.NoError(t, err) - resp, err := ctl.Run(ctx, w, req) - _ = resp.Apply(ctx, w, req) - require.NoError(t, err) - require.Equal(t, testcase.expectedStatusCode, w.Result().StatusCode) - - if !testcase.shouldFail { - actualOutput := &v20220315privatepreview.ExtenderResponseResource{} - _ = json.Unmarshal(w.Body.Bytes(), actualOutput) - require.Equal(t, expectedOutput, actualOutput) - - require.Equal(t, "updated-resource-etag", w.Header().Get("ETag")) - } - }) - } -} diff --git a/pkg/linkrp/frontend/controller/extenders/deleteextender.go b/pkg/linkrp/frontend/controller/extenders/deleteextender.go deleted file mode 100644 index 8b40782e90..0000000000 --- a/pkg/linkrp/frontend/controller/extenders/deleteextender.go +++ /dev/null @@ -1,80 +0,0 @@ -/* -Copyright 2023 The Radius Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package extenders - -import ( - "context" - "errors" - "net/http" - - v1 "github.com/project-radius/radius/pkg/armrpc/api/v1" - ctrl "github.com/project-radius/radius/pkg/armrpc/frontend/controller" - "github.com/project-radius/radius/pkg/armrpc/rest" - "github.com/project-radius/radius/pkg/linkrp/datamodel" - "github.com/project-radius/radius/pkg/linkrp/datamodel/converter" - "github.com/project-radius/radius/pkg/ucp/store" -) - -var _ ctrl.Controller = (*DeleteExtender)(nil) - -// DeleteExtender is the controller implementation to delete extender link resource. -type DeleteExtender struct { - ctrl.Operation[*datamodel.Extender, datamodel.Extender] -} - -// NewDeleteExtender creates a new instance DeleteExtender. -func NewDeleteExtender(opts ctrl.Options) (ctrl.Controller, error) { - return &DeleteExtender{ - Operation: ctrl.NewOperation(opts, - ctrl.ResourceOptions[datamodel.Extender]{ - RequestConverter: converter.ExtenderDataModelFromVersioned, - ResponseConverter: converter.ExtenderDataModelToVersioned, - }), - }, nil -} - -func (extender *DeleteExtender) Run(ctx context.Context, w http.ResponseWriter, req *http.Request) (rest.Response, error) { - serviceCtx := v1.ARMRequestContextFromContext(ctx) - - old, etag, err := extender.GetResource(ctx, serviceCtx.ResourceID) - if err != nil { - return nil, err - } - - if old == nil { - return rest.NewNoContentResponse(), nil - } - - if etag == "" { - return rest.NewNoContentResponse(), nil - } - - r, err := extender.PrepareResource(ctx, req, nil, old, etag) - if r != nil || err != nil { - return r, err - } - - err = extender.StorageClient().Delete(ctx, serviceCtx.ResourceID.String()) - if err != nil { - if errors.Is(&store.ErrNotFound{}, err) { - return rest.NewNoContentResponse(), nil - } - return nil, err - } - - return rest.NewOKResponse(nil), nil -} diff --git a/pkg/linkrp/frontend/controller/extenders/deleteextender_test.go b/pkg/linkrp/frontend/controller/extenders/deleteextender_test.go deleted file mode 100644 index bd75323546..0000000000 --- a/pkg/linkrp/frontend/controller/extenders/deleteextender_test.go +++ /dev/null @@ -1,160 +0,0 @@ -/* -Copyright 2023 The Radius Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package extenders - -import ( - "context" - "encoding/json" - "io" - "net/http" - "net/http/httptest" - "testing" - - v1 "github.com/project-radius/radius/pkg/armrpc/api/v1" - ctrl "github.com/project-radius/radius/pkg/armrpc/frontend/controller" - "github.com/project-radius/radius/pkg/ucp/store" - "github.com/project-radius/radius/test/testutil" - - "github.com/golang/mock/gomock" - "github.com/stretchr/testify/require" -) - -func TestDeleteExtender_20220315PrivatePreview(t *testing.T) { - setupTest := func(tb testing.TB) (func(tb testing.TB), *store.MockStorageClient) { - mctrl := gomock.NewController(t) - mds := store.NewMockStorageClient(mctrl) - return func(tb testing.TB) { - mctrl.Finish() - }, mds - } - - t.Parallel() - - t.Run("delete non-existing resource", func(t *testing.T) { - teardownTest, mds := setupTest(t) - defer teardownTest(t) - w := httptest.NewRecorder() - req, _ := testutil.GetARMTestHTTPRequest(context.Background(), http.MethodDelete, testHeaderfile, nil) - ctx := testutil.ARMTestContextFromRequest(req) - - mds. - EXPECT(). - Get(gomock.Any(), gomock.Any()). - DoAndReturn(func(ctx context.Context, id string, _ ...store.GetOptions) (*store.Object, error) { - return nil, &store.ErrNotFound{} - }) - - opts := ctrl.Options{ - StorageClient: mds, - } - - ctl, err := NewDeleteExtender(opts) - - require.NoError(t, err) - resp, err := ctl.Run(ctx, w, req) - require.NoError(t, err) - err = resp.Apply(ctx, w, req) - require.NoError(t, err) - - result := w.Result() - require.Equal(t, http.StatusNoContent, result.StatusCode) - - body := result.Body - defer body.Close() - payload, err := io.ReadAll(body) - require.NoError(t, err) - require.Empty(t, payload, "response body should be empty") - }) - - existingResourceDeleteTestCases := []struct { - desc string - ifMatchETag string - resourceETag string - expectedStatusCode int - shouldFail bool - }{ - {"delete-existing-resource-no-if-match", "", "random-etag", http.StatusOK, false}, - {"delete-not-existing-resource-no-if-match", "", "", http.StatusNoContent, true}, - {"delete-existing-resource-matching-if-match", "matching-etag", "matching-etag", http.StatusOK, false}, - {"delete-existing-resource-not-matching-if-match", "not-matching-etag", "another-etag", http.StatusPreconditionFailed, true}, - {"delete-not-existing-resource-*-if-match", "*", "", http.StatusNoContent, true}, - {"delete-existing-resource-*-if-match", "*", "random-etag", http.StatusOK, false}, - } - - for _, testcase := range existingResourceDeleteTestCases { - t.Run(testcase.desc, func(t *testing.T) { - teardownTest, mds := setupTest(t) - defer teardownTest(t) - w := httptest.NewRecorder() - - req, _ := testutil.GetARMTestHTTPRequest(context.Background(), http.MethodDelete, testHeaderfile, nil) - req.Header.Set("If-Match", testcase.ifMatchETag) - - ctx := testutil.ARMTestContextFromRequest(req) - _, extenderDataModel, _ := getTestModels20220315privatepreview() - - mds. - EXPECT(). - Get(gomock.Any(), gomock.Any()). - DoAndReturn(func(ctx context.Context, id string, _ ...store.GetOptions) (*store.Object, error) { - return &store.Object{ - Metadata: store.Metadata{ID: id, ETag: testcase.resourceETag}, - Data: extenderDataModel, - }, nil - }) - - if !testcase.shouldFail { - mds. - EXPECT(). - Delete(gomock.Any(), gomock.Any()). - DoAndReturn(func(ctx context.Context, id string, _ ...store.DeleteOptions) error { - return nil - }) - } - - opts := ctrl.Options{ - StorageClient: mds, - } - - ctl, err := NewDeleteExtender(opts) - require.NoError(t, err) - resp, err := ctl.Run(ctx, w, req) - require.NoError(t, err) - err = resp.Apply(ctx, w, req) - require.NoError(t, err) - - result := w.Result() - require.Equal(t, testcase.expectedStatusCode, result.StatusCode) - - body := result.Body - defer body.Close() - payload, err := io.ReadAll(body) - require.NoError(t, err) - - if result.StatusCode == http.StatusOK || result.StatusCode == http.StatusNoContent { - // We return either 200 or 204 without a response body for success. - require.Empty(t, payload, "response body should be empty") - } else { - armerr := v1.ErrorResponse{} - err = json.Unmarshal(payload, &armerr) - require.NoError(t, err) - require.Equal(t, v1.CodePreconditionFailed, armerr.Error.Code) - require.NotEmpty(t, armerr.Error.Target) - } - }) - } -} diff --git a/pkg/linkrp/frontend/controller/extenders/testdata/20220315privatepreview_datamodel.json b/pkg/linkrp/frontend/controller/extenders/testdata/20220315privatepreview_datamodel.json index 6653372f81..e2b19f3336 100644 --- a/pkg/linkrp/frontend/controller/extenders/testdata/20220315privatepreview_datamodel.json +++ b/pkg/linkrp/frontend/controller/extenders/testdata/20220315privatepreview_datamodel.json @@ -19,20 +19,10 @@ "fromNumber": "222-222-2222" }, "secrets": { - "accountSid": "sid", - "authToken:": "token" - } - }, - "computedValues": { - "fromNumber": "222-222-2222" - }, - "secretValues": { - "accountSid": { - "value": "sid" + "accountSid": "sid", + "authToken:": "token" }, - "authToken:": { - "value": "token" - } + "resourceProvisioning": "manual" }, "tenantId": "00000000-0000-0000-0000-000000000000", "subscriptionId": "00000000-0000-0000-0000-000000000000", diff --git a/pkg/linkrp/frontend/controller/extenders/testdata/20220315privatepreview_input.json b/pkg/linkrp/frontend/controller/extenders/testdata/20220315privatepreview_input.json index e85984702f..42988b83f8 100644 --- a/pkg/linkrp/frontend/controller/extenders/testdata/20220315privatepreview_input.json +++ b/pkg/linkrp/frontend/controller/extenders/testdata/20220315privatepreview_input.json @@ -7,6 +7,7 @@ "secrets": { "accountSid": "sid", "authToken:": "token" - } + }, + "resourceProvisioning": "manual" } } \ No newline at end of file diff --git a/pkg/linkrp/frontend/controller/extenders/testdata/20220315privatepreview_input_diff_env.json b/pkg/linkrp/frontend/controller/extenders/testdata/20220315privatepreview_input_diff_env.json index c26f84e576..51cff92fd1 100644 --- a/pkg/linkrp/frontend/controller/extenders/testdata/20220315privatepreview_input_diff_env.json +++ b/pkg/linkrp/frontend/controller/extenders/testdata/20220315privatepreview_input_diff_env.json @@ -7,6 +7,7 @@ "secrets": { "accountSid": "sid", "authToken:": "token" - } + }, + "resourceProvisioning": "manual" } } \ No newline at end of file diff --git a/pkg/linkrp/frontend/controller/extenders/testdata/20220315privatepreview_output.json b/pkg/linkrp/frontend/controller/extenders/testdata/20220315privatepreview_output.json index bab85ce3e6..b703b37f04 100644 --- a/pkg/linkrp/frontend/controller/extenders/testdata/20220315privatepreview_output.json +++ b/pkg/linkrp/frontend/controller/extenders/testdata/20220315privatepreview_output.json @@ -13,6 +13,7 @@ "accountSid": "sid", "authToken:": "token" }, + "resourceProvisioning": "manual", "provisioningState": "Succeeded" }, "systemData": { diff --git a/pkg/linkrp/frontend/controller/extenders/testdata/20220315privatepreviewgetandlist_output.json b/pkg/linkrp/frontend/controller/extenders/testdata/20220315privatepreviewgetandlist_output.json index 60a7d8a4b8..0a36cafbd2 100644 --- a/pkg/linkrp/frontend/controller/extenders/testdata/20220315privatepreviewgetandlist_output.json +++ b/pkg/linkrp/frontend/controller/extenders/testdata/20220315privatepreviewgetandlist_output.json @@ -9,6 +9,7 @@ "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", "fromNumber": "222-222-2222", + "resourceProvisioning": "manual", "provisioningState": "Succeeded" }, "systemData": { diff --git a/test/functional/corerp/resources/extender_test.go b/test/functional/corerp/resources/extender_test.go index 4f69adc71a..0ad4c91c1b 100644 --- a/test/functional/corerp/resources/extender_test.go +++ b/test/functional/corerp/resources/extender_test.go @@ -62,41 +62,3 @@ func Test_Extender(t *testing.T) { test.Test(t) } - -func Test_ExtenderRecipe(t *testing.T) { - template := "testdata/corerp-resources-extender-recipe.bicep" - name := "corerp-resources-extender-recipe" - appNamespace := "default-corerp-resources-extender-recipe" - - test := corerp.NewCoreRPTest(t, name, []corerp.TestStep{ - { - Executor: step.NewDeployExecutor(template, functional.GetMagpieImage()), - CoreRPResources: &validation.CoreRPResourceSet{ - Resources: []validation.CoreRPResource{ - { - Name: name, - Type: validation.ApplicationsResource, - }, - { - Name: "extr-ctnr", - Type: validation.ContainersResource, - App: name, - }, - { - Name: "extr-twilio", - Type: validation.ExtendersResource, - }, - }, - }, - K8sObjects: &validation.K8sObjectSet{ - Namespaces: map[string][]validation.K8sObject{ - appNamespace: { - validation.NewK8sPodForResource(name, "extr-ctnr"), - }, - }, - }, - }, - }) - - test.Test(t) -} From a395ccdca02a12a6e0eaf8a0fdb24b94d7e5a229 Mon Sep 17 00:00:00 2001 From: sk593 Date: Mon, 12 Jun 2023 19:25:50 -0700 Subject: [PATCH 04/16] nit --- pkg/linkrp/frontend/controller/types.go | 4 +- pkg/linkrp/processors/validator.go | 2 +- .../corerp-resources-extender-recipe.bicep | 41 ------------------- 3 files changed, 3 insertions(+), 44 deletions(-) delete mode 100644 test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep diff --git a/pkg/linkrp/frontend/controller/types.go b/pkg/linkrp/frontend/controller/types.go index ffa8f4d237..77c3a71caa 100644 --- a/pkg/linkrp/frontend/controller/types.go +++ b/pkg/linkrp/frontend/controller/types.go @@ -56,8 +56,8 @@ var ( // AsyncDeleteDaprPubSubBrokerTimeout is the timeout for async delete dapr pub sub broker AsyncDeleteDaprPubSubBrokerTimeout = time.Duration(30) * time.Minute - // AsyncCreateOrUpdateDaprPubSubBrokerTimeout is the timeout for async create or update dapr pub sub broker + // AsyncCreateOrUpdateExtenderTimeout is the timeout for async create or update extender AsyncCreateOrUpdateExtenderTimeout = time.Duration(60) * time.Minute - // AsyncDeleteDaprPubSubBrokerTimeout is the timeout for async delete dapr pub sub broker + // AsyncDeleteExtenderTimeout is the timeout for async delete extender AsyncDeleteExtenderTimeout = time.Duration(30) * time.Minute ) diff --git a/pkg/linkrp/processors/validator.go b/pkg/linkrp/processors/validator.go index 44100d7a8b..8f15c0aece 100644 --- a/pkg/linkrp/processors/validator.go +++ b/pkg/linkrp/processors/validator.go @@ -106,7 +106,7 @@ func (v *Validator) AddOptionalSecretField(name string, ref *string) { v.fields = append(v.fields, bind(v, name, ref, false, true, "string", convertToString, nil)) } -// AddComputedStringField registers a field containing a computed string connection value. The empty string will be treated as an "unset" value. +// AddOptionalComputedField registers a field containing a computed property value. The empty property will be treated as an "unset" value. // // The compute function will be called if the value is not already set or provided by the recipe. Inside the compute function // it is safe to assume that other non-computed fields have been populated already. diff --git a/test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep b/test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep deleted file mode 100644 index 234f5af63d..0000000000 --- a/test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep +++ /dev/null @@ -1,41 +0,0 @@ -import radius as rad - -param application string -param environment string - -resource s3Extender 'Applications.Link/extenders' = { - name: 's3' - properties: { - environment: environment - application: application - recipe: { - name: 's3' - } - } -} - -resource container 'Applications.Core/containers' = { - name: 'mycontainer' - properties: { - application: application - container: { - image: '*****' - // In this case, I need to set the bucketname to an env name I already use - env: { - // Access property - // User needs to know name of the property (tooling does not) - BUCKETNAME: s3.properties.bucketName - // Access secrets (permissioned separately than properties and not part of the resource body) - DBSECRET: s3.secrets('databaseSecret') - } - } - connections: { - // This sets environment variable(s) on the container - // CONNECTION_S3_BUCKETNAME - // CONNECTION_S3_DATABASESECRET - s3: { - source: s3.id - } - } - } -} From 760f6deb4e8e767885da3f7423b662c3ffd020ff Mon Sep 17 00:00:00 2001 From: sk593 Date: Tue, 13 Jun 2023 09:48:08 -0700 Subject: [PATCH 05/16] update schema --- .../examples/DaprSecretStoresGet.json | 2 +- .../examples/DaprSecretStoresList.json | 3 +- .../DaprSecretStoresListByRootScope.json | 3 +- .../examples/DaprSecretStoresPut.json | 6 +-- .../examples/DaprStateStoresList.json | 33 ++++++++---- .../DaprStateStoresListByRootScope.json | 24 +++++++-- .../examples/DaprStateStoresPut.json | 22 ++++++-- .../DaprStateStoresPutWithRecipe.json | 2 - .../examples/ExtendersGet.json | 3 +- .../examples/ExtendersList.json | 3 +- .../examples/ExtendersListByRootScope.json | 3 +- .../examples/ExtendersPut.json | 9 ++-- .../examples/ExtendersPutWithRecipe.json | 52 +++++++++++++++++++ .../examples/RabbitMQMessageQueuesGet.json | 2 +- .../examples/RabbitMQMessageQueuesList.json | 3 +- .../RabbitMQMessageQueuesListByRootScope.json | 3 +- .../examples/RabbitMQMessageQueuesPut.json | 6 +-- .../examples/RabbitMQQueuesGet.json | 2 +- .../examples/RabbitMQQueuesList.json | 3 +- .../RabbitMQQueuesListByRootScope.json | 3 +- .../examples/RabbitMQQueuesPut.json | 6 +-- 21 files changed, 142 insertions(+), 51 deletions(-) create mode 100644 swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/ExtendersPutWithRecipe.json diff --git a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprSecretStoresGet.json b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprSecretStoresGet.json index 427a77aee7..bd2b645675 100644 --- a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprSecretStoresGet.json +++ b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprSecretStoresGet.json @@ -20,7 +20,7 @@ "metadata": { "foo": "bar" }, - "mode": "values" + "resourceProvisioning": "manual" } } } diff --git a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprSecretStoresList.json b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprSecretStoresList.json index 2247d56741..26574f5f3b 100644 --- a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprSecretStoresList.json +++ b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprSecretStoresList.json @@ -21,7 +21,7 @@ "metadata": { "foo": "bar" }, - "mode": "values" + "resourceProvisioning": "manual" } }, { @@ -33,7 +33,6 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode":"recipe", "recipe": { "name": "sqldb", "parameters":{ diff --git a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprSecretStoresListByRootScope.json b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprSecretStoresListByRootScope.json index 3c825da488..04091b8b57 100644 --- a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprSecretStoresListByRootScope.json +++ b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprSecretStoresListByRootScope.json @@ -21,7 +21,7 @@ "metadata": { "foo": "bar" }, - "mode": "values" + "resourceProvisioning": "manual" } }, { @@ -33,7 +33,6 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode":"recipe", "recipe": { "name": "sqldb", "parameters":{ diff --git a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprSecretStoresPut.json b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprSecretStoresPut.json index 59a13feab9..448efed7cb 100644 --- a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprSecretStoresPut.json +++ b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprSecretStoresPut.json @@ -13,7 +13,7 @@ "metadata": { "foo": "bar" }, - "mode": "values" + "resourceProvisioning": "manual" } } }, @@ -28,7 +28,7 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode": "values", + "resourceProvisioning": "manual", "kind": "generic", "type": "secretstores.hashicorp.vault", "version": "v1", @@ -48,7 +48,7 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode": "values", + "resourceProvisioning": "manual", "type": "secretstores.hashicorp.vault", "version": "v1", "metadata": { diff --git a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprStateStoresList.json b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprStateStoresList.json index befb9c8183..487d2db839 100644 --- a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprStateStoresList.json +++ b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprStateStoresList.json @@ -16,8 +16,15 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode": "resource", - "resource": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.Sql/servers/testServer/databases/testDatabase" + "resourceProvisioning": "manual", + "resources": [ + {"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.Storage/storageAccounts/tableServices/tables/testTable"} + ], + "type": "state.zookeeper", + "version": "v1", + "metadata": { + "foo": "bar" + } } }, { @@ -29,8 +36,15 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode": "resource", - "resource": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.Storage/storageAccounts/tableServices/tables/testTable" + "resourceProvisioning": "manual", + "resources": [ + {"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.Storage/storageAccounts/tableServices/tables/testTable"} + ], + "type": "state.zookeeper", + "version": "v1", + "metadata": { + "foo": "bar" + } } }, { @@ -42,12 +56,12 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode": "values", + "resourceProvisioning": "manual", "type": "state.zookeeper", - "version": "v1", - "metadata": { - "foo": "bar" - } + "version": "v1", + "metadata": { + "foo": "bar" + } } }, { @@ -59,7 +73,6 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode": "recipe", "recipe": { "name": "recipe-test" } diff --git a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprStateStoresListByRootScope.json b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprStateStoresListByRootScope.json index d133c41a1a..3a2dc7e6a3 100644 --- a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprStateStoresListByRootScope.json +++ b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprStateStoresListByRootScope.json @@ -16,8 +16,15 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode": "resource", - "resource": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.Sql/servers/testServer/databases/testDatabase" + "resourceProvisioning": "manual", + "resources": [ + {"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.Sql/servers/testServer/databases/testDatabase"} + ], + "type": "state.zookeeper", + "version": "v1", + "metadata": { + "foo": "bar" + } } }, { @@ -29,8 +36,15 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode": "resource", - "resource": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.Storage/storageAccounts/tableServices/tables/testTable" + "resourceProvisioning": "manual", + "resources": [ + {"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.Sql/servers/testServer/databases/testDatabase"} + ], + "type": "state.zookeeper", + "version": "v1", + "metadata": { + "foo": "bar" + } } }, { @@ -42,7 +56,7 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode": "values", + "resourceProvisioning": "manual", "type": "state.zookeeper", "version": "v1", "metadata": { diff --git a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprStateStoresPut.json b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprStateStoresPut.json index fb205b7418..3e0ae0f135 100644 --- a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprStateStoresPut.json +++ b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprStateStoresPut.json @@ -25,8 +25,15 @@ "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", "kind": "state.sqlserver", - "mode": "resource", - "resource": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.Sql/servers/testServer/databases/testDatabase" + "resources": [ + {"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.Storage/storageAccounts/tableServices/tables/testTable"} + ], + "type": "state.zookeeper", + "version": "v1", + "metadata": { + "foo": "bar" + }, + "resourceProvisioning": "manual" } } }, @@ -40,8 +47,15 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode": "resource", - "resource": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.Sql/servers/testServer/databases/testDatabase" + "resources": [ + {"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.Storage/storageAccounts/tableServices/tables/testTable"} + ], + "type": "state.zookeeper", + "version": "v1", + "metadata": { + "foo": "bar" + }, + "resourceProvisioning": "manual" } } } diff --git a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprStateStoresPutWithRecipe.json b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprStateStoresPutWithRecipe.json index 130fee2bab..9c6f14d5b9 100644 --- a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprStateStoresPutWithRecipe.json +++ b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprStateStoresPutWithRecipe.json @@ -8,7 +8,6 @@ "properties": { "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode": "recipe", "recipe": { "name": "recipe-test" } @@ -27,7 +26,6 @@ "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", "kind": "state.sqlserver", - "mode": "recipe", "recipe": { "name": "recipe-test" } diff --git a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/ExtendersGet.json b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/ExtendersGet.json index 3eafe4968f..621e5709ae 100644 --- a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/ExtendersGet.json +++ b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/ExtendersGet.json @@ -20,7 +20,8 @@ "secrets": { "accountSid": "sid", "authToken:": "token" - } + }, + "resourceProvisioning": "manual" } } } diff --git a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/ExtendersList.json b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/ExtendersList.json index f4f59508f0..49e1381f3f 100644 --- a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/ExtendersList.json +++ b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/ExtendersList.json @@ -20,7 +20,8 @@ "secrets": { "accountSid": "sid", "authToken:": "token" - } + }, + "resourceProvisioning": "manual" } } ], diff --git a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/ExtendersListByRootScope.json b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/ExtendersListByRootScope.json index 9dd75f42ca..0c54b9e4ba 100644 --- a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/ExtendersListByRootScope.json +++ b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/ExtendersListByRootScope.json @@ -20,7 +20,8 @@ "secrets": { "accountSid": "sid", "authToken:": "token" - } + }, + "resourceProvisioning": "manual" } } ], diff --git a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/ExtendersPut.json b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/ExtendersPut.json index 9ae9e2f2bb..1b2adaf31a 100644 --- a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/ExtendersPut.json +++ b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/ExtendersPut.json @@ -11,7 +11,8 @@ "secrets": { "accountSid": "sid", "authToken:": "token" - } + }, + "resourceProvisioning": "manual" } } }, @@ -30,7 +31,8 @@ "secrets": { "accountSid": "sid", "authToken:": "token" - } + }, + "resourceProvisioning": "manual" } } }, @@ -48,7 +50,8 @@ "secrets": { "accountSid": "sid", "authToken:": "token" - } + }, + "resourceProvisioning": "manual" } } } diff --git a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/ExtendersPutWithRecipe.json b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/ExtendersPutWithRecipe.json new file mode 100644 index 0000000000..018e9d6492 --- /dev/null +++ b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/ExtendersPutWithRecipe.json @@ -0,0 +1,52 @@ +{ + "parameters": { + "rootScope": "subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup", + "extenderName": "extender0", + "api-version": "2022-03-15-privatepreview", + "ExtenderParameters": { + "location": "West US", + "properties": { + "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", + "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", + "recipe": { + "name": "s3" + } + } + } + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Link/extenders/extender0", + "name": "extender0", + "type": "Applications.Link/extenders", + "location": "West US", + "properties": { + "provisioningState": "Succeeded", + "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", + "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", + "recipe": { + "name": "s3" + } + } + } + }, + "201": { + "body": { + "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Link/extenders/extender1", + "name": "extender1", + "type": "Applications.Link/extenders", + "location": "West US", + "properties": { + "provisioningState": "Succeeded", + "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", + "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", + "recipe": { + "name": "s3" + } + } + } + } + } +} + \ No newline at end of file diff --git a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/RabbitMQMessageQueuesGet.json b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/RabbitMQMessageQueuesGet.json index 6f4ed8bd6d..3c91597618 100644 --- a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/RabbitMQMessageQueuesGet.json +++ b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/RabbitMQMessageQueuesGet.json @@ -15,7 +15,7 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode": "values", + "resourceProvisioning": "manual", "queue": "rabbitmq0", "secrets": { "connectionString": "connection://string" diff --git a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/RabbitMQMessageQueuesList.json b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/RabbitMQMessageQueuesList.json index 555a7537c4..8201de777d 100644 --- a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/RabbitMQMessageQueuesList.json +++ b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/RabbitMQMessageQueuesList.json @@ -16,7 +16,7 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode": "values", + "resourceProvisioning": "manual", "queue": "rabbitmq0" } }, @@ -29,7 +29,6 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode":"recipe", "recipe": { "name": "sqldb", "parameters":{ diff --git a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/RabbitMQMessageQueuesListByRootScope.json b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/RabbitMQMessageQueuesListByRootScope.json index 682ade38bc..abacb89868 100644 --- a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/RabbitMQMessageQueuesListByRootScope.json +++ b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/RabbitMQMessageQueuesListByRootScope.json @@ -16,7 +16,7 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode": "values", + "resourceProvisioning": "manual", "queue": "rabbitmq0", "secrets": { "connectionString": "connection://string" @@ -32,7 +32,6 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode":"recipe", "recipe": { "name": "sqldb", "parameters":{ diff --git a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/RabbitMQMessageQueuesPut.json b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/RabbitMQMessageQueuesPut.json index ff021e7db3..d92b63188e 100644 --- a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/RabbitMQMessageQueuesPut.json +++ b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/RabbitMQMessageQueuesPut.json @@ -8,7 +8,7 @@ "properties": { "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode": "values", + "resourceProvisioning": "manual", "queue": "rabbitmq0", "secrets": { "connectionString": "connection://string" @@ -27,7 +27,7 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode": "values", + "resourceProvisioning": "manual", "queue": "rabbitmq0", "secrets": { "connectionString": "connection://string" @@ -45,7 +45,7 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode": "values", + "resourceProvisioning": "manual", "queue": "rabbitmq0", "secrets": { "connectionString": "connection://string" diff --git a/swagger/specification/applications/resource-manager/Applications.Messaging/preview/2022-03-15-privatepreview/examples/RabbitMQQueuesGet.json b/swagger/specification/applications/resource-manager/Applications.Messaging/preview/2022-03-15-privatepreview/examples/RabbitMQQueuesGet.json index 3902d6b291..a3ba86102a 100644 --- a/swagger/specification/applications/resource-manager/Applications.Messaging/preview/2022-03-15-privatepreview/examples/RabbitMQQueuesGet.json +++ b/swagger/specification/applications/resource-manager/Applications.Messaging/preview/2022-03-15-privatepreview/examples/RabbitMQQueuesGet.json @@ -15,7 +15,7 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode": "values", + "resourceProvisioning": "manual", "queue": "rabbitmq0", "secrets": { "connectionString": "connection://string" diff --git a/swagger/specification/applications/resource-manager/Applications.Messaging/preview/2022-03-15-privatepreview/examples/RabbitMQQueuesList.json b/swagger/specification/applications/resource-manager/Applications.Messaging/preview/2022-03-15-privatepreview/examples/RabbitMQQueuesList.json index dca7c01720..29cfdb4d75 100644 --- a/swagger/specification/applications/resource-manager/Applications.Messaging/preview/2022-03-15-privatepreview/examples/RabbitMQQueuesList.json +++ b/swagger/specification/applications/resource-manager/Applications.Messaging/preview/2022-03-15-privatepreview/examples/RabbitMQQueuesList.json @@ -16,7 +16,7 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode": "values", + "resourceProvisioning": "manual", "queue": "rabbitmq0" } }, @@ -29,7 +29,6 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode":"recipe", "recipe": { "name": "sqldb", "parameters":{ diff --git a/swagger/specification/applications/resource-manager/Applications.Messaging/preview/2022-03-15-privatepreview/examples/RabbitMQQueuesListByRootScope.json b/swagger/specification/applications/resource-manager/Applications.Messaging/preview/2022-03-15-privatepreview/examples/RabbitMQQueuesListByRootScope.json index e90198d328..04651a266e 100644 --- a/swagger/specification/applications/resource-manager/Applications.Messaging/preview/2022-03-15-privatepreview/examples/RabbitMQQueuesListByRootScope.json +++ b/swagger/specification/applications/resource-manager/Applications.Messaging/preview/2022-03-15-privatepreview/examples/RabbitMQQueuesListByRootScope.json @@ -16,7 +16,7 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode": "values", + "resourceProvisioning": "manual", "queue": "rabbitmq0", "secrets": { "connectionString": "connection://string" @@ -32,7 +32,6 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode":"recipe", "recipe": { "name": "sqldb", "parameters":{ diff --git a/swagger/specification/applications/resource-manager/Applications.Messaging/preview/2022-03-15-privatepreview/examples/RabbitMQQueuesPut.json b/swagger/specification/applications/resource-manager/Applications.Messaging/preview/2022-03-15-privatepreview/examples/RabbitMQQueuesPut.json index 12605f7f01..8008dc7e0a 100644 --- a/swagger/specification/applications/resource-manager/Applications.Messaging/preview/2022-03-15-privatepreview/examples/RabbitMQQueuesPut.json +++ b/swagger/specification/applications/resource-manager/Applications.Messaging/preview/2022-03-15-privatepreview/examples/RabbitMQQueuesPut.json @@ -8,7 +8,7 @@ "properties": { "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode": "values", + "resourceProvisioning": "manual", "queue": "rabbitmq0", "secrets": { "connectionString": "connection://string" @@ -27,7 +27,7 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode": "values", + "resourceProvisioning": "manual", "queue": "rabbitmq0", "secrets": { "connectionString": "connection://string" @@ -45,7 +45,7 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode": "values", + "resourceProvisioning": "manual", "queue": "rabbitmq0", "secrets": { "connectionString": "connection://string" From 78fb924ce3aa6b3fdc96489bec93a8ae4090ca13 Mon Sep 17 00:00:00 2001 From: sk593 Date: Tue, 13 Jun 2023 10:30:46 -0700 Subject: [PATCH 06/16] update comments --- pkg/linkrp/processors/extenders/processor.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/linkrp/processors/extenders/processor.go b/pkg/linkrp/processors/extenders/processor.go index 58048c542b..eab5d6a7ae 100644 --- a/pkg/linkrp/processors/extenders/processor.go +++ b/pkg/linkrp/processors/extenders/processor.go @@ -9,11 +9,11 @@ import ( "github.com/project-radius/radius/pkg/recipes" ) -// Processor is a processor for RedisCache resources. +// Processor is a processor for Extender resources. type Processor struct { } -// Process implements the processors.Processor interface for RedisCache resources. +// Process implements the processors.Processor interface for Extender resources. func (p *Processor) Process(ctx context.Context, resource *datamodel.Extender, options processors.Options) error { validator := processors.NewValidator(&resource.ComputedValues, &resource.SecretValues, &resource.Properties.Status.OutputResources) From 7a67b7c7171e7671955fc0f32de4792b1844b2a5 Mon Sep 17 00:00:00 2001 From: sk593 Date: Tue, 13 Jun 2023 14:18:56 -0700 Subject: [PATCH 07/16] add s3 recipes --- .../corerp-resources-extender-recipe.bicep | 33 +++++++++++++++++++ .../test-recipes/extender-awss3-recipe.bicep | 18 ++++++++++ 2 files changed, 51 insertions(+) create mode 100644 test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep create mode 100644 test/functional/corerp/resources/testdata/recipes/test-recipes/extender-awss3-recipe.bicep diff --git a/test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep b/test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep new file mode 100644 index 0000000000..7cf34147b5 --- /dev/null +++ b/test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep @@ -0,0 +1,33 @@ +import radius as rad + +param application string +param environment string + +resource s3Extender 'Applications.Link/extenders@2022-03-15-privatepreview' = { + name: 's3' + properties: { + environment: environment + application: application + recipe: { + name: 's3' + } + } +} + +resource container 'Applications.Core/containers@2022-03-15-privatepreview' = { + name: 'mycontainer' + properties: { + application: application + container: { + image: '*****' + env: { + BUCKETNAME: s3Extender.properties.bucketName + } + } + connections: { + s3: { + source: s3Extender.id + } + } + } +} diff --git a/test/functional/corerp/resources/testdata/recipes/test-recipes/extender-awss3-recipe.bicep b/test/functional/corerp/resources/testdata/recipes/test-recipes/extender-awss3-recipe.bicep new file mode 100644 index 0000000000..a96edf297b --- /dev/null +++ b/test/functional/corerp/resources/testdata/recipes/test-recipes/extender-awss3-recipe.bicep @@ -0,0 +1,18 @@ +import aws as aws + +param context object + +param bucketName string = 'bucket${context.resource.id}' + +resource s3 'AWS.S3/Bucket@default' = { + alias: bucketName + properties: { + BucketName: bucketName + } +} + +output result object = { + values: { + bucketName: s3.properties.BucketName + } +} From 666f0d18c1a715b5c678aeac35eaaac62b3a9bae Mon Sep 17 00:00:00 2001 From: sk593 Date: Tue, 13 Jun 2023 23:04:11 -0700 Subject: [PATCH 08/16] nit --- pkg/linkrp/datamodel/extender.go | 8 ++++++++ .../extenders/v20220315privatepreview_test.go | 16 ---------------- .../examples/DaprStateStoresGet.json | 4 ++-- .../testdata/corerp-resources-extender.bicep | 2 +- 4 files changed, 11 insertions(+), 19 deletions(-) diff --git a/pkg/linkrp/datamodel/extender.go b/pkg/linkrp/datamodel/extender.go index 30c9bf4d0a..8d2c593eed 100644 --- a/pkg/linkrp/datamodel/extender.go +++ b/pkg/linkrp/datamodel/extender.go @@ -53,6 +53,14 @@ func (extender *Extender) ResourceTypeName() string { return linkrp.ExtendersResourceType } +// Recipe returns the recipe for the Extender resource +func (extender *Extender) Recipe() *linkrp.LinkRecipe { + if extender.Properties.ResourceProvisioning == linkrp.ResourceProvisioningManual { + return nil + } + return &extender.Properties.Recipe +} + // ExtenderProperties represents the properties of Extender resource. type ExtenderProperties struct { rpv1.BasicResourceProperties diff --git a/pkg/linkrp/frontend/controller/extenders/v20220315privatepreview_test.go b/pkg/linkrp/frontend/controller/extenders/v20220315privatepreview_test.go index 4c77c21444..f6567a8034 100644 --- a/pkg/linkrp/frontend/controller/extenders/v20220315privatepreview_test.go +++ b/pkg/linkrp/frontend/controller/extenders/v20220315privatepreview_test.go @@ -41,19 +41,3 @@ func getTestModels20220315privatepreview() (input *v20220315privatepreview.Exten return input, dataModel, output } - -func getTestModelsForGetAndListApis20220315privatepreview() (input *v20220315privatepreview.ExtenderResource, dataModel *datamodel.Extender, output *v20220315privatepreview.ExtenderResponseResource) { - rawInput := testutil.ReadFixture("20220315privatepreview_input.json") - input = &v20220315privatepreview.ExtenderResource{} - _ = json.Unmarshal(rawInput, input) - - rawDataModel := testutil.ReadFixture("20220315privatepreview_datamodel.json") - dataModel = &datamodel.Extender{} - _ = json.Unmarshal(rawDataModel, dataModel) - - rawExpectedOutput := testutil.ReadFixture("20220315privatepreviewgetandlist_output.json") - output = &v20220315privatepreview.ExtenderResponseResource{} - _ = json.Unmarshal(rawExpectedOutput, output) - - return input, dataModel, output -} diff --git a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprStateStoresGet.json b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprStateStoresGet.json index 1af8817bc6..3450b5fb4b 100644 --- a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprStateStoresGet.json +++ b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprStateStoresGet.json @@ -16,8 +16,8 @@ "provisioningState": "Succeeded", "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "mode": "resource", - "resource": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.Sql/servers/testServer/databases/testDatabase" + "resourceProvisioning": "manual", + "resources": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.Sql/servers/testServer/databases/testDatabase" } } } diff --git a/test/functional/corerp/resources/testdata/corerp-resources-extender.bicep b/test/functional/corerp/resources/testdata/corerp-resources-extender.bicep index a76500747f..b93e847847 100644 --- a/test/functional/corerp/resources/testdata/corerp-resources-extender.bicep +++ b/test/functional/corerp/resources/testdata/corerp-resources-extender.bicep @@ -21,6 +21,7 @@ resource twilio 'Applications.Link/extenders@2022-03-15-privatepreview' = { accountSid: 'sid' authToken: 'token' } + resourceProvisioning: 'manual' } } @@ -38,6 +39,5 @@ resource container 'Applications.Core/containers@2022-03-15-privatepreview' = { } } connections: {} - resourceProvisioning: 'manual' } } From 8b20935eeb27ca795dae62faf3a0ae1a885adba2 Mon Sep 17 00:00:00 2001 From: sk593 Date: Wed, 14 Jun 2023 09:14:16 -0700 Subject: [PATCH 09/16] merging --- .../applications.link/2022-03-15-privatepreview/types.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hack/bicep-types-radius/generated/applications/applications.link/2022-03-15-privatepreview/types.json b/hack/bicep-types-radius/generated/applications/applications.link/2022-03-15-privatepreview/types.json index 0b9f8100bf..cc17f3a0e4 100644 --- a/hack/bicep-types-radius/generated/applications/applications.link/2022-03-15-privatepreview/types.json +++ b/hack/bicep-types-radius/generated/applications/applications.link/2022-03-15-privatepreview/types.json @@ -1 +1 @@ -[{"1":{"Kind":1}},{"1":{"Kind":2}},{"1":{"Kind":3}},{"1":{"Kind":4}},{"1":{"Kind":5}},{"1":{"Kind":6}},{"1":{"Kind":7}},{"1":{"Kind":8}},{"6":{"Value":"Applications.Link/daprInvokeHttpRoutes"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprInvokeHttpRoutes","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":8,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":9,"Flags":10,"Description":"The resource api version"},"properties":{"Type":11,"Flags":0,"Description":"DaprInvokeHttpRoute link properties"},"tags":{"Type":23,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprInvokeHttpRouteProperties","Properties":{"provisioningState":{"Type":19,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"appId":{"Type":4,"Flags":1,"Description":"The Dapr appId used for the route"},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[12,13,14,15,16,17,18]}},{"2":{"Name":"Recipe","Properties":{"name":{"Type":4,"Flags":1,"Description":"The name of the recipe within the environment to use"},"parameters":{"Type":0,"Flags":0,"Description":"Any object"}}}},{"2":{"Name":"ResourceStatus","Properties":{"outputResources":{"Type":22,"Flags":0,"Description":"Properties of an output resource"}}}},{"3":{"ItemType":0}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"2":{"Name":"SystemData","Properties":{"createdBy":{"Type":4,"Flags":0,"Description":"The identity that created the resource."},"createdByType":{"Type":29,"Flags":0,"Description":"The type of identity that created the resource."},"createdAt":{"Type":4,"Flags":0,"Description":"The timestamp of resource creation (UTC)."},"lastModifiedBy":{"Type":4,"Flags":0,"Description":"The identity that last modified the resource."},"lastModifiedByType":{"Type":34,"Flags":0,"Description":"The type of identity that created the resource."},"lastModifiedAt":{"Type":4,"Flags":0,"Description":"The timestamp of resource last modification (UTC)"}}}},{"6":{"Value":"User"}},{"6":{"Value":"Application"}},{"6":{"Value":"ManagedIdentity"}},{"6":{"Value":"Key"}},{"5":{"Elements":[25,26,27,28]}},{"6":{"Value":"User"}},{"6":{"Value":"Application"}},{"6":{"Value":"ManagedIdentity"}},{"6":{"Value":"Key"}},{"5":{"Elements":[30,31,32,33]}},{"4":{"Name":"Applications.Link/daprInvokeHttpRoutes@2022-03-15-privatepreview","ScopeType":0,"Body":10}},{"6":{"Value":"Applications.Link/daprPubSubBrokers"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprPubSubBrokers","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":36,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":37,"Flags":10,"Description":"The resource api version"},"properties":{"Type":39,"Flags":0,"Description":"DaprPubSubBroker link properties"},"tags":{"Type":53,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprPubSubBrokerProperties","Properties":{"provisioningState":{"Type":47,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"resourceProvisioning":{"Type":50,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"metadata":{"Type":0,"Flags":0,"Description":"Any object"},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":52,"Flags":0,"Description":"A collection of references to resources associated with the daprPubSubBroker"},"type":{"Type":4,"Flags":0,"Description":"DaprPubSubBroker type. These strings match the format used by Dapr Kubernetes configuration format."},"version":{"Type":4,"Flags":0,"Description":"Dapr component version"},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[40,41,42,43,44,45,46]}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[48,49]}},{"2":{"Name":"ResourceReference","Properties":{"id":{"Type":4,"Flags":1,"Description":"Resource id of an existing resource"}}}},{"3":{"ItemType":51}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/daprPubSubBrokers@2022-03-15-privatepreview","ScopeType":0,"Body":38}},{"6":{"Value":"Applications.Link/daprSecretStores"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprSecretStores","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":55,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":56,"Flags":10,"Description":"The resource api version"},"properties":{"Type":58,"Flags":0,"Description":"DaprSecretStore link properties"},"tags":{"Type":70,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprSecretStoreProperties","Properties":{"provisioningState":{"Type":66,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"type":{"Type":4,"Flags":0,"Description":"Dapr Secret Store type. These strings match the types defined in Dapr Component format: https://docs.dapr.io/reference/components-reference/supported-secret-stores/"},"version":{"Type":4,"Flags":0,"Description":"Dapr component version"},"metadata":{"Type":0,"Flags":0,"Description":"Any object"},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resourceProvisioning":{"Type":69,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[59,60,61,62,63,64,65]}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[67,68]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/daprSecretStores@2022-03-15-privatepreview","ScopeType":0,"Body":57}},{"6":{"Value":"Applications.Link/daprStateStores"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprStateStores","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":72,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":73,"Flags":10,"Description":"The resource api version"},"properties":{"Type":75,"Flags":0,"Description":"DaprStateStore link properties"},"tags":{"Type":88,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprStateStoreProperties","Properties":{"provisioningState":{"Type":83,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"resourceProvisioning":{"Type":86,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"metadata":{"Type":0,"Flags":0,"Description":"Any object"},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":87,"Flags":0,"Description":"A collection of references to resources associated with the state store"},"type":{"Type":4,"Flags":0,"Description":"Dapr StateStore type. These strings match the format used by Dapr Kubernetes configuration format."},"version":{"Type":4,"Flags":0,"Description":"Dapr component version"},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[76,77,78,79,80,81,82]}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[84,85]}},{"3":{"ItemType":51}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/daprStateStores@2022-03-15-privatepreview","ScopeType":0,"Body":74}},{"6":{"Value":"Applications.Link/mongoDatabases"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/mongoDatabases","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":90,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":91,"Flags":10,"Description":"The resource api version"},"properties":{"Type":93,"Flags":0,"Description":"MongoDatabase link properties"},"tags":{"Type":107,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"MongoDatabaseProperties","Properties":{"provisioningState":{"Type":101,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"secrets":{"Type":102,"Flags":0,"Description":"The secret values for the given MongoDatabase resource"},"host":{"Type":4,"Flags":0,"Description":"Host name of the target Mongo database"},"port":{"Type":3,"Flags":0,"Description":"Port value of the target Mongo database"},"database":{"Type":4,"Flags":2,"Description":"Database name of the target Mongo database"},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":103,"Flags":0,"Description":"List of the resource IDs that support the MongoDB resource"},"resourceProvisioning":{"Type":106,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"username":{"Type":4,"Flags":0,"Description":"Username to use when connecting to the target Mongo database"},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[94,95,96,97,98,99,100]}},{"2":{"Name":"MongoDatabaseSecrets","Properties":{"password":{"Type":4,"Flags":0,"Description":"Password to use when connecting to the target Mongo database"},"connectionString":{"Type":4,"Flags":0,"Description":"Connection string used to connect to the target Mongo database"}}}},{"3":{"ItemType":51}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[104,105]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/mongoDatabases@2022-03-15-privatepreview","ScopeType":0,"Body":92}},{"6":{"Value":"Applications.Link/rabbitMQMessageQueues"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/rabbitMQMessageQueues","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":109,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":110,"Flags":10,"Description":"The resource api version"},"properties":{"Type":112,"Flags":0,"Description":"RabbitMQMessageQueue link properties"},"tags":{"Type":125,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"RabbitMQMessageQueueProperties","Properties":{"provisioningState":{"Type":120,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"secrets":{"Type":121,"Flags":0,"Description":"The secret values for the given RabbitMQMessageQueue resource"},"queue":{"Type":4,"Flags":0,"Description":"The name of the queue"},"resourceProvisioning":{"Type":124,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[113,114,115,116,117,118,119]}},{"2":{"Name":"RabbitMQSecrets","Properties":{"connectionString":{"Type":4,"Flags":0,"Description":"The connection string used to connect to this RabbitMQ instance"}}}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[122,123]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/rabbitMQMessageQueues@2022-03-15-privatepreview","ScopeType":0,"Body":111}},{"6":{"Value":"Applications.Link/redisCaches"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/redisCaches","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":127,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":128,"Flags":10,"Description":"The resource api version"},"properties":{"Type":130,"Flags":0,"Description":"RedisCache link properties"},"tags":{"Type":144,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"RedisCacheProperties","Properties":{"provisioningState":{"Type":138,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"secrets":{"Type":139,"Flags":0,"Description":"The secret values for the given RedisCache resource"},"host":{"Type":4,"Flags":0,"Description":"The host name of the target Redis cache"},"port":{"Type":3,"Flags":0,"Description":"The port value of the target Redis cache"},"username":{"Type":4,"Flags":2,"Description":"The username for Redis cache"},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":140,"Flags":0,"Description":"List of the resource IDs that support the Redis resource"},"resourceProvisioning":{"Type":143,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[131,132,133,134,135,136,137]}},{"2":{"Name":"RedisCacheSecrets","Properties":{"connectionString":{"Type":4,"Flags":0,"Description":"The connection string used to connect to the Redis cache"},"password":{"Type":4,"Flags":0,"Description":"The password for this Redis cache instance"}}}},{"3":{"ItemType":51}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[141,142]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/redisCaches@2022-03-15-privatepreview","ScopeType":0,"Body":129}},{"6":{"Value":"Applications.Link/sqlDatabases"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/sqlDatabases","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":146,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":147,"Flags":10,"Description":"The resource api version"},"properties":{"Type":149,"Flags":0,"Description":"SqlDatabase properties"},"tags":{"Type":162,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"SqlDatabaseProperties","Properties":{"provisioningState":{"Type":157,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"database":{"Type":4,"Flags":0,"Description":"The name of the Sql database."},"server":{"Type":4,"Flags":0,"Description":"The fully qualified domain name of the Sql database."},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":158,"Flags":0,"Description":"List of the resource IDs that support the SqlDatabase resource"},"resourceProvisioning":{"Type":161,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[150,151,152,153,154,155,156]}},{"3":{"ItemType":51}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[159,160]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/sqlDatabases@2022-03-15-privatepreview","ScopeType":0,"Body":148}},{"6":{"Value":"Applications.Link/extenders"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/extenders","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":164,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":165,"Flags":10,"Description":"The resource api version"},"properties":{"Type":167,"Flags":1,"Description":"Extender link properties"},"tags":{"Type":180,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"ExtenderProperties","Properties":{"secrets":{"Type":168,"Flags":4,"Description":"The secret values for the given Extender resource"},"resourceProvisioning":{"Type":171,"Flags":4,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"recipe":{"Type":20,"Flags":4,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"provisioningState":{"Type":179,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}},"AdditionalProperties":0}},{"2":{"Name":"ExtenderSecrets","Properties":{},"AdditionalProperties":0}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[169,170]}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[172,173,174,175,176,177,178]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/extenders@2022-03-15-privatepreview","ScopeType":0,"Body":166}},{"2":{"Name":"MongoDatabaseListSecretsResult","Properties":{"password":{"Type":4,"Flags":2,"Description":"Password to use when connecting to the target Mongo database"},"connectionString":{"Type":4,"Flags":2,"Description":"Connection string used to connect to the target Mongo database"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/mongoDatabases","ApiVersion":"2022-03-15-privatepreview","Output":182}},{"2":{"Name":"RabbitMQListSecretsResult","Properties":{"connectionString":{"Type":4,"Flags":2,"Description":"The connection string used to connect to this RabbitMQ instance"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/rabbitMQMessageQueues","ApiVersion":"2022-03-15-privatepreview","Output":184}},{"2":{"Name":"RedisCacheListSecretsResult","Properties":{"connectionString":{"Type":4,"Flags":2,"Description":"The connection string used to connect to the Redis cache"},"password":{"Type":4,"Flags":2,"Description":"The password for this Redis cache instance"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/redisCaches","ApiVersion":"2022-03-15-privatepreview","Output":186}},{"2":{"Name":"ExtenderSecrets","Properties":{},"AdditionalProperties":0}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/extenders","ApiVersion":"2022-03-15-privatepreview","Output":188}}] +[{"1":{"Kind":1}},{"1":{"Kind":2}},{"1":{"Kind":3}},{"1":{"Kind":4}},{"1":{"Kind":5}},{"1":{"Kind":6}},{"1":{"Kind":7}},{"1":{"Kind":8}},{"6":{"Value":"Applications.Link/daprInvokeHttpRoutes"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprInvokeHttpRoutes","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":8,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":9,"Flags":10,"Description":"The resource api version"},"properties":{"Type":11,"Flags":0,"Description":"DaprInvokeHttpRoute link properties"},"tags":{"Type":23,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprInvokeHttpRouteProperties","Properties":{"provisioningState":{"Type":19,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"appId":{"Type":4,"Flags":1,"Description":"The Dapr appId used for the route"},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[12,13,14,15,16,17,18]}},{"2":{"Name":"Recipe","Properties":{"name":{"Type":4,"Flags":1,"Description":"The name of the recipe within the environment to use"},"parameters":{"Type":0,"Flags":0,"Description":"Any object"}}}},{"2":{"Name":"ResourceStatus","Properties":{"outputResources":{"Type":22,"Flags":0,"Description":"Properties of an output resource"}}}},{"3":{"ItemType":0}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"2":{"Name":"SystemData","Properties":{"createdBy":{"Type":4,"Flags":0,"Description":"The identity that created the resource."},"createdByType":{"Type":29,"Flags":0,"Description":"The type of identity that created the resource."},"createdAt":{"Type":4,"Flags":0,"Description":"The timestamp of resource creation (UTC)."},"lastModifiedBy":{"Type":4,"Flags":0,"Description":"The identity that last modified the resource."},"lastModifiedByType":{"Type":34,"Flags":0,"Description":"The type of identity that created the resource."},"lastModifiedAt":{"Type":4,"Flags":0,"Description":"The timestamp of resource last modification (UTC)"}}}},{"6":{"Value":"User"}},{"6":{"Value":"Application"}},{"6":{"Value":"ManagedIdentity"}},{"6":{"Value":"Key"}},{"5":{"Elements":[25,26,27,28]}},{"6":{"Value":"User"}},{"6":{"Value":"Application"}},{"6":{"Value":"ManagedIdentity"}},{"6":{"Value":"Key"}},{"5":{"Elements":[30,31,32,33]}},{"4":{"Name":"Applications.Link/daprInvokeHttpRoutes@2022-03-15-privatepreview","ScopeType":0,"Body":10}},{"6":{"Value":"Applications.Link/daprPubSubBrokers"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprPubSubBrokers","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":36,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":37,"Flags":10,"Description":"The resource api version"},"properties":{"Type":39,"Flags":0,"Description":"DaprPubSubBroker link properties"},"tags":{"Type":53,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprPubSubBrokerProperties","Properties":{"provisioningState":{"Type":47,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"resourceProvisioning":{"Type":50,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"metadata":{"Type":0,"Flags":0,"Description":"Any object"},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":52,"Flags":0,"Description":"A collection of references to resources associated with the daprPubSubBroker"},"type":{"Type":4,"Flags":0,"Description":"DaprPubSubBroker type. These strings match the format used by Dapr Kubernetes configuration format."},"version":{"Type":4,"Flags":0,"Description":"Dapr component version"},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[40,41,42,43,44,45,46]}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[48,49]}},{"2":{"Name":"ResourceReference","Properties":{"id":{"Type":4,"Flags":1,"Description":"Resource id of an existing resource"}}}},{"3":{"ItemType":51}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/daprPubSubBrokers@2022-03-15-privatepreview","ScopeType":0,"Body":38}},{"6":{"Value":"Applications.Link/daprSecretStores"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprSecretStores","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":55,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":56,"Flags":10,"Description":"The resource api version"},"properties":{"Type":58,"Flags":0,"Description":"DaprSecretStore link properties"},"tags":{"Type":70,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprSecretStoreProperties","Properties":{"provisioningState":{"Type":66,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"type":{"Type":4,"Flags":0,"Description":"Dapr Secret Store type. These strings match the types defined in Dapr Component format: https://docs.dapr.io/reference/components-reference/supported-secret-stores/"},"version":{"Type":4,"Flags":0,"Description":"Dapr component version"},"metadata":{"Type":0,"Flags":0,"Description":"Any object"},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resourceProvisioning":{"Type":69,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[59,60,61,62,63,64,65]}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[67,68]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/daprSecretStores@2022-03-15-privatepreview","ScopeType":0,"Body":57}},{"6":{"Value":"Applications.Link/daprStateStores"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprStateStores","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":72,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":73,"Flags":10,"Description":"The resource api version"},"properties":{"Type":75,"Flags":0,"Description":"DaprStateStore link properties"},"tags":{"Type":88,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprStateStoreProperties","Properties":{"provisioningState":{"Type":83,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"resourceProvisioning":{"Type":86,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"metadata":{"Type":0,"Flags":0,"Description":"Any object"},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":87,"Flags":0,"Description":"A collection of references to resources associated with the state store"},"type":{"Type":4,"Flags":0,"Description":"Dapr StateStore type. These strings match the format used by Dapr Kubernetes configuration format."},"version":{"Type":4,"Flags":0,"Description":"Dapr component version"},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[76,77,78,79,80,81,82]}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[84,85]}},{"3":{"ItemType":51}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/daprStateStores@2022-03-15-privatepreview","ScopeType":0,"Body":74}},{"6":{"Value":"Applications.Link/mongoDatabases"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/mongoDatabases","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":90,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":91,"Flags":10,"Description":"The resource api version"},"properties":{"Type":93,"Flags":0,"Description":"MongoDatabase link properties"},"tags":{"Type":107,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"MongoDatabaseProperties","Properties":{"provisioningState":{"Type":101,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"secrets":{"Type":102,"Flags":0,"Description":"The secret values for the given MongoDatabase resource"},"host":{"Type":4,"Flags":0,"Description":"Host name of the target Mongo database"},"port":{"Type":3,"Flags":0,"Description":"Port value of the target Mongo database"},"database":{"Type":4,"Flags":0,"Description":"Database name of the target Mongo database"},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":103,"Flags":0,"Description":"List of the resource IDs that support the MongoDB resource"},"resourceProvisioning":{"Type":106,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"username":{"Type":4,"Flags":0,"Description":"Username to use when connecting to the target Mongo database"},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[94,95,96,97,98,99,100]}},{"2":{"Name":"MongoDatabaseSecrets","Properties":{"password":{"Type":4,"Flags":0,"Description":"Password to use when connecting to the target Mongo database"},"connectionString":{"Type":4,"Flags":0,"Description":"Connection string used to connect to the target Mongo database"}}}},{"3":{"ItemType":51}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[104,105]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/mongoDatabases@2022-03-15-privatepreview","ScopeType":0,"Body":92}},{"6":{"Value":"Applications.Link/rabbitMQMessageQueues"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/rabbitMQMessageQueues","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":109,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":110,"Flags":10,"Description":"The resource api version"},"properties":{"Type":112,"Flags":0,"Description":"RabbitMQMessageQueue link properties"},"tags":{"Type":125,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"RabbitMQMessageQueueProperties","Properties":{"provisioningState":{"Type":120,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"secrets":{"Type":121,"Flags":0,"Description":"The secret values for the given RabbitMQMessageQueue resource"},"queue":{"Type":4,"Flags":0,"Description":"The name of the queue"},"resourceProvisioning":{"Type":124,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[113,114,115,116,117,118,119]}},{"2":{"Name":"RabbitMQSecrets","Properties":{"connectionString":{"Type":4,"Flags":0,"Description":"The connection string used to connect to this RabbitMQ instance"}}}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[122,123]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/rabbitMQMessageQueues@2022-03-15-privatepreview","ScopeType":0,"Body":111}},{"6":{"Value":"Applications.Link/redisCaches"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/redisCaches","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":127,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":128,"Flags":10,"Description":"The resource api version"},"properties":{"Type":130,"Flags":0,"Description":"RedisCache link properties"},"tags":{"Type":144,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"RedisCacheProperties","Properties":{"provisioningState":{"Type":138,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"secrets":{"Type":139,"Flags":0,"Description":"The secret values for the given RedisCache resource"},"host":{"Type":4,"Flags":0,"Description":"The host name of the target Redis cache"},"port":{"Type":3,"Flags":0,"Description":"The port value of the target Redis cache"},"username":{"Type":4,"Flags":0,"Description":"The username for Redis cache"},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":140,"Flags":0,"Description":"List of the resource IDs that support the Redis resource"},"resourceProvisioning":{"Type":143,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[131,132,133,134,135,136,137]}},{"2":{"Name":"RedisCacheSecrets","Properties":{"connectionString":{"Type":4,"Flags":0,"Description":"The connection string used to connect to the Redis cache"},"password":{"Type":4,"Flags":0,"Description":"The password for this Redis cache instance"}}}},{"3":{"ItemType":51}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[141,142]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/redisCaches@2022-03-15-privatepreview","ScopeType":0,"Body":129}},{"6":{"Value":"Applications.Link/sqlDatabases"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/sqlDatabases","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":146,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":147,"Flags":10,"Description":"The resource api version"},"properties":{"Type":149,"Flags":0,"Description":"SqlDatabase properties"},"tags":{"Type":162,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"SqlDatabaseProperties","Properties":{"provisioningState":{"Type":157,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"database":{"Type":4,"Flags":0,"Description":"The name of the Sql database."},"server":{"Type":4,"Flags":0,"Description":"The fully qualified domain name of the Sql database."},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":158,"Flags":0,"Description":"List of the resource IDs that support the SqlDatabase resource"},"resourceProvisioning":{"Type":161,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[150,151,152,153,154,155,156]}},{"3":{"ItemType":51}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[159,160]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/sqlDatabases@2022-03-15-privatepreview","ScopeType":0,"Body":148}},{"6":{"Value":"Applications.Link/extenders"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/extenders","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":164,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":165,"Flags":10,"Description":"The resource api version"},"properties":{"Type":167,"Flags":1,"Description":"Extender link properties"},"tags":{"Type":180,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"ExtenderProperties","Properties":{"secrets":{"Type":168,"Flags":4,"Description":"The secret values for the given Extender resource"},"resourceProvisioning":{"Type":171,"Flags":4,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"recipe":{"Type":20,"Flags":4,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"provisioningState":{"Type":179,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}},"AdditionalProperties":0}},{"2":{"Name":"ExtenderSecrets","Properties":{},"AdditionalProperties":0}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[169,170]}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[172,173,174,175,176,177,178]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/extenders@2022-03-15-privatepreview","ScopeType":0,"Body":166}},{"2":{"Name":"MongoDatabaseListSecretsResult","Properties":{"password":{"Type":4,"Flags":2,"Description":"Password to use when connecting to the target Mongo database"},"connectionString":{"Type":4,"Flags":2,"Description":"Connection string used to connect to the target Mongo database"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/mongoDatabases","ApiVersion":"2022-03-15-privatepreview","Output":182}},{"2":{"Name":"RabbitMQListSecretsResult","Properties":{"connectionString":{"Type":4,"Flags":2,"Description":"The connection string used to connect to this RabbitMQ instance"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/rabbitMQMessageQueues","ApiVersion":"2022-03-15-privatepreview","Output":184}},{"2":{"Name":"RedisCacheListSecretsResult","Properties":{"connectionString":{"Type":4,"Flags":2,"Description":"The connection string used to connect to the Redis cache"},"password":{"Type":4,"Flags":2,"Description":"The password for this Redis cache instance"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/redisCaches","ApiVersion":"2022-03-15-privatepreview","Output":186}},{"2":{"Name":"ExtenderSecrets","Properties":{},"AdditionalProperties":0}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/extenders","ApiVersion":"2022-03-15-privatepreview","Output":188}}] \ No newline at end of file From 0bddcfa8554434f3d3f9f09d327e2fa6271fca4c Mon Sep 17 00:00:00 2001 From: sk593 Date: Wed, 14 Jun 2023 09:18:04 -0700 Subject: [PATCH 10/16] nit --- .../resources/testdata/corerp-resources-extender-recipe.bicep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep b/test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep index 7cf34147b5..8dc42f5a44 100644 --- a/test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep +++ b/test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep @@ -19,7 +19,7 @@ resource container 'Applications.Core/containers@2022-03-15-privatepreview' = { properties: { application: application container: { - image: '*****' + image: 'radius.azurecr.io/tutorial/webapp:edge' env: { BUCKETNAME: s3Extender.properties.bucketName } From 428f39f4bd8becc044e857196148bc4e4d57a574 Mon Sep 17 00:00:00 2001 From: sk593 Date: Wed, 14 Jun 2023 15:36:45 -0700 Subject: [PATCH 11/16] updating func tests --- pkg/linkrp/processors/extenders/processor.go | 2 +- .../corerp/resources/extender_test.go | 31 ++++++++ .../corerp-resources-extender-recipe.bicep | 59 +++++++++------ .../test-recipes/extender-awss3-recipe.bicep | 18 ----- .../test-recipes/extender-recipe.bicep | 74 +++++++++++++++++++ 5 files changed, 143 insertions(+), 41 deletions(-) delete mode 100644 test/functional/corerp/resources/testdata/recipes/test-recipes/extender-awss3-recipe.bicep create mode 100644 test/functional/corerp/resources/testdata/recipes/test-recipes/extender-recipe.bicep diff --git a/pkg/linkrp/processors/extenders/processor.go b/pkg/linkrp/processors/extenders/processor.go index eab5d6a7ae..48c07bf5f1 100644 --- a/pkg/linkrp/processors/extenders/processor.go +++ b/pkg/linkrp/processors/extenders/processor.go @@ -25,7 +25,7 @@ func (p *Processor) Process(ctx context.Context, resource *datamodel.Extender, o secretValues := createOutputValues(resource.Properties.Secrets, options.RecipeOutput, true) for k, val := range secretValues { if secret, ok := val.(string); !ok { - return &processors.ValidationError{fmt.Sprintf("secret '%s' must be of type string", k)} + return &processors.ValidationError{Message: fmt.Sprintf("secret '%s' must be of type string", k)} } else { validator.AddOptionalSecretField(k, &secret) } diff --git a/test/functional/corerp/resources/extender_test.go b/test/functional/corerp/resources/extender_test.go index 0ad4c91c1b..cfadd4d721 100644 --- a/test/functional/corerp/resources/extender_test.go +++ b/test/functional/corerp/resources/extender_test.go @@ -62,3 +62,34 @@ func Test_Extender(t *testing.T) { test.Test(t) } + +func Test_Extender_Recipe(t *testing.T) { + template := "testdata/corerp-resources-extender-recipe.bicep" + name := "corerp-resources-extender-recipe" + + test := corerp.NewCoreRPTest(t, name, []corerp.TestStep{ + { + Executor: step.NewDeployExecutor(template, functional.GetRecipeRegistry(), functional.GetRecipeVersion()), + CoreRPResources: &validation.CoreRPResourceSet{ + Resources: []validation.CoreRPResource{ + { + Name: "corerp-resources-extender-recipe-env", + Type: validation.EnvironmentsResource, + }, + { + Name: name, + Type: validation.ApplicationsResource, + }, + { + Name: "extender-recipe", + Type: validation.ExtendersResource, + App: name, + }, + }, + }, + SkipObjectValidation: true, + }, + }) + + test.Test(t) +} diff --git a/test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep b/test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep index 8dc42f5a44..419f1617c9 100644 --- a/test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep +++ b/test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep @@ -1,33 +1,48 @@ -import radius as rad +import radius as radius -param application string -param environment string +param registry string -resource s3Extender 'Applications.Link/extenders@2022-03-15-privatepreview' = { - name: 's3' +param version string + +resource env 'Applications.Core/environments@2022-03-15-privatepreview' = { + name: 'corerp-resources-extender-recipe-env' + location: 'global' properties: { - environment: environment - application: application - recipe: { - name: 's3' + compute: { + kind: 'kubernetes' + resourceId: 'self' + namespace: 'corerp-resources-extender-recipe-env' + } + recipes: { + 'Applications.Link/extenders':{ + default: { + templateKind: 'bicep' + templatePath: '${registry}/test/functional/corerp/recipes/extender-recipe:${version}' + } + } } } } -resource container 'Applications.Core/containers@2022-03-15-privatepreview' = { - name: 'mycontainer' +resource app 'Applications.Core/applications@2022-03-15-privatepreview' = { + name: 'corerp-resources-extender-recipe' + location: 'global' properties: { - application: application - container: { - image: 'radius.azurecr.io/tutorial/webapp:edge' - env: { - BUCKETNAME: s3Extender.properties.bucketName - } - } - connections: { - s3: { - source: s3Extender.id + environment: env.id + extensions: [ + { + kind: 'kubernetesNamespace' + namespace: 'corerp-resources-extender-recipe-app' } - } + ] + } +} + +resource extender 'Applications.Link/extenders@2022-03-15-privatepreview' = { + name: 'extender-recipe' + location: 'global' + properties: { + environment: env.id + application: app.id } } diff --git a/test/functional/corerp/resources/testdata/recipes/test-recipes/extender-awss3-recipe.bicep b/test/functional/corerp/resources/testdata/recipes/test-recipes/extender-awss3-recipe.bicep deleted file mode 100644 index a96edf297b..0000000000 --- a/test/functional/corerp/resources/testdata/recipes/test-recipes/extender-awss3-recipe.bicep +++ /dev/null @@ -1,18 +0,0 @@ -import aws as aws - -param context object - -param bucketName string = 'bucket${context.resource.id}' - -resource s3 'AWS.S3/Bucket@default' = { - alias: bucketName - properties: { - BucketName: bucketName - } -} - -output result object = { - values: { - bucketName: s3.properties.BucketName - } -} diff --git a/test/functional/corerp/resources/testdata/recipes/test-recipes/extender-recipe.bicep b/test/functional/corerp/resources/testdata/recipes/test-recipes/extender-recipe.bicep new file mode 100644 index 0000000000..25a24282fb --- /dev/null +++ b/test/functional/corerp/resources/testdata/recipes/test-recipes/extender-recipe.bicep @@ -0,0 +1,74 @@ +import kubernetes as kubernetes { + kubeConfig: '' + namespace: context.runtime.kubernetes.namespace +} + +param context object + +resource extender 'apps/Deployment@v1' = { + metadata: { + name: 'extender-${uniqueString(context.resource.id)}' + } + spec: { + selector: { + matchLabels: { + app: 'extender' + resource: context.resource.name + } + } + template: { + metadata: { + labels: { + app: 'extender' + resource: context.resource.name + } + } + spec: { + containers: [ + { + name: 'extender' + image: 'radiusdev.azurecr.io/magpiego:latest' + ports: [ + { + containerPort: 6379 + } + ] + } + ] + } + } + } +} + +resource svc 'core/Service@v1' = { + metadata: { + name: 'extender-${uniqueString(context.resource.id)}' + } + spec: { + type: 'ClusterIP' + selector: { + app: 'extender' + resource: context.resource.name + } + ports: [ + { + port: 6379 + } + ] + } +} + +output result object = { + // This workaround is needed because the deployment engine omits Kubernetes resources from its output. + // + // Once this gap is addressed, users won't need to do this. + resources: [ + '/planes/kubernetes/local/namespaces/${svc.metadata.namespace}/providers/core/Service/${svc.metadata.name}' + '/planes/kubernetes/local/namespaces/${extender.metadata.namespace}/providers/apps/Deployment/${extender.metadata.name}' + ] + values: { + host: '${svc.metadata.name}.${svc.metadata.namespace}.svc.cluster.local' + port: 6379 + } +} + From e30dd046bf64c1489673f18328002e46f9ac03fc Mon Sep 17 00:00:00 2001 From: sk593 Date: Mon, 19 Jun 2023 10:41:26 -0700 Subject: [PATCH 12/16] addressing comments --- .../extender_conversion_test.go | 16 ++--- ...nderresource.json => extender_manual.json} | 0 ...e2.json => extender_manual_nosecrets.json} | 0 ...ource_recipe.json => extender_recipe.json} | 0 ...del.json => extenderdatamodel_manual.json} | 0 ...> extenderdatamodel_manual_nosecrets.json} | 0 ...ipe.json => extenderdatamodel_recipe.json} | 0 .../converter/extender_converter_test.go | 2 +- pkg/linkrp/processors/extenders/processor.go | 12 ++-- .../processors/extenders/processor_test.go | 65 +++++++++++++++++-- pkg/linkrp/processors/validator.go | 11 +--- .../examples/DaprStateStoresList.json | 8 +-- .../examples/ExtendersPutWithRecipe.json | 4 +- .../corerp/resources/extender_test.go | 2 +- .../corerp-resources-extender-recipe.bicep | 4 +- .../testdata/corerp-resources-extender.bicep | 1 - .../test-recipes/extender-recipe.bicep | 3 +- 17 files changed, 89 insertions(+), 39 deletions(-) rename pkg/linkrp/api/v20220315privatepreview/testdata/{extenderresource.json => extender_manual.json} (100%) rename pkg/linkrp/api/v20220315privatepreview/testdata/{extenderresource2.json => extender_manual_nosecrets.json} (100%) rename pkg/linkrp/api/v20220315privatepreview/testdata/{extenderresource_recipe.json => extender_recipe.json} (100%) rename pkg/linkrp/api/v20220315privatepreview/testdata/{extenderresourcedatamodel.json => extenderdatamodel_manual.json} (100%) rename pkg/linkrp/api/v20220315privatepreview/testdata/{extenderresourcedatamodel2.json => extenderdatamodel_manual_nosecrets.json} (100%) rename pkg/linkrp/api/v20220315privatepreview/testdata/{extenderresourcedatamodel_recipe.json => extenderdatamodel_recipe.json} (100%) diff --git a/pkg/linkrp/api/v20220315privatepreview/extender_conversion_test.go b/pkg/linkrp/api/v20220315privatepreview/extender_conversion_test.go index 1c3b5911ef..f47387820c 100644 --- a/pkg/linkrp/api/v20220315privatepreview/extender_conversion_test.go +++ b/pkg/linkrp/api/v20220315privatepreview/extender_conversion_test.go @@ -30,13 +30,13 @@ import ( func TestExtender_ConvertVersionedToDataModel(t *testing.T) { testset := []struct { - file string desc string + file string expected *datamodel.Extender }{ { - file: "extenderresource.json", desc: "extender resource provisioning manual", + file: "extender_manual.json", expected: &datamodel.Extender{ BaseResource: v1.BaseResource{ TrackedResource: v1.TrackedResource{ @@ -64,8 +64,8 @@ func TestExtender_ConvertVersionedToDataModel(t *testing.T) { }, }, { - file: "extenderresource2.json", desc: "extender resource provisioning manual (no secrets)", + file: "extender_manual_nosecrets.json", expected: &datamodel.Extender{ BaseResource: v1.BaseResource{ TrackedResource: v1.TrackedResource{ @@ -92,8 +92,8 @@ func TestExtender_ConvertVersionedToDataModel(t *testing.T) { }, }, { - file: "extenderresource_recipe.json", desc: "extender resource recipe", + file: "extender_recipe.json", expected: &datamodel.Extender{ BaseResource: v1.BaseResource{ TrackedResource: v1.TrackedResource{ @@ -142,13 +142,13 @@ func TestExtender_ConvertVersionedToDataModel(t *testing.T) { func TestExtender_ConvertDataModelToVersioned(t *testing.T) { testset := []struct { - file string desc string + file string expected *ExtenderResource }{ { desc: "extender resource provisioning manual datamodel", - file: "extenderresourcedatamodel.json", + file: "extenderdatamodel_manual.json", expected: &ExtenderResource{ Location: to.Ptr(""), Properties: &ExtenderProperties{ @@ -178,7 +178,7 @@ func TestExtender_ConvertDataModelToVersioned(t *testing.T) { }, { desc: "extender resource provisioning manual datamodel (no secrets)", - file: "extenderresourcedatamodel2.json", + file: "extenderdatamodel_manual_nosecrets.json", expected: &ExtenderResource{ Location: to.Ptr(""), Properties: &ExtenderProperties{ @@ -200,7 +200,7 @@ func TestExtender_ConvertDataModelToVersioned(t *testing.T) { }, { desc: "extender resource recipe datamodel", - file: "extenderresourcedatamodel_recipe.json", + file: "extenderdatamodel_recipe.json", expected: &ExtenderResource{ Location: to.Ptr(""), Properties: &ExtenderProperties{ diff --git a/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresource.json b/pkg/linkrp/api/v20220315privatepreview/testdata/extender_manual.json similarity index 100% rename from pkg/linkrp/api/v20220315privatepreview/testdata/extenderresource.json rename to pkg/linkrp/api/v20220315privatepreview/testdata/extender_manual.json diff --git a/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresource2.json b/pkg/linkrp/api/v20220315privatepreview/testdata/extender_manual_nosecrets.json similarity index 100% rename from pkg/linkrp/api/v20220315privatepreview/testdata/extenderresource2.json rename to pkg/linkrp/api/v20220315privatepreview/testdata/extender_manual_nosecrets.json diff --git a/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresource_recipe.json b/pkg/linkrp/api/v20220315privatepreview/testdata/extender_recipe.json similarity index 100% rename from pkg/linkrp/api/v20220315privatepreview/testdata/extenderresource_recipe.json rename to pkg/linkrp/api/v20220315privatepreview/testdata/extender_recipe.json diff --git a/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresourcedatamodel.json b/pkg/linkrp/api/v20220315privatepreview/testdata/extenderdatamodel_manual.json similarity index 100% rename from pkg/linkrp/api/v20220315privatepreview/testdata/extenderresourcedatamodel.json rename to pkg/linkrp/api/v20220315privatepreview/testdata/extenderdatamodel_manual.json diff --git a/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresourcedatamodel2.json b/pkg/linkrp/api/v20220315privatepreview/testdata/extenderdatamodel_manual_nosecrets.json similarity index 100% rename from pkg/linkrp/api/v20220315privatepreview/testdata/extenderresourcedatamodel2.json rename to pkg/linkrp/api/v20220315privatepreview/testdata/extenderdatamodel_manual_nosecrets.json diff --git a/pkg/linkrp/api/v20220315privatepreview/testdata/extenderresourcedatamodel_recipe.json b/pkg/linkrp/api/v20220315privatepreview/testdata/extenderdatamodel_recipe.json similarity index 100% rename from pkg/linkrp/api/v20220315privatepreview/testdata/extenderresourcedatamodel_recipe.json rename to pkg/linkrp/api/v20220315privatepreview/testdata/extenderdatamodel_recipe.json diff --git a/pkg/linkrp/datamodel/converter/extender_converter_test.go b/pkg/linkrp/datamodel/converter/extender_converter_test.go index bc00c28861..743f1c134c 100644 --- a/pkg/linkrp/datamodel/converter/extender_converter_test.go +++ b/pkg/linkrp/datamodel/converter/extender_converter_test.go @@ -72,7 +72,7 @@ func TestExtenderDataModelFromVersioned(t *testing.T) { err error }{ { - "../../api/v20220315privatepreview/testdata/extenderresource.json", + "../../api/v20220315privatepreview/testdata/extender_manual.json", "2022-03-15-privatepreview", nil, }, diff --git a/pkg/linkrp/processors/extenders/processor.go b/pkg/linkrp/processors/extenders/processor.go index 48c07bf5f1..ddc8ac5a6c 100644 --- a/pkg/linkrp/processors/extenders/processor.go +++ b/pkg/linkrp/processors/extenders/processor.go @@ -17,17 +17,19 @@ type Processor struct { func (p *Processor) Process(ctx context.Context, resource *datamodel.Extender, options processors.Options) error { validator := processors.NewValidator(&resource.ComputedValues, &resource.SecretValues, &resource.Properties.Status.OutputResources) - computedValues := createOutputValues(resource.Properties.AdditionalProperties, options.RecipeOutput, false) + computedValues := mergeOutputValues(resource.Properties.AdditionalProperties, options.RecipeOutput, false) for k, val := range computedValues { - validator.AddOptionalComputedField(k, val) + value := val + validator.AddOptionalAnyField(k, value) } - secretValues := createOutputValues(resource.Properties.Secrets, options.RecipeOutput, true) + secretValues := mergeOutputValues(resource.Properties.Secrets, options.RecipeOutput, true) for k, val := range secretValues { if secret, ok := val.(string); !ok { return &processors.ValidationError{Message: fmt.Sprintf("secret '%s' must be of type string", k)} } else { - validator.AddOptionalSecretField(k, &secret) + value := secret + validator.AddOptionalSecretField(k, &value) } } @@ -44,7 +46,7 @@ func (p *Processor) Process(ctx context.Context, resource *datamodel.Extender, o return nil } -func createOutputValues(properties map[string]any, recipeOutput *recipes.RecipeOutput, secret bool) map[string]any { +func mergeOutputValues(properties map[string]any, recipeOutput *recipes.RecipeOutput, secret bool) map[string]any { values := make(map[string]any) for k, val := range properties { values[k] = val diff --git a/pkg/linkrp/processors/extenders/processor_test.go b/pkg/linkrp/processors/extenders/processor_test.go index 9dc7f724f7..24946d6b28 100644 --- a/pkg/linkrp/processors/extenders/processor_test.go +++ b/pkg/linkrp/processors/extenders/processor_test.go @@ -27,14 +27,14 @@ import ( "github.com/stretchr/testify/require" ) +const ( + extenderResourceID1 = "/planes/aws/aws/accounts/123341234/regions/us-west-2/providers/AWS.S3/Bucket/myBucket" + extenderResourceID2 = "/planes/aws/aws/accounts/123341234/regions/us-west-2/providers/AWS.S3/Bucket/myBucket2" + password = "testpassword" +) + func Test_Process(t *testing.T) { processor := Processor{} - - const extenderResourceID1 = "/planes/aws/aws/accounts/123341234/regions/us-west-2/providers/AWS.S3/Bucket/myBucket" - const extenderResourceID2 = "/planes/aws/aws/accounts/123341234/regions/us-west-2/providers/AWS.S3/Bucket/myBucket2" - - const password = "testpassword" - t.Run("success - recipe", func(t *testing.T) { resource := &datamodel.Extender{} options := processors.Options{ @@ -44,9 +44,11 @@ func Test_Process(t *testing.T) { }, Values: map[string]any{ "bucketName": "myBucket", + "region": "westus", }, Secrets: map[string]any{ "databaseSecret": password, + "adminSecret": password, }, }, } @@ -55,15 +57,21 @@ func Test_Process(t *testing.T) { require.NoError(t, err) require.Equal(t, "myBucket", resource.Properties.AdditionalProperties["bucketName"]) + require.Equal(t, "westus", resource.Properties.AdditionalProperties["region"]) require.Equal(t, password, resource.Properties.Secrets["databaseSecret"]) + require.Equal(t, password, resource.Properties.Secrets["adminSecret"]) expectedValues := map[string]any{ "bucketName": "myBucket", + "region": "westus", } expectedSecrets := map[string]rpv1.SecretValueReference{ "databaseSecret": { Value: password, }, + "adminSecret": { + Value: password, + }, } expectedOutputResources, err := processors.GetOutputResourcesFromRecipe(options.RecipeOutput) @@ -173,3 +181,48 @@ func Test_Process(t *testing.T) { }) } + +func Test_MergeOutputValues(t *testing.T) { + resource := &datamodel.Extender{ + Properties: datamodel.ExtenderProperties{ + AdditionalProperties: map[string]any{"bucketName": "myBucket"}, + Secrets: map[string]any{ + "databaseSecret1": password, + }, + }, + } + propertiesMap := mergeOutputValues(resource.Properties.AdditionalProperties, nil, false) + require.Equal(t, resource.Properties.AdditionalProperties, propertiesMap) + secretsMap := mergeOutputValues(resource.Properties.Secrets, nil, true) + require.Equal(t, resource.Properties.Secrets, secretsMap) + + options := processors.Options{ + RecipeOutput: &recipes.RecipeOutput{ + Resources: []string{ + extenderResourceID1, + }, + Values: map[string]any{ + "region": "westus", + }, + Secrets: map[string]any{ + "databaseSecret2": password, + "adminSecret": password, + }, + }, + } + + expectedAdditionalProperties := map[string]any{ + "bucketName": "myBucket", + "region": "westus", + } + expectedSecrets := map[string]any{ + "databaseSecret1": password, + "databaseSecret2": password, + "adminSecret": password, + } + + propertiesMap = mergeOutputValues(resource.Properties.AdditionalProperties, options.RecipeOutput, false) + require.Equal(t, expectedAdditionalProperties, propertiesMap) + secretsMap = mergeOutputValues(resource.Properties.Secrets, options.RecipeOutput, true) + require.Equal(t, expectedSecrets, secretsMap) +} diff --git a/pkg/linkrp/processors/validator.go b/pkg/linkrp/processors/validator.go index 8f15c0aece..2a85ffa25c 100644 --- a/pkg/linkrp/processors/validator.go +++ b/pkg/linkrp/processors/validator.go @@ -106,15 +106,8 @@ func (v *Validator) AddOptionalSecretField(name string, ref *string) { v.fields = append(v.fields, bind(v, name, ref, false, true, "string", convertToString, nil)) } -// AddOptionalComputedField registers a field containing a computed property value. The empty property will be treated as an "unset" value. -// -// The compute function will be called if the value is not already set or provided by the recipe. Inside the compute function -// it is safe to assume that other non-computed fields have been populated already. -// -// The compute function will not be called if a validation error has previously occurred. -func (v *Validator) AddOptionalComputedField(name string, ref any) { - // Note: secrets are always strings - // v.computedFields = append(v.computedFields, bind(v, name, ref, false, false, "string", convertToString, nil)) +// AddOptionalAnyField registers a field containing any property value. The empty property will be treated as an "unset" value. +func (v *Validator) AddOptionalAnyField(name string, ref any) { v.recordValue(name, ref, false) } diff --git a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprStateStoresList.json b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprStateStoresList.json index 487d2db839..04eb1b5885 100644 --- a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprStateStoresList.json +++ b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/DaprStateStoresList.json @@ -58,10 +58,10 @@ "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", "resourceProvisioning": "manual", "type": "state.zookeeper", - "version": "v1", - "metadata": { - "foo": "bar" - } + "version": "v1", + "metadata": { + "foo": "bar" + } } }, { diff --git a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/ExtendersPutWithRecipe.json b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/ExtendersPutWithRecipe.json index 018e9d6492..dd2e7caa16 100644 --- a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/ExtendersPutWithRecipe.json +++ b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/examples/ExtendersPutWithRecipe.json @@ -27,7 +27,7 @@ "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", "recipe": { "name": "s3" - } + } } } }, @@ -43,7 +43,7 @@ "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", "recipe": { "name": "s3" - } + } } } } diff --git a/test/functional/corerp/resources/extender_test.go b/test/functional/corerp/resources/extender_test.go index cfadd4d721..9dfd865e69 100644 --- a/test/functional/corerp/resources/extender_test.go +++ b/test/functional/corerp/resources/extender_test.go @@ -25,7 +25,7 @@ import ( "github.com/project-radius/radius/test/validation" ) -func Test_Extender(t *testing.T) { +func Test_Extender_Manual(t *testing.T) { template := "testdata/corerp-resources-extender.bicep" name := "corerp-resources-extender" appNamespace := "default-corerp-resources-extender" diff --git a/test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep b/test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep index 419f1617c9..12ce9f1f34 100644 --- a/test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep +++ b/test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep @@ -18,6 +18,9 @@ resource env 'Applications.Core/environments@2022-03-15-privatepreview' = { default: { templateKind: 'bicep' templatePath: '${registry}/test/functional/corerp/recipes/extender-recipe:${version}' + parameters: { + containerIamge: '${registry}/magpiego:${version}' + } } } } @@ -40,7 +43,6 @@ resource app 'Applications.Core/applications@2022-03-15-privatepreview' = { resource extender 'Applications.Link/extenders@2022-03-15-privatepreview' = { name: 'extender-recipe' - location: 'global' properties: { environment: env.id application: app.id diff --git a/test/functional/corerp/resources/testdata/corerp-resources-extender.bicep b/test/functional/corerp/resources/testdata/corerp-resources-extender.bicep index b93e847847..c3de618a5d 100644 --- a/test/functional/corerp/resources/testdata/corerp-resources-extender.bicep +++ b/test/functional/corerp/resources/testdata/corerp-resources-extender.bicep @@ -13,7 +13,6 @@ resource app 'Applications.Core/applications@2022-03-15-privatepreview' = { resource twilio 'Applications.Link/extenders@2022-03-15-privatepreview' = { name: 'extr-twilio' - location: 'global' properties: { environment: environment fromNumber: '222-222-2222' diff --git a/test/functional/corerp/resources/testdata/recipes/test-recipes/extender-recipe.bicep b/test/functional/corerp/resources/testdata/recipes/test-recipes/extender-recipe.bicep index 25a24282fb..9b957b4675 100644 --- a/test/functional/corerp/resources/testdata/recipes/test-recipes/extender-recipe.bicep +++ b/test/functional/corerp/resources/testdata/recipes/test-recipes/extender-recipe.bicep @@ -4,6 +4,7 @@ import kubernetes as kubernetes { } param context object +param containerImage string resource extender 'apps/Deployment@v1' = { metadata: { @@ -27,7 +28,7 @@ resource extender 'apps/Deployment@v1' = { containers: [ { name: 'extender' - image: 'radiusdev.azurecr.io/magpiego:latest' + image: containerImage ports: [ { containerPort: 6379 From 18ff7cf3ff3a116875c2db23987ecde54dc16cd3 Mon Sep 17 00:00:00 2001 From: sk593 Date: Mon, 19 Jun 2023 10:49:19 -0700 Subject: [PATCH 13/16] update generated files --- .../applications.link/2022-03-15-privatepreview/types.json | 2 +- hack/bicep-types-radius/generated/index.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hack/bicep-types-radius/generated/applications/applications.link/2022-03-15-privatepreview/types.json b/hack/bicep-types-radius/generated/applications/applications.link/2022-03-15-privatepreview/types.json index cc17f3a0e4..a0791505a3 100644 --- a/hack/bicep-types-radius/generated/applications/applications.link/2022-03-15-privatepreview/types.json +++ b/hack/bicep-types-radius/generated/applications/applications.link/2022-03-15-privatepreview/types.json @@ -1 +1 @@ -[{"1":{"Kind":1}},{"1":{"Kind":2}},{"1":{"Kind":3}},{"1":{"Kind":4}},{"1":{"Kind":5}},{"1":{"Kind":6}},{"1":{"Kind":7}},{"1":{"Kind":8}},{"6":{"Value":"Applications.Link/daprInvokeHttpRoutes"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprInvokeHttpRoutes","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":8,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":9,"Flags":10,"Description":"The resource api version"},"properties":{"Type":11,"Flags":0,"Description":"DaprInvokeHttpRoute link properties"},"tags":{"Type":23,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprInvokeHttpRouteProperties","Properties":{"provisioningState":{"Type":19,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"appId":{"Type":4,"Flags":1,"Description":"The Dapr appId used for the route"},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[12,13,14,15,16,17,18]}},{"2":{"Name":"Recipe","Properties":{"name":{"Type":4,"Flags":1,"Description":"The name of the recipe within the environment to use"},"parameters":{"Type":0,"Flags":0,"Description":"Any object"}}}},{"2":{"Name":"ResourceStatus","Properties":{"outputResources":{"Type":22,"Flags":0,"Description":"Properties of an output resource"}}}},{"3":{"ItemType":0}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"2":{"Name":"SystemData","Properties":{"createdBy":{"Type":4,"Flags":0,"Description":"The identity that created the resource."},"createdByType":{"Type":29,"Flags":0,"Description":"The type of identity that created the resource."},"createdAt":{"Type":4,"Flags":0,"Description":"The timestamp of resource creation (UTC)."},"lastModifiedBy":{"Type":4,"Flags":0,"Description":"The identity that last modified the resource."},"lastModifiedByType":{"Type":34,"Flags":0,"Description":"The type of identity that created the resource."},"lastModifiedAt":{"Type":4,"Flags":0,"Description":"The timestamp of resource last modification (UTC)"}}}},{"6":{"Value":"User"}},{"6":{"Value":"Application"}},{"6":{"Value":"ManagedIdentity"}},{"6":{"Value":"Key"}},{"5":{"Elements":[25,26,27,28]}},{"6":{"Value":"User"}},{"6":{"Value":"Application"}},{"6":{"Value":"ManagedIdentity"}},{"6":{"Value":"Key"}},{"5":{"Elements":[30,31,32,33]}},{"4":{"Name":"Applications.Link/daprInvokeHttpRoutes@2022-03-15-privatepreview","ScopeType":0,"Body":10}},{"6":{"Value":"Applications.Link/daprPubSubBrokers"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprPubSubBrokers","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":36,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":37,"Flags":10,"Description":"The resource api version"},"properties":{"Type":39,"Flags":0,"Description":"DaprPubSubBroker link properties"},"tags":{"Type":53,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprPubSubBrokerProperties","Properties":{"provisioningState":{"Type":47,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"resourceProvisioning":{"Type":50,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"metadata":{"Type":0,"Flags":0,"Description":"Any object"},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":52,"Flags":0,"Description":"A collection of references to resources associated with the daprPubSubBroker"},"type":{"Type":4,"Flags":0,"Description":"DaprPubSubBroker type. These strings match the format used by Dapr Kubernetes configuration format."},"version":{"Type":4,"Flags":0,"Description":"Dapr component version"},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[40,41,42,43,44,45,46]}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[48,49]}},{"2":{"Name":"ResourceReference","Properties":{"id":{"Type":4,"Flags":1,"Description":"Resource id of an existing resource"}}}},{"3":{"ItemType":51}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/daprPubSubBrokers@2022-03-15-privatepreview","ScopeType":0,"Body":38}},{"6":{"Value":"Applications.Link/daprSecretStores"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprSecretStores","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":55,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":56,"Flags":10,"Description":"The resource api version"},"properties":{"Type":58,"Flags":0,"Description":"DaprSecretStore link properties"},"tags":{"Type":70,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprSecretStoreProperties","Properties":{"provisioningState":{"Type":66,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"type":{"Type":4,"Flags":0,"Description":"Dapr Secret Store type. These strings match the types defined in Dapr Component format: https://docs.dapr.io/reference/components-reference/supported-secret-stores/"},"version":{"Type":4,"Flags":0,"Description":"Dapr component version"},"metadata":{"Type":0,"Flags":0,"Description":"Any object"},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resourceProvisioning":{"Type":69,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[59,60,61,62,63,64,65]}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[67,68]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/daprSecretStores@2022-03-15-privatepreview","ScopeType":0,"Body":57}},{"6":{"Value":"Applications.Link/daprStateStores"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprStateStores","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":72,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":73,"Flags":10,"Description":"The resource api version"},"properties":{"Type":75,"Flags":0,"Description":"DaprStateStore link properties"},"tags":{"Type":88,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprStateStoreProperties","Properties":{"provisioningState":{"Type":83,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"resourceProvisioning":{"Type":86,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"metadata":{"Type":0,"Flags":0,"Description":"Any object"},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":87,"Flags":0,"Description":"A collection of references to resources associated with the state store"},"type":{"Type":4,"Flags":0,"Description":"Dapr StateStore type. These strings match the format used by Dapr Kubernetes configuration format."},"version":{"Type":4,"Flags":0,"Description":"Dapr component version"},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[76,77,78,79,80,81,82]}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[84,85]}},{"3":{"ItemType":51}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/daprStateStores@2022-03-15-privatepreview","ScopeType":0,"Body":74}},{"6":{"Value":"Applications.Link/mongoDatabases"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/mongoDatabases","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":90,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":91,"Flags":10,"Description":"The resource api version"},"properties":{"Type":93,"Flags":0,"Description":"MongoDatabase link properties"},"tags":{"Type":107,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"MongoDatabaseProperties","Properties":{"provisioningState":{"Type":101,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"secrets":{"Type":102,"Flags":0,"Description":"The secret values for the given MongoDatabase resource"},"host":{"Type":4,"Flags":0,"Description":"Host name of the target Mongo database"},"port":{"Type":3,"Flags":0,"Description":"Port value of the target Mongo database"},"database":{"Type":4,"Flags":0,"Description":"Database name of the target Mongo database"},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":103,"Flags":0,"Description":"List of the resource IDs that support the MongoDB resource"},"resourceProvisioning":{"Type":106,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"username":{"Type":4,"Flags":0,"Description":"Username to use when connecting to the target Mongo database"},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[94,95,96,97,98,99,100]}},{"2":{"Name":"MongoDatabaseSecrets","Properties":{"password":{"Type":4,"Flags":0,"Description":"Password to use when connecting to the target Mongo database"},"connectionString":{"Type":4,"Flags":0,"Description":"Connection string used to connect to the target Mongo database"}}}},{"3":{"ItemType":51}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[104,105]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/mongoDatabases@2022-03-15-privatepreview","ScopeType":0,"Body":92}},{"6":{"Value":"Applications.Link/rabbitMQMessageQueues"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/rabbitMQMessageQueues","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":109,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":110,"Flags":10,"Description":"The resource api version"},"properties":{"Type":112,"Flags":0,"Description":"RabbitMQMessageQueue link properties"},"tags":{"Type":125,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"RabbitMQMessageQueueProperties","Properties":{"provisioningState":{"Type":120,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"secrets":{"Type":121,"Flags":0,"Description":"The secret values for the given RabbitMQMessageQueue resource"},"queue":{"Type":4,"Flags":0,"Description":"The name of the queue"},"resourceProvisioning":{"Type":124,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[113,114,115,116,117,118,119]}},{"2":{"Name":"RabbitMQSecrets","Properties":{"connectionString":{"Type":4,"Flags":0,"Description":"The connection string used to connect to this RabbitMQ instance"}}}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[122,123]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/rabbitMQMessageQueues@2022-03-15-privatepreview","ScopeType":0,"Body":111}},{"6":{"Value":"Applications.Link/redisCaches"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/redisCaches","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":127,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":128,"Flags":10,"Description":"The resource api version"},"properties":{"Type":130,"Flags":0,"Description":"RedisCache link properties"},"tags":{"Type":144,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"RedisCacheProperties","Properties":{"provisioningState":{"Type":138,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"secrets":{"Type":139,"Flags":0,"Description":"The secret values for the given RedisCache resource"},"host":{"Type":4,"Flags":0,"Description":"The host name of the target Redis cache"},"port":{"Type":3,"Flags":0,"Description":"The port value of the target Redis cache"},"username":{"Type":4,"Flags":0,"Description":"The username for Redis cache"},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":140,"Flags":0,"Description":"List of the resource IDs that support the Redis resource"},"resourceProvisioning":{"Type":143,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[131,132,133,134,135,136,137]}},{"2":{"Name":"RedisCacheSecrets","Properties":{"connectionString":{"Type":4,"Flags":0,"Description":"The connection string used to connect to the Redis cache"},"password":{"Type":4,"Flags":0,"Description":"The password for this Redis cache instance"}}}},{"3":{"ItemType":51}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[141,142]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/redisCaches@2022-03-15-privatepreview","ScopeType":0,"Body":129}},{"6":{"Value":"Applications.Link/sqlDatabases"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/sqlDatabases","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":146,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":147,"Flags":10,"Description":"The resource api version"},"properties":{"Type":149,"Flags":0,"Description":"SqlDatabase properties"},"tags":{"Type":162,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"SqlDatabaseProperties","Properties":{"provisioningState":{"Type":157,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"database":{"Type":4,"Flags":0,"Description":"The name of the Sql database."},"server":{"Type":4,"Flags":0,"Description":"The fully qualified domain name of the Sql database."},"recipe":{"Type":20,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":158,"Flags":0,"Description":"List of the resource IDs that support the SqlDatabase resource"},"resourceProvisioning":{"Type":161,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[150,151,152,153,154,155,156]}},{"3":{"ItemType":51}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[159,160]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/sqlDatabases@2022-03-15-privatepreview","ScopeType":0,"Body":148}},{"6":{"Value":"Applications.Link/extenders"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/extenders","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":164,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":165,"Flags":10,"Description":"The resource api version"},"properties":{"Type":167,"Flags":1,"Description":"Extender link properties"},"tags":{"Type":180,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":24,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"ExtenderProperties","Properties":{"secrets":{"Type":168,"Flags":4,"Description":"The secret values for the given Extender resource"},"resourceProvisioning":{"Type":171,"Flags":4,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"recipe":{"Type":20,"Flags":4,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"provisioningState":{"Type":179,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"status":{"Type":21,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}},"AdditionalProperties":0}},{"2":{"Name":"ExtenderSecrets","Properties":{},"AdditionalProperties":0}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[169,170]}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[172,173,174,175,176,177,178]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/extenders@2022-03-15-privatepreview","ScopeType":0,"Body":166}},{"2":{"Name":"MongoDatabaseListSecretsResult","Properties":{"password":{"Type":4,"Flags":2,"Description":"Password to use when connecting to the target Mongo database"},"connectionString":{"Type":4,"Flags":2,"Description":"Connection string used to connect to the target Mongo database"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/mongoDatabases","ApiVersion":"2022-03-15-privatepreview","Output":182}},{"2":{"Name":"RabbitMQListSecretsResult","Properties":{"connectionString":{"Type":4,"Flags":2,"Description":"The connection string used to connect to this RabbitMQ instance"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/rabbitMQMessageQueues","ApiVersion":"2022-03-15-privatepreview","Output":184}},{"2":{"Name":"RedisCacheListSecretsResult","Properties":{"connectionString":{"Type":4,"Flags":2,"Description":"The connection string used to connect to the Redis cache"},"password":{"Type":4,"Flags":2,"Description":"The password for this Redis cache instance"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/redisCaches","ApiVersion":"2022-03-15-privatepreview","Output":186}},{"2":{"Name":"ExtenderSecrets","Properties":{},"AdditionalProperties":0}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/extenders","ApiVersion":"2022-03-15-privatepreview","Output":188}}] \ No newline at end of file +[{"1":{"Kind":1}},{"1":{"Kind":2}},{"1":{"Kind":3}},{"1":{"Kind":4}},{"1":{"Kind":5}},{"1":{"Kind":6}},{"1":{"Kind":7}},{"1":{"Kind":8}},{"6":{"Value":"Applications.Link/daprPubSubBrokers"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprPubSubBrokers","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":8,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":9,"Flags":10,"Description":"The resource api version"},"properties":{"Type":11,"Flags":0,"Description":"DaprPubSubBroker link properties"},"tags":{"Type":28,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprPubSubBrokerProperties","Properties":{"provisioningState":{"Type":19,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"resourceProvisioning":{"Type":22,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"metadata":{"Type":0,"Flags":0,"Description":"Any object"},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":25,"Flags":0,"Description":"A collection of references to resources associated with the daprPubSubBroker"},"type":{"Type":4,"Flags":0,"Description":"DaprPubSubBroker type. These strings match the format used by Dapr Kubernetes configuration format."},"version":{"Type":4,"Flags":0,"Description":"Dapr component version"},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[12,13,14,15,16,17,18]}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[20,21]}},{"2":{"Name":"Recipe","Properties":{"name":{"Type":4,"Flags":1,"Description":"The name of the recipe within the environment to use"},"parameters":{"Type":0,"Flags":0,"Description":"Any object"}}}},{"2":{"Name":"ResourceReference","Properties":{"id":{"Type":4,"Flags":1,"Description":"Resource id of an existing resource"}}}},{"3":{"ItemType":24}},{"2":{"Name":"ResourceStatus","Properties":{"outputResources":{"Type":27,"Flags":0,"Description":"Properties of an output resource"}}}},{"3":{"ItemType":0}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"2":{"Name":"SystemData","Properties":{"createdBy":{"Type":4,"Flags":0,"Description":"The identity that created the resource."},"createdByType":{"Type":34,"Flags":0,"Description":"The type of identity that created the resource."},"createdAt":{"Type":4,"Flags":0,"Description":"The timestamp of resource creation (UTC)."},"lastModifiedBy":{"Type":4,"Flags":0,"Description":"The identity that last modified the resource."},"lastModifiedByType":{"Type":39,"Flags":0,"Description":"The type of identity that created the resource."},"lastModifiedAt":{"Type":4,"Flags":0,"Description":"The timestamp of resource last modification (UTC)"}}}},{"6":{"Value":"User"}},{"6":{"Value":"Application"}},{"6":{"Value":"ManagedIdentity"}},{"6":{"Value":"Key"}},{"5":{"Elements":[30,31,32,33]}},{"6":{"Value":"User"}},{"6":{"Value":"Application"}},{"6":{"Value":"ManagedIdentity"}},{"6":{"Value":"Key"}},{"5":{"Elements":[35,36,37,38]}},{"4":{"Name":"Applications.Link/daprPubSubBrokers@2022-03-15-privatepreview","ScopeType":0,"Body":10}},{"6":{"Value":"Applications.Link/daprSecretStores"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprSecretStores","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":41,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":42,"Flags":10,"Description":"The resource api version"},"properties":{"Type":44,"Flags":0,"Description":"DaprSecretStore link properties"},"tags":{"Type":56,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprSecretStoreProperties","Properties":{"provisioningState":{"Type":52,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"type":{"Type":4,"Flags":0,"Description":"Dapr Secret Store type. These strings match the types defined in Dapr Component format: https://docs.dapr.io/reference/components-reference/supported-secret-stores/"},"version":{"Type":4,"Flags":0,"Description":"Dapr component version"},"metadata":{"Type":0,"Flags":0,"Description":"Any object"},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resourceProvisioning":{"Type":55,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[45,46,47,48,49,50,51]}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[53,54]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/daprSecretStores@2022-03-15-privatepreview","ScopeType":0,"Body":43}},{"6":{"Value":"Applications.Link/daprStateStores"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprStateStores","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":58,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":59,"Flags":10,"Description":"The resource api version"},"properties":{"Type":61,"Flags":0,"Description":"DaprStateStore link properties"},"tags":{"Type":74,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprStateStoreProperties","Properties":{"provisioningState":{"Type":69,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"resourceProvisioning":{"Type":72,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"metadata":{"Type":0,"Flags":0,"Description":"Any object"},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":73,"Flags":0,"Description":"A collection of references to resources associated with the state store"},"type":{"Type":4,"Flags":0,"Description":"Dapr StateStore type. These strings match the format used by Dapr Kubernetes configuration format."},"version":{"Type":4,"Flags":0,"Description":"Dapr component version"},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[62,63,64,65,66,67,68]}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[70,71]}},{"3":{"ItemType":24}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/daprStateStores@2022-03-15-privatepreview","ScopeType":0,"Body":60}},{"6":{"Value":"Applications.Link/mongoDatabases"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/mongoDatabases","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":76,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":77,"Flags":10,"Description":"The resource api version"},"properties":{"Type":79,"Flags":0,"Description":"MongoDatabase link properties"},"tags":{"Type":93,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"MongoDatabaseProperties","Properties":{"provisioningState":{"Type":87,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"secrets":{"Type":88,"Flags":0,"Description":"The secret values for the given MongoDatabase resource"},"host":{"Type":4,"Flags":0,"Description":"Host name of the target Mongo database"},"port":{"Type":3,"Flags":0,"Description":"Port value of the target Mongo database"},"database":{"Type":4,"Flags":0,"Description":"Database name of the target Mongo database"},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":89,"Flags":0,"Description":"List of the resource IDs that support the MongoDB resource"},"resourceProvisioning":{"Type":92,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"username":{"Type":4,"Flags":0,"Description":"Username to use when connecting to the target Mongo database"},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[80,81,82,83,84,85,86]}},{"2":{"Name":"MongoDatabaseSecrets","Properties":{"password":{"Type":4,"Flags":0,"Description":"Password to use when connecting to the target Mongo database"},"connectionString":{"Type":4,"Flags":0,"Description":"Connection string used to connect to the target Mongo database"}}}},{"3":{"ItemType":24}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[90,91]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/mongoDatabases@2022-03-15-privatepreview","ScopeType":0,"Body":78}},{"6":{"Value":"Applications.Link/rabbitMQMessageQueues"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/rabbitMQMessageQueues","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":95,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":96,"Flags":10,"Description":"The resource api version"},"properties":{"Type":98,"Flags":0,"Description":"RabbitMQMessageQueue link properties"},"tags":{"Type":111,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"RabbitMQMessageQueueProperties","Properties":{"provisioningState":{"Type":106,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"secrets":{"Type":107,"Flags":0,"Description":"The secret values for the given RabbitMQMessageQueue resource"},"queue":{"Type":4,"Flags":0,"Description":"The name of the queue"},"resourceProvisioning":{"Type":110,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[99,100,101,102,103,104,105]}},{"2":{"Name":"RabbitMQSecrets","Properties":{"connectionString":{"Type":4,"Flags":0,"Description":"The connection string used to connect to this RabbitMQ instance"}}}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[108,109]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/rabbitMQMessageQueues@2022-03-15-privatepreview","ScopeType":0,"Body":97}},{"6":{"Value":"Applications.Link/redisCaches"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/redisCaches","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":113,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":114,"Flags":10,"Description":"The resource api version"},"properties":{"Type":116,"Flags":0,"Description":"RedisCache link properties"},"tags":{"Type":130,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"RedisCacheProperties","Properties":{"provisioningState":{"Type":124,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"secrets":{"Type":125,"Flags":0,"Description":"The secret values for the given RedisCache resource"},"host":{"Type":4,"Flags":0,"Description":"The host name of the target Redis cache"},"port":{"Type":3,"Flags":0,"Description":"The port value of the target Redis cache"},"username":{"Type":4,"Flags":0,"Description":"The username for Redis cache"},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":126,"Flags":0,"Description":"List of the resource IDs that support the Redis resource"},"resourceProvisioning":{"Type":129,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[117,118,119,120,121,122,123]}},{"2":{"Name":"RedisCacheSecrets","Properties":{"connectionString":{"Type":4,"Flags":0,"Description":"The connection string used to connect to the Redis cache"},"password":{"Type":4,"Flags":0,"Description":"The password for this Redis cache instance"}}}},{"3":{"ItemType":24}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[127,128]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/redisCaches@2022-03-15-privatepreview","ScopeType":0,"Body":115}},{"6":{"Value":"Applications.Link/sqlDatabases"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/sqlDatabases","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":132,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":133,"Flags":10,"Description":"The resource api version"},"properties":{"Type":135,"Flags":0,"Description":"SqlDatabase properties"},"tags":{"Type":149,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"SqlDatabaseProperties","Properties":{"provisioningState":{"Type":143,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"database":{"Type":4,"Flags":0,"Description":"The name of the Sql database."},"server":{"Type":4,"Flags":0,"Description":"The fully qualified domain name of the Sql database."},"port":{"Type":3,"Flags":0,"Description":"Port value of the target Sql database"},"username":{"Type":4,"Flags":0,"Description":"Username to use when connecting to the target Sql database"},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":144,"Flags":0,"Description":"List of the resource IDs that support the SqlDatabase resource"},"resourceProvisioning":{"Type":147,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"secrets":{"Type":148,"Flags":0,"Description":"The secret values for the given SqlDatabase resource"},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[136,137,138,139,140,141,142]}},{"3":{"ItemType":24}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[145,146]}},{"2":{"Name":"SqlDatabaseSecrets","Properties":{"password":{"Type":4,"Flags":0,"Description":"Password to use when connecting to the target Sql database"},"connectionString":{"Type":4,"Flags":0,"Description":"Connection string used to connect to the target Sql database"}}}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/sqlDatabases@2022-03-15-privatepreview","ScopeType":0,"Body":134}},{"6":{"Value":"Applications.Link/extenders"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/extenders","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":151,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":152,"Flags":10,"Description":"The resource api version"},"properties":{"Type":154,"Flags":1,"Description":"Extender link properties"},"tags":{"Type":167,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"ExtenderProperties","Properties":{"secrets":{"Type":155,"Flags":4,"Description":"The secret values for the given Extender resource"},"resourceProvisioning":{"Type":158,"Flags":4,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"recipe":{"Type":23,"Flags":4,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"provisioningState":{"Type":166,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}},"AdditionalProperties":0}},{"2":{"Name":"ExtenderSecrets","Properties":{},"AdditionalProperties":0}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[156,157]}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[159,160,161,162,163,164,165]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/extenders@2022-03-15-privatepreview","ScopeType":0,"Body":153}},{"2":{"Name":"MongoDatabaseListSecretsResult","Properties":{"password":{"Type":4,"Flags":2,"Description":"Password to use when connecting to the target Mongo database"},"connectionString":{"Type":4,"Flags":2,"Description":"Connection string used to connect to the target Mongo database"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/mongoDatabases","ApiVersion":"2022-03-15-privatepreview","Output":169}},{"2":{"Name":"RabbitMQListSecretsResult","Properties":{"connectionString":{"Type":4,"Flags":2,"Description":"The connection string used to connect to this RabbitMQ instance"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/rabbitMQMessageQueues","ApiVersion":"2022-03-15-privatepreview","Output":171}},{"2":{"Name":"RedisCacheListSecretsResult","Properties":{"connectionString":{"Type":4,"Flags":2,"Description":"The connection string used to connect to the Redis cache"},"password":{"Type":4,"Flags":2,"Description":"The password for this Redis cache instance"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/redisCaches","ApiVersion":"2022-03-15-privatepreview","Output":173}},{"2":{"Name":"SqlDatabaseListSecretsResult","Properties":{"password":{"Type":4,"Flags":2,"Description":"Password to use when connecting to the target Sql database"},"connectionString":{"Type":4,"Flags":2,"Description":"Connection string used to connect to the target Sql database"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/sqlDatabases","ApiVersion":"2022-03-15-privatepreview","Output":175}},{"2":{"Name":"ExtenderSecrets","Properties":{},"AdditionalProperties":0}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/extenders","ApiVersion":"2022-03-15-privatepreview","Output":177}}] \ No newline at end of file diff --git a/hack/bicep-types-radius/generated/index.json b/hack/bicep-types-radius/generated/index.json index c45baaede5..5741c6d76b 100644 --- a/hack/bicep-types-radius/generated/index.json +++ b/hack/bicep-types-radius/generated/index.json @@ -1 +1 @@ -{"Resources":{"Applications.Core/environments@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":51},"Applications.Core/applications@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":75},"Applications.Core/httpRoutes@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":89},"Applications.Core/gateways@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":110},"Applications.Core/containers@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":175},"Applications.Core/volumes@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":212},"Applications.Core/secretStores@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":235},"Applications.Core/extenders@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":250},"Applications.Dapr/daprPubSubBrokers@2022-03-15-privatepreview":{"RelativePath":"applications/applications.dapr/2022-03-15-privatepreview/types.json","Index":41},"Applications.Dapr/daprSecretStores@2022-03-15-privatepreview":{"RelativePath":"applications/applications.dapr/2022-03-15-privatepreview/types.json","Index":59},"Applications.Dapr/daprStateStores@2022-03-15-privatepreview":{"RelativePath":"applications/applications.dapr/2022-03-15-privatepreview/types.json","Index":79},"Applications.Datastores/mongoDatabases@2022-03-15-privatepreview":{"RelativePath":"applications/applications.datastores/2022-03-15-privatepreview/types.json","Index":42},"Applications.Datastores/redisCaches@2022-03-15-privatepreview":{"RelativePath":"applications/applications.datastores/2022-03-15-privatepreview/types.json","Index":63},"Applications.Datastores/sqlDatabases@2022-03-15-privatepreview":{"RelativePath":"applications/applications.datastores/2022-03-15-privatepreview/types.json","Index":83},"Applications.Link/daprInvokeHttpRoutes@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":35},"Applications.Link/daprPubSubBrokers@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":54},"Applications.Link/daprSecretStores@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":71},"Applications.Link/daprStateStores@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":89},"Applications.Link/mongoDatabases@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":108},"Applications.Link/rabbitMQMessageQueues@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":126},"Applications.Link/redisCaches@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":145},"Applications.Link/sqlDatabases@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":163},"Applications.Link/extenders@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":181},"Applications.Messaging/rabbitMQQueues@2022-03-15-privatepreview":{"RelativePath":"applications/applications.messaging/2022-03-15-privatepreview/types.json","Index":40}},"Functions":{"applications.core/secretstores":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":256}]},"applications.core/extenders":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":258}]},"applications.datastores/mongodatabases":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.datastores/2022-03-15-privatepreview/types.json","Index":85}]},"applications.datastores/rediscaches":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.datastores/2022-03-15-privatepreview/types.json","Index":87}]},"applications.link/mongodatabases":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":183}]},"applications.link/rabbitmqmessagequeues":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":185}]},"applications.link/rediscaches":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":187}]},"applications.link/extenders":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":189}]},"applications.messaging/rabbitmqqueues":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.messaging/2022-03-15-privatepreview/types.json","Index":42}]}}} +{"Resources":{"Applications.Core/environments@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":51},"Applications.Core/applications@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":75},"Applications.Core/httpRoutes@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":89},"Applications.Core/gateways@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":110},"Applications.Core/containers@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":175},"Applications.Core/volumes@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":212},"Applications.Core/secretStores@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":235},"Applications.Core/extenders@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":250},"Applications.Dapr/daprPubSubBrokers@2022-03-15-privatepreview":{"RelativePath":"applications/applications.dapr/2022-03-15-privatepreview/types.json","Index":41},"Applications.Dapr/daprSecretStores@2022-03-15-privatepreview":{"RelativePath":"applications/applications.dapr/2022-03-15-privatepreview/types.json","Index":59},"Applications.Dapr/daprStateStores@2022-03-15-privatepreview":{"RelativePath":"applications/applications.dapr/2022-03-15-privatepreview/types.json","Index":79},"Applications.Datastores/mongoDatabases@2022-03-15-privatepreview":{"RelativePath":"applications/applications.datastores/2022-03-15-privatepreview/types.json","Index":42},"Applications.Datastores/redisCaches@2022-03-15-privatepreview":{"RelativePath":"applications/applications.datastores/2022-03-15-privatepreview/types.json","Index":63},"Applications.Datastores/sqlDatabases@2022-03-15-privatepreview":{"RelativePath":"applications/applications.datastores/2022-03-15-privatepreview/types.json","Index":83},"Applications.Link/daprPubSubBrokers@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":40},"Applications.Link/daprSecretStores@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":57},"Applications.Link/daprStateStores@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":75},"Applications.Link/mongoDatabases@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":94},"Applications.Link/rabbitMQMessageQueues@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":112},"Applications.Link/redisCaches@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":131},"Applications.Link/sqlDatabases@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":150},"Applications.Link/extenders@2022-03-15-privatepreview":{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":168},"Applications.Messaging/rabbitMQQueues@2022-03-15-privatepreview":{"RelativePath":"applications/applications.messaging/2022-03-15-privatepreview/types.json","Index":40}},"Functions":{"applications.core/secretstores":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":256}]},"applications.core/extenders":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":258}]},"applications.datastores/mongodatabases":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.datastores/2022-03-15-privatepreview/types.json","Index":85}]},"applications.datastores/rediscaches":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.datastores/2022-03-15-privatepreview/types.json","Index":87}]},"applications.link/mongodatabases":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":170}]},"applications.link/rabbitmqmessagequeues":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":172}]},"applications.link/rediscaches":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":174}]},"applications.link/sqldatabases":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":176}]},"applications.link/extenders":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.link/2022-03-15-privatepreview/types.json","Index":178}]},"applications.messaging/rabbitmqqueues":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.messaging/2022-03-15-privatepreview/types.json","Index":42}]}}} \ No newline at end of file From 64937c6d22789ccb041f3ae1693b4aac95db36af Mon Sep 17 00:00:00 2001 From: sk593 Date: Mon, 19 Jun 2023 11:30:09 -0700 Subject: [PATCH 14/16] merge conflicts --- .../extender_conversion_test.go | 2 + .../20220315privatepreview_datamodel.json | 67 +++++++++++-------- .../corerp-resources-extender-recipe.bicep | 2 +- 3 files changed, 42 insertions(+), 29 deletions(-) diff --git a/pkg/linkrp/api/v20220315privatepreview/extender_conversion_test.go b/pkg/linkrp/api/v20220315privatepreview/extender_conversion_test.go index f47387820c..9613e6a834 100644 --- a/pkg/linkrp/api/v20220315privatepreview/extender_conversion_test.go +++ b/pkg/linkrp/api/v20220315privatepreview/extender_conversion_test.go @@ -60,6 +60,7 @@ func TestExtender_ConvertVersionedToDataModel(t *testing.T) { AdditionalProperties: map[string]any{"fromNumber": "222-222-2222"}, ResourceProvisioning: linkrp.ResourceProvisioningManual, Secrets: map[string]any{"accountSid": "sid", "authToken": "token"}, + Recipe: linkrp.LinkRecipe{Name: "default"}, }, }, }, @@ -88,6 +89,7 @@ func TestExtender_ConvertVersionedToDataModel(t *testing.T) { }, AdditionalProperties: map[string]any{"fromNumber": "222-222-2222"}, ResourceProvisioning: linkrp.ResourceProvisioningManual, + Recipe: linkrp.LinkRecipe{Name: "default"}, }, }, }, diff --git a/pkg/linkrp/frontend/controller/extenders/testdata/20220315privatepreview_datamodel.json b/pkg/linkrp/frontend/controller/extenders/testdata/20220315privatepreview_datamodel.json index e2b19f3336..61ee87a2eb 100644 --- a/pkg/linkrp/frontend/controller/extenders/testdata/20220315privatepreview_datamodel.json +++ b/pkg/linkrp/frontend/controller/extenders/testdata/20220315privatepreview_datamodel.json @@ -1,32 +1,43 @@ { - "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/applications.link/extenders/extender0", - "name": "extender0", - "type": "applications.link/extenders", - "location": "West US", - "systemData": { - "createdAt": "2022-03-22T18:54:52.6857175Z", - "createdBy": "fake@hotmail.com", - "createdByType": "User", - "lastModifiedAt": "2022-03-22T18:57:52.6857175Z", - "lastModifiedBy": "fake@hotmail.com", - "lastModifiedByType": "User" + "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/radius-test-rg/providers/applications.link/extenders/extender0", + "name": "extender0", + "type": "applications.link/extenders", + "location": "West US", + "systemData": { + "createdAt": "2022-03-22T18:54:52.6857175Z", + "createdBy": "fake@hotmail.com", + "createdByType": "User", + "lastModifiedAt": "2022-03-22T18:57:52.6857175Z", + "lastModifiedBy": "fake@hotmail.com", + "lastModifiedByType": "User" + }, + "properties": { + "provisioningState": "Succeeded", + "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", + "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", + "additionalProperties":{ + "fromNumber": "222-222-2222" }, - "properties": { - "provisioningState": "Succeeded", - "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication", - "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0", - "additionalProperties":{ - "fromNumber": "222-222-2222" - }, - "secrets": { - "accountSid": "sid", - "authToken:": "token" - }, - "resourceProvisioning": "manual" + "secrets": { + "accountSid": "sid", + "authToken:": "token" + } + }, + "computedValues": { + "fromNumber": "222-222-2222" + }, + "secretValues": { + "accountSid": { + "value": "sid" }, - "tenantId": "00000000-0000-0000-0000-000000000000", - "subscriptionId": "00000000-0000-0000-0000-000000000000", - "resourceGroup": "radius-test-rg", - "createdApiVersion": "2022-03-15-privatepreview", - "updatedApiVersion": "2022-03-15-privatepreview" + "authToken:": { + "value": "token" + } + }, + "resourceProvisioning": "manual", + "tenantId": "00000000-0000-0000-0000-000000000000", + "subscriptionId": "00000000-0000-0000-0000-000000000000", + "resourceGroup": "radius-test-rg", + "createdApiVersion": "2022-03-15-privatepreview", + "updatedApiVersion": "2022-03-15-privatepreview" } \ No newline at end of file diff --git a/test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep b/test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep index 12ce9f1f34..edfa84539e 100644 --- a/test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep +++ b/test/functional/corerp/resources/testdata/corerp-resources-extender-recipe.bicep @@ -19,7 +19,7 @@ resource env 'Applications.Core/environments@2022-03-15-privatepreview' = { templateKind: 'bicep' templatePath: '${registry}/test/functional/corerp/recipes/extender-recipe:${version}' parameters: { - containerIamge: '${registry}/magpiego:${version}' + containerImage: '${registry}/magpiego:${version}' } } } From ae8c7d1d88eb7e2edcafbaf7004aec32a83873d1 Mon Sep 17 00:00:00 2001 From: sk593 Date: Mon, 19 Jun 2023 12:11:52 -0700 Subject: [PATCH 15/16] nit --- pkg/linkrp/api/v20220315privatepreview/zz_generated_models.go | 2 +- .../preview/2022-03-15-privatepreview/extenders.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/linkrp/api/v20220315privatepreview/zz_generated_models.go b/pkg/linkrp/api/v20220315privatepreview/zz_generated_models.go index 8b7b9bcfc4..b7211c7bba 100644 --- a/pkg/linkrp/api/v20220315privatepreview/zz_generated_models.go +++ b/pkg/linkrp/api/v20220315privatepreview/zz_generated_models.go @@ -367,7 +367,7 @@ type ExtenderProperties struct { // Fully qualified resource ID for the application that the link is consumed by Application *string `json:"application,omitempty"` - // The recipe used to automatically deploy underlying infrastructure for the daprPubSubBroker link + // The recipe used to automatically deploy underlying infrastructure for the Extender link Recipe *Recipe `json:"recipe,omitempty"` // Specifies how the underlying service/resource is provisioned and managed. diff --git a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/extenders.json b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/extenders.json index fcc6cafce9..324c4e744e 100644 --- a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/extenders.json +++ b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/extenders.json @@ -365,7 +365,7 @@ }, "recipe": { "$ref": "openapi.json#/definitions/Recipe", - "description": "The recipe used to automatically deploy underlying infrastructure for the daprPubSubBroker link" + "description": "The recipe used to automatically deploy underlying infrastructure for the Extender link" } } } From 56402c2765e2593f971874e146f918ba8679452b Mon Sep 17 00:00:00 2001 From: sk593 Date: Mon, 19 Jun 2023 14:27:29 -0700 Subject: [PATCH 16/16] update schema --- .../2022-03-15-privatepreview/types.json | 2 +- .../2022-03-15-privatepreview/types.md | 6 +- .../zz_generated_extenders_client.go | 4 +- .../zz_generated_models.go | 44 +------- .../zz_generated_models_serde.go | 105 ------------------ .../zz_generated_response_types.go | 4 +- .../2022-03-15-privatepreview/extenders.json | 82 +++++++------- 7 files changed, 50 insertions(+), 197 deletions(-) diff --git a/hack/bicep-types-radius/generated/applications/applications.link/2022-03-15-privatepreview/types.json b/hack/bicep-types-radius/generated/applications/applications.link/2022-03-15-privatepreview/types.json index a0791505a3..9dbaadbdb3 100644 --- a/hack/bicep-types-radius/generated/applications/applications.link/2022-03-15-privatepreview/types.json +++ b/hack/bicep-types-radius/generated/applications/applications.link/2022-03-15-privatepreview/types.json @@ -1 +1 @@ -[{"1":{"Kind":1}},{"1":{"Kind":2}},{"1":{"Kind":3}},{"1":{"Kind":4}},{"1":{"Kind":5}},{"1":{"Kind":6}},{"1":{"Kind":7}},{"1":{"Kind":8}},{"6":{"Value":"Applications.Link/daprPubSubBrokers"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprPubSubBrokers","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":8,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":9,"Flags":10,"Description":"The resource api version"},"properties":{"Type":11,"Flags":0,"Description":"DaprPubSubBroker link properties"},"tags":{"Type":28,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprPubSubBrokerProperties","Properties":{"provisioningState":{"Type":19,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"resourceProvisioning":{"Type":22,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"metadata":{"Type":0,"Flags":0,"Description":"Any object"},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":25,"Flags":0,"Description":"A collection of references to resources associated with the daprPubSubBroker"},"type":{"Type":4,"Flags":0,"Description":"DaprPubSubBroker type. These strings match the format used by Dapr Kubernetes configuration format."},"version":{"Type":4,"Flags":0,"Description":"Dapr component version"},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[12,13,14,15,16,17,18]}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[20,21]}},{"2":{"Name":"Recipe","Properties":{"name":{"Type":4,"Flags":1,"Description":"The name of the recipe within the environment to use"},"parameters":{"Type":0,"Flags":0,"Description":"Any object"}}}},{"2":{"Name":"ResourceReference","Properties":{"id":{"Type":4,"Flags":1,"Description":"Resource id of an existing resource"}}}},{"3":{"ItemType":24}},{"2":{"Name":"ResourceStatus","Properties":{"outputResources":{"Type":27,"Flags":0,"Description":"Properties of an output resource"}}}},{"3":{"ItemType":0}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"2":{"Name":"SystemData","Properties":{"createdBy":{"Type":4,"Flags":0,"Description":"The identity that created the resource."},"createdByType":{"Type":34,"Flags":0,"Description":"The type of identity that created the resource."},"createdAt":{"Type":4,"Flags":0,"Description":"The timestamp of resource creation (UTC)."},"lastModifiedBy":{"Type":4,"Flags":0,"Description":"The identity that last modified the resource."},"lastModifiedByType":{"Type":39,"Flags":0,"Description":"The type of identity that created the resource."},"lastModifiedAt":{"Type":4,"Flags":0,"Description":"The timestamp of resource last modification (UTC)"}}}},{"6":{"Value":"User"}},{"6":{"Value":"Application"}},{"6":{"Value":"ManagedIdentity"}},{"6":{"Value":"Key"}},{"5":{"Elements":[30,31,32,33]}},{"6":{"Value":"User"}},{"6":{"Value":"Application"}},{"6":{"Value":"ManagedIdentity"}},{"6":{"Value":"Key"}},{"5":{"Elements":[35,36,37,38]}},{"4":{"Name":"Applications.Link/daprPubSubBrokers@2022-03-15-privatepreview","ScopeType":0,"Body":10}},{"6":{"Value":"Applications.Link/daprSecretStores"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprSecretStores","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":41,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":42,"Flags":10,"Description":"The resource api version"},"properties":{"Type":44,"Flags":0,"Description":"DaprSecretStore link properties"},"tags":{"Type":56,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprSecretStoreProperties","Properties":{"provisioningState":{"Type":52,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"type":{"Type":4,"Flags":0,"Description":"Dapr Secret Store type. These strings match the types defined in Dapr Component format: https://docs.dapr.io/reference/components-reference/supported-secret-stores/"},"version":{"Type":4,"Flags":0,"Description":"Dapr component version"},"metadata":{"Type":0,"Flags":0,"Description":"Any object"},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resourceProvisioning":{"Type":55,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[45,46,47,48,49,50,51]}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[53,54]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/daprSecretStores@2022-03-15-privatepreview","ScopeType":0,"Body":43}},{"6":{"Value":"Applications.Link/daprStateStores"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprStateStores","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":58,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":59,"Flags":10,"Description":"The resource api version"},"properties":{"Type":61,"Flags":0,"Description":"DaprStateStore link properties"},"tags":{"Type":74,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprStateStoreProperties","Properties":{"provisioningState":{"Type":69,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"resourceProvisioning":{"Type":72,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"metadata":{"Type":0,"Flags":0,"Description":"Any object"},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":73,"Flags":0,"Description":"A collection of references to resources associated with the state store"},"type":{"Type":4,"Flags":0,"Description":"Dapr StateStore type. These strings match the format used by Dapr Kubernetes configuration format."},"version":{"Type":4,"Flags":0,"Description":"Dapr component version"},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[62,63,64,65,66,67,68]}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[70,71]}},{"3":{"ItemType":24}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/daprStateStores@2022-03-15-privatepreview","ScopeType":0,"Body":60}},{"6":{"Value":"Applications.Link/mongoDatabases"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/mongoDatabases","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":76,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":77,"Flags":10,"Description":"The resource api version"},"properties":{"Type":79,"Flags":0,"Description":"MongoDatabase link properties"},"tags":{"Type":93,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"MongoDatabaseProperties","Properties":{"provisioningState":{"Type":87,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"secrets":{"Type":88,"Flags":0,"Description":"The secret values for the given MongoDatabase resource"},"host":{"Type":4,"Flags":0,"Description":"Host name of the target Mongo database"},"port":{"Type":3,"Flags":0,"Description":"Port value of the target Mongo database"},"database":{"Type":4,"Flags":0,"Description":"Database name of the target Mongo database"},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":89,"Flags":0,"Description":"List of the resource IDs that support the MongoDB resource"},"resourceProvisioning":{"Type":92,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"username":{"Type":4,"Flags":0,"Description":"Username to use when connecting to the target Mongo database"},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[80,81,82,83,84,85,86]}},{"2":{"Name":"MongoDatabaseSecrets","Properties":{"password":{"Type":4,"Flags":0,"Description":"Password to use when connecting to the target Mongo database"},"connectionString":{"Type":4,"Flags":0,"Description":"Connection string used to connect to the target Mongo database"}}}},{"3":{"ItemType":24}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[90,91]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/mongoDatabases@2022-03-15-privatepreview","ScopeType":0,"Body":78}},{"6":{"Value":"Applications.Link/rabbitMQMessageQueues"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/rabbitMQMessageQueues","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":95,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":96,"Flags":10,"Description":"The resource api version"},"properties":{"Type":98,"Flags":0,"Description":"RabbitMQMessageQueue link properties"},"tags":{"Type":111,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"RabbitMQMessageQueueProperties","Properties":{"provisioningState":{"Type":106,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"secrets":{"Type":107,"Flags":0,"Description":"The secret values for the given RabbitMQMessageQueue resource"},"queue":{"Type":4,"Flags":0,"Description":"The name of the queue"},"resourceProvisioning":{"Type":110,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[99,100,101,102,103,104,105]}},{"2":{"Name":"RabbitMQSecrets","Properties":{"connectionString":{"Type":4,"Flags":0,"Description":"The connection string used to connect to this RabbitMQ instance"}}}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[108,109]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/rabbitMQMessageQueues@2022-03-15-privatepreview","ScopeType":0,"Body":97}},{"6":{"Value":"Applications.Link/redisCaches"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/redisCaches","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":113,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":114,"Flags":10,"Description":"The resource api version"},"properties":{"Type":116,"Flags":0,"Description":"RedisCache link properties"},"tags":{"Type":130,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"RedisCacheProperties","Properties":{"provisioningState":{"Type":124,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"secrets":{"Type":125,"Flags":0,"Description":"The secret values for the given RedisCache resource"},"host":{"Type":4,"Flags":0,"Description":"The host name of the target Redis cache"},"port":{"Type":3,"Flags":0,"Description":"The port value of the target Redis cache"},"username":{"Type":4,"Flags":0,"Description":"The username for Redis cache"},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":126,"Flags":0,"Description":"List of the resource IDs that support the Redis resource"},"resourceProvisioning":{"Type":129,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[117,118,119,120,121,122,123]}},{"2":{"Name":"RedisCacheSecrets","Properties":{"connectionString":{"Type":4,"Flags":0,"Description":"The connection string used to connect to the Redis cache"},"password":{"Type":4,"Flags":0,"Description":"The password for this Redis cache instance"}}}},{"3":{"ItemType":24}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[127,128]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/redisCaches@2022-03-15-privatepreview","ScopeType":0,"Body":115}},{"6":{"Value":"Applications.Link/sqlDatabases"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/sqlDatabases","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":132,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":133,"Flags":10,"Description":"The resource api version"},"properties":{"Type":135,"Flags":0,"Description":"SqlDatabase properties"},"tags":{"Type":149,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"SqlDatabaseProperties","Properties":{"provisioningState":{"Type":143,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"database":{"Type":4,"Flags":0,"Description":"The name of the Sql database."},"server":{"Type":4,"Flags":0,"Description":"The fully qualified domain name of the Sql database."},"port":{"Type":3,"Flags":0,"Description":"Port value of the target Sql database"},"username":{"Type":4,"Flags":0,"Description":"Username to use when connecting to the target Sql database"},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":144,"Flags":0,"Description":"List of the resource IDs that support the SqlDatabase resource"},"resourceProvisioning":{"Type":147,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"secrets":{"Type":148,"Flags":0,"Description":"The secret values for the given SqlDatabase resource"},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[136,137,138,139,140,141,142]}},{"3":{"ItemType":24}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[145,146]}},{"2":{"Name":"SqlDatabaseSecrets","Properties":{"password":{"Type":4,"Flags":0,"Description":"Password to use when connecting to the target Sql database"},"connectionString":{"Type":4,"Flags":0,"Description":"Connection string used to connect to the target Sql database"}}}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/sqlDatabases@2022-03-15-privatepreview","ScopeType":0,"Body":134}},{"6":{"Value":"Applications.Link/extenders"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/extenders","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":151,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":152,"Flags":10,"Description":"The resource api version"},"properties":{"Type":154,"Flags":1,"Description":"Extender link properties"},"tags":{"Type":167,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"ExtenderProperties","Properties":{"secrets":{"Type":155,"Flags":4,"Description":"The secret values for the given Extender resource"},"resourceProvisioning":{"Type":158,"Flags":4,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"recipe":{"Type":23,"Flags":4,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"provisioningState":{"Type":166,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}},"AdditionalProperties":0}},{"2":{"Name":"ExtenderSecrets","Properties":{},"AdditionalProperties":0}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[156,157]}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[159,160,161,162,163,164,165]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/extenders@2022-03-15-privatepreview","ScopeType":0,"Body":153}},{"2":{"Name":"MongoDatabaseListSecretsResult","Properties":{"password":{"Type":4,"Flags":2,"Description":"Password to use when connecting to the target Mongo database"},"connectionString":{"Type":4,"Flags":2,"Description":"Connection string used to connect to the target Mongo database"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/mongoDatabases","ApiVersion":"2022-03-15-privatepreview","Output":169}},{"2":{"Name":"RabbitMQListSecretsResult","Properties":{"connectionString":{"Type":4,"Flags":2,"Description":"The connection string used to connect to this RabbitMQ instance"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/rabbitMQMessageQueues","ApiVersion":"2022-03-15-privatepreview","Output":171}},{"2":{"Name":"RedisCacheListSecretsResult","Properties":{"connectionString":{"Type":4,"Flags":2,"Description":"The connection string used to connect to the Redis cache"},"password":{"Type":4,"Flags":2,"Description":"The password for this Redis cache instance"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/redisCaches","ApiVersion":"2022-03-15-privatepreview","Output":173}},{"2":{"Name":"SqlDatabaseListSecretsResult","Properties":{"password":{"Type":4,"Flags":2,"Description":"Password to use when connecting to the target Sql database"},"connectionString":{"Type":4,"Flags":2,"Description":"Connection string used to connect to the target Sql database"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/sqlDatabases","ApiVersion":"2022-03-15-privatepreview","Output":175}},{"2":{"Name":"ExtenderSecrets","Properties":{},"AdditionalProperties":0}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/extenders","ApiVersion":"2022-03-15-privatepreview","Output":177}}] \ No newline at end of file +[{"1":{"Kind":1}},{"1":{"Kind":2}},{"1":{"Kind":3}},{"1":{"Kind":4}},{"1":{"Kind":5}},{"1":{"Kind":6}},{"1":{"Kind":7}},{"1":{"Kind":8}},{"6":{"Value":"Applications.Link/daprPubSubBrokers"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprPubSubBrokers","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":8,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":9,"Flags":10,"Description":"The resource api version"},"properties":{"Type":11,"Flags":0,"Description":"DaprPubSubBroker link properties"},"tags":{"Type":28,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprPubSubBrokerProperties","Properties":{"provisioningState":{"Type":19,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"resourceProvisioning":{"Type":22,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"metadata":{"Type":0,"Flags":0,"Description":"Any object"},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":25,"Flags":0,"Description":"A collection of references to resources associated with the daprPubSubBroker"},"type":{"Type":4,"Flags":0,"Description":"DaprPubSubBroker type. These strings match the format used by Dapr Kubernetes configuration format."},"version":{"Type":4,"Flags":0,"Description":"Dapr component version"},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[12,13,14,15,16,17,18]}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[20,21]}},{"2":{"Name":"Recipe","Properties":{"name":{"Type":4,"Flags":1,"Description":"The name of the recipe within the environment to use"},"parameters":{"Type":0,"Flags":0,"Description":"Any object"}}}},{"2":{"Name":"ResourceReference","Properties":{"id":{"Type":4,"Flags":1,"Description":"Resource id of an existing resource"}}}},{"3":{"ItemType":24}},{"2":{"Name":"ResourceStatus","Properties":{"outputResources":{"Type":27,"Flags":0,"Description":"Properties of an output resource"}}}},{"3":{"ItemType":0}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"2":{"Name":"SystemData","Properties":{"createdBy":{"Type":4,"Flags":0,"Description":"The identity that created the resource."},"createdByType":{"Type":34,"Flags":0,"Description":"The type of identity that created the resource."},"createdAt":{"Type":4,"Flags":0,"Description":"The timestamp of resource creation (UTC)."},"lastModifiedBy":{"Type":4,"Flags":0,"Description":"The identity that last modified the resource."},"lastModifiedByType":{"Type":39,"Flags":0,"Description":"The type of identity that created the resource."},"lastModifiedAt":{"Type":4,"Flags":0,"Description":"The timestamp of resource last modification (UTC)"}}}},{"6":{"Value":"User"}},{"6":{"Value":"Application"}},{"6":{"Value":"ManagedIdentity"}},{"6":{"Value":"Key"}},{"5":{"Elements":[30,31,32,33]}},{"6":{"Value":"User"}},{"6":{"Value":"Application"}},{"6":{"Value":"ManagedIdentity"}},{"6":{"Value":"Key"}},{"5":{"Elements":[35,36,37,38]}},{"4":{"Name":"Applications.Link/daprPubSubBrokers@2022-03-15-privatepreview","ScopeType":0,"Body":10}},{"6":{"Value":"Applications.Link/daprSecretStores"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprSecretStores","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":41,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":42,"Flags":10,"Description":"The resource api version"},"properties":{"Type":44,"Flags":0,"Description":"DaprSecretStore link properties"},"tags":{"Type":56,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprSecretStoreProperties","Properties":{"provisioningState":{"Type":52,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"type":{"Type":4,"Flags":0,"Description":"Dapr Secret Store type. These strings match the types defined in Dapr Component format: https://docs.dapr.io/reference/components-reference/supported-secret-stores/"},"version":{"Type":4,"Flags":0,"Description":"Dapr component version"},"metadata":{"Type":0,"Flags":0,"Description":"Any object"},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resourceProvisioning":{"Type":55,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[45,46,47,48,49,50,51]}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[53,54]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/daprSecretStores@2022-03-15-privatepreview","ScopeType":0,"Body":43}},{"6":{"Value":"Applications.Link/daprStateStores"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/daprStateStores","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":58,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":59,"Flags":10,"Description":"The resource api version"},"properties":{"Type":61,"Flags":0,"Description":"DaprStateStore link properties"},"tags":{"Type":74,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"DaprStateStoreProperties","Properties":{"provisioningState":{"Type":69,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"resourceProvisioning":{"Type":72,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"metadata":{"Type":0,"Flags":0,"Description":"Any object"},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":73,"Flags":0,"Description":"A collection of references to resources associated with the state store"},"type":{"Type":4,"Flags":0,"Description":"Dapr StateStore type. These strings match the format used by Dapr Kubernetes configuration format."},"version":{"Type":4,"Flags":0,"Description":"Dapr component version"},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[62,63,64,65,66,67,68]}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[70,71]}},{"3":{"ItemType":24}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/daprStateStores@2022-03-15-privatepreview","ScopeType":0,"Body":60}},{"6":{"Value":"Applications.Link/mongoDatabases"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/mongoDatabases","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":76,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":77,"Flags":10,"Description":"The resource api version"},"properties":{"Type":79,"Flags":0,"Description":"MongoDatabase link properties"},"tags":{"Type":93,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"MongoDatabaseProperties","Properties":{"provisioningState":{"Type":87,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"secrets":{"Type":88,"Flags":0,"Description":"The secret values for the given MongoDatabase resource"},"host":{"Type":4,"Flags":0,"Description":"Host name of the target Mongo database"},"port":{"Type":3,"Flags":0,"Description":"Port value of the target Mongo database"},"database":{"Type":4,"Flags":0,"Description":"Database name of the target Mongo database"},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":89,"Flags":0,"Description":"List of the resource IDs that support the MongoDB resource"},"resourceProvisioning":{"Type":92,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"username":{"Type":4,"Flags":0,"Description":"Username to use when connecting to the target Mongo database"},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[80,81,82,83,84,85,86]}},{"2":{"Name":"MongoDatabaseSecrets","Properties":{"password":{"Type":4,"Flags":0,"Description":"Password to use when connecting to the target Mongo database"},"connectionString":{"Type":4,"Flags":0,"Description":"Connection string used to connect to the target Mongo database"}}}},{"3":{"ItemType":24}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[90,91]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/mongoDatabases@2022-03-15-privatepreview","ScopeType":0,"Body":78}},{"6":{"Value":"Applications.Link/rabbitMQMessageQueues"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/rabbitMQMessageQueues","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":95,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":96,"Flags":10,"Description":"The resource api version"},"properties":{"Type":98,"Flags":0,"Description":"RabbitMQMessageQueue link properties"},"tags":{"Type":111,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"RabbitMQMessageQueueProperties","Properties":{"provisioningState":{"Type":106,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"secrets":{"Type":107,"Flags":0,"Description":"The secret values for the given RabbitMQMessageQueue resource"},"queue":{"Type":4,"Flags":0,"Description":"The name of the queue"},"resourceProvisioning":{"Type":110,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[99,100,101,102,103,104,105]}},{"2":{"Name":"RabbitMQSecrets","Properties":{"connectionString":{"Type":4,"Flags":0,"Description":"The connection string used to connect to this RabbitMQ instance"}}}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[108,109]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/rabbitMQMessageQueues@2022-03-15-privatepreview","ScopeType":0,"Body":97}},{"6":{"Value":"Applications.Link/redisCaches"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/redisCaches","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":113,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":114,"Flags":10,"Description":"The resource api version"},"properties":{"Type":116,"Flags":0,"Description":"RedisCache link properties"},"tags":{"Type":130,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"RedisCacheProperties","Properties":{"provisioningState":{"Type":124,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"secrets":{"Type":125,"Flags":0,"Description":"The secret values for the given RedisCache resource"},"host":{"Type":4,"Flags":0,"Description":"The host name of the target Redis cache"},"port":{"Type":3,"Flags":0,"Description":"The port value of the target Redis cache"},"username":{"Type":4,"Flags":0,"Description":"The username for Redis cache"},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":126,"Flags":0,"Description":"List of the resource IDs that support the Redis resource"},"resourceProvisioning":{"Type":129,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[117,118,119,120,121,122,123]}},{"2":{"Name":"RedisCacheSecrets","Properties":{"connectionString":{"Type":4,"Flags":0,"Description":"The connection string used to connect to the Redis cache"},"password":{"Type":4,"Flags":0,"Description":"The password for this Redis cache instance"}}}},{"3":{"ItemType":24}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[127,128]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/redisCaches@2022-03-15-privatepreview","ScopeType":0,"Body":115}},{"6":{"Value":"Applications.Link/sqlDatabases"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/sqlDatabases","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":132,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":133,"Flags":10,"Description":"The resource api version"},"properties":{"Type":135,"Flags":0,"Description":"SqlDatabase properties"},"tags":{"Type":149,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"SqlDatabaseProperties","Properties":{"provisioningState":{"Type":143,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"database":{"Type":4,"Flags":0,"Description":"The name of the Sql database."},"server":{"Type":4,"Flags":0,"Description":"The fully qualified domain name of the Sql database."},"port":{"Type":3,"Flags":0,"Description":"Port value of the target Sql database"},"username":{"Type":4,"Flags":0,"Description":"Username to use when connecting to the target Sql database"},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"resources":{"Type":144,"Flags":0,"Description":"List of the resource IDs that support the SqlDatabase resource"},"resourceProvisioning":{"Type":147,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"secrets":{"Type":148,"Flags":0,"Description":"The secret values for the given SqlDatabase resource"},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[136,137,138,139,140,141,142]}},{"3":{"ItemType":24}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[145,146]}},{"2":{"Name":"SqlDatabaseSecrets","Properties":{"password":{"Type":4,"Flags":0,"Description":"Password to use when connecting to the target Sql database"},"connectionString":{"Type":4,"Flags":0,"Description":"Connection string used to connect to the target Sql database"}}}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/sqlDatabases@2022-03-15-privatepreview","ScopeType":0,"Body":134}},{"6":{"Value":"Applications.Link/extenders"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Link/extenders","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":151,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":152,"Flags":10,"Description":"The resource api version"},"properties":{"Type":154,"Flags":1,"Description":"Extender link properties"},"tags":{"Type":167,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"},"systemData":{"Type":29,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."}}}},{"2":{"Name":"ExtenderProperties","Properties":{"provisioningState":{"Type":162,"Flags":2,"Description":"Provisioning state of the link at the time the operation was called"},"secrets":{"Type":163,"Flags":0,"Description":"The secret values for the given Extender resource"},"resourceProvisioning":{"Type":166,"Flags":0,"Description":"Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values."},"recipe":{"Type":23,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a link"},"status":{"Type":26,"Flags":2,"Description":"Status of a resource."},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the link is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the link is consumed by"}},"AdditionalProperties":0}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Provisioning"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Accepted"}},{"5":{"Elements":[155,156,157,158,159,160,161]}},{"2":{"Name":"ExtenderSecrets","Properties":{},"AdditionalProperties":0}},{"6":{"Value":"recipe"}},{"6":{"Value":"manual"}},{"5":{"Elements":[164,165]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Link/extenders@2022-03-15-privatepreview","ScopeType":0,"Body":153}},{"2":{"Name":"MongoDatabaseListSecretsResult","Properties":{"password":{"Type":4,"Flags":2,"Description":"Password to use when connecting to the target Mongo database"},"connectionString":{"Type":4,"Flags":2,"Description":"Connection string used to connect to the target Mongo database"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/mongoDatabases","ApiVersion":"2022-03-15-privatepreview","Output":169}},{"2":{"Name":"RabbitMQListSecretsResult","Properties":{"connectionString":{"Type":4,"Flags":2,"Description":"The connection string used to connect to this RabbitMQ instance"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/rabbitMQMessageQueues","ApiVersion":"2022-03-15-privatepreview","Output":171}},{"2":{"Name":"RedisCacheListSecretsResult","Properties":{"connectionString":{"Type":4,"Flags":2,"Description":"The connection string used to connect to the Redis cache"},"password":{"Type":4,"Flags":2,"Description":"The password for this Redis cache instance"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/redisCaches","ApiVersion":"2022-03-15-privatepreview","Output":173}},{"2":{"Name":"SqlDatabaseListSecretsResult","Properties":{"password":{"Type":4,"Flags":2,"Description":"Password to use when connecting to the target Sql database"},"connectionString":{"Type":4,"Flags":2,"Description":"Connection string used to connect to the target Sql database"}}}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/sqlDatabases","ApiVersion":"2022-03-15-privatepreview","Output":175}},{"2":{"Name":"ExtenderSecrets","Properties":{},"AdditionalProperties":0}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Link/extenders","ApiVersion":"2022-03-15-privatepreview","Output":177}}] \ No newline at end of file diff --git a/hack/bicep-types-radius/generated/applications/applications.link/2022-03-15-privatepreview/types.md b/hack/bicep-types-radius/generated/applications/applications.link/2022-03-15-privatepreview/types.md index f67b48153c..0258194f18 100644 --- a/hack/bicep-types-radius/generated/applications/applications.link/2022-03-15-privatepreview/types.md +++ b/hack/bicep-types-radius/generated/applications/applications.link/2022-03-15-privatepreview/types.md @@ -204,9 +204,9 @@ * **application**: string: Fully qualified resource ID for the application that the link is consumed by * **environment**: string (Required): Fully qualified resource ID for the environment that the link is linked to * **provisioningState**: 'Accepted' | 'Canceled' | 'Deleting' | 'Failed' | 'Provisioning' | 'Succeeded' | 'Updating' (ReadOnly): Provisioning state of the link at the time the operation was called -* **recipe**: [Recipe](#recipe) (WriteOnly): The recipe used to automatically deploy underlying infrastructure for a link -* **resourceProvisioning**: 'manual' | 'recipe' (WriteOnly): Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values. -* **secrets**: [ExtenderSecrets](#extendersecrets) (WriteOnly): The secret values for the given Extender resource +* **recipe**: [Recipe](#recipe): The recipe used to automatically deploy underlying infrastructure for a link +* **resourceProvisioning**: 'manual' | 'recipe': Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values. +* **secrets**: [ExtenderSecrets](#extendersecrets): The secret values for the given Extender resource * **status**: [ResourceStatus](#resourcestatus) (ReadOnly): Status of a resource. ### Additional Properties * **Additional Properties Type**: any diff --git a/pkg/linkrp/api/v20220315privatepreview/zz_generated_extenders_client.go b/pkg/linkrp/api/v20220315privatepreview/zz_generated_extenders_client.go index 0abc22c38f..3fd40b233f 100644 --- a/pkg/linkrp/api/v20220315privatepreview/zz_generated_extenders_client.go +++ b/pkg/linkrp/api/v20220315privatepreview/zz_generated_extenders_client.go @@ -98,7 +98,7 @@ func (client *ExtendersClient) createOrUpdateCreateRequest(ctx context.Context, // createOrUpdateHandleResponse handles the CreateOrUpdate response. func (client *ExtendersClient) createOrUpdateHandleResponse(resp *http.Response) (ExtendersClientCreateOrUpdateResponse, error) { result := ExtendersClientCreateOrUpdateResponse{} - if err := runtime.UnmarshalAsJSON(resp, &result.ExtenderResponseResource); err != nil { + if err := runtime.UnmarshalAsJSON(resp, &result.ExtenderResource); err != nil { return ExtendersClientCreateOrUpdateResponse{}, err } return result, nil @@ -185,7 +185,7 @@ func (client *ExtendersClient) getCreateRequest(ctx context.Context, extenderNam // getHandleResponse handles the Get response. func (client *ExtendersClient) getHandleResponse(resp *http.Response) (ExtendersClientGetResponse, error) { result := ExtendersClientGetResponse{} - if err := runtime.UnmarshalAsJSON(resp, &result.ExtenderResponseResource); err != nil { + if err := runtime.UnmarshalAsJSON(resp, &result.ExtenderResource); err != nil { return ExtendersClientGetResponse{}, err } return result, nil diff --git a/pkg/linkrp/api/v20220315privatepreview/zz_generated_models.go b/pkg/linkrp/api/v20220315privatepreview/zz_generated_models.go index b7211c7bba..a78f2d3adc 100644 --- a/pkg/linkrp/api/v20220315privatepreview/zz_generated_models.go +++ b/pkg/linkrp/api/v20220315privatepreview/zz_generated_models.go @@ -353,7 +353,7 @@ type ExtenderList struct { NextLink *string `json:"nextLink,omitempty"` // List of Extender resources - Value []*ExtenderResponseResource `json:"value,omitempty"` + Value []*ExtenderResource `json:"value,omitempty"` } // ExtenderProperties - Extender link properties @@ -407,48 +407,6 @@ type ExtenderResource struct { Type *string `json:"type,omitempty" azure:"ro"` } -// ExtenderResponseProperties - Extender link properties -type ExtenderResponseProperties struct { - // REQUIRED; Fully qualified resource ID for the environment that the link is linked to - Environment *string `json:"environment,omitempty"` - - // OPTIONAL; Contains additional key/value pairs not defined in the schema. - AdditionalProperties map[string]interface{} - - // Fully qualified resource ID for the application that the link is consumed by - Application *string `json:"application,omitempty"` - - // READ-ONLY; Provisioning state of the extender link at the time the operation was called - ProvisioningState *ProvisioningState `json:"provisioningState,omitempty" azure:"ro"` - - // READ-ONLY; Status of a resource. - Status *ResourceStatus `json:"status,omitempty" azure:"ro"` -} - -// ExtenderResponseResource - Extender link -type ExtenderResponseResource struct { - // REQUIRED; The geo-location where the resource lives - Location *string `json:"location,omitempty"` - - // REQUIRED; Extender link properties - Properties *ExtenderResponseProperties `json:"properties,omitempty"` - - // Resource tags. - Tags map[string]*string `json:"tags,omitempty"` - - // READ-ONLY; Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName} - ID *string `json:"id,omitempty" azure:"ro"` - - // READ-ONLY; The name of the resource - Name *string `json:"name,omitempty" azure:"ro"` - - // READ-ONLY; Azure Resource Manager metadata containing createdBy and modifiedBy information. - SystemData *SystemData `json:"systemData,omitempty" azure:"ro"` - - // READ-ONLY; The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts" - Type *string `json:"type,omitempty" azure:"ro"` -} - // ExtendersClientCreateOrUpdateOptions contains the optional parameters for the ExtendersClient.CreateOrUpdate method. type ExtendersClientCreateOrUpdateOptions struct { // placeholder for future optional parameters diff --git a/pkg/linkrp/api/v20220315privatepreview/zz_generated_models_serde.go b/pkg/linkrp/api/v20220315privatepreview/zz_generated_models_serde.go index 79db050022..8686a4b64a 100644 --- a/pkg/linkrp/api/v20220315privatepreview/zz_generated_models_serde.go +++ b/pkg/linkrp/api/v20220315privatepreview/zz_generated_models_serde.go @@ -781,111 +781,6 @@ func (e *ExtenderResource) UnmarshalJSON(data []byte) error { return nil } -// MarshalJSON implements the json.Marshaller interface for type ExtenderResponseProperties. -func (e ExtenderResponseProperties) MarshalJSON() ([]byte, error) { - objectMap := make(map[string]interface{}) - populate(objectMap, "application", e.Application) - populate(objectMap, "environment", e.Environment) - populate(objectMap, "provisioningState", e.ProvisioningState) - populate(objectMap, "status", e.Status) - if e.AdditionalProperties != nil { - for key, val := range e.AdditionalProperties { - objectMap[key] = val - } - } - return json.Marshal(objectMap) -} - -// UnmarshalJSON implements the json.Unmarshaller interface for type ExtenderResponseProperties. -func (e *ExtenderResponseProperties) UnmarshalJSON(data []byte) error { - var rawMsg map[string]json.RawMessage - if err := json.Unmarshal(data, &rawMsg); err != nil { - return fmt.Errorf("unmarshalling type %T: %v", e, err) - } - for key, val := range rawMsg { - var err error - switch key { - case "application": - err = unpopulate(val, "Application", &e.Application) - delete(rawMsg, key) - case "environment": - err = unpopulate(val, "Environment", &e.Environment) - delete(rawMsg, key) - case "provisioningState": - err = unpopulate(val, "ProvisioningState", &e.ProvisioningState) - delete(rawMsg, key) - case "status": - err = unpopulate(val, "Status", &e.Status) - delete(rawMsg, key) - default: - if e.AdditionalProperties == nil { - e.AdditionalProperties = map[string]interface{}{} - } - if val != nil { - var aux interface{} - err = json.Unmarshal(val, &aux) - e.AdditionalProperties[key] = aux - } - delete(rawMsg, key) - } - if err != nil { - return fmt.Errorf("unmarshalling type %T: %v", e, err) - } - } - return nil -} - -// MarshalJSON implements the json.Marshaller interface for type ExtenderResponseResource. -func (e ExtenderResponseResource) MarshalJSON() ([]byte, error) { - objectMap := make(map[string]interface{}) - populate(objectMap, "id", e.ID) - populate(objectMap, "location", e.Location) - populate(objectMap, "name", e.Name) - populate(objectMap, "properties", e.Properties) - populate(objectMap, "systemData", e.SystemData) - populate(objectMap, "tags", e.Tags) - populate(objectMap, "type", e.Type) - return json.Marshal(objectMap) -} - -// UnmarshalJSON implements the json.Unmarshaller interface for type ExtenderResponseResource. -func (e *ExtenderResponseResource) UnmarshalJSON(data []byte) error { - var rawMsg map[string]json.RawMessage - if err := json.Unmarshal(data, &rawMsg); err != nil { - return fmt.Errorf("unmarshalling type %T: %v", e, err) - } - for key, val := range rawMsg { - var err error - switch key { - case "id": - err = unpopulate(val, "ID", &e.ID) - delete(rawMsg, key) - case "location": - err = unpopulate(val, "Location", &e.Location) - delete(rawMsg, key) - case "name": - err = unpopulate(val, "Name", &e.Name) - delete(rawMsg, key) - case "properties": - err = unpopulate(val, "Properties", &e.Properties) - delete(rawMsg, key) - case "systemData": - err = unpopulate(val, "SystemData", &e.SystemData) - delete(rawMsg, key) - case "tags": - err = unpopulate(val, "Tags", &e.Tags) - delete(rawMsg, key) - case "type": - err = unpopulate(val, "Type", &e.Type) - delete(rawMsg, key) - } - if err != nil { - return fmt.Errorf("unmarshalling type %T: %v", e, err) - } - } - return nil -} - // MarshalJSON implements the json.Marshaller interface for type MongoDatabaseListSecretsResult. func (m MongoDatabaseListSecretsResult) MarshalJSON() ([]byte, error) { objectMap := make(map[string]interface{}) diff --git a/pkg/linkrp/api/v20220315privatepreview/zz_generated_response_types.go b/pkg/linkrp/api/v20220315privatepreview/zz_generated_response_types.go index 0b3a353ee6..85821cf6f9 100644 --- a/pkg/linkrp/api/v20220315privatepreview/zz_generated_response_types.go +++ b/pkg/linkrp/api/v20220315privatepreview/zz_generated_response_types.go @@ -77,7 +77,7 @@ type DaprStateStoreClientListByRootScopeResponse struct { // ExtendersClientCreateOrUpdateResponse contains the response from method ExtendersClient.CreateOrUpdate. type ExtendersClientCreateOrUpdateResponse struct { - ExtenderResponseResource + ExtenderResource } // ExtendersClientDeleteResponse contains the response from method ExtendersClient.Delete. @@ -87,7 +87,7 @@ type ExtendersClientDeleteResponse struct { // ExtendersClientGetResponse contains the response from method ExtendersClient.Get. type ExtendersClientGetResponse struct { - ExtenderResponseResource + ExtenderResource } // ExtendersClientListByRootScopeResponse contains the response from method ExtendersClient.ListByRootScope. diff --git a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/extenders.json b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/extenders.json index 324c4e744e..9402612d40 100644 --- a/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/extenders.json +++ b/swagger/specification/applications/resource-manager/Applications.Link/preview/2022-03-15-privatepreview/extenders.json @@ -107,7 +107,7 @@ "200": { "description": "Extender resource", "schema": { - "$ref": "#/definitions/ExtenderResponseResource" + "$ref": "#/definitions/ExtenderResource" } }, "default": { @@ -156,13 +156,13 @@ "200": { "description": "The request was successful; response contains the extender resource", "schema": { - "$ref": "#/definitions/ExtenderResponseResource" + "$ref": "#/definitions/ExtenderResource" } }, "201": { "description": "The request was successful, resource will be updated asynchronously", "schema": { - "$ref": "#/definitions/ExtenderResponseResource" + "$ref": "#/definitions/ExtenderResource" } }, "default": { @@ -261,6 +261,35 @@ } }, "definitions": { + "Recipe": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The name of the recipe within the environment to use" + }, + "parameters": { + "$ref": "openapi.json#/definitions/Parameters", + "description": "Key/value parameters to pass into the recipe at deployment" + } + }, + "description": "The recipe used to automatically deploy underlying infrastructure for a link", + "required": [ + "name" + ] + }, + "ResourceProvisioning": { + "type": "string", + "description": "Specifies how the underlying service/resource is provisioned and managed. Available values are 'recipe', where Radius manages the lifecycle of the resource through a Recipe, and 'manual', where a user manages the resource and provides the values.", + "enum": [ + "recipe", + "manual" + ], + "x-ms-enum": { + "name": "ResourceProvisioning", + "modelAsString": true + } + }, "ExtenderList": { "description": "Object that includes an array of Extender and a possible link for next set", "type": "object", @@ -269,7 +298,7 @@ "description": "List of Extender resources", "type": "array", "items": { - "$ref": "#/definitions/ExtenderResponseResource" + "$ref": "#/definitions/ExtenderResource" } }, "nextLink": { @@ -299,24 +328,6 @@ } } }, - "ExtenderResponseResource": { - "description": "Extender link", - "type": "object", - "allOf": [ - { - "$ref": "../../../../../common-types/resource-management/v3/types.json#/definitions/TrackedResource" - } - ], - "required": [ - "properties" - ], - "properties": { - "properties": { - "x-ms-client-flatten": true, - "$ref": "#/definitions/ExtenderResponseProperties" - } - } - }, "ExtenderListSecretsResult": { "description": "The secret values for the given Extender resource", "$ref": "#/definitions/ExtenderSecrets" @@ -326,7 +337,7 @@ "additionalProperties": true, "properties": {} }, - "ExtenderResponseProperties": { + "ExtenderProperties": { "description": "Extender link properties", "type": "object", "allOf": [ @@ -340,34 +351,23 @@ "readOnly": true, "$ref": "openapi.json#/definitions/ProvisioningState", "description": "Provisioning state of the extender link at the time the operation was called" - } - }, - "required": [ - "environment" - ] - }, - "ExtenderProperties": { - "description": "Extender link properties", - "type": "object", - "allOf": [ - { - "$ref": "#/definitions/ExtenderResponseProperties" - } - ], - "properties": { + }, "secrets": { "additionalProperties": true, "$ref": "#/definitions/ExtenderSecrets" }, "resourceProvisioning": { - "$ref": "openapi.json#/definitions/ResourceProvisioning", + "$ref": "#/definitions/ResourceProvisioning", "description": "Specifies how the underlying service/resource is provisioned and managed." }, "recipe": { - "$ref": "openapi.json#/definitions/Recipe", + "$ref": "#/definitions/Recipe", "description": "The recipe used to automatically deploy underlying infrastructure for the Extender link" } - } + }, + "required": [ + "environment" + ] } }, "parameters": {