From cf2bb3b8fbc6530d53002616424c5a6eeb303e5d Mon Sep 17 00:00:00 2001 From: Matthew Christopher Date: Fri, 7 Jun 2024 14:37:26 -0700 Subject: [PATCH] Add support for RoleDefinition resource This fixes #2570. --- docs/hugo/content/reference/_index.md | 8 + .../content/reference/authorization/_index.md | 8 + .../role_definition_extension_types_gen.go | 20 + .../customizations/structure.txt | 3 +- .../role_assignment_defaults.go | 12 +- .../v1api20220401/role_assignment_defaults.go | 12 +- .../v1api20220401/role_definition_defaults.go | 47 + .../role_definition_spec_arm_types_gen.go | 62 + ...role_definition_spec_arm_types_gen_test.go | 234 +++ .../role_definition_status_arm_types_gen.go | 64 + ...le_definition_status_arm_types_gen_test.go | 241 ++++ .../role_definition_types_gen.go | 1267 +++++++++++++++++ .../role_definition_types_gen_test.go | 622 ++++++++ .../storage/role_definition_types_gen.go | 242 ++++ .../storage/role_definition_types_gen_test.go | 369 +++++ .../v1api20220401/storage/structure.txt | 70 +- .../storage/zz_generated.deepcopy.go | 288 ++++ .../authorization/v1api20220401/structure.txt | 87 +- .../v1api20220401/zz_generated.deepcopy.go | 489 +++++++ v2/api/authorization/versions_matrix.md | 7 + .../sql_role_assignment_defaults.go | 12 +- .../sql_role_assignment_defaults.go | 12 +- v2/azure-arm.yaml | 7 + .../authorization_roledefinition_test.go | 108 ++ .../controllers/controller_resources_gen.go | 12 +- ...RoleDefinitionResourceGroupScope_CRUD.yaml | 476 +++++++ ..._RoleDefinitionSubscriptionScope_CRUD.yaml | 270 ++++ ...ion_v1api20220401_CreationAndDeletion.yaml | 418 +++--- v2/internal/testcommon/samples_tester.go | 49 +- v2/internal/util/randextensions/uuid5.go | 35 +- .../v1api20220401_roledefinition.yaml | 25 + 31 files changed, 5334 insertions(+), 242 deletions(-) create mode 100644 v2/api/authorization/customizations/role_definition_extension_types_gen.go create mode 100644 v2/api/authorization/v1api20220401/role_definition_defaults.go create mode 100644 v2/api/authorization/v1api20220401/role_definition_spec_arm_types_gen.go create mode 100644 v2/api/authorization/v1api20220401/role_definition_spec_arm_types_gen_test.go create mode 100644 v2/api/authorization/v1api20220401/role_definition_status_arm_types_gen.go create mode 100644 v2/api/authorization/v1api20220401/role_definition_status_arm_types_gen_test.go create mode 100644 v2/api/authorization/v1api20220401/role_definition_types_gen.go create mode 100644 v2/api/authorization/v1api20220401/role_definition_types_gen_test.go create mode 100644 v2/api/authorization/v1api20220401/storage/role_definition_types_gen.go create mode 100644 v2/api/authorization/v1api20220401/storage/role_definition_types_gen_test.go create mode 100644 v2/internal/controllers/authorization_roledefinition_test.go create mode 100644 v2/internal/controllers/recordings/Test_Authorization_RoleDefinitionResourceGroupScope_CRUD.yaml create mode 100644 v2/internal/controllers/recordings/Test_Authorization_RoleDefinitionSubscriptionScope_CRUD.yaml create mode 100644 v2/samples/authorization/v1api20220401/v1api20220401_roledefinition.yaml diff --git a/docs/hugo/content/reference/_index.md b/docs/hugo/content/reference/_index.md index 1e0cca2e750..e0ab6abd3c5 100644 --- a/docs/hugo/content/reference/_index.md +++ b/docs/hugo/content/reference/_index.md @@ -81,6 +81,14 @@ These resource(s) are available for use in the current release of ASO. Different To install the CRDs for these resources, your ASO configuration must include `authorization.azure.com/*` as a one of the configured CRD patterns. See [CRD Management in ASO](https://azure.github.io/azure-service-operator/guide/crd-management/) for details on doing this for both [Helm](https://azure.github.io/azure-service-operator/guide/crd-management/#helm) and [YAML](https://azure.github.io/azure-service-operator/guide/crd-management/#yaml) based installations. +### Next Release + +Development of these new resources is complete and they will be available in the next release of ASO. + +| Resource | ARM Version | CRD Version | Supported From | Sample | +|--------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------|---------------|----------------|--------------------------------------------------------------------------------------------------------------------------------------------| +| [RoleDefinition](https://azure.github.io/azure-service-operator/reference/authorization/v1api20220401/#authorization.azure.com/v1api20220401.RoleDefinition) | 2022-04-01 | v1api20220401 | v2.8.0 | [View](https://github.com/Azure/azure-service-operator/tree/main/v2/samples/authorization/v1api20220401/v1api20220401_roledefinition.yaml) | + ### Released These resource(s) are available for use in the current release of ASO. Different versions of a given resource reflect different versions of the Azure ARM API. diff --git a/docs/hugo/content/reference/authorization/_index.md b/docs/hugo/content/reference/authorization/_index.md index 52064433706..a52083a7851 100644 --- a/docs/hugo/content/reference/authorization/_index.md +++ b/docs/hugo/content/reference/authorization/_index.md @@ -5,6 +5,14 @@ no_list: true --- To install the CRDs for these resources, your ASO configuration must include `authorization.azure.com/*` as a one of the configured CRD patterns. See [CRD Management in ASO](https://azure.github.io/azure-service-operator/guide/crd-management/) for details on doing this for both [Helm](https://azure.github.io/azure-service-operator/guide/crd-management/#helm) and [YAML](https://azure.github.io/azure-service-operator/guide/crd-management/#yaml) based installations. +### Next Release + +Development of these new resources is complete and they will be available in the next release of ASO. + +| Resource | ARM Version | CRD Version | Supported From | Sample | +|--------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------|---------------|----------------|--------------------------------------------------------------------------------------------------------------------------------------------| +| [RoleDefinition](https://azure.github.io/azure-service-operator/reference/authorization/v1api20220401/#authorization.azure.com/v1api20220401.RoleDefinition) | 2022-04-01 | v1api20220401 | v2.8.0 | [View](https://github.com/Azure/azure-service-operator/tree/main/v2/samples/authorization/v1api20220401/v1api20220401_roledefinition.yaml) | + ### Released These resource(s) are available for use in the current release of ASO. Different versions of a given resource reflect different versions of the Azure ARM API. diff --git a/v2/api/authorization/customizations/role_definition_extension_types_gen.go b/v2/api/authorization/customizations/role_definition_extension_types_gen.go new file mode 100644 index 00000000000..9e15f251807 --- /dev/null +++ b/v2/api/authorization/customizations/role_definition_extension_types_gen.go @@ -0,0 +1,20 @@ +// Code generated by azure-service-operator-codegen. DO NOT EDIT. +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. +package customizations + +import ( + v20220401 "github.com/Azure/azure-service-operator/v2/api/authorization/v1api20220401" + storage "github.com/Azure/azure-service-operator/v2/api/authorization/v1api20220401/storage" + "github.com/Azure/azure-service-operator/v2/pkg/genruntime" +) + +type RoleDefinitionExtension struct { +} + +// GetExtendedResources Returns the KubernetesResource slice for Resource versions +func (extension *RoleDefinitionExtension) GetExtendedResources() []genruntime.KubernetesResource { + return []genruntime.KubernetesResource{ + &v20220401.RoleDefinition{}, + &storage.RoleDefinition{}} +} diff --git a/v2/api/authorization/customizations/structure.txt b/v2/api/authorization/customizations/structure.txt index 15d6529d90b..c626f28c7b7 100644 --- a/v2/api/authorization/customizations/structure.txt +++ b/v2/api/authorization/customizations/structure.txt @@ -1,3 +1,4 @@ // Code generated by azure-service-operator-codegen. DO NOT EDIT. github.com/Azure/azure-service-operator/v2/api/authorization/customizations -└── RoleAssignmentExtension: Object (0 properties) +├── RoleAssignmentExtension: Object (0 properties) +└── RoleDefinitionExtension: Object (0 properties) diff --git a/v2/api/authorization/v1api20200801preview/role_assignment_defaults.go b/v2/api/authorization/v1api20200801preview/role_assignment_defaults.go index 0b8aea6feb1..9a62c690d35 100644 --- a/v2/api/authorization/v1api20200801preview/role_assignment_defaults.go +++ b/v2/api/authorization/v1api20200801preview/role_assignment_defaults.go @@ -46,10 +46,12 @@ func (assignment *RoleAssignment) defaultAzureName() { ownerGK := assignment.Owner().GroupKind() gk := assignment.GroupVersionKind().GroupKind() assignment.Spec.AzureName = randextensions.MakeUUIDName( - ownerGK, - assignment.Spec.Owner.Name, - gk, - assignment.Namespace, - assignment.Name) + assignment.Name, + randextensions.MakeUniqueOwnerScopedString( + ownerGK, + assignment.Spec.Owner.Name, + gk, + assignment.Namespace, + assignment.Name)) } } diff --git a/v2/api/authorization/v1api20220401/role_assignment_defaults.go b/v2/api/authorization/v1api20220401/role_assignment_defaults.go index 0b9c6a37a94..479655dc15c 100644 --- a/v2/api/authorization/v1api20220401/role_assignment_defaults.go +++ b/v2/api/authorization/v1api20220401/role_assignment_defaults.go @@ -46,10 +46,12 @@ func (assignment *RoleAssignment) defaultAzureName() { ownerGK := assignment.Owner().GroupKind() gk := assignment.GroupVersionKind().GroupKind() assignment.Spec.AzureName = randextensions.MakeUUIDName( - ownerGK, - assignment.Spec.Owner.Name, - gk, - assignment.Namespace, - assignment.Name) + assignment.Name, + randextensions.MakeUniqueOwnerScopedString( + ownerGK, + assignment.Spec.Owner.Name, + gk, + assignment.Namespace, + assignment.Name)) } } diff --git a/v2/api/authorization/v1api20220401/role_definition_defaults.go b/v2/api/authorization/v1api20220401/role_definition_defaults.go new file mode 100644 index 00000000000..4a01fe869e6 --- /dev/null +++ b/v2/api/authorization/v1api20220401/role_definition_defaults.go @@ -0,0 +1,47 @@ +/* +Copyright (c) Microsoft Corporation. +Licensed under the MIT license. +*/ + +package v1api20220401 + +import ( + "github.com/Azure/azure-service-operator/v2/internal/util/randextensions" + "github.com/Azure/azure-service-operator/v2/pkg/genruntime" +) + +var _ genruntime.Defaulter = &RoleDefinition{} + +func (definition *RoleDefinition) CustomDefault() { + definition.defaultAzureName() +} + +// defaultAzureName performs special AzureName defaulting for RoleDefinition by generating a stable GUID +// based on the Role name. +// We generate the UUID using UUIDv5 with a seed string based on the group+kind of the RoleDefinition and the +// namespace+name it's deployed into. +// We include the namespace and name to ensure no two RoleDefinitions in the same cluster can end up +// with the same UUID. +// We include the group and kind to ensure that different kinds of resources get different UUIDs. This isn't +// entirely required by Azure, but it makes sense to avoid collisions between two resources of different types +// even if they have the same namespace and name. +// In the rare case users have multiple ASO instances with resources in the same namespace in each cluster +// having the same name but not actually pointing to the same Azure resource (maybe in a different subscription?) +// they can avoid name conflicts by explicitly specifying AzureName for their RoleDefinition. +func (definition *RoleDefinition) defaultAzureName() { + // If owner is not set we can't default AzureName, but the request will be rejected anyway for lack of owner. + if definition.Spec.Owner == nil { + return + } + + if definition.AzureName() == "" { + gk := definition.GroupVersionKind().GroupKind() + definition.Spec.AzureName = randextensions.MakeUUIDName( + definition.Name, + randextensions.MakeUniqueOwnerScopedString( + definition.Owner(), + gk, + definition.Namespace, + definition.Name)) + } +} diff --git a/v2/api/authorization/v1api20220401/role_definition_spec_arm_types_gen.go b/v2/api/authorization/v1api20220401/role_definition_spec_arm_types_gen.go new file mode 100644 index 00000000000..b8301b2f793 --- /dev/null +++ b/v2/api/authorization/v1api20220401/role_definition_spec_arm_types_gen.go @@ -0,0 +1,62 @@ +// Code generated by azure-service-operator-codegen. DO NOT EDIT. +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. +package v1api20220401 + +import "github.com/Azure/azure-service-operator/v2/pkg/genruntime" + +type RoleDefinition_Spec_ARM struct { + Name string `json:"name,omitempty"` + + // Properties: Role definition properties. + Properties *RoleDefinitionProperties_ARM `json:"properties,omitempty"` +} + +var _ genruntime.ARMResourceSpec = &RoleDefinition_Spec_ARM{} + +// GetAPIVersion returns the ARM API version of the resource. This is always "2022-04-01" +func (definition RoleDefinition_Spec_ARM) GetAPIVersion() string { + return string(APIVersion_Value) +} + +// GetName returns the Name of the resource +func (definition *RoleDefinition_Spec_ARM) GetName() string { + return definition.Name +} + +// GetType returns the ARM Type of the resource. This is always "Microsoft.Authorization/roleDefinitions" +func (definition *RoleDefinition_Spec_ARM) GetType() string { + return "Microsoft.Authorization/roleDefinitions" +} + +// Role definition properties. +type RoleDefinitionProperties_ARM struct { + AssignableScopes []string `json:"assignableScopes,omitempty"` + + // Description: The role definition description. + Description *string `json:"description,omitempty"` + + // Permissions: Role definition permissions. + Permissions []Permission_ARM `json:"permissions,omitempty"` + + // RoleName: The role name. + RoleName *string `json:"roleName,omitempty"` + + // Type: The role type. + Type *string `json:"type,omitempty"` +} + +// Role definition permissions. +type Permission_ARM struct { + // Actions: Allowed actions. + Actions []string `json:"actions,omitempty"` + + // DataActions: Allowed Data actions. + DataActions []string `json:"dataActions,omitempty"` + + // NotActions: Denied actions. + NotActions []string `json:"notActions,omitempty"` + + // NotDataActions: Denied Data actions. + NotDataActions []string `json:"notDataActions,omitempty"` +} diff --git a/v2/api/authorization/v1api20220401/role_definition_spec_arm_types_gen_test.go b/v2/api/authorization/v1api20220401/role_definition_spec_arm_types_gen_test.go new file mode 100644 index 00000000000..300cb3e5668 --- /dev/null +++ b/v2/api/authorization/v1api20220401/role_definition_spec_arm_types_gen_test.go @@ -0,0 +1,234 @@ +// Code generated by azure-service-operator-codegen. DO NOT EDIT. +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. +package v1api20220401 + +import ( + "encoding/json" + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/kr/pretty" + "github.com/kylelemons/godebug/diff" + "github.com/leanovate/gopter" + "github.com/leanovate/gopter/gen" + "github.com/leanovate/gopter/prop" + "os" + "reflect" + "testing" +) + +func Test_RoleDefinition_Spec_ARM_WhenSerializedToJson_DeserializesAsEqual(t *testing.T) { + t.Parallel() + parameters := gopter.DefaultTestParameters() + parameters.MinSuccessfulTests = 80 + parameters.MaxSize = 3 + properties := gopter.NewProperties(parameters) + properties.Property( + "Round trip of RoleDefinition_Spec_ARM via JSON returns original", + prop.ForAll(RunJSONSerializationTestForRoleDefinition_Spec_ARM, RoleDefinition_Spec_ARMGenerator())) + properties.TestingRun(t, gopter.NewFormatedReporter(true, 240, os.Stdout)) +} + +// RunJSONSerializationTestForRoleDefinition_Spec_ARM runs a test to see if a specific instance of RoleDefinition_Spec_ARM round trips to JSON and back losslessly +func RunJSONSerializationTestForRoleDefinition_Spec_ARM(subject RoleDefinition_Spec_ARM) string { + // Serialize to JSON + bin, err := json.Marshal(subject) + if err != nil { + return err.Error() + } + + // Deserialize back into memory + var actual RoleDefinition_Spec_ARM + err = json.Unmarshal(bin, &actual) + if err != nil { + return err.Error() + } + + // Check for outcome + match := cmp.Equal(subject, actual, cmpopts.EquateEmpty()) + if !match { + actualFmt := pretty.Sprint(actual) + subjectFmt := pretty.Sprint(subject) + result := diff.Diff(subjectFmt, actualFmt) + return result + } + + return "" +} + +// Generator of RoleDefinition_Spec_ARM instances for property testing - lazily instantiated by +// RoleDefinition_Spec_ARMGenerator() +var roleDefinition_Spec_ARMGenerator gopter.Gen + +// RoleDefinition_Spec_ARMGenerator returns a generator of RoleDefinition_Spec_ARM instances for property testing. +// We first initialize roleDefinition_Spec_ARMGenerator with a simplified generator based on the +// fields with primitive types then replacing it with a more complex one that also handles complex fields +// to ensure any cycles in the object graph properly terminate. +func RoleDefinition_Spec_ARMGenerator() gopter.Gen { + if roleDefinition_Spec_ARMGenerator != nil { + return roleDefinition_Spec_ARMGenerator + } + + generators := make(map[string]gopter.Gen) + AddIndependentPropertyGeneratorsForRoleDefinition_Spec_ARM(generators) + roleDefinition_Spec_ARMGenerator = gen.Struct(reflect.TypeOf(RoleDefinition_Spec_ARM{}), generators) + + // The above call to gen.Struct() captures the map, so create a new one + generators = make(map[string]gopter.Gen) + AddIndependentPropertyGeneratorsForRoleDefinition_Spec_ARM(generators) + AddRelatedPropertyGeneratorsForRoleDefinition_Spec_ARM(generators) + roleDefinition_Spec_ARMGenerator = gen.Struct(reflect.TypeOf(RoleDefinition_Spec_ARM{}), generators) + + return roleDefinition_Spec_ARMGenerator +} + +// AddIndependentPropertyGeneratorsForRoleDefinition_Spec_ARM is a factory method for creating gopter generators +func AddIndependentPropertyGeneratorsForRoleDefinition_Spec_ARM(gens map[string]gopter.Gen) { + gens["Name"] = gen.AlphaString() +} + +// AddRelatedPropertyGeneratorsForRoleDefinition_Spec_ARM is a factory method for creating gopter generators +func AddRelatedPropertyGeneratorsForRoleDefinition_Spec_ARM(gens map[string]gopter.Gen) { + gens["Properties"] = gen.PtrOf(RoleDefinitionProperties_ARMGenerator()) +} + +func Test_RoleDefinitionProperties_ARM_WhenSerializedToJson_DeserializesAsEqual(t *testing.T) { + t.Parallel() + parameters := gopter.DefaultTestParameters() + parameters.MinSuccessfulTests = 100 + parameters.MaxSize = 3 + properties := gopter.NewProperties(parameters) + properties.Property( + "Round trip of RoleDefinitionProperties_ARM via JSON returns original", + prop.ForAll(RunJSONSerializationTestForRoleDefinitionProperties_ARM, RoleDefinitionProperties_ARMGenerator())) + properties.TestingRun(t, gopter.NewFormatedReporter(true, 240, os.Stdout)) +} + +// RunJSONSerializationTestForRoleDefinitionProperties_ARM runs a test to see if a specific instance of RoleDefinitionProperties_ARM round trips to JSON and back losslessly +func RunJSONSerializationTestForRoleDefinitionProperties_ARM(subject RoleDefinitionProperties_ARM) string { + // Serialize to JSON + bin, err := json.Marshal(subject) + if err != nil { + return err.Error() + } + + // Deserialize back into memory + var actual RoleDefinitionProperties_ARM + err = json.Unmarshal(bin, &actual) + if err != nil { + return err.Error() + } + + // Check for outcome + match := cmp.Equal(subject, actual, cmpopts.EquateEmpty()) + if !match { + actualFmt := pretty.Sprint(actual) + subjectFmt := pretty.Sprint(subject) + result := diff.Diff(subjectFmt, actualFmt) + return result + } + + return "" +} + +// Generator of RoleDefinitionProperties_ARM instances for property testing - lazily instantiated by +// RoleDefinitionProperties_ARMGenerator() +var roleDefinitionProperties_ARMGenerator gopter.Gen + +// RoleDefinitionProperties_ARMGenerator returns a generator of RoleDefinitionProperties_ARM instances for property testing. +// We first initialize roleDefinitionProperties_ARMGenerator with a simplified generator based on the +// fields with primitive types then replacing it with a more complex one that also handles complex fields +// to ensure any cycles in the object graph properly terminate. +func RoleDefinitionProperties_ARMGenerator() gopter.Gen { + if roleDefinitionProperties_ARMGenerator != nil { + return roleDefinitionProperties_ARMGenerator + } + + generators := make(map[string]gopter.Gen) + AddIndependentPropertyGeneratorsForRoleDefinitionProperties_ARM(generators) + roleDefinitionProperties_ARMGenerator = gen.Struct(reflect.TypeOf(RoleDefinitionProperties_ARM{}), generators) + + // The above call to gen.Struct() captures the map, so create a new one + generators = make(map[string]gopter.Gen) + AddIndependentPropertyGeneratorsForRoleDefinitionProperties_ARM(generators) + AddRelatedPropertyGeneratorsForRoleDefinitionProperties_ARM(generators) + roleDefinitionProperties_ARMGenerator = gen.Struct(reflect.TypeOf(RoleDefinitionProperties_ARM{}), generators) + + return roleDefinitionProperties_ARMGenerator +} + +// AddIndependentPropertyGeneratorsForRoleDefinitionProperties_ARM is a factory method for creating gopter generators +func AddIndependentPropertyGeneratorsForRoleDefinitionProperties_ARM(gens map[string]gopter.Gen) { + gens["AssignableScopes"] = gen.SliceOf(gen.AlphaString()) + gens["Description"] = gen.PtrOf(gen.AlphaString()) + gens["RoleName"] = gen.PtrOf(gen.AlphaString()) + gens["Type"] = gen.PtrOf(gen.AlphaString()) +} + +// AddRelatedPropertyGeneratorsForRoleDefinitionProperties_ARM is a factory method for creating gopter generators +func AddRelatedPropertyGeneratorsForRoleDefinitionProperties_ARM(gens map[string]gopter.Gen) { + gens["Permissions"] = gen.SliceOf(Permission_ARMGenerator()) +} + +func Test_Permission_ARM_WhenSerializedToJson_DeserializesAsEqual(t *testing.T) { + t.Parallel() + parameters := gopter.DefaultTestParameters() + parameters.MinSuccessfulTests = 100 + parameters.MaxSize = 3 + properties := gopter.NewProperties(parameters) + properties.Property( + "Round trip of Permission_ARM via JSON returns original", + prop.ForAll(RunJSONSerializationTestForPermission_ARM, Permission_ARMGenerator())) + properties.TestingRun(t, gopter.NewFormatedReporter(true, 240, os.Stdout)) +} + +// RunJSONSerializationTestForPermission_ARM runs a test to see if a specific instance of Permission_ARM round trips to JSON and back losslessly +func RunJSONSerializationTestForPermission_ARM(subject Permission_ARM) string { + // Serialize to JSON + bin, err := json.Marshal(subject) + if err != nil { + return err.Error() + } + + // Deserialize back into memory + var actual Permission_ARM + err = json.Unmarshal(bin, &actual) + if err != nil { + return err.Error() + } + + // Check for outcome + match := cmp.Equal(subject, actual, cmpopts.EquateEmpty()) + if !match { + actualFmt := pretty.Sprint(actual) + subjectFmt := pretty.Sprint(subject) + result := diff.Diff(subjectFmt, actualFmt) + return result + } + + return "" +} + +// Generator of Permission_ARM instances for property testing - lazily instantiated by Permission_ARMGenerator() +var permission_ARMGenerator gopter.Gen + +// Permission_ARMGenerator returns a generator of Permission_ARM instances for property testing. +func Permission_ARMGenerator() gopter.Gen { + if permission_ARMGenerator != nil { + return permission_ARMGenerator + } + + generators := make(map[string]gopter.Gen) + AddIndependentPropertyGeneratorsForPermission_ARM(generators) + permission_ARMGenerator = gen.Struct(reflect.TypeOf(Permission_ARM{}), generators) + + return permission_ARMGenerator +} + +// AddIndependentPropertyGeneratorsForPermission_ARM is a factory method for creating gopter generators +func AddIndependentPropertyGeneratorsForPermission_ARM(gens map[string]gopter.Gen) { + gens["Actions"] = gen.SliceOf(gen.AlphaString()) + gens["DataActions"] = gen.SliceOf(gen.AlphaString()) + gens["NotActions"] = gen.SliceOf(gen.AlphaString()) + gens["NotDataActions"] = gen.SliceOf(gen.AlphaString()) +} diff --git a/v2/api/authorization/v1api20220401/role_definition_status_arm_types_gen.go b/v2/api/authorization/v1api20220401/role_definition_status_arm_types_gen.go new file mode 100644 index 00000000000..1acd1259382 --- /dev/null +++ b/v2/api/authorization/v1api20220401/role_definition_status_arm_types_gen.go @@ -0,0 +1,64 @@ +// Code generated by azure-service-operator-codegen. DO NOT EDIT. +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. +package v1api20220401 + +// Role definition. +type RoleDefinition_STATUS_ARM struct { + // Id: The role definition ID. + Id *string `json:"id,omitempty"` + + // Name: The role definition name. + Name *string `json:"name,omitempty"` + + // Properties: Role definition properties. + Properties *RoleDefinitionProperties_STATUS_ARM `json:"properties,omitempty"` + + // Type: The role definition type. + Type *string `json:"type,omitempty"` +} + +// Role definition properties. +type RoleDefinitionProperties_STATUS_ARM struct { + // AssignableScopes: Role definition assignable scopes. + AssignableScopes []string `json:"assignableScopes,omitempty"` + + // CreatedBy: Id of the user who created the assignment + CreatedBy *string `json:"createdBy,omitempty"` + + // CreatedOn: Time it was created + CreatedOn *string `json:"createdOn,omitempty"` + + // Description: The role definition description. + Description *string `json:"description,omitempty"` + + // Permissions: Role definition permissions. + Permissions []Permission_STATUS_ARM `json:"permissions,omitempty"` + + // RoleName: The role name. + RoleName *string `json:"roleName,omitempty"` + + // Type: The role type. + Type *string `json:"type,omitempty"` + + // UpdatedBy: Id of the user who updated the assignment + UpdatedBy *string `json:"updatedBy,omitempty"` + + // UpdatedOn: Time it was updated + UpdatedOn *string `json:"updatedOn,omitempty"` +} + +// Role definition permissions. +type Permission_STATUS_ARM struct { + // Actions: Allowed actions. + Actions []string `json:"actions,omitempty"` + + // DataActions: Allowed Data actions. + DataActions []string `json:"dataActions,omitempty"` + + // NotActions: Denied actions. + NotActions []string `json:"notActions,omitempty"` + + // NotDataActions: Denied Data actions. + NotDataActions []string `json:"notDataActions,omitempty"` +} diff --git a/v2/api/authorization/v1api20220401/role_definition_status_arm_types_gen_test.go b/v2/api/authorization/v1api20220401/role_definition_status_arm_types_gen_test.go new file mode 100644 index 00000000000..03a82b90f9a --- /dev/null +++ b/v2/api/authorization/v1api20220401/role_definition_status_arm_types_gen_test.go @@ -0,0 +1,241 @@ +// Code generated by azure-service-operator-codegen. DO NOT EDIT. +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. +package v1api20220401 + +import ( + "encoding/json" + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/kr/pretty" + "github.com/kylelemons/godebug/diff" + "github.com/leanovate/gopter" + "github.com/leanovate/gopter/gen" + "github.com/leanovate/gopter/prop" + "os" + "reflect" + "testing" +) + +func Test_RoleDefinition_STATUS_ARM_WhenSerializedToJson_DeserializesAsEqual(t *testing.T) { + t.Parallel() + parameters := gopter.DefaultTestParameters() + parameters.MinSuccessfulTests = 80 + parameters.MaxSize = 3 + properties := gopter.NewProperties(parameters) + properties.Property( + "Round trip of RoleDefinition_STATUS_ARM via JSON returns original", + prop.ForAll(RunJSONSerializationTestForRoleDefinition_STATUS_ARM, RoleDefinition_STATUS_ARMGenerator())) + properties.TestingRun(t, gopter.NewFormatedReporter(true, 240, os.Stdout)) +} + +// RunJSONSerializationTestForRoleDefinition_STATUS_ARM runs a test to see if a specific instance of RoleDefinition_STATUS_ARM round trips to JSON and back losslessly +func RunJSONSerializationTestForRoleDefinition_STATUS_ARM(subject RoleDefinition_STATUS_ARM) string { + // Serialize to JSON + bin, err := json.Marshal(subject) + if err != nil { + return err.Error() + } + + // Deserialize back into memory + var actual RoleDefinition_STATUS_ARM + err = json.Unmarshal(bin, &actual) + if err != nil { + return err.Error() + } + + // Check for outcome + match := cmp.Equal(subject, actual, cmpopts.EquateEmpty()) + if !match { + actualFmt := pretty.Sprint(actual) + subjectFmt := pretty.Sprint(subject) + result := diff.Diff(subjectFmt, actualFmt) + return result + } + + return "" +} + +// Generator of RoleDefinition_STATUS_ARM instances for property testing - lazily instantiated by +// RoleDefinition_STATUS_ARMGenerator() +var roleDefinition_STATUS_ARMGenerator gopter.Gen + +// RoleDefinition_STATUS_ARMGenerator returns a generator of RoleDefinition_STATUS_ARM instances for property testing. +// We first initialize roleDefinition_STATUS_ARMGenerator with a simplified generator based on the +// fields with primitive types then replacing it with a more complex one that also handles complex fields +// to ensure any cycles in the object graph properly terminate. +func RoleDefinition_STATUS_ARMGenerator() gopter.Gen { + if roleDefinition_STATUS_ARMGenerator != nil { + return roleDefinition_STATUS_ARMGenerator + } + + generators := make(map[string]gopter.Gen) + AddIndependentPropertyGeneratorsForRoleDefinition_STATUS_ARM(generators) + roleDefinition_STATUS_ARMGenerator = gen.Struct(reflect.TypeOf(RoleDefinition_STATUS_ARM{}), generators) + + // The above call to gen.Struct() captures the map, so create a new one + generators = make(map[string]gopter.Gen) + AddIndependentPropertyGeneratorsForRoleDefinition_STATUS_ARM(generators) + AddRelatedPropertyGeneratorsForRoleDefinition_STATUS_ARM(generators) + roleDefinition_STATUS_ARMGenerator = gen.Struct(reflect.TypeOf(RoleDefinition_STATUS_ARM{}), generators) + + return roleDefinition_STATUS_ARMGenerator +} + +// AddIndependentPropertyGeneratorsForRoleDefinition_STATUS_ARM is a factory method for creating gopter generators +func AddIndependentPropertyGeneratorsForRoleDefinition_STATUS_ARM(gens map[string]gopter.Gen) { + gens["Id"] = gen.PtrOf(gen.AlphaString()) + gens["Name"] = gen.PtrOf(gen.AlphaString()) + gens["Type"] = gen.PtrOf(gen.AlphaString()) +} + +// AddRelatedPropertyGeneratorsForRoleDefinition_STATUS_ARM is a factory method for creating gopter generators +func AddRelatedPropertyGeneratorsForRoleDefinition_STATUS_ARM(gens map[string]gopter.Gen) { + gens["Properties"] = gen.PtrOf(RoleDefinitionProperties_STATUS_ARMGenerator()) +} + +func Test_RoleDefinitionProperties_STATUS_ARM_WhenSerializedToJson_DeserializesAsEqual(t *testing.T) { + t.Parallel() + parameters := gopter.DefaultTestParameters() + parameters.MinSuccessfulTests = 80 + parameters.MaxSize = 3 + properties := gopter.NewProperties(parameters) + properties.Property( + "Round trip of RoleDefinitionProperties_STATUS_ARM via JSON returns original", + prop.ForAll(RunJSONSerializationTestForRoleDefinitionProperties_STATUS_ARM, RoleDefinitionProperties_STATUS_ARMGenerator())) + properties.TestingRun(t, gopter.NewFormatedReporter(true, 240, os.Stdout)) +} + +// RunJSONSerializationTestForRoleDefinitionProperties_STATUS_ARM runs a test to see if a specific instance of RoleDefinitionProperties_STATUS_ARM round trips to JSON and back losslessly +func RunJSONSerializationTestForRoleDefinitionProperties_STATUS_ARM(subject RoleDefinitionProperties_STATUS_ARM) string { + // Serialize to JSON + bin, err := json.Marshal(subject) + if err != nil { + return err.Error() + } + + // Deserialize back into memory + var actual RoleDefinitionProperties_STATUS_ARM + err = json.Unmarshal(bin, &actual) + if err != nil { + return err.Error() + } + + // Check for outcome + match := cmp.Equal(subject, actual, cmpopts.EquateEmpty()) + if !match { + actualFmt := pretty.Sprint(actual) + subjectFmt := pretty.Sprint(subject) + result := diff.Diff(subjectFmt, actualFmt) + return result + } + + return "" +} + +// Generator of RoleDefinitionProperties_STATUS_ARM instances for property testing - lazily instantiated by +// RoleDefinitionProperties_STATUS_ARMGenerator() +var roleDefinitionProperties_STATUS_ARMGenerator gopter.Gen + +// RoleDefinitionProperties_STATUS_ARMGenerator returns a generator of RoleDefinitionProperties_STATUS_ARM instances for property testing. +// We first initialize roleDefinitionProperties_STATUS_ARMGenerator with a simplified generator based on the +// fields with primitive types then replacing it with a more complex one that also handles complex fields +// to ensure any cycles in the object graph properly terminate. +func RoleDefinitionProperties_STATUS_ARMGenerator() gopter.Gen { + if roleDefinitionProperties_STATUS_ARMGenerator != nil { + return roleDefinitionProperties_STATUS_ARMGenerator + } + + generators := make(map[string]gopter.Gen) + AddIndependentPropertyGeneratorsForRoleDefinitionProperties_STATUS_ARM(generators) + roleDefinitionProperties_STATUS_ARMGenerator = gen.Struct(reflect.TypeOf(RoleDefinitionProperties_STATUS_ARM{}), generators) + + // The above call to gen.Struct() captures the map, so create a new one + generators = make(map[string]gopter.Gen) + AddIndependentPropertyGeneratorsForRoleDefinitionProperties_STATUS_ARM(generators) + AddRelatedPropertyGeneratorsForRoleDefinitionProperties_STATUS_ARM(generators) + roleDefinitionProperties_STATUS_ARMGenerator = gen.Struct(reflect.TypeOf(RoleDefinitionProperties_STATUS_ARM{}), generators) + + return roleDefinitionProperties_STATUS_ARMGenerator +} + +// AddIndependentPropertyGeneratorsForRoleDefinitionProperties_STATUS_ARM is a factory method for creating gopter generators +func AddIndependentPropertyGeneratorsForRoleDefinitionProperties_STATUS_ARM(gens map[string]gopter.Gen) { + gens["AssignableScopes"] = gen.SliceOf(gen.AlphaString()) + gens["CreatedBy"] = gen.PtrOf(gen.AlphaString()) + gens["CreatedOn"] = gen.PtrOf(gen.AlphaString()) + gens["Description"] = gen.PtrOf(gen.AlphaString()) + gens["RoleName"] = gen.PtrOf(gen.AlphaString()) + gens["Type"] = gen.PtrOf(gen.AlphaString()) + gens["UpdatedBy"] = gen.PtrOf(gen.AlphaString()) + gens["UpdatedOn"] = gen.PtrOf(gen.AlphaString()) +} + +// AddRelatedPropertyGeneratorsForRoleDefinitionProperties_STATUS_ARM is a factory method for creating gopter generators +func AddRelatedPropertyGeneratorsForRoleDefinitionProperties_STATUS_ARM(gens map[string]gopter.Gen) { + gens["Permissions"] = gen.SliceOf(Permission_STATUS_ARMGenerator()) +} + +func Test_Permission_STATUS_ARM_WhenSerializedToJson_DeserializesAsEqual(t *testing.T) { + t.Parallel() + parameters := gopter.DefaultTestParameters() + parameters.MinSuccessfulTests = 80 + parameters.MaxSize = 3 + properties := gopter.NewProperties(parameters) + properties.Property( + "Round trip of Permission_STATUS_ARM via JSON returns original", + prop.ForAll(RunJSONSerializationTestForPermission_STATUS_ARM, Permission_STATUS_ARMGenerator())) + properties.TestingRun(t, gopter.NewFormatedReporter(true, 240, os.Stdout)) +} + +// RunJSONSerializationTestForPermission_STATUS_ARM runs a test to see if a specific instance of Permission_STATUS_ARM round trips to JSON and back losslessly +func RunJSONSerializationTestForPermission_STATUS_ARM(subject Permission_STATUS_ARM) string { + // Serialize to JSON + bin, err := json.Marshal(subject) + if err != nil { + return err.Error() + } + + // Deserialize back into memory + var actual Permission_STATUS_ARM + err = json.Unmarshal(bin, &actual) + if err != nil { + return err.Error() + } + + // Check for outcome + match := cmp.Equal(subject, actual, cmpopts.EquateEmpty()) + if !match { + actualFmt := pretty.Sprint(actual) + subjectFmt := pretty.Sprint(subject) + result := diff.Diff(subjectFmt, actualFmt) + return result + } + + return "" +} + +// Generator of Permission_STATUS_ARM instances for property testing - lazily instantiated by +// Permission_STATUS_ARMGenerator() +var permission_STATUS_ARMGenerator gopter.Gen + +// Permission_STATUS_ARMGenerator returns a generator of Permission_STATUS_ARM instances for property testing. +func Permission_STATUS_ARMGenerator() gopter.Gen { + if permission_STATUS_ARMGenerator != nil { + return permission_STATUS_ARMGenerator + } + + generators := make(map[string]gopter.Gen) + AddIndependentPropertyGeneratorsForPermission_STATUS_ARM(generators) + permission_STATUS_ARMGenerator = gen.Struct(reflect.TypeOf(Permission_STATUS_ARM{}), generators) + + return permission_STATUS_ARMGenerator +} + +// AddIndependentPropertyGeneratorsForPermission_STATUS_ARM is a factory method for creating gopter generators +func AddIndependentPropertyGeneratorsForPermission_STATUS_ARM(gens map[string]gopter.Gen) { + gens["Actions"] = gen.SliceOf(gen.AlphaString()) + gens["DataActions"] = gen.SliceOf(gen.AlphaString()) + gens["NotActions"] = gen.SliceOf(gen.AlphaString()) + gens["NotDataActions"] = gen.SliceOf(gen.AlphaString()) +} diff --git a/v2/api/authorization/v1api20220401/role_definition_types_gen.go b/v2/api/authorization/v1api20220401/role_definition_types_gen.go new file mode 100644 index 00000000000..989bc71b4c7 --- /dev/null +++ b/v2/api/authorization/v1api20220401/role_definition_types_gen.go @@ -0,0 +1,1267 @@ +// Code generated by azure-service-operator-codegen. DO NOT EDIT. +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. +package v1api20220401 + +import ( + "fmt" + storage "github.com/Azure/azure-service-operator/v2/api/authorization/v1api20220401/storage" + "github.com/Azure/azure-service-operator/v2/internal/reflecthelpers" + "github.com/Azure/azure-service-operator/v2/pkg/genruntime" + "github.com/Azure/azure-service-operator/v2/pkg/genruntime/conditions" + "github.com/pkg/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "sigs.k8s.io/controller-runtime/pkg/conversion" + "sigs.k8s.io/controller-runtime/pkg/webhook/admission" +) + +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status +// +kubebuilder:printcolumn:name="Ready",type="string",JSONPath=".status.conditions[?(@.type=='Ready')].status" +// +kubebuilder:printcolumn:name="Severity",type="string",JSONPath=".status.conditions[?(@.type=='Ready')].severity" +// +kubebuilder:printcolumn:name="Reason",type="string",JSONPath=".status.conditions[?(@.type=='Ready')].reason" +// +kubebuilder:printcolumn:name="Message",type="string",JSONPath=".status.conditions[?(@.type=='Ready')].message" +// Generator information: +// - Generated from: /authorization/resource-manager/Microsoft.Authorization/stable/2022-04-01/authorization-RoleDefinitionsCalls.json +// - ARM URI: /{scope}/providers/Microsoft.Authorization/roleDefinitions/{roleDefinitionId} +type RoleDefinition struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + Spec RoleDefinition_Spec `json:"spec,omitempty"` + Status RoleDefinition_STATUS `json:"status,omitempty"` +} + +var _ conditions.Conditioner = &RoleDefinition{} + +// GetConditions returns the conditions of the resource +func (definition *RoleDefinition) GetConditions() conditions.Conditions { + return definition.Status.Conditions +} + +// SetConditions sets the conditions on the resource status +func (definition *RoleDefinition) SetConditions(conditions conditions.Conditions) { + definition.Status.Conditions = conditions +} + +var _ conversion.Convertible = &RoleDefinition{} + +// ConvertFrom populates our RoleDefinition from the provided hub RoleDefinition +func (definition *RoleDefinition) ConvertFrom(hub conversion.Hub) error { + source, ok := hub.(*storage.RoleDefinition) + if !ok { + return fmt.Errorf("expected authorization/v1api20220401/storage/RoleDefinition but received %T instead", hub) + } + + return definition.AssignProperties_From_RoleDefinition(source) +} + +// ConvertTo populates the provided hub RoleDefinition from our RoleDefinition +func (definition *RoleDefinition) ConvertTo(hub conversion.Hub) error { + destination, ok := hub.(*storage.RoleDefinition) + if !ok { + return fmt.Errorf("expected authorization/v1api20220401/storage/RoleDefinition but received %T instead", hub) + } + + return definition.AssignProperties_To_RoleDefinition(destination) +} + +// +kubebuilder:webhook:path=/mutate-authorization-azure-com-v1api20220401-roledefinition,mutating=true,sideEffects=None,matchPolicy=Exact,failurePolicy=fail,groups=authorization.azure.com,resources=roledefinitions,verbs=create;update,versions=v1api20220401,name=default.v1api20220401.roledefinitions.authorization.azure.com,admissionReviewVersions=v1 + +var _ admission.Defaulter = &RoleDefinition{} + +// Default applies defaults to the RoleDefinition resource +func (definition *RoleDefinition) Default() { + definition.defaultImpl() + var temp any = definition + if runtimeDefaulter, ok := temp.(genruntime.Defaulter); ok { + runtimeDefaulter.CustomDefault() + } +} + +// defaultImpl applies the code generated defaults to the RoleDefinition resource +func (definition *RoleDefinition) defaultImpl() {} + +var _ genruntime.ImportableResource = &RoleDefinition{} + +// InitializeSpec initializes the spec for this resource from the given status +func (definition *RoleDefinition) InitializeSpec(status genruntime.ConvertibleStatus) error { + if s, ok := status.(*RoleDefinition_STATUS); ok { + return definition.Spec.Initialize_From_RoleDefinition_STATUS(s) + } + + return fmt.Errorf("expected Status of type RoleDefinition_STATUS but received %T instead", status) +} + +var _ genruntime.KubernetesResource = &RoleDefinition{} + +// AzureName returns the Azure name of the resource +func (definition *RoleDefinition) AzureName() string { + return definition.Spec.AzureName +} + +// GetAPIVersion returns the ARM API version of the resource. This is always "2022-04-01" +func (definition RoleDefinition) GetAPIVersion() string { + return string(APIVersion_Value) +} + +// GetResourceScope returns the scope of the resource +func (definition *RoleDefinition) GetResourceScope() genruntime.ResourceScope { + return genruntime.ResourceScopeExtension +} + +// GetSpec returns the specification of this resource +func (definition *RoleDefinition) GetSpec() genruntime.ConvertibleSpec { + return &definition.Spec +} + +// GetStatus returns the status of this resource +func (definition *RoleDefinition) GetStatus() genruntime.ConvertibleStatus { + return &definition.Status +} + +// GetSupportedOperations returns the operations supported by the resource +func (definition *RoleDefinition) GetSupportedOperations() []genruntime.ResourceOperation { + return []genruntime.ResourceOperation{ + genruntime.ResourceOperationDelete, + genruntime.ResourceOperationGet, + genruntime.ResourceOperationPut, + } +} + +// GetType returns the ARM Type of the resource. This is always "Microsoft.Authorization/roleDefinitions" +func (definition *RoleDefinition) GetType() string { + return "Microsoft.Authorization/roleDefinitions" +} + +// NewEmptyStatus returns a new empty (blank) status +func (definition *RoleDefinition) NewEmptyStatus() genruntime.ConvertibleStatus { + return &RoleDefinition_STATUS{} +} + +// Owner returns the ResourceReference of the owner +func (definition *RoleDefinition) Owner() *genruntime.ResourceReference { + return definition.Spec.Owner.AsResourceReference() +} + +// SetStatus sets the status of this resource +func (definition *RoleDefinition) SetStatus(status genruntime.ConvertibleStatus) error { + // If we have exactly the right type of status, assign it + if st, ok := status.(*RoleDefinition_STATUS); ok { + definition.Status = *st + return nil + } + + // Convert status to required version + var st RoleDefinition_STATUS + err := status.ConvertStatusTo(&st) + if err != nil { + return errors.Wrap(err, "failed to convert status") + } + + definition.Status = st + return nil +} + +// +kubebuilder:webhook:path=/validate-authorization-azure-com-v1api20220401-roledefinition,mutating=false,sideEffects=None,matchPolicy=Exact,failurePolicy=fail,groups=authorization.azure.com,resources=roledefinitions,verbs=create;update,versions=v1api20220401,name=validate.v1api20220401.roledefinitions.authorization.azure.com,admissionReviewVersions=v1 + +var _ admission.Validator = &RoleDefinition{} + +// ValidateCreate validates the creation of the resource +func (definition *RoleDefinition) ValidateCreate() (admission.Warnings, error) { + validations := definition.createValidations() + var temp any = definition + if runtimeValidator, ok := temp.(genruntime.Validator); ok { + validations = append(validations, runtimeValidator.CreateValidations()...) + } + return genruntime.ValidateCreate(validations) +} + +// ValidateDelete validates the deletion of the resource +func (definition *RoleDefinition) ValidateDelete() (admission.Warnings, error) { + validations := definition.deleteValidations() + var temp any = definition + if runtimeValidator, ok := temp.(genruntime.Validator); ok { + validations = append(validations, runtimeValidator.DeleteValidations()...) + } + return genruntime.ValidateDelete(validations) +} + +// ValidateUpdate validates an update of the resource +func (definition *RoleDefinition) ValidateUpdate(old runtime.Object) (admission.Warnings, error) { + validations := definition.updateValidations() + var temp any = definition + if runtimeValidator, ok := temp.(genruntime.Validator); ok { + validations = append(validations, runtimeValidator.UpdateValidations()...) + } + return genruntime.ValidateUpdate(old, validations) +} + +// createValidations validates the creation of the resource +func (definition *RoleDefinition) createValidations() []func() (admission.Warnings, error) { + return []func() (admission.Warnings, error){definition.validateResourceReferences} +} + +// deleteValidations validates the deletion of the resource +func (definition *RoleDefinition) deleteValidations() []func() (admission.Warnings, error) { + return nil +} + +// updateValidations validates the update of the resource +func (definition *RoleDefinition) updateValidations() []func(old runtime.Object) (admission.Warnings, error) { + return []func(old runtime.Object) (admission.Warnings, error){ + func(old runtime.Object) (admission.Warnings, error) { + return definition.validateResourceReferences() + }, + definition.validateWriteOnceProperties} +} + +// validateResourceReferences validates all resource references +func (definition *RoleDefinition) validateResourceReferences() (admission.Warnings, error) { + refs, err := reflecthelpers.FindResourceReferences(&definition.Spec) + if err != nil { + return nil, err + } + return genruntime.ValidateResourceReferences(refs) +} + +// validateWriteOnceProperties validates all WriteOnce properties +func (definition *RoleDefinition) validateWriteOnceProperties(old runtime.Object) (admission.Warnings, error) { + oldObj, ok := old.(*RoleDefinition) + if !ok { + return nil, nil + } + + return genruntime.ValidateWriteOnceProperties(oldObj, definition) +} + +// AssignProperties_From_RoleDefinition populates our RoleDefinition from the provided source RoleDefinition +func (definition *RoleDefinition) AssignProperties_From_RoleDefinition(source *storage.RoleDefinition) error { + + // ObjectMeta + definition.ObjectMeta = *source.ObjectMeta.DeepCopy() + + // Spec + var spec RoleDefinition_Spec + err := spec.AssignProperties_From_RoleDefinition_Spec(&source.Spec) + if err != nil { + return errors.Wrap(err, "calling AssignProperties_From_RoleDefinition_Spec() to populate field Spec") + } + definition.Spec = spec + + // Status + var status RoleDefinition_STATUS + err = status.AssignProperties_From_RoleDefinition_STATUS(&source.Status) + if err != nil { + return errors.Wrap(err, "calling AssignProperties_From_RoleDefinition_STATUS() to populate field Status") + } + definition.Status = status + + // No error + return nil +} + +// AssignProperties_To_RoleDefinition populates the provided destination RoleDefinition from our RoleDefinition +func (definition *RoleDefinition) AssignProperties_To_RoleDefinition(destination *storage.RoleDefinition) error { + + // ObjectMeta + destination.ObjectMeta = *definition.ObjectMeta.DeepCopy() + + // Spec + var spec storage.RoleDefinition_Spec + err := definition.Spec.AssignProperties_To_RoleDefinition_Spec(&spec) + if err != nil { + return errors.Wrap(err, "calling AssignProperties_To_RoleDefinition_Spec() to populate field Spec") + } + destination.Spec = spec + + // Status + var status storage.RoleDefinition_STATUS + err = definition.Status.AssignProperties_To_RoleDefinition_STATUS(&status) + if err != nil { + return errors.Wrap(err, "calling AssignProperties_To_RoleDefinition_STATUS() to populate field Status") + } + destination.Status = status + + // No error + return nil +} + +// OriginalGVK returns a GroupValueKind for the original API version used to create the resource +func (definition *RoleDefinition) OriginalGVK() *schema.GroupVersionKind { + return &schema.GroupVersionKind{ + Group: GroupVersion.Group, + Version: definition.Spec.OriginalVersion(), + Kind: "RoleDefinition", + } +} + +// +kubebuilder:object:root=true +// Generator information: +// - Generated from: /authorization/resource-manager/Microsoft.Authorization/stable/2022-04-01/authorization-RoleDefinitionsCalls.json +// - ARM URI: /{scope}/providers/Microsoft.Authorization/roleDefinitions/{roleDefinitionId} +type RoleDefinitionList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []RoleDefinition `json:"items"` +} + +type RoleDefinition_Spec struct { + // AssignableScopesReferences: Role definition assignable scopes. + AssignableScopesReferences []genruntime.ResourceReference `armReference:"AssignableScopes" json:"assignableScopesReferences,omitempty"` + + // AzureName: The name of the resource in Azure. This is often the same as the name of the resource in Kubernetes but it + // doesn't have to be. + AzureName string `json:"azureName,omitempty"` + + // Description: The role definition description. + Description *string `json:"description,omitempty"` + + // +kubebuilder:validation:Required + // Owner: The owner of the resource. The owner controls where the resource goes when it is deployed. The owner also + // controls the resources lifecycle. When the owner is deleted the resource will also be deleted. This resource is an + // extension resource, which means that any other Azure resource can be its owner. + Owner *genruntime.ArbitraryOwnerReference `json:"owner,omitempty"` + + // Permissions: Role definition permissions. + Permissions []Permission `json:"permissions,omitempty"` + + // RoleName: The role name. + RoleName *string `json:"roleName,omitempty"` + + // Type: The role type. + Type *string `json:"type,omitempty"` +} + +var _ genruntime.ARMTransformer = &RoleDefinition_Spec{} + +// ConvertToARM converts from a Kubernetes CRD object to an ARM object +func (definition *RoleDefinition_Spec) ConvertToARM(resolved genruntime.ConvertToARMResolvedDetails) (interface{}, error) { + if definition == nil { + return nil, nil + } + result := &RoleDefinition_Spec_ARM{} + + // Set property "Name": + result.Name = resolved.Name + + // Set property "Properties": + if definition.AssignableScopesReferences != nil || + definition.Description != nil || + definition.Permissions != nil || + definition.RoleName != nil || + definition.Type != nil { + result.Properties = &RoleDefinitionProperties_ARM{} + } + for _, item := range definition.AssignableScopesReferences { + itemARMID, err := resolved.ResolvedReferences.Lookup(item) + if err != nil { + return nil, err + } + result.Properties.AssignableScopes = append(result.Properties.AssignableScopes, itemARMID) + } + if definition.Description != nil { + description := *definition.Description + result.Properties.Description = &description + } + for _, item := range definition.Permissions { + item_ARM, err := item.ConvertToARM(resolved) + if err != nil { + return nil, err + } + result.Properties.Permissions = append(result.Properties.Permissions, *item_ARM.(*Permission_ARM)) + } + if definition.RoleName != nil { + roleName := *definition.RoleName + result.Properties.RoleName = &roleName + } + if definition.Type != nil { + typeVar := *definition.Type + result.Properties.Type = &typeVar + } + return result, nil +} + +// NewEmptyARMValue returns an empty ARM value suitable for deserializing into +func (definition *RoleDefinition_Spec) NewEmptyARMValue() genruntime.ARMResourceStatus { + return &RoleDefinition_Spec_ARM{} +} + +// PopulateFromARM populates a Kubernetes CRD object from an Azure ARM object +func (definition *RoleDefinition_Spec) PopulateFromARM(owner genruntime.ArbitraryOwnerReference, armInput interface{}) error { + typedInput, ok := armInput.(RoleDefinition_Spec_ARM) + if !ok { + return fmt.Errorf("unexpected type supplied for PopulateFromARM() function. Expected RoleDefinition_Spec_ARM, got %T", armInput) + } + + // no assignment for property "AssignableScopesReferences" + + // Set property "AzureName": + definition.SetAzureName(genruntime.ExtractKubernetesResourceNameFromARMName(typedInput.Name)) + + // Set property "Description": + // copying flattened property: + if typedInput.Properties != nil { + if typedInput.Properties.Description != nil { + description := *typedInput.Properties.Description + definition.Description = &description + } + } + + // Set property "Owner": + definition.Owner = &owner + + // Set property "Permissions": + // copying flattened property: + if typedInput.Properties != nil { + for _, item := range typedInput.Properties.Permissions { + var item1 Permission + err := item1.PopulateFromARM(owner, item) + if err != nil { + return err + } + definition.Permissions = append(definition.Permissions, item1) + } + } + + // Set property "RoleName": + // copying flattened property: + if typedInput.Properties != nil { + if typedInput.Properties.RoleName != nil { + roleName := *typedInput.Properties.RoleName + definition.RoleName = &roleName + } + } + + // Set property "Type": + // copying flattened property: + if typedInput.Properties != nil { + if typedInput.Properties.Type != nil { + typeVar := *typedInput.Properties.Type + definition.Type = &typeVar + } + } + + // No error + return nil +} + +var _ genruntime.ConvertibleSpec = &RoleDefinition_Spec{} + +// ConvertSpecFrom populates our RoleDefinition_Spec from the provided source +func (definition *RoleDefinition_Spec) ConvertSpecFrom(source genruntime.ConvertibleSpec) error { + src, ok := source.(*storage.RoleDefinition_Spec) + if ok { + // Populate our instance from source + return definition.AssignProperties_From_RoleDefinition_Spec(src) + } + + // Convert to an intermediate form + src = &storage.RoleDefinition_Spec{} + err := src.ConvertSpecFrom(source) + if err != nil { + return errors.Wrap(err, "initial step of conversion in ConvertSpecFrom()") + } + + // Update our instance from src + err = definition.AssignProperties_From_RoleDefinition_Spec(src) + if err != nil { + return errors.Wrap(err, "final step of conversion in ConvertSpecFrom()") + } + + return nil +} + +// ConvertSpecTo populates the provided destination from our RoleDefinition_Spec +func (definition *RoleDefinition_Spec) ConvertSpecTo(destination genruntime.ConvertibleSpec) error { + dst, ok := destination.(*storage.RoleDefinition_Spec) + if ok { + // Populate destination from our instance + return definition.AssignProperties_To_RoleDefinition_Spec(dst) + } + + // Convert to an intermediate form + dst = &storage.RoleDefinition_Spec{} + err := definition.AssignProperties_To_RoleDefinition_Spec(dst) + if err != nil { + return errors.Wrap(err, "initial step of conversion in ConvertSpecTo()") + } + + // Update dst from our instance + err = dst.ConvertSpecTo(destination) + if err != nil { + return errors.Wrap(err, "final step of conversion in ConvertSpecTo()") + } + + return nil +} + +// AssignProperties_From_RoleDefinition_Spec populates our RoleDefinition_Spec from the provided source RoleDefinition_Spec +func (definition *RoleDefinition_Spec) AssignProperties_From_RoleDefinition_Spec(source *storage.RoleDefinition_Spec) error { + + // AssignableScopesReferences + if source.AssignableScopesReferences != nil { + assignableScopesReferenceList := make([]genruntime.ResourceReference, len(source.AssignableScopesReferences)) + for assignableScopesReferenceIndex, assignableScopesReferenceItem := range source.AssignableScopesReferences { + // Shadow the loop variable to avoid aliasing + assignableScopesReferenceItem := assignableScopesReferenceItem + assignableScopesReferenceList[assignableScopesReferenceIndex] = assignableScopesReferenceItem.Copy() + } + definition.AssignableScopesReferences = assignableScopesReferenceList + } else { + definition.AssignableScopesReferences = nil + } + + // AzureName + definition.AzureName = source.AzureName + + // Description + definition.Description = genruntime.ClonePointerToString(source.Description) + + // Owner + if source.Owner != nil { + owner := source.Owner.Copy() + definition.Owner = &owner + } else { + definition.Owner = nil + } + + // Permissions + if source.Permissions != nil { + permissionList := make([]Permission, len(source.Permissions)) + for permissionIndex, permissionItem := range source.Permissions { + // Shadow the loop variable to avoid aliasing + permissionItem := permissionItem + var permission Permission + err := permission.AssignProperties_From_Permission(&permissionItem) + if err != nil { + return errors.Wrap(err, "calling AssignProperties_From_Permission() to populate field Permissions") + } + permissionList[permissionIndex] = permission + } + definition.Permissions = permissionList + } else { + definition.Permissions = nil + } + + // RoleName + definition.RoleName = genruntime.ClonePointerToString(source.RoleName) + + // Type + definition.Type = genruntime.ClonePointerToString(source.Type) + + // No error + return nil +} + +// AssignProperties_To_RoleDefinition_Spec populates the provided destination RoleDefinition_Spec from our RoleDefinition_Spec +func (definition *RoleDefinition_Spec) AssignProperties_To_RoleDefinition_Spec(destination *storage.RoleDefinition_Spec) error { + // Create a new property bag + propertyBag := genruntime.NewPropertyBag() + + // AssignableScopesReferences + if definition.AssignableScopesReferences != nil { + assignableScopesReferenceList := make([]genruntime.ResourceReference, len(definition.AssignableScopesReferences)) + for assignableScopesReferenceIndex, assignableScopesReferenceItem := range definition.AssignableScopesReferences { + // Shadow the loop variable to avoid aliasing + assignableScopesReferenceItem := assignableScopesReferenceItem + assignableScopesReferenceList[assignableScopesReferenceIndex] = assignableScopesReferenceItem.Copy() + } + destination.AssignableScopesReferences = assignableScopesReferenceList + } else { + destination.AssignableScopesReferences = nil + } + + // AzureName + destination.AzureName = definition.AzureName + + // Description + destination.Description = genruntime.ClonePointerToString(definition.Description) + + // OriginalVersion + destination.OriginalVersion = definition.OriginalVersion() + + // Owner + if definition.Owner != nil { + owner := definition.Owner.Copy() + destination.Owner = &owner + } else { + destination.Owner = nil + } + + // Permissions + if definition.Permissions != nil { + permissionList := make([]storage.Permission, len(definition.Permissions)) + for permissionIndex, permissionItem := range definition.Permissions { + // Shadow the loop variable to avoid aliasing + permissionItem := permissionItem + var permission storage.Permission + err := permissionItem.AssignProperties_To_Permission(&permission) + if err != nil { + return errors.Wrap(err, "calling AssignProperties_To_Permission() to populate field Permissions") + } + permissionList[permissionIndex] = permission + } + destination.Permissions = permissionList + } else { + destination.Permissions = nil + } + + // RoleName + destination.RoleName = genruntime.ClonePointerToString(definition.RoleName) + + // Type + destination.Type = genruntime.ClonePointerToString(definition.Type) + + // Update the property bag + if len(propertyBag) > 0 { + destination.PropertyBag = propertyBag + } else { + destination.PropertyBag = nil + } + + // No error + return nil +} + +// Initialize_From_RoleDefinition_STATUS populates our RoleDefinition_Spec from the provided source RoleDefinition_STATUS +func (definition *RoleDefinition_Spec) Initialize_From_RoleDefinition_STATUS(source *RoleDefinition_STATUS) error { + + // Description + definition.Description = genruntime.ClonePointerToString(source.Description) + + // Permissions + if source.Permissions != nil { + permissionList := make([]Permission, len(source.Permissions)) + for permissionIndex, permissionItem := range source.Permissions { + // Shadow the loop variable to avoid aliasing + permissionItem := permissionItem + var permission Permission + err := permission.Initialize_From_Permission_STATUS(&permissionItem) + if err != nil { + return errors.Wrap(err, "calling Initialize_From_Permission_STATUS() to populate field Permissions") + } + permissionList[permissionIndex] = permission + } + definition.Permissions = permissionList + } else { + definition.Permissions = nil + } + + // RoleName + definition.RoleName = genruntime.ClonePointerToString(source.RoleName) + + // Type + definition.Type = genruntime.ClonePointerToString(source.Type) + + // No error + return nil +} + +// OriginalVersion returns the original API version used to create the resource. +func (definition *RoleDefinition_Spec) OriginalVersion() string { + return GroupVersion.Version +} + +// SetAzureName sets the Azure name of the resource +func (definition *RoleDefinition_Spec) SetAzureName(azureName string) { + definition.AzureName = azureName +} + +// Role definition. +type RoleDefinition_STATUS struct { + // AssignableScopes: Role definition assignable scopes. + AssignableScopes []string `json:"assignableScopes,omitempty"` + + // Conditions: The observed state of the resource + Conditions []conditions.Condition `json:"conditions,omitempty"` + + // CreatedBy: Id of the user who created the assignment + CreatedBy *string `json:"createdBy,omitempty"` + + // CreatedOn: Time it was created + CreatedOn *string `json:"createdOn,omitempty"` + + // Description: The role definition description. + Description *string `json:"description,omitempty"` + + // Id: The role definition ID. + Id *string `json:"id,omitempty"` + + // Name: The role definition name. + Name *string `json:"name,omitempty"` + + // Permissions: Role definition permissions. + Permissions []Permission_STATUS `json:"permissions,omitempty"` + + // PropertiesType: The role type. + PropertiesType *string `json:"properties_type,omitempty"` + + // RoleName: The role name. + RoleName *string `json:"roleName,omitempty"` + + // Type: The role definition type. + Type *string `json:"type,omitempty"` + + // UpdatedBy: Id of the user who updated the assignment + UpdatedBy *string `json:"updatedBy,omitempty"` + + // UpdatedOn: Time it was updated + UpdatedOn *string `json:"updatedOn,omitempty"` +} + +var _ genruntime.ConvertibleStatus = &RoleDefinition_STATUS{} + +// ConvertStatusFrom populates our RoleDefinition_STATUS from the provided source +func (definition *RoleDefinition_STATUS) ConvertStatusFrom(source genruntime.ConvertibleStatus) error { + src, ok := source.(*storage.RoleDefinition_STATUS) + if ok { + // Populate our instance from source + return definition.AssignProperties_From_RoleDefinition_STATUS(src) + } + + // Convert to an intermediate form + src = &storage.RoleDefinition_STATUS{} + err := src.ConvertStatusFrom(source) + if err != nil { + return errors.Wrap(err, "initial step of conversion in ConvertStatusFrom()") + } + + // Update our instance from src + err = definition.AssignProperties_From_RoleDefinition_STATUS(src) + if err != nil { + return errors.Wrap(err, "final step of conversion in ConvertStatusFrom()") + } + + return nil +} + +// ConvertStatusTo populates the provided destination from our RoleDefinition_STATUS +func (definition *RoleDefinition_STATUS) ConvertStatusTo(destination genruntime.ConvertibleStatus) error { + dst, ok := destination.(*storage.RoleDefinition_STATUS) + if ok { + // Populate destination from our instance + return definition.AssignProperties_To_RoleDefinition_STATUS(dst) + } + + // Convert to an intermediate form + dst = &storage.RoleDefinition_STATUS{} + err := definition.AssignProperties_To_RoleDefinition_STATUS(dst) + if err != nil { + return errors.Wrap(err, "initial step of conversion in ConvertStatusTo()") + } + + // Update dst from our instance + err = dst.ConvertStatusTo(destination) + if err != nil { + return errors.Wrap(err, "final step of conversion in ConvertStatusTo()") + } + + return nil +} + +var _ genruntime.FromARMConverter = &RoleDefinition_STATUS{} + +// NewEmptyARMValue returns an empty ARM value suitable for deserializing into +func (definition *RoleDefinition_STATUS) NewEmptyARMValue() genruntime.ARMResourceStatus { + return &RoleDefinition_STATUS_ARM{} +} + +// PopulateFromARM populates a Kubernetes CRD object from an Azure ARM object +func (definition *RoleDefinition_STATUS) PopulateFromARM(owner genruntime.ArbitraryOwnerReference, armInput interface{}) error { + typedInput, ok := armInput.(RoleDefinition_STATUS_ARM) + if !ok { + return fmt.Errorf("unexpected type supplied for PopulateFromARM() function. Expected RoleDefinition_STATUS_ARM, got %T", armInput) + } + + // Set property "AssignableScopes": + // copying flattened property: + if typedInput.Properties != nil { + for _, item := range typedInput.Properties.AssignableScopes { + definition.AssignableScopes = append(definition.AssignableScopes, item) + } + } + + // no assignment for property "Conditions" + + // Set property "CreatedBy": + // copying flattened property: + if typedInput.Properties != nil { + if typedInput.Properties.CreatedBy != nil { + createdBy := *typedInput.Properties.CreatedBy + definition.CreatedBy = &createdBy + } + } + + // Set property "CreatedOn": + // copying flattened property: + if typedInput.Properties != nil { + if typedInput.Properties.CreatedOn != nil { + createdOn := *typedInput.Properties.CreatedOn + definition.CreatedOn = &createdOn + } + } + + // Set property "Description": + // copying flattened property: + if typedInput.Properties != nil { + if typedInput.Properties.Description != nil { + description := *typedInput.Properties.Description + definition.Description = &description + } + } + + // Set property "Id": + if typedInput.Id != nil { + id := *typedInput.Id + definition.Id = &id + } + + // Set property "Name": + if typedInput.Name != nil { + name := *typedInput.Name + definition.Name = &name + } + + // Set property "Permissions": + // copying flattened property: + if typedInput.Properties != nil { + for _, item := range typedInput.Properties.Permissions { + var item1 Permission_STATUS + err := item1.PopulateFromARM(owner, item) + if err != nil { + return err + } + definition.Permissions = append(definition.Permissions, item1) + } + } + + // Set property "PropertiesType": + // copying flattened property: + if typedInput.Properties != nil { + if typedInput.Properties.Type != nil { + propertiesType := *typedInput.Properties.Type + definition.PropertiesType = &propertiesType + } + } + + // Set property "RoleName": + // copying flattened property: + if typedInput.Properties != nil { + if typedInput.Properties.RoleName != nil { + roleName := *typedInput.Properties.RoleName + definition.RoleName = &roleName + } + } + + // Set property "Type": + if typedInput.Type != nil { + typeVar := *typedInput.Type + definition.Type = &typeVar + } + + // Set property "UpdatedBy": + // copying flattened property: + if typedInput.Properties != nil { + if typedInput.Properties.UpdatedBy != nil { + updatedBy := *typedInput.Properties.UpdatedBy + definition.UpdatedBy = &updatedBy + } + } + + // Set property "UpdatedOn": + // copying flattened property: + if typedInput.Properties != nil { + if typedInput.Properties.UpdatedOn != nil { + updatedOn := *typedInput.Properties.UpdatedOn + definition.UpdatedOn = &updatedOn + } + } + + // No error + return nil +} + +// AssignProperties_From_RoleDefinition_STATUS populates our RoleDefinition_STATUS from the provided source RoleDefinition_STATUS +func (definition *RoleDefinition_STATUS) AssignProperties_From_RoleDefinition_STATUS(source *storage.RoleDefinition_STATUS) error { + + // AssignableScopes + definition.AssignableScopes = genruntime.CloneSliceOfString(source.AssignableScopes) + + // Conditions + definition.Conditions = genruntime.CloneSliceOfCondition(source.Conditions) + + // CreatedBy + definition.CreatedBy = genruntime.ClonePointerToString(source.CreatedBy) + + // CreatedOn + definition.CreatedOn = genruntime.ClonePointerToString(source.CreatedOn) + + // Description + definition.Description = genruntime.ClonePointerToString(source.Description) + + // Id + definition.Id = genruntime.ClonePointerToString(source.Id) + + // Name + definition.Name = genruntime.ClonePointerToString(source.Name) + + // Permissions + if source.Permissions != nil { + permissionList := make([]Permission_STATUS, len(source.Permissions)) + for permissionIndex, permissionItem := range source.Permissions { + // Shadow the loop variable to avoid aliasing + permissionItem := permissionItem + var permission Permission_STATUS + err := permission.AssignProperties_From_Permission_STATUS(&permissionItem) + if err != nil { + return errors.Wrap(err, "calling AssignProperties_From_Permission_STATUS() to populate field Permissions") + } + permissionList[permissionIndex] = permission + } + definition.Permissions = permissionList + } else { + definition.Permissions = nil + } + + // PropertiesType + definition.PropertiesType = genruntime.ClonePointerToString(source.PropertiesType) + + // RoleName + definition.RoleName = genruntime.ClonePointerToString(source.RoleName) + + // Type + definition.Type = genruntime.ClonePointerToString(source.Type) + + // UpdatedBy + definition.UpdatedBy = genruntime.ClonePointerToString(source.UpdatedBy) + + // UpdatedOn + definition.UpdatedOn = genruntime.ClonePointerToString(source.UpdatedOn) + + // No error + return nil +} + +// AssignProperties_To_RoleDefinition_STATUS populates the provided destination RoleDefinition_STATUS from our RoleDefinition_STATUS +func (definition *RoleDefinition_STATUS) AssignProperties_To_RoleDefinition_STATUS(destination *storage.RoleDefinition_STATUS) error { + // Create a new property bag + propertyBag := genruntime.NewPropertyBag() + + // AssignableScopes + destination.AssignableScopes = genruntime.CloneSliceOfString(definition.AssignableScopes) + + // Conditions + destination.Conditions = genruntime.CloneSliceOfCondition(definition.Conditions) + + // CreatedBy + destination.CreatedBy = genruntime.ClonePointerToString(definition.CreatedBy) + + // CreatedOn + destination.CreatedOn = genruntime.ClonePointerToString(definition.CreatedOn) + + // Description + destination.Description = genruntime.ClonePointerToString(definition.Description) + + // Id + destination.Id = genruntime.ClonePointerToString(definition.Id) + + // Name + destination.Name = genruntime.ClonePointerToString(definition.Name) + + // Permissions + if definition.Permissions != nil { + permissionList := make([]storage.Permission_STATUS, len(definition.Permissions)) + for permissionIndex, permissionItem := range definition.Permissions { + // Shadow the loop variable to avoid aliasing + permissionItem := permissionItem + var permission storage.Permission_STATUS + err := permissionItem.AssignProperties_To_Permission_STATUS(&permission) + if err != nil { + return errors.Wrap(err, "calling AssignProperties_To_Permission_STATUS() to populate field Permissions") + } + permissionList[permissionIndex] = permission + } + destination.Permissions = permissionList + } else { + destination.Permissions = nil + } + + // PropertiesType + destination.PropertiesType = genruntime.ClonePointerToString(definition.PropertiesType) + + // RoleName + destination.RoleName = genruntime.ClonePointerToString(definition.RoleName) + + // Type + destination.Type = genruntime.ClonePointerToString(definition.Type) + + // UpdatedBy + destination.UpdatedBy = genruntime.ClonePointerToString(definition.UpdatedBy) + + // UpdatedOn + destination.UpdatedOn = genruntime.ClonePointerToString(definition.UpdatedOn) + + // Update the property bag + if len(propertyBag) > 0 { + destination.PropertyBag = propertyBag + } else { + destination.PropertyBag = nil + } + + // No error + return nil +} + +// Role definition permissions. +type Permission struct { + // Actions: Allowed actions. + Actions []string `json:"actions,omitempty"` + + // DataActions: Allowed Data actions. + DataActions []string `json:"dataActions,omitempty"` + + // NotActions: Denied actions. + NotActions []string `json:"notActions,omitempty"` + + // NotDataActions: Denied Data actions. + NotDataActions []string `json:"notDataActions,omitempty"` +} + +var _ genruntime.ARMTransformer = &Permission{} + +// ConvertToARM converts from a Kubernetes CRD object to an ARM object +func (permission *Permission) ConvertToARM(resolved genruntime.ConvertToARMResolvedDetails) (interface{}, error) { + if permission == nil { + return nil, nil + } + result := &Permission_ARM{} + + // Set property "Actions": + for _, item := range permission.Actions { + result.Actions = append(result.Actions, item) + } + + // Set property "DataActions": + for _, item := range permission.DataActions { + result.DataActions = append(result.DataActions, item) + } + + // Set property "NotActions": + for _, item := range permission.NotActions { + result.NotActions = append(result.NotActions, item) + } + + // Set property "NotDataActions": + for _, item := range permission.NotDataActions { + result.NotDataActions = append(result.NotDataActions, item) + } + return result, nil +} + +// NewEmptyARMValue returns an empty ARM value suitable for deserializing into +func (permission *Permission) NewEmptyARMValue() genruntime.ARMResourceStatus { + return &Permission_ARM{} +} + +// PopulateFromARM populates a Kubernetes CRD object from an Azure ARM object +func (permission *Permission) PopulateFromARM(owner genruntime.ArbitraryOwnerReference, armInput interface{}) error { + typedInput, ok := armInput.(Permission_ARM) + if !ok { + return fmt.Errorf("unexpected type supplied for PopulateFromARM() function. Expected Permission_ARM, got %T", armInput) + } + + // Set property "Actions": + for _, item := range typedInput.Actions { + permission.Actions = append(permission.Actions, item) + } + + // Set property "DataActions": + for _, item := range typedInput.DataActions { + permission.DataActions = append(permission.DataActions, item) + } + + // Set property "NotActions": + for _, item := range typedInput.NotActions { + permission.NotActions = append(permission.NotActions, item) + } + + // Set property "NotDataActions": + for _, item := range typedInput.NotDataActions { + permission.NotDataActions = append(permission.NotDataActions, item) + } + + // No error + return nil +} + +// AssignProperties_From_Permission populates our Permission from the provided source Permission +func (permission *Permission) AssignProperties_From_Permission(source *storage.Permission) error { + + // Actions + permission.Actions = genruntime.CloneSliceOfString(source.Actions) + + // DataActions + permission.DataActions = genruntime.CloneSliceOfString(source.DataActions) + + // NotActions + permission.NotActions = genruntime.CloneSliceOfString(source.NotActions) + + // NotDataActions + permission.NotDataActions = genruntime.CloneSliceOfString(source.NotDataActions) + + // No error + return nil +} + +// AssignProperties_To_Permission populates the provided destination Permission from our Permission +func (permission *Permission) AssignProperties_To_Permission(destination *storage.Permission) error { + // Create a new property bag + propertyBag := genruntime.NewPropertyBag() + + // Actions + destination.Actions = genruntime.CloneSliceOfString(permission.Actions) + + // DataActions + destination.DataActions = genruntime.CloneSliceOfString(permission.DataActions) + + // NotActions + destination.NotActions = genruntime.CloneSliceOfString(permission.NotActions) + + // NotDataActions + destination.NotDataActions = genruntime.CloneSliceOfString(permission.NotDataActions) + + // Update the property bag + if len(propertyBag) > 0 { + destination.PropertyBag = propertyBag + } else { + destination.PropertyBag = nil + } + + // No error + return nil +} + +// Initialize_From_Permission_STATUS populates our Permission from the provided source Permission_STATUS +func (permission *Permission) Initialize_From_Permission_STATUS(source *Permission_STATUS) error { + + // Actions + permission.Actions = genruntime.CloneSliceOfString(source.Actions) + + // DataActions + permission.DataActions = genruntime.CloneSliceOfString(source.DataActions) + + // NotActions + permission.NotActions = genruntime.CloneSliceOfString(source.NotActions) + + // NotDataActions + permission.NotDataActions = genruntime.CloneSliceOfString(source.NotDataActions) + + // No error + return nil +} + +// Role definition permissions. +type Permission_STATUS struct { + // Actions: Allowed actions. + Actions []string `json:"actions,omitempty"` + + // DataActions: Allowed Data actions. + DataActions []string `json:"dataActions,omitempty"` + + // NotActions: Denied actions. + NotActions []string `json:"notActions,omitempty"` + + // NotDataActions: Denied Data actions. + NotDataActions []string `json:"notDataActions,omitempty"` +} + +var _ genruntime.FromARMConverter = &Permission_STATUS{} + +// NewEmptyARMValue returns an empty ARM value suitable for deserializing into +func (permission *Permission_STATUS) NewEmptyARMValue() genruntime.ARMResourceStatus { + return &Permission_STATUS_ARM{} +} + +// PopulateFromARM populates a Kubernetes CRD object from an Azure ARM object +func (permission *Permission_STATUS) PopulateFromARM(owner genruntime.ArbitraryOwnerReference, armInput interface{}) error { + typedInput, ok := armInput.(Permission_STATUS_ARM) + if !ok { + return fmt.Errorf("unexpected type supplied for PopulateFromARM() function. Expected Permission_STATUS_ARM, got %T", armInput) + } + + // Set property "Actions": + for _, item := range typedInput.Actions { + permission.Actions = append(permission.Actions, item) + } + + // Set property "DataActions": + for _, item := range typedInput.DataActions { + permission.DataActions = append(permission.DataActions, item) + } + + // Set property "NotActions": + for _, item := range typedInput.NotActions { + permission.NotActions = append(permission.NotActions, item) + } + + // Set property "NotDataActions": + for _, item := range typedInput.NotDataActions { + permission.NotDataActions = append(permission.NotDataActions, item) + } + + // No error + return nil +} + +// AssignProperties_From_Permission_STATUS populates our Permission_STATUS from the provided source Permission_STATUS +func (permission *Permission_STATUS) AssignProperties_From_Permission_STATUS(source *storage.Permission_STATUS) error { + + // Actions + permission.Actions = genruntime.CloneSliceOfString(source.Actions) + + // DataActions + permission.DataActions = genruntime.CloneSliceOfString(source.DataActions) + + // NotActions + permission.NotActions = genruntime.CloneSliceOfString(source.NotActions) + + // NotDataActions + permission.NotDataActions = genruntime.CloneSliceOfString(source.NotDataActions) + + // No error + return nil +} + +// AssignProperties_To_Permission_STATUS populates the provided destination Permission_STATUS from our Permission_STATUS +func (permission *Permission_STATUS) AssignProperties_To_Permission_STATUS(destination *storage.Permission_STATUS) error { + // Create a new property bag + propertyBag := genruntime.NewPropertyBag() + + // Actions + destination.Actions = genruntime.CloneSliceOfString(permission.Actions) + + // DataActions + destination.DataActions = genruntime.CloneSliceOfString(permission.DataActions) + + // NotActions + destination.NotActions = genruntime.CloneSliceOfString(permission.NotActions) + + // NotDataActions + destination.NotDataActions = genruntime.CloneSliceOfString(permission.NotDataActions) + + // Update the property bag + if len(propertyBag) > 0 { + destination.PropertyBag = propertyBag + } else { + destination.PropertyBag = nil + } + + // No error + return nil +} + +func init() { + SchemeBuilder.Register(&RoleDefinition{}, &RoleDefinitionList{}) +} diff --git a/v2/api/authorization/v1api20220401/role_definition_types_gen_test.go b/v2/api/authorization/v1api20220401/role_definition_types_gen_test.go new file mode 100644 index 00000000000..b1a439e0ff5 --- /dev/null +++ b/v2/api/authorization/v1api20220401/role_definition_types_gen_test.go @@ -0,0 +1,622 @@ +// Code generated by azure-service-operator-codegen. DO NOT EDIT. +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. +package v1api20220401 + +import ( + "encoding/json" + storage "github.com/Azure/azure-service-operator/v2/api/authorization/v1api20220401/storage" + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/kr/pretty" + "github.com/kylelemons/godebug/diff" + "github.com/leanovate/gopter" + "github.com/leanovate/gopter/gen" + "github.com/leanovate/gopter/prop" + "os" + "reflect" + "testing" +) + +func Test_RoleDefinition_WhenConvertedToHub_RoundTripsWithoutLoss(t *testing.T) { + t.Parallel() + parameters := gopter.DefaultTestParameters() + parameters.MaxSize = 10 + parameters.MinSuccessfulTests = 10 + properties := gopter.NewProperties(parameters) + properties.Property( + "Round trip from RoleDefinition to hub returns original", + prop.ForAll(RunResourceConversionTestForRoleDefinition, RoleDefinitionGenerator())) + properties.TestingRun(t, gopter.NewFormatedReporter(false, 240, os.Stdout)) +} + +// RunResourceConversionTestForRoleDefinition tests if a specific instance of RoleDefinition round trips to the hub storage version and back losslessly +func RunResourceConversionTestForRoleDefinition(subject RoleDefinition) string { + // Copy subject to make sure conversion doesn't modify it + copied := subject.DeepCopy() + + // Convert to our hub version + var hub storage.RoleDefinition + err := copied.ConvertTo(&hub) + if err != nil { + return err.Error() + } + + // Convert from our hub version + var actual RoleDefinition + err = actual.ConvertFrom(&hub) + if err != nil { + return err.Error() + } + + // Compare actual with what we started with + match := cmp.Equal(subject, actual, cmpopts.EquateEmpty()) + if !match { + actualFmt := pretty.Sprint(actual) + subjectFmt := pretty.Sprint(subject) + result := diff.Diff(subjectFmt, actualFmt) + return result + } + + return "" +} + +func Test_RoleDefinition_WhenPropertiesConverted_RoundTripsWithoutLoss(t *testing.T) { + t.Parallel() + parameters := gopter.DefaultTestParameters() + parameters.MaxSize = 10 + properties := gopter.NewProperties(parameters) + properties.Property( + "Round trip from RoleDefinition to RoleDefinition via AssignProperties_To_RoleDefinition & AssignProperties_From_RoleDefinition returns original", + prop.ForAll(RunPropertyAssignmentTestForRoleDefinition, RoleDefinitionGenerator())) + properties.TestingRun(t, gopter.NewFormatedReporter(false, 240, os.Stdout)) +} + +// RunPropertyAssignmentTestForRoleDefinition tests if a specific instance of RoleDefinition can be assigned to storage and back losslessly +func RunPropertyAssignmentTestForRoleDefinition(subject RoleDefinition) string { + // Copy subject to make sure assignment doesn't modify it + copied := subject.DeepCopy() + + // Use AssignPropertiesTo() for the first stage of conversion + var other storage.RoleDefinition + err := copied.AssignProperties_To_RoleDefinition(&other) + if err != nil { + return err.Error() + } + + // Use AssignPropertiesFrom() to convert back to our original type + var actual RoleDefinition + err = actual.AssignProperties_From_RoleDefinition(&other) + if err != nil { + return err.Error() + } + + // Check for a match + match := cmp.Equal(subject, actual, cmpopts.EquateEmpty()) + if !match { + actualFmt := pretty.Sprint(actual) + subjectFmt := pretty.Sprint(subject) + result := diff.Diff(subjectFmt, actualFmt) + return result + } + + return "" +} + +func Test_RoleDefinition_WhenSerializedToJson_DeserializesAsEqual(t *testing.T) { + t.Parallel() + parameters := gopter.DefaultTestParameters() + parameters.MinSuccessfulTests = 20 + parameters.MaxSize = 3 + properties := gopter.NewProperties(parameters) + properties.Property( + "Round trip of RoleDefinition via JSON returns original", + prop.ForAll(RunJSONSerializationTestForRoleDefinition, RoleDefinitionGenerator())) + properties.TestingRun(t, gopter.NewFormatedReporter(true, 240, os.Stdout)) +} + +// RunJSONSerializationTestForRoleDefinition runs a test to see if a specific instance of RoleDefinition round trips to JSON and back losslessly +func RunJSONSerializationTestForRoleDefinition(subject RoleDefinition) string { + // Serialize to JSON + bin, err := json.Marshal(subject) + if err != nil { + return err.Error() + } + + // Deserialize back into memory + var actual RoleDefinition + err = json.Unmarshal(bin, &actual) + if err != nil { + return err.Error() + } + + // Check for outcome + match := cmp.Equal(subject, actual, cmpopts.EquateEmpty()) + if !match { + actualFmt := pretty.Sprint(actual) + subjectFmt := pretty.Sprint(subject) + result := diff.Diff(subjectFmt, actualFmt) + return result + } + + return "" +} + +// Generator of RoleDefinition instances for property testing - lazily instantiated by RoleDefinitionGenerator() +var roleDefinitionGenerator gopter.Gen + +// RoleDefinitionGenerator returns a generator of RoleDefinition instances for property testing. +func RoleDefinitionGenerator() gopter.Gen { + if roleDefinitionGenerator != nil { + return roleDefinitionGenerator + } + + generators := make(map[string]gopter.Gen) + AddRelatedPropertyGeneratorsForRoleDefinition(generators) + roleDefinitionGenerator = gen.Struct(reflect.TypeOf(RoleDefinition{}), generators) + + return roleDefinitionGenerator +} + +// AddRelatedPropertyGeneratorsForRoleDefinition is a factory method for creating gopter generators +func AddRelatedPropertyGeneratorsForRoleDefinition(gens map[string]gopter.Gen) { + gens["Spec"] = RoleDefinition_SpecGenerator() + gens["Status"] = RoleDefinition_STATUSGenerator() +} + +func Test_RoleDefinition_Spec_WhenPropertiesConverted_RoundTripsWithoutLoss(t *testing.T) { + t.Parallel() + parameters := gopter.DefaultTestParameters() + parameters.MaxSize = 10 + properties := gopter.NewProperties(parameters) + properties.Property( + "Round trip from RoleDefinition_Spec to RoleDefinition_Spec via AssignProperties_To_RoleDefinition_Spec & AssignProperties_From_RoleDefinition_Spec returns original", + prop.ForAll(RunPropertyAssignmentTestForRoleDefinition_Spec, RoleDefinition_SpecGenerator())) + properties.TestingRun(t, gopter.NewFormatedReporter(false, 240, os.Stdout)) +} + +// RunPropertyAssignmentTestForRoleDefinition_Spec tests if a specific instance of RoleDefinition_Spec can be assigned to storage and back losslessly +func RunPropertyAssignmentTestForRoleDefinition_Spec(subject RoleDefinition_Spec) string { + // Copy subject to make sure assignment doesn't modify it + copied := subject.DeepCopy() + + // Use AssignPropertiesTo() for the first stage of conversion + var other storage.RoleDefinition_Spec + err := copied.AssignProperties_To_RoleDefinition_Spec(&other) + if err != nil { + return err.Error() + } + + // Use AssignPropertiesFrom() to convert back to our original type + var actual RoleDefinition_Spec + err = actual.AssignProperties_From_RoleDefinition_Spec(&other) + if err != nil { + return err.Error() + } + + // Check for a match + match := cmp.Equal(subject, actual, cmpopts.EquateEmpty()) + if !match { + actualFmt := pretty.Sprint(actual) + subjectFmt := pretty.Sprint(subject) + result := diff.Diff(subjectFmt, actualFmt) + return result + } + + return "" +} + +func Test_RoleDefinition_Spec_WhenSerializedToJson_DeserializesAsEqual(t *testing.T) { + t.Parallel() + parameters := gopter.DefaultTestParameters() + parameters.MinSuccessfulTests = 80 + parameters.MaxSize = 3 + properties := gopter.NewProperties(parameters) + properties.Property( + "Round trip of RoleDefinition_Spec via JSON returns original", + prop.ForAll(RunJSONSerializationTestForRoleDefinition_Spec, RoleDefinition_SpecGenerator())) + properties.TestingRun(t, gopter.NewFormatedReporter(true, 240, os.Stdout)) +} + +// RunJSONSerializationTestForRoleDefinition_Spec runs a test to see if a specific instance of RoleDefinition_Spec round trips to JSON and back losslessly +func RunJSONSerializationTestForRoleDefinition_Spec(subject RoleDefinition_Spec) string { + // Serialize to JSON + bin, err := json.Marshal(subject) + if err != nil { + return err.Error() + } + + // Deserialize back into memory + var actual RoleDefinition_Spec + err = json.Unmarshal(bin, &actual) + if err != nil { + return err.Error() + } + + // Check for outcome + match := cmp.Equal(subject, actual, cmpopts.EquateEmpty()) + if !match { + actualFmt := pretty.Sprint(actual) + subjectFmt := pretty.Sprint(subject) + result := diff.Diff(subjectFmt, actualFmt) + return result + } + + return "" +} + +// Generator of RoleDefinition_Spec instances for property testing - lazily instantiated by +// RoleDefinition_SpecGenerator() +var roleDefinition_SpecGenerator gopter.Gen + +// RoleDefinition_SpecGenerator returns a generator of RoleDefinition_Spec instances for property testing. +// We first initialize roleDefinition_SpecGenerator with a simplified generator based on the +// fields with primitive types then replacing it with a more complex one that also handles complex fields +// to ensure any cycles in the object graph properly terminate. +func RoleDefinition_SpecGenerator() gopter.Gen { + if roleDefinition_SpecGenerator != nil { + return roleDefinition_SpecGenerator + } + + generators := make(map[string]gopter.Gen) + AddIndependentPropertyGeneratorsForRoleDefinition_Spec(generators) + roleDefinition_SpecGenerator = gen.Struct(reflect.TypeOf(RoleDefinition_Spec{}), generators) + + // The above call to gen.Struct() captures the map, so create a new one + generators = make(map[string]gopter.Gen) + AddIndependentPropertyGeneratorsForRoleDefinition_Spec(generators) + AddRelatedPropertyGeneratorsForRoleDefinition_Spec(generators) + roleDefinition_SpecGenerator = gen.Struct(reflect.TypeOf(RoleDefinition_Spec{}), generators) + + return roleDefinition_SpecGenerator +} + +// AddIndependentPropertyGeneratorsForRoleDefinition_Spec is a factory method for creating gopter generators +func AddIndependentPropertyGeneratorsForRoleDefinition_Spec(gens map[string]gopter.Gen) { + gens["AzureName"] = gen.AlphaString() + gens["Description"] = gen.PtrOf(gen.AlphaString()) + gens["RoleName"] = gen.PtrOf(gen.AlphaString()) + gens["Type"] = gen.PtrOf(gen.AlphaString()) +} + +// AddRelatedPropertyGeneratorsForRoleDefinition_Spec is a factory method for creating gopter generators +func AddRelatedPropertyGeneratorsForRoleDefinition_Spec(gens map[string]gopter.Gen) { + gens["Permissions"] = gen.SliceOf(PermissionGenerator()) +} + +func Test_RoleDefinition_STATUS_WhenPropertiesConverted_RoundTripsWithoutLoss(t *testing.T) { + t.Parallel() + parameters := gopter.DefaultTestParameters() + parameters.MaxSize = 10 + properties := gopter.NewProperties(parameters) + properties.Property( + "Round trip from RoleDefinition_STATUS to RoleDefinition_STATUS via AssignProperties_To_RoleDefinition_STATUS & AssignProperties_From_RoleDefinition_STATUS returns original", + prop.ForAll(RunPropertyAssignmentTestForRoleDefinition_STATUS, RoleDefinition_STATUSGenerator())) + properties.TestingRun(t, gopter.NewFormatedReporter(false, 240, os.Stdout)) +} + +// RunPropertyAssignmentTestForRoleDefinition_STATUS tests if a specific instance of RoleDefinition_STATUS can be assigned to storage and back losslessly +func RunPropertyAssignmentTestForRoleDefinition_STATUS(subject RoleDefinition_STATUS) string { + // Copy subject to make sure assignment doesn't modify it + copied := subject.DeepCopy() + + // Use AssignPropertiesTo() for the first stage of conversion + var other storage.RoleDefinition_STATUS + err := copied.AssignProperties_To_RoleDefinition_STATUS(&other) + if err != nil { + return err.Error() + } + + // Use AssignPropertiesFrom() to convert back to our original type + var actual RoleDefinition_STATUS + err = actual.AssignProperties_From_RoleDefinition_STATUS(&other) + if err != nil { + return err.Error() + } + + // Check for a match + match := cmp.Equal(subject, actual, cmpopts.EquateEmpty()) + if !match { + actualFmt := pretty.Sprint(actual) + subjectFmt := pretty.Sprint(subject) + result := diff.Diff(subjectFmt, actualFmt) + return result + } + + return "" +} + +func Test_RoleDefinition_STATUS_WhenSerializedToJson_DeserializesAsEqual(t *testing.T) { + t.Parallel() + parameters := gopter.DefaultTestParameters() + parameters.MinSuccessfulTests = 80 + parameters.MaxSize = 3 + properties := gopter.NewProperties(parameters) + properties.Property( + "Round trip of RoleDefinition_STATUS via JSON returns original", + prop.ForAll(RunJSONSerializationTestForRoleDefinition_STATUS, RoleDefinition_STATUSGenerator())) + properties.TestingRun(t, gopter.NewFormatedReporter(true, 240, os.Stdout)) +} + +// RunJSONSerializationTestForRoleDefinition_STATUS runs a test to see if a specific instance of RoleDefinition_STATUS round trips to JSON and back losslessly +func RunJSONSerializationTestForRoleDefinition_STATUS(subject RoleDefinition_STATUS) string { + // Serialize to JSON + bin, err := json.Marshal(subject) + if err != nil { + return err.Error() + } + + // Deserialize back into memory + var actual RoleDefinition_STATUS + err = json.Unmarshal(bin, &actual) + if err != nil { + return err.Error() + } + + // Check for outcome + match := cmp.Equal(subject, actual, cmpopts.EquateEmpty()) + if !match { + actualFmt := pretty.Sprint(actual) + subjectFmt := pretty.Sprint(subject) + result := diff.Diff(subjectFmt, actualFmt) + return result + } + + return "" +} + +// Generator of RoleDefinition_STATUS instances for property testing - lazily instantiated by +// RoleDefinition_STATUSGenerator() +var roleDefinition_STATUSGenerator gopter.Gen + +// RoleDefinition_STATUSGenerator returns a generator of RoleDefinition_STATUS instances for property testing. +// We first initialize roleDefinition_STATUSGenerator with a simplified generator based on the +// fields with primitive types then replacing it with a more complex one that also handles complex fields +// to ensure any cycles in the object graph properly terminate. +func RoleDefinition_STATUSGenerator() gopter.Gen { + if roleDefinition_STATUSGenerator != nil { + return roleDefinition_STATUSGenerator + } + + generators := make(map[string]gopter.Gen) + AddIndependentPropertyGeneratorsForRoleDefinition_STATUS(generators) + roleDefinition_STATUSGenerator = gen.Struct(reflect.TypeOf(RoleDefinition_STATUS{}), generators) + + // The above call to gen.Struct() captures the map, so create a new one + generators = make(map[string]gopter.Gen) + AddIndependentPropertyGeneratorsForRoleDefinition_STATUS(generators) + AddRelatedPropertyGeneratorsForRoleDefinition_STATUS(generators) + roleDefinition_STATUSGenerator = gen.Struct(reflect.TypeOf(RoleDefinition_STATUS{}), generators) + + return roleDefinition_STATUSGenerator +} + +// AddIndependentPropertyGeneratorsForRoleDefinition_STATUS is a factory method for creating gopter generators +func AddIndependentPropertyGeneratorsForRoleDefinition_STATUS(gens map[string]gopter.Gen) { + gens["AssignableScopes"] = gen.SliceOf(gen.AlphaString()) + gens["CreatedBy"] = gen.PtrOf(gen.AlphaString()) + gens["CreatedOn"] = gen.PtrOf(gen.AlphaString()) + gens["Description"] = gen.PtrOf(gen.AlphaString()) + gens["Id"] = gen.PtrOf(gen.AlphaString()) + gens["Name"] = gen.PtrOf(gen.AlphaString()) + gens["PropertiesType"] = gen.PtrOf(gen.AlphaString()) + gens["RoleName"] = gen.PtrOf(gen.AlphaString()) + gens["Type"] = gen.PtrOf(gen.AlphaString()) + gens["UpdatedBy"] = gen.PtrOf(gen.AlphaString()) + gens["UpdatedOn"] = gen.PtrOf(gen.AlphaString()) +} + +// AddRelatedPropertyGeneratorsForRoleDefinition_STATUS is a factory method for creating gopter generators +func AddRelatedPropertyGeneratorsForRoleDefinition_STATUS(gens map[string]gopter.Gen) { + gens["Permissions"] = gen.SliceOf(Permission_STATUSGenerator()) +} + +func Test_Permission_WhenPropertiesConverted_RoundTripsWithoutLoss(t *testing.T) { + t.Parallel() + parameters := gopter.DefaultTestParameters() + parameters.MaxSize = 10 + properties := gopter.NewProperties(parameters) + properties.Property( + "Round trip from Permission to Permission via AssignProperties_To_Permission & AssignProperties_From_Permission returns original", + prop.ForAll(RunPropertyAssignmentTestForPermission, PermissionGenerator())) + properties.TestingRun(t, gopter.NewFormatedReporter(false, 240, os.Stdout)) +} + +// RunPropertyAssignmentTestForPermission tests if a specific instance of Permission can be assigned to storage and back losslessly +func RunPropertyAssignmentTestForPermission(subject Permission) string { + // Copy subject to make sure assignment doesn't modify it + copied := subject.DeepCopy() + + // Use AssignPropertiesTo() for the first stage of conversion + var other storage.Permission + err := copied.AssignProperties_To_Permission(&other) + if err != nil { + return err.Error() + } + + // Use AssignPropertiesFrom() to convert back to our original type + var actual Permission + err = actual.AssignProperties_From_Permission(&other) + if err != nil { + return err.Error() + } + + // Check for a match + match := cmp.Equal(subject, actual, cmpopts.EquateEmpty()) + if !match { + actualFmt := pretty.Sprint(actual) + subjectFmt := pretty.Sprint(subject) + result := diff.Diff(subjectFmt, actualFmt) + return result + } + + return "" +} + +func Test_Permission_WhenSerializedToJson_DeserializesAsEqual(t *testing.T) { + t.Parallel() + parameters := gopter.DefaultTestParameters() + parameters.MinSuccessfulTests = 100 + parameters.MaxSize = 3 + properties := gopter.NewProperties(parameters) + properties.Property( + "Round trip of Permission via JSON returns original", + prop.ForAll(RunJSONSerializationTestForPermission, PermissionGenerator())) + properties.TestingRun(t, gopter.NewFormatedReporter(true, 240, os.Stdout)) +} + +// RunJSONSerializationTestForPermission runs a test to see if a specific instance of Permission round trips to JSON and back losslessly +func RunJSONSerializationTestForPermission(subject Permission) string { + // Serialize to JSON + bin, err := json.Marshal(subject) + if err != nil { + return err.Error() + } + + // Deserialize back into memory + var actual Permission + err = json.Unmarshal(bin, &actual) + if err != nil { + return err.Error() + } + + // Check for outcome + match := cmp.Equal(subject, actual, cmpopts.EquateEmpty()) + if !match { + actualFmt := pretty.Sprint(actual) + subjectFmt := pretty.Sprint(subject) + result := diff.Diff(subjectFmt, actualFmt) + return result + } + + return "" +} + +// Generator of Permission instances for property testing - lazily instantiated by PermissionGenerator() +var permissionGenerator gopter.Gen + +// PermissionGenerator returns a generator of Permission instances for property testing. +func PermissionGenerator() gopter.Gen { + if permissionGenerator != nil { + return permissionGenerator + } + + generators := make(map[string]gopter.Gen) + AddIndependentPropertyGeneratorsForPermission(generators) + permissionGenerator = gen.Struct(reflect.TypeOf(Permission{}), generators) + + return permissionGenerator +} + +// AddIndependentPropertyGeneratorsForPermission is a factory method for creating gopter generators +func AddIndependentPropertyGeneratorsForPermission(gens map[string]gopter.Gen) { + gens["Actions"] = gen.SliceOf(gen.AlphaString()) + gens["DataActions"] = gen.SliceOf(gen.AlphaString()) + gens["NotActions"] = gen.SliceOf(gen.AlphaString()) + gens["NotDataActions"] = gen.SliceOf(gen.AlphaString()) +} + +func Test_Permission_STATUS_WhenPropertiesConverted_RoundTripsWithoutLoss(t *testing.T) { + t.Parallel() + parameters := gopter.DefaultTestParameters() + parameters.MaxSize = 10 + properties := gopter.NewProperties(parameters) + properties.Property( + "Round trip from Permission_STATUS to Permission_STATUS via AssignProperties_To_Permission_STATUS & AssignProperties_From_Permission_STATUS returns original", + prop.ForAll(RunPropertyAssignmentTestForPermission_STATUS, Permission_STATUSGenerator())) + properties.TestingRun(t, gopter.NewFormatedReporter(false, 240, os.Stdout)) +} + +// RunPropertyAssignmentTestForPermission_STATUS tests if a specific instance of Permission_STATUS can be assigned to storage and back losslessly +func RunPropertyAssignmentTestForPermission_STATUS(subject Permission_STATUS) string { + // Copy subject to make sure assignment doesn't modify it + copied := subject.DeepCopy() + + // Use AssignPropertiesTo() for the first stage of conversion + var other storage.Permission_STATUS + err := copied.AssignProperties_To_Permission_STATUS(&other) + if err != nil { + return err.Error() + } + + // Use AssignPropertiesFrom() to convert back to our original type + var actual Permission_STATUS + err = actual.AssignProperties_From_Permission_STATUS(&other) + if err != nil { + return err.Error() + } + + // Check for a match + match := cmp.Equal(subject, actual, cmpopts.EquateEmpty()) + if !match { + actualFmt := pretty.Sprint(actual) + subjectFmt := pretty.Sprint(subject) + result := diff.Diff(subjectFmt, actualFmt) + return result + } + + return "" +} + +func Test_Permission_STATUS_WhenSerializedToJson_DeserializesAsEqual(t *testing.T) { + t.Parallel() + parameters := gopter.DefaultTestParameters() + parameters.MinSuccessfulTests = 80 + parameters.MaxSize = 3 + properties := gopter.NewProperties(parameters) + properties.Property( + "Round trip of Permission_STATUS via JSON returns original", + prop.ForAll(RunJSONSerializationTestForPermission_STATUS, Permission_STATUSGenerator())) + properties.TestingRun(t, gopter.NewFormatedReporter(true, 240, os.Stdout)) +} + +// RunJSONSerializationTestForPermission_STATUS runs a test to see if a specific instance of Permission_STATUS round trips to JSON and back losslessly +func RunJSONSerializationTestForPermission_STATUS(subject Permission_STATUS) string { + // Serialize to JSON + bin, err := json.Marshal(subject) + if err != nil { + return err.Error() + } + + // Deserialize back into memory + var actual Permission_STATUS + err = json.Unmarshal(bin, &actual) + if err != nil { + return err.Error() + } + + // Check for outcome + match := cmp.Equal(subject, actual, cmpopts.EquateEmpty()) + if !match { + actualFmt := pretty.Sprint(actual) + subjectFmt := pretty.Sprint(subject) + result := diff.Diff(subjectFmt, actualFmt) + return result + } + + return "" +} + +// Generator of Permission_STATUS instances for property testing - lazily instantiated by Permission_STATUSGenerator() +var permission_STATUSGenerator gopter.Gen + +// Permission_STATUSGenerator returns a generator of Permission_STATUS instances for property testing. +func Permission_STATUSGenerator() gopter.Gen { + if permission_STATUSGenerator != nil { + return permission_STATUSGenerator + } + + generators := make(map[string]gopter.Gen) + AddIndependentPropertyGeneratorsForPermission_STATUS(generators) + permission_STATUSGenerator = gen.Struct(reflect.TypeOf(Permission_STATUS{}), generators) + + return permission_STATUSGenerator +} + +// AddIndependentPropertyGeneratorsForPermission_STATUS is a factory method for creating gopter generators +func AddIndependentPropertyGeneratorsForPermission_STATUS(gens map[string]gopter.Gen) { + gens["Actions"] = gen.SliceOf(gen.AlphaString()) + gens["DataActions"] = gen.SliceOf(gen.AlphaString()) + gens["NotActions"] = gen.SliceOf(gen.AlphaString()) + gens["NotDataActions"] = gen.SliceOf(gen.AlphaString()) +} diff --git a/v2/api/authorization/v1api20220401/storage/role_definition_types_gen.go b/v2/api/authorization/v1api20220401/storage/role_definition_types_gen.go new file mode 100644 index 00000000000..8f023e58707 --- /dev/null +++ b/v2/api/authorization/v1api20220401/storage/role_definition_types_gen.go @@ -0,0 +1,242 @@ +// Code generated by azure-service-operator-codegen. DO NOT EDIT. +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. +package storage + +import ( + "github.com/Azure/azure-service-operator/v2/pkg/genruntime" + "github.com/Azure/azure-service-operator/v2/pkg/genruntime/conditions" + "github.com/pkg/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +// +kubebuilder:rbac:groups=authorization.azure.com,resources=roledefinitions,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=authorization.azure.com,resources={roledefinitions/status,roledefinitions/finalizers},verbs=get;update;patch + +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status +// +kubebuilder:storageversion +// +kubebuilder:printcolumn:name="Ready",type="string",JSONPath=".status.conditions[?(@.type=='Ready')].status" +// +kubebuilder:printcolumn:name="Severity",type="string",JSONPath=".status.conditions[?(@.type=='Ready')].severity" +// +kubebuilder:printcolumn:name="Reason",type="string",JSONPath=".status.conditions[?(@.type=='Ready')].reason" +// +kubebuilder:printcolumn:name="Message",type="string",JSONPath=".status.conditions[?(@.type=='Ready')].message" +// Storage version of v1api20220401.RoleDefinition +// Generator information: +// - Generated from: /authorization/resource-manager/Microsoft.Authorization/stable/2022-04-01/authorization-RoleDefinitionsCalls.json +// - ARM URI: /{scope}/providers/Microsoft.Authorization/roleDefinitions/{roleDefinitionId} +type RoleDefinition struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + Spec RoleDefinition_Spec `json:"spec,omitempty"` + Status RoleDefinition_STATUS `json:"status,omitempty"` +} + +var _ conditions.Conditioner = &RoleDefinition{} + +// GetConditions returns the conditions of the resource +func (definition *RoleDefinition) GetConditions() conditions.Conditions { + return definition.Status.Conditions +} + +// SetConditions sets the conditions on the resource status +func (definition *RoleDefinition) SetConditions(conditions conditions.Conditions) { + definition.Status.Conditions = conditions +} + +var _ genruntime.KubernetesResource = &RoleDefinition{} + +// AzureName returns the Azure name of the resource +func (definition *RoleDefinition) AzureName() string { + return definition.Spec.AzureName +} + +// GetAPIVersion returns the ARM API version of the resource. This is always "2022-04-01" +func (definition RoleDefinition) GetAPIVersion() string { + return string(APIVersion_Value) +} + +// GetResourceScope returns the scope of the resource +func (definition *RoleDefinition) GetResourceScope() genruntime.ResourceScope { + return genruntime.ResourceScopeExtension +} + +// GetSpec returns the specification of this resource +func (definition *RoleDefinition) GetSpec() genruntime.ConvertibleSpec { + return &definition.Spec +} + +// GetStatus returns the status of this resource +func (definition *RoleDefinition) GetStatus() genruntime.ConvertibleStatus { + return &definition.Status +} + +// GetSupportedOperations returns the operations supported by the resource +func (definition *RoleDefinition) GetSupportedOperations() []genruntime.ResourceOperation { + return []genruntime.ResourceOperation{ + genruntime.ResourceOperationDelete, + genruntime.ResourceOperationGet, + genruntime.ResourceOperationPut, + } +} + +// GetType returns the ARM Type of the resource. This is always "Microsoft.Authorization/roleDefinitions" +func (definition *RoleDefinition) GetType() string { + return "Microsoft.Authorization/roleDefinitions" +} + +// NewEmptyStatus returns a new empty (blank) status +func (definition *RoleDefinition) NewEmptyStatus() genruntime.ConvertibleStatus { + return &RoleDefinition_STATUS{} +} + +// Owner returns the ResourceReference of the owner +func (definition *RoleDefinition) Owner() *genruntime.ResourceReference { + return definition.Spec.Owner.AsResourceReference() +} + +// SetStatus sets the status of this resource +func (definition *RoleDefinition) SetStatus(status genruntime.ConvertibleStatus) error { + // If we have exactly the right type of status, assign it + if st, ok := status.(*RoleDefinition_STATUS); ok { + definition.Status = *st + return nil + } + + // Convert status to required version + var st RoleDefinition_STATUS + err := status.ConvertStatusTo(&st) + if err != nil { + return errors.Wrap(err, "failed to convert status") + } + + definition.Status = st + return nil +} + +// Hub marks that this RoleDefinition is the hub type for conversion +func (definition *RoleDefinition) Hub() {} + +// OriginalGVK returns a GroupValueKind for the original API version used to create the resource +func (definition *RoleDefinition) OriginalGVK() *schema.GroupVersionKind { + return &schema.GroupVersionKind{ + Group: GroupVersion.Group, + Version: definition.Spec.OriginalVersion, + Kind: "RoleDefinition", + } +} + +// +kubebuilder:object:root=true +// Storage version of v1api20220401.RoleDefinition +// Generator information: +// - Generated from: /authorization/resource-manager/Microsoft.Authorization/stable/2022-04-01/authorization-RoleDefinitionsCalls.json +// - ARM URI: /{scope}/providers/Microsoft.Authorization/roleDefinitions/{roleDefinitionId} +type RoleDefinitionList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []RoleDefinition `json:"items"` +} + +// Storage version of v1api20220401.RoleDefinition_Spec +type RoleDefinition_Spec struct { + AssignableScopesReferences []genruntime.ResourceReference `armReference:"AssignableScopes" json:"assignableScopesReferences,omitempty"` + + // AzureName: The name of the resource in Azure. This is often the same as the name of the resource in Kubernetes but it + // doesn't have to be. + AzureName string `json:"azureName,omitempty"` + Description *string `json:"description,omitempty"` + OriginalVersion string `json:"originalVersion,omitempty"` + + // +kubebuilder:validation:Required + // Owner: The owner of the resource. The owner controls where the resource goes when it is deployed. The owner also + // controls the resources lifecycle. When the owner is deleted the resource will also be deleted. This resource is an + // extension resource, which means that any other Azure resource can be its owner. + Owner *genruntime.ArbitraryOwnerReference `json:"owner,omitempty"` + Permissions []Permission `json:"permissions,omitempty"` + PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"` + RoleName *string `json:"roleName,omitempty"` + Type *string `json:"type,omitempty"` +} + +var _ genruntime.ConvertibleSpec = &RoleDefinition_Spec{} + +// ConvertSpecFrom populates our RoleDefinition_Spec from the provided source +func (definition *RoleDefinition_Spec) ConvertSpecFrom(source genruntime.ConvertibleSpec) error { + if source == definition { + return errors.New("attempted conversion between unrelated implementations of github.com/Azure/azure-service-operator/v2/pkg/genruntime/ConvertibleSpec") + } + + return source.ConvertSpecTo(definition) +} + +// ConvertSpecTo populates the provided destination from our RoleDefinition_Spec +func (definition *RoleDefinition_Spec) ConvertSpecTo(destination genruntime.ConvertibleSpec) error { + if destination == definition { + return errors.New("attempted conversion between unrelated implementations of github.com/Azure/azure-service-operator/v2/pkg/genruntime/ConvertibleSpec") + } + + return destination.ConvertSpecFrom(definition) +} + +// Storage version of v1api20220401.RoleDefinition_STATUS +// Role definition. +type RoleDefinition_STATUS struct { + AssignableScopes []string `json:"assignableScopes,omitempty"` + Conditions []conditions.Condition `json:"conditions,omitempty"` + CreatedBy *string `json:"createdBy,omitempty"` + CreatedOn *string `json:"createdOn,omitempty"` + Description *string `json:"description,omitempty"` + Id *string `json:"id,omitempty"` + Name *string `json:"name,omitempty"` + Permissions []Permission_STATUS `json:"permissions,omitempty"` + PropertiesType *string `json:"properties_type,omitempty"` + PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"` + RoleName *string `json:"roleName,omitempty"` + Type *string `json:"type,omitempty"` + UpdatedBy *string `json:"updatedBy,omitempty"` + UpdatedOn *string `json:"updatedOn,omitempty"` +} + +var _ genruntime.ConvertibleStatus = &RoleDefinition_STATUS{} + +// ConvertStatusFrom populates our RoleDefinition_STATUS from the provided source +func (definition *RoleDefinition_STATUS) ConvertStatusFrom(source genruntime.ConvertibleStatus) error { + if source == definition { + return errors.New("attempted conversion between unrelated implementations of github.com/Azure/azure-service-operator/v2/pkg/genruntime/ConvertibleStatus") + } + + return source.ConvertStatusTo(definition) +} + +// ConvertStatusTo populates the provided destination from our RoleDefinition_STATUS +func (definition *RoleDefinition_STATUS) ConvertStatusTo(destination genruntime.ConvertibleStatus) error { + if destination == definition { + return errors.New("attempted conversion between unrelated implementations of github.com/Azure/azure-service-operator/v2/pkg/genruntime/ConvertibleStatus") + } + + return destination.ConvertStatusFrom(definition) +} + +// Storage version of v1api20220401.Permission +// Role definition permissions. +type Permission struct { + Actions []string `json:"actions,omitempty"` + DataActions []string `json:"dataActions,omitempty"` + NotActions []string `json:"notActions,omitempty"` + NotDataActions []string `json:"notDataActions,omitempty"` + PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"` +} + +// Storage version of v1api20220401.Permission_STATUS +// Role definition permissions. +type Permission_STATUS struct { + Actions []string `json:"actions,omitempty"` + DataActions []string `json:"dataActions,omitempty"` + NotActions []string `json:"notActions,omitempty"` + NotDataActions []string `json:"notDataActions,omitempty"` + PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"` +} + +func init() { + SchemeBuilder.Register(&RoleDefinition{}, &RoleDefinitionList{}) +} diff --git a/v2/api/authorization/v1api20220401/storage/role_definition_types_gen_test.go b/v2/api/authorization/v1api20220401/storage/role_definition_types_gen_test.go new file mode 100644 index 00000000000..e7cbf9f8a01 --- /dev/null +++ b/v2/api/authorization/v1api20220401/storage/role_definition_types_gen_test.go @@ -0,0 +1,369 @@ +// Code generated by azure-service-operator-codegen. DO NOT EDIT. +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. +package storage + +import ( + "encoding/json" + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/kr/pretty" + "github.com/kylelemons/godebug/diff" + "github.com/leanovate/gopter" + "github.com/leanovate/gopter/gen" + "github.com/leanovate/gopter/prop" + "os" + "reflect" + "testing" +) + +func Test_RoleDefinition_WhenSerializedToJson_DeserializesAsEqual(t *testing.T) { + t.Parallel() + parameters := gopter.DefaultTestParameters() + parameters.MinSuccessfulTests = 20 + parameters.MaxSize = 3 + properties := gopter.NewProperties(parameters) + properties.Property( + "Round trip of RoleDefinition via JSON returns original", + prop.ForAll(RunJSONSerializationTestForRoleDefinition, RoleDefinitionGenerator())) + properties.TestingRun(t, gopter.NewFormatedReporter(true, 240, os.Stdout)) +} + +// RunJSONSerializationTestForRoleDefinition runs a test to see if a specific instance of RoleDefinition round trips to JSON and back losslessly +func RunJSONSerializationTestForRoleDefinition(subject RoleDefinition) string { + // Serialize to JSON + bin, err := json.Marshal(subject) + if err != nil { + return err.Error() + } + + // Deserialize back into memory + var actual RoleDefinition + err = json.Unmarshal(bin, &actual) + if err != nil { + return err.Error() + } + + // Check for outcome + match := cmp.Equal(subject, actual, cmpopts.EquateEmpty()) + if !match { + actualFmt := pretty.Sprint(actual) + subjectFmt := pretty.Sprint(subject) + result := diff.Diff(subjectFmt, actualFmt) + return result + } + + return "" +} + +// Generator of RoleDefinition instances for property testing - lazily instantiated by RoleDefinitionGenerator() +var roleDefinitionGenerator gopter.Gen + +// RoleDefinitionGenerator returns a generator of RoleDefinition instances for property testing. +func RoleDefinitionGenerator() gopter.Gen { + if roleDefinitionGenerator != nil { + return roleDefinitionGenerator + } + + generators := make(map[string]gopter.Gen) + AddRelatedPropertyGeneratorsForRoleDefinition(generators) + roleDefinitionGenerator = gen.Struct(reflect.TypeOf(RoleDefinition{}), generators) + + return roleDefinitionGenerator +} + +// AddRelatedPropertyGeneratorsForRoleDefinition is a factory method for creating gopter generators +func AddRelatedPropertyGeneratorsForRoleDefinition(gens map[string]gopter.Gen) { + gens["Spec"] = RoleDefinition_SpecGenerator() + gens["Status"] = RoleDefinition_STATUSGenerator() +} + +func Test_RoleDefinition_Spec_WhenSerializedToJson_DeserializesAsEqual(t *testing.T) { + t.Parallel() + parameters := gopter.DefaultTestParameters() + parameters.MinSuccessfulTests = 80 + parameters.MaxSize = 3 + properties := gopter.NewProperties(parameters) + properties.Property( + "Round trip of RoleDefinition_Spec via JSON returns original", + prop.ForAll(RunJSONSerializationTestForRoleDefinition_Spec, RoleDefinition_SpecGenerator())) + properties.TestingRun(t, gopter.NewFormatedReporter(true, 240, os.Stdout)) +} + +// RunJSONSerializationTestForRoleDefinition_Spec runs a test to see if a specific instance of RoleDefinition_Spec round trips to JSON and back losslessly +func RunJSONSerializationTestForRoleDefinition_Spec(subject RoleDefinition_Spec) string { + // Serialize to JSON + bin, err := json.Marshal(subject) + if err != nil { + return err.Error() + } + + // Deserialize back into memory + var actual RoleDefinition_Spec + err = json.Unmarshal(bin, &actual) + if err != nil { + return err.Error() + } + + // Check for outcome + match := cmp.Equal(subject, actual, cmpopts.EquateEmpty()) + if !match { + actualFmt := pretty.Sprint(actual) + subjectFmt := pretty.Sprint(subject) + result := diff.Diff(subjectFmt, actualFmt) + return result + } + + return "" +} + +// Generator of RoleDefinition_Spec instances for property testing - lazily instantiated by +// RoleDefinition_SpecGenerator() +var roleDefinition_SpecGenerator gopter.Gen + +// RoleDefinition_SpecGenerator returns a generator of RoleDefinition_Spec instances for property testing. +// We first initialize roleDefinition_SpecGenerator with a simplified generator based on the +// fields with primitive types then replacing it with a more complex one that also handles complex fields +// to ensure any cycles in the object graph properly terminate. +func RoleDefinition_SpecGenerator() gopter.Gen { + if roleDefinition_SpecGenerator != nil { + return roleDefinition_SpecGenerator + } + + generators := make(map[string]gopter.Gen) + AddIndependentPropertyGeneratorsForRoleDefinition_Spec(generators) + roleDefinition_SpecGenerator = gen.Struct(reflect.TypeOf(RoleDefinition_Spec{}), generators) + + // The above call to gen.Struct() captures the map, so create a new one + generators = make(map[string]gopter.Gen) + AddIndependentPropertyGeneratorsForRoleDefinition_Spec(generators) + AddRelatedPropertyGeneratorsForRoleDefinition_Spec(generators) + roleDefinition_SpecGenerator = gen.Struct(reflect.TypeOf(RoleDefinition_Spec{}), generators) + + return roleDefinition_SpecGenerator +} + +// AddIndependentPropertyGeneratorsForRoleDefinition_Spec is a factory method for creating gopter generators +func AddIndependentPropertyGeneratorsForRoleDefinition_Spec(gens map[string]gopter.Gen) { + gens["AzureName"] = gen.AlphaString() + gens["Description"] = gen.PtrOf(gen.AlphaString()) + gens["OriginalVersion"] = gen.AlphaString() + gens["RoleName"] = gen.PtrOf(gen.AlphaString()) + gens["Type"] = gen.PtrOf(gen.AlphaString()) +} + +// AddRelatedPropertyGeneratorsForRoleDefinition_Spec is a factory method for creating gopter generators +func AddRelatedPropertyGeneratorsForRoleDefinition_Spec(gens map[string]gopter.Gen) { + gens["Permissions"] = gen.SliceOf(PermissionGenerator()) +} + +func Test_RoleDefinition_STATUS_WhenSerializedToJson_DeserializesAsEqual(t *testing.T) { + t.Parallel() + parameters := gopter.DefaultTestParameters() + parameters.MinSuccessfulTests = 80 + parameters.MaxSize = 3 + properties := gopter.NewProperties(parameters) + properties.Property( + "Round trip of RoleDefinition_STATUS via JSON returns original", + prop.ForAll(RunJSONSerializationTestForRoleDefinition_STATUS, RoleDefinition_STATUSGenerator())) + properties.TestingRun(t, gopter.NewFormatedReporter(true, 240, os.Stdout)) +} + +// RunJSONSerializationTestForRoleDefinition_STATUS runs a test to see if a specific instance of RoleDefinition_STATUS round trips to JSON and back losslessly +func RunJSONSerializationTestForRoleDefinition_STATUS(subject RoleDefinition_STATUS) string { + // Serialize to JSON + bin, err := json.Marshal(subject) + if err != nil { + return err.Error() + } + + // Deserialize back into memory + var actual RoleDefinition_STATUS + err = json.Unmarshal(bin, &actual) + if err != nil { + return err.Error() + } + + // Check for outcome + match := cmp.Equal(subject, actual, cmpopts.EquateEmpty()) + if !match { + actualFmt := pretty.Sprint(actual) + subjectFmt := pretty.Sprint(subject) + result := diff.Diff(subjectFmt, actualFmt) + return result + } + + return "" +} + +// Generator of RoleDefinition_STATUS instances for property testing - lazily instantiated by +// RoleDefinition_STATUSGenerator() +var roleDefinition_STATUSGenerator gopter.Gen + +// RoleDefinition_STATUSGenerator returns a generator of RoleDefinition_STATUS instances for property testing. +// We first initialize roleDefinition_STATUSGenerator with a simplified generator based on the +// fields with primitive types then replacing it with a more complex one that also handles complex fields +// to ensure any cycles in the object graph properly terminate. +func RoleDefinition_STATUSGenerator() gopter.Gen { + if roleDefinition_STATUSGenerator != nil { + return roleDefinition_STATUSGenerator + } + + generators := make(map[string]gopter.Gen) + AddIndependentPropertyGeneratorsForRoleDefinition_STATUS(generators) + roleDefinition_STATUSGenerator = gen.Struct(reflect.TypeOf(RoleDefinition_STATUS{}), generators) + + // The above call to gen.Struct() captures the map, so create a new one + generators = make(map[string]gopter.Gen) + AddIndependentPropertyGeneratorsForRoleDefinition_STATUS(generators) + AddRelatedPropertyGeneratorsForRoleDefinition_STATUS(generators) + roleDefinition_STATUSGenerator = gen.Struct(reflect.TypeOf(RoleDefinition_STATUS{}), generators) + + return roleDefinition_STATUSGenerator +} + +// AddIndependentPropertyGeneratorsForRoleDefinition_STATUS is a factory method for creating gopter generators +func AddIndependentPropertyGeneratorsForRoleDefinition_STATUS(gens map[string]gopter.Gen) { + gens["AssignableScopes"] = gen.SliceOf(gen.AlphaString()) + gens["CreatedBy"] = gen.PtrOf(gen.AlphaString()) + gens["CreatedOn"] = gen.PtrOf(gen.AlphaString()) + gens["Description"] = gen.PtrOf(gen.AlphaString()) + gens["Id"] = gen.PtrOf(gen.AlphaString()) + gens["Name"] = gen.PtrOf(gen.AlphaString()) + gens["PropertiesType"] = gen.PtrOf(gen.AlphaString()) + gens["RoleName"] = gen.PtrOf(gen.AlphaString()) + gens["Type"] = gen.PtrOf(gen.AlphaString()) + gens["UpdatedBy"] = gen.PtrOf(gen.AlphaString()) + gens["UpdatedOn"] = gen.PtrOf(gen.AlphaString()) +} + +// AddRelatedPropertyGeneratorsForRoleDefinition_STATUS is a factory method for creating gopter generators +func AddRelatedPropertyGeneratorsForRoleDefinition_STATUS(gens map[string]gopter.Gen) { + gens["Permissions"] = gen.SliceOf(Permission_STATUSGenerator()) +} + +func Test_Permission_WhenSerializedToJson_DeserializesAsEqual(t *testing.T) { + t.Parallel() + parameters := gopter.DefaultTestParameters() + parameters.MinSuccessfulTests = 100 + parameters.MaxSize = 3 + properties := gopter.NewProperties(parameters) + properties.Property( + "Round trip of Permission via JSON returns original", + prop.ForAll(RunJSONSerializationTestForPermission, PermissionGenerator())) + properties.TestingRun(t, gopter.NewFormatedReporter(true, 240, os.Stdout)) +} + +// RunJSONSerializationTestForPermission runs a test to see if a specific instance of Permission round trips to JSON and back losslessly +func RunJSONSerializationTestForPermission(subject Permission) string { + // Serialize to JSON + bin, err := json.Marshal(subject) + if err != nil { + return err.Error() + } + + // Deserialize back into memory + var actual Permission + err = json.Unmarshal(bin, &actual) + if err != nil { + return err.Error() + } + + // Check for outcome + match := cmp.Equal(subject, actual, cmpopts.EquateEmpty()) + if !match { + actualFmt := pretty.Sprint(actual) + subjectFmt := pretty.Sprint(subject) + result := diff.Diff(subjectFmt, actualFmt) + return result + } + + return "" +} + +// Generator of Permission instances for property testing - lazily instantiated by PermissionGenerator() +var permissionGenerator gopter.Gen + +// PermissionGenerator returns a generator of Permission instances for property testing. +func PermissionGenerator() gopter.Gen { + if permissionGenerator != nil { + return permissionGenerator + } + + generators := make(map[string]gopter.Gen) + AddIndependentPropertyGeneratorsForPermission(generators) + permissionGenerator = gen.Struct(reflect.TypeOf(Permission{}), generators) + + return permissionGenerator +} + +// AddIndependentPropertyGeneratorsForPermission is a factory method for creating gopter generators +func AddIndependentPropertyGeneratorsForPermission(gens map[string]gopter.Gen) { + gens["Actions"] = gen.SliceOf(gen.AlphaString()) + gens["DataActions"] = gen.SliceOf(gen.AlphaString()) + gens["NotActions"] = gen.SliceOf(gen.AlphaString()) + gens["NotDataActions"] = gen.SliceOf(gen.AlphaString()) +} + +func Test_Permission_STATUS_WhenSerializedToJson_DeserializesAsEqual(t *testing.T) { + t.Parallel() + parameters := gopter.DefaultTestParameters() + parameters.MinSuccessfulTests = 80 + parameters.MaxSize = 3 + properties := gopter.NewProperties(parameters) + properties.Property( + "Round trip of Permission_STATUS via JSON returns original", + prop.ForAll(RunJSONSerializationTestForPermission_STATUS, Permission_STATUSGenerator())) + properties.TestingRun(t, gopter.NewFormatedReporter(true, 240, os.Stdout)) +} + +// RunJSONSerializationTestForPermission_STATUS runs a test to see if a specific instance of Permission_STATUS round trips to JSON and back losslessly +func RunJSONSerializationTestForPermission_STATUS(subject Permission_STATUS) string { + // Serialize to JSON + bin, err := json.Marshal(subject) + if err != nil { + return err.Error() + } + + // Deserialize back into memory + var actual Permission_STATUS + err = json.Unmarshal(bin, &actual) + if err != nil { + return err.Error() + } + + // Check for outcome + match := cmp.Equal(subject, actual, cmpopts.EquateEmpty()) + if !match { + actualFmt := pretty.Sprint(actual) + subjectFmt := pretty.Sprint(subject) + result := diff.Diff(subjectFmt, actualFmt) + return result + } + + return "" +} + +// Generator of Permission_STATUS instances for property testing - lazily instantiated by Permission_STATUSGenerator() +var permission_STATUSGenerator gopter.Gen + +// Permission_STATUSGenerator returns a generator of Permission_STATUS instances for property testing. +func Permission_STATUSGenerator() gopter.Gen { + if permission_STATUSGenerator != nil { + return permission_STATUSGenerator + } + + generators := make(map[string]gopter.Gen) + AddIndependentPropertyGeneratorsForPermission_STATUS(generators) + permission_STATUSGenerator = gen.Struct(reflect.TypeOf(Permission_STATUS{}), generators) + + return permission_STATUSGenerator +} + +// AddIndependentPropertyGeneratorsForPermission_STATUS is a factory method for creating gopter generators +func AddIndependentPropertyGeneratorsForPermission_STATUS(gens map[string]gopter.Gen) { + gens["Actions"] = gen.SliceOf(gen.AlphaString()) + gens["DataActions"] = gen.SliceOf(gen.AlphaString()) + gens["NotActions"] = gen.SliceOf(gen.AlphaString()) + gens["NotDataActions"] = gen.SliceOf(gen.AlphaString()) +} diff --git a/v2/api/authorization/v1api20220401/storage/structure.txt b/v2/api/authorization/v1api20220401/storage/structure.txt index 2726cf7afb6..a64ce3abadd 100644 --- a/v2/api/authorization/v1api20220401/storage/structure.txt +++ b/v2/api/authorization/v1api20220401/storage/structure.txt @@ -2,35 +2,71 @@ github.com/Azure/azure-service-operator/v2/api/authorization/v1api20220401/storage ├── APIVersion: Enum (1 value) │ └── "2022-04-01" -└── RoleAssignment: Resource - ├── Spec: Object (12 properties) +├── RoleAssignment: Resource +│ ├── Spec: Object (12 properties) +│ │ ├── AzureName: string +│ │ ├── Condition: *string +│ │ ├── ConditionVersion: *string +│ │ ├── DelegatedManagedIdentityResourceId: *string +│ │ ├── Description: *string +│ │ ├── OriginalVersion: string +│ │ ├── Owner: *genruntime.ArbitraryOwnerReference +│ │ ├── PrincipalId: *string +│ │ ├── PrincipalIdFromConfig: *genruntime.ConfigMapReference +│ │ ├── PrincipalType: *string +│ │ ├── PropertyBag: genruntime.PropertyBag +│ │ └── RoleDefinitionReference: *genruntime.ResourceReference +│ └── Status: Object (17 properties) +│ ├── Condition: *string +│ ├── ConditionVersion: *string +│ ├── Conditions: conditions.Condition[] +│ ├── CreatedBy: *string +│ ├── CreatedOn: *string +│ ├── DelegatedManagedIdentityResourceId: *string +│ ├── Description: *string +│ ├── Id: *string +│ ├── Name: *string +│ ├── PrincipalId: *string +│ ├── PrincipalType: *string +│ ├── PropertyBag: genruntime.PropertyBag +│ ├── RoleDefinitionId: *string +│ ├── Scope: *string +│ ├── Type: *string +│ ├── UpdatedBy: *string +│ └── UpdatedOn: *string +└── RoleDefinition: Resource + ├── Spec: Object (9 properties) + │ ├── AssignableScopesReferences: genruntime.ResourceReference[] │ ├── AzureName: string - │ ├── Condition: *string - │ ├── ConditionVersion: *string - │ ├── DelegatedManagedIdentityResourceId: *string │ ├── Description: *string │ ├── OriginalVersion: string │ ├── Owner: *genruntime.ArbitraryOwnerReference - │ ├── PrincipalId: *string - │ ├── PrincipalIdFromConfig: *genruntime.ConfigMapReference - │ ├── PrincipalType: *string + │ ├── Permissions: Object (5 properties)[] + │ │ ├── Actions: string[] + │ │ ├── DataActions: string[] + │ │ ├── NotActions: string[] + │ │ ├── NotDataActions: string[] + │ │ └── PropertyBag: genruntime.PropertyBag │ ├── PropertyBag: genruntime.PropertyBag - │ └── RoleDefinitionReference: *genruntime.ResourceReference - └── Status: Object (17 properties) - ├── Condition: *string - ├── ConditionVersion: *string + │ ├── RoleName: *string + │ └── Type: *string + └── Status: Object (14 properties) + ├── AssignableScopes: string[] ├── Conditions: conditions.Condition[] ├── CreatedBy: *string ├── CreatedOn: *string - ├── DelegatedManagedIdentityResourceId: *string ├── Description: *string ├── Id: *string ├── Name: *string - ├── PrincipalId: *string - ├── PrincipalType: *string + ├── Permissions: Object (5 properties)[] + │ ├── Actions: string[] + │ ├── DataActions: string[] + │ ├── NotActions: string[] + │ ├── NotDataActions: string[] + │ └── PropertyBag: genruntime.PropertyBag + ├── PropertiesType: *string ├── PropertyBag: genruntime.PropertyBag - ├── RoleDefinitionId: *string - ├── Scope: *string + ├── RoleName: *string ├── Type: *string ├── UpdatedBy: *string └── UpdatedOn: *string diff --git a/v2/api/authorization/v1api20220401/storage/zz_generated.deepcopy.go b/v2/api/authorization/v1api20220401/storage/zz_generated.deepcopy.go index 9c976d891fb..b40916928fe 100644 --- a/v2/api/authorization/v1api20220401/storage/zz_generated.deepcopy.go +++ b/v2/api/authorization/v1api20220401/storage/zz_generated.deepcopy.go @@ -15,6 +15,90 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" ) +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Permission) DeepCopyInto(out *Permission) { + *out = *in + if in.Actions != nil { + in, out := &in.Actions, &out.Actions + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.DataActions != nil { + in, out := &in.DataActions, &out.DataActions + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.NotActions != nil { + in, out := &in.NotActions, &out.NotActions + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.NotDataActions != nil { + in, out := &in.NotDataActions, &out.NotDataActions + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.PropertyBag != nil { + in, out := &in.PropertyBag, &out.PropertyBag + *out = make(genruntime.PropertyBag, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Permission. +func (in *Permission) DeepCopy() *Permission { + if in == nil { + return nil + } + out := new(Permission) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Permission_STATUS) DeepCopyInto(out *Permission_STATUS) { + *out = *in + if in.Actions != nil { + in, out := &in.Actions, &out.Actions + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.DataActions != nil { + in, out := &in.DataActions, &out.DataActions + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.NotActions != nil { + in, out := &in.NotActions, &out.NotActions + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.NotDataActions != nil { + in, out := &in.NotDataActions, &out.NotDataActions + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.PropertyBag != nil { + in, out := &in.PropertyBag, &out.PropertyBag + *out = make(genruntime.PropertyBag, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Permission_STATUS. +func (in *Permission_STATUS) DeepCopy() *Permission_STATUS { + if in == nil { + return nil + } + out := new(Permission_STATUS) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *RoleAssignment) DeepCopyInto(out *RoleAssignment) { *out = *in @@ -244,3 +328,207 @@ func (in *RoleAssignment_Spec) DeepCopy() *RoleAssignment_Spec { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RoleDefinition) DeepCopyInto(out *RoleDefinition) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RoleDefinition. +func (in *RoleDefinition) DeepCopy() *RoleDefinition { + if in == nil { + return nil + } + out := new(RoleDefinition) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *RoleDefinition) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RoleDefinitionList) DeepCopyInto(out *RoleDefinitionList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]RoleDefinition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RoleDefinitionList. +func (in *RoleDefinitionList) DeepCopy() *RoleDefinitionList { + if in == nil { + return nil + } + out := new(RoleDefinitionList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *RoleDefinitionList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RoleDefinition_STATUS) DeepCopyInto(out *RoleDefinition_STATUS) { + *out = *in + if in.AssignableScopes != nil { + in, out := &in.AssignableScopes, &out.AssignableScopes + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]conditions.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.CreatedBy != nil { + in, out := &in.CreatedBy, &out.CreatedBy + *out = new(string) + **out = **in + } + if in.CreatedOn != nil { + in, out := &in.CreatedOn, &out.CreatedOn + *out = new(string) + **out = **in + } + if in.Description != nil { + in, out := &in.Description, &out.Description + *out = new(string) + **out = **in + } + if in.Id != nil { + in, out := &in.Id, &out.Id + *out = new(string) + **out = **in + } + if in.Name != nil { + in, out := &in.Name, &out.Name + *out = new(string) + **out = **in + } + if in.Permissions != nil { + in, out := &in.Permissions, &out.Permissions + *out = make([]Permission_STATUS, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.PropertiesType != nil { + in, out := &in.PropertiesType, &out.PropertiesType + *out = new(string) + **out = **in + } + if in.PropertyBag != nil { + in, out := &in.PropertyBag, &out.PropertyBag + *out = make(genruntime.PropertyBag, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + if in.RoleName != nil { + in, out := &in.RoleName, &out.RoleName + *out = new(string) + **out = **in + } + if in.Type != nil { + in, out := &in.Type, &out.Type + *out = new(string) + **out = **in + } + if in.UpdatedBy != nil { + in, out := &in.UpdatedBy, &out.UpdatedBy + *out = new(string) + **out = **in + } + if in.UpdatedOn != nil { + in, out := &in.UpdatedOn, &out.UpdatedOn + *out = new(string) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RoleDefinition_STATUS. +func (in *RoleDefinition_STATUS) DeepCopy() *RoleDefinition_STATUS { + if in == nil { + return nil + } + out := new(RoleDefinition_STATUS) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RoleDefinition_Spec) DeepCopyInto(out *RoleDefinition_Spec) { + *out = *in + if in.AssignableScopesReferences != nil { + in, out := &in.AssignableScopesReferences, &out.AssignableScopesReferences + *out = make([]genruntime.ResourceReference, len(*in)) + copy(*out, *in) + } + if in.Description != nil { + in, out := &in.Description, &out.Description + *out = new(string) + **out = **in + } + if in.Owner != nil { + in, out := &in.Owner, &out.Owner + *out = new(genruntime.ArbitraryOwnerReference) + **out = **in + } + if in.Permissions != nil { + in, out := &in.Permissions, &out.Permissions + *out = make([]Permission, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.PropertyBag != nil { + in, out := &in.PropertyBag, &out.PropertyBag + *out = make(genruntime.PropertyBag, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + if in.RoleName != nil { + in, out := &in.RoleName, &out.RoleName + *out = new(string) + **out = **in + } + if in.Type != nil { + in, out := &in.Type, &out.Type + *out = new(string) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RoleDefinition_Spec. +func (in *RoleDefinition_Spec) DeepCopy() *RoleDefinition_Spec { + if in == nil { + return nil + } + out := new(RoleDefinition_Spec) + in.DeepCopyInto(out) + return out +} diff --git a/v2/api/authorization/v1api20220401/structure.txt b/v2/api/authorization/v1api20220401/structure.txt index 8719d9d24c1..b6ce3e9ffc0 100644 --- a/v2/api/authorization/v1api20220401/structure.txt +++ b/v2/api/authorization/v1api20220401/structure.txt @@ -63,18 +63,79 @@ github.com/Azure/azure-service-operator/v2/api/authorization/v1api20220401 │ │ ├── UpdatedBy: *string │ │ └── UpdatedOn: *string │ └── Type: *string -└── RoleAssignment_Spec_ARM: Object (2 properties) +├── RoleAssignment_Spec_ARM: Object (2 properties) +│ ├── Name: string +│ └── Properties: *Object (7 properties) +│ ├── Condition: *string +│ ├── ConditionVersion: *string +│ ├── DelegatedManagedIdentityResourceId: *string +│ ├── Description: *string +│ ├── PrincipalId: *string +│ ├── PrincipalType: *Enum (5 values) +│ │ ├── "Device" +│ │ ├── "ForeignGroup" +│ │ ├── "Group" +│ │ ├── "ServicePrincipal" +│ │ └── "User" +│ └── RoleDefinitionId: *string +├── RoleDefinition: Resource +│ ├── Spec: Object (7 properties) +│ │ ├── AssignableScopesReferences: genruntime.ResourceReference[] +│ │ ├── AzureName: string +│ │ ├── Description: *string +│ │ ├── Owner: *genruntime.ArbitraryOwnerReference +│ │ ├── Permissions: Object (4 properties)[] +│ │ │ ├── Actions: string[] +│ │ │ ├── DataActions: string[] +│ │ │ ├── NotActions: string[] +│ │ │ └── NotDataActions: string[] +│ │ ├── RoleName: *string +│ │ └── Type: *string +│ └── Status: Object (13 properties) +│ ├── AssignableScopes: string[] +│ ├── Conditions: conditions.Condition[] +│ ├── CreatedBy: *string +│ ├── CreatedOn: *string +│ ├── Description: *string +│ ├── Id: *string +│ ├── Name: *string +│ ├── Permissions: Object (4 properties)[] +│ │ ├── Actions: string[] +│ │ ├── DataActions: string[] +│ │ ├── NotActions: string[] +│ │ └── NotDataActions: string[] +│ ├── PropertiesType: *string +│ ├── RoleName: *string +│ ├── Type: *string +│ ├── UpdatedBy: *string +│ └── UpdatedOn: *string +├── RoleDefinition_STATUS_ARM: Object (4 properties) +│ ├── Id: *string +│ ├── Name: *string +│ ├── Properties: *Object (9 properties) +│ │ ├── AssignableScopes: string[] +│ │ ├── CreatedBy: *string +│ │ ├── CreatedOn: *string +│ │ ├── Description: *string +│ │ ├── Permissions: Object (4 properties)[] +│ │ │ ├── Actions: string[] +│ │ │ ├── DataActions: string[] +│ │ │ ├── NotActions: string[] +│ │ │ └── NotDataActions: string[] +│ │ ├── RoleName: *string +│ │ ├── Type: *string +│ │ ├── UpdatedBy: *string +│ │ └── UpdatedOn: *string +│ └── Type: *string +└── RoleDefinition_Spec_ARM: Object (2 properties) ├── Name: string - └── Properties: *Object (7 properties) - ├── Condition: *string - ├── ConditionVersion: *string - ├── DelegatedManagedIdentityResourceId: *string + └── Properties: *Object (5 properties) + ├── AssignableScopes: string[] ├── Description: *string - ├── PrincipalId: *string - ├── PrincipalType: *Enum (5 values) - │ ├── "Device" - │ ├── "ForeignGroup" - │ ├── "Group" - │ ├── "ServicePrincipal" - │ └── "User" - └── RoleDefinitionId: *string + ├── Permissions: Object (4 properties)[] + │ ├── Actions: string[] + │ ├── DataActions: string[] + │ ├── NotActions: string[] + │ └── NotDataActions: string[] + ├── RoleName: *string + └── Type: *string diff --git a/v2/api/authorization/v1api20220401/zz_generated.deepcopy.go b/v2/api/authorization/v1api20220401/zz_generated.deepcopy.go index 2627bb62001..8f864e8e54c 100644 --- a/v2/api/authorization/v1api20220401/zz_generated.deepcopy.go +++ b/v2/api/authorization/v1api20220401/zz_generated.deepcopy.go @@ -15,6 +15,146 @@ import ( "k8s.io/apimachinery/pkg/runtime" ) +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Permission) DeepCopyInto(out *Permission) { + *out = *in + if in.Actions != nil { + in, out := &in.Actions, &out.Actions + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.DataActions != nil { + in, out := &in.DataActions, &out.DataActions + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.NotActions != nil { + in, out := &in.NotActions, &out.NotActions + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.NotDataActions != nil { + in, out := &in.NotDataActions, &out.NotDataActions + *out = make([]string, len(*in)) + copy(*out, *in) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Permission. +func (in *Permission) DeepCopy() *Permission { + if in == nil { + return nil + } + out := new(Permission) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Permission_ARM) DeepCopyInto(out *Permission_ARM) { + *out = *in + if in.Actions != nil { + in, out := &in.Actions, &out.Actions + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.DataActions != nil { + in, out := &in.DataActions, &out.DataActions + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.NotActions != nil { + in, out := &in.NotActions, &out.NotActions + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.NotDataActions != nil { + in, out := &in.NotDataActions, &out.NotDataActions + *out = make([]string, len(*in)) + copy(*out, *in) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Permission_ARM. +func (in *Permission_ARM) DeepCopy() *Permission_ARM { + if in == nil { + return nil + } + out := new(Permission_ARM) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Permission_STATUS) DeepCopyInto(out *Permission_STATUS) { + *out = *in + if in.Actions != nil { + in, out := &in.Actions, &out.Actions + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.DataActions != nil { + in, out := &in.DataActions, &out.DataActions + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.NotActions != nil { + in, out := &in.NotActions, &out.NotActions + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.NotDataActions != nil { + in, out := &in.NotDataActions, &out.NotDataActions + *out = make([]string, len(*in)) + copy(*out, *in) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Permission_STATUS. +func (in *Permission_STATUS) DeepCopy() *Permission_STATUS { + if in == nil { + return nil + } + out := new(Permission_STATUS) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Permission_STATUS_ARM) DeepCopyInto(out *Permission_STATUS_ARM) { + *out = *in + if in.Actions != nil { + in, out := &in.Actions, &out.Actions + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.DataActions != nil { + in, out := &in.DataActions, &out.DataActions + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.NotActions != nil { + in, out := &in.NotActions, &out.NotActions + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.NotDataActions != nil { + in, out := &in.NotDataActions, &out.NotDataActions + *out = make([]string, len(*in)) + copy(*out, *in) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Permission_STATUS_ARM. +func (in *Permission_STATUS_ARM) DeepCopy() *Permission_STATUS_ARM { + if in == nil { + return nil + } + out := new(Permission_STATUS_ARM) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *RoleAssignment) DeepCopyInto(out *RoleAssignment) { *out = *in @@ -410,3 +550,352 @@ func (in *RoleAssignment_Spec_ARM) DeepCopy() *RoleAssignment_Spec_ARM { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RoleDefinition) DeepCopyInto(out *RoleDefinition) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RoleDefinition. +func (in *RoleDefinition) DeepCopy() *RoleDefinition { + if in == nil { + return nil + } + out := new(RoleDefinition) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *RoleDefinition) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RoleDefinitionList) DeepCopyInto(out *RoleDefinitionList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]RoleDefinition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RoleDefinitionList. +func (in *RoleDefinitionList) DeepCopy() *RoleDefinitionList { + if in == nil { + return nil + } + out := new(RoleDefinitionList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *RoleDefinitionList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RoleDefinitionProperties_ARM) DeepCopyInto(out *RoleDefinitionProperties_ARM) { + *out = *in + if in.AssignableScopes != nil { + in, out := &in.AssignableScopes, &out.AssignableScopes + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Description != nil { + in, out := &in.Description, &out.Description + *out = new(string) + **out = **in + } + if in.Permissions != nil { + in, out := &in.Permissions, &out.Permissions + *out = make([]Permission_ARM, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.RoleName != nil { + in, out := &in.RoleName, &out.RoleName + *out = new(string) + **out = **in + } + if in.Type != nil { + in, out := &in.Type, &out.Type + *out = new(string) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RoleDefinitionProperties_ARM. +func (in *RoleDefinitionProperties_ARM) DeepCopy() *RoleDefinitionProperties_ARM { + if in == nil { + return nil + } + out := new(RoleDefinitionProperties_ARM) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RoleDefinitionProperties_STATUS_ARM) DeepCopyInto(out *RoleDefinitionProperties_STATUS_ARM) { + *out = *in + if in.AssignableScopes != nil { + in, out := &in.AssignableScopes, &out.AssignableScopes + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.CreatedBy != nil { + in, out := &in.CreatedBy, &out.CreatedBy + *out = new(string) + **out = **in + } + if in.CreatedOn != nil { + in, out := &in.CreatedOn, &out.CreatedOn + *out = new(string) + **out = **in + } + if in.Description != nil { + in, out := &in.Description, &out.Description + *out = new(string) + **out = **in + } + if in.Permissions != nil { + in, out := &in.Permissions, &out.Permissions + *out = make([]Permission_STATUS_ARM, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.RoleName != nil { + in, out := &in.RoleName, &out.RoleName + *out = new(string) + **out = **in + } + if in.Type != nil { + in, out := &in.Type, &out.Type + *out = new(string) + **out = **in + } + if in.UpdatedBy != nil { + in, out := &in.UpdatedBy, &out.UpdatedBy + *out = new(string) + **out = **in + } + if in.UpdatedOn != nil { + in, out := &in.UpdatedOn, &out.UpdatedOn + *out = new(string) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RoleDefinitionProperties_STATUS_ARM. +func (in *RoleDefinitionProperties_STATUS_ARM) DeepCopy() *RoleDefinitionProperties_STATUS_ARM { + if in == nil { + return nil + } + out := new(RoleDefinitionProperties_STATUS_ARM) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RoleDefinition_STATUS) DeepCopyInto(out *RoleDefinition_STATUS) { + *out = *in + if in.AssignableScopes != nil { + in, out := &in.AssignableScopes, &out.AssignableScopes + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]conditions.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.CreatedBy != nil { + in, out := &in.CreatedBy, &out.CreatedBy + *out = new(string) + **out = **in + } + if in.CreatedOn != nil { + in, out := &in.CreatedOn, &out.CreatedOn + *out = new(string) + **out = **in + } + if in.Description != nil { + in, out := &in.Description, &out.Description + *out = new(string) + **out = **in + } + if in.Id != nil { + in, out := &in.Id, &out.Id + *out = new(string) + **out = **in + } + if in.Name != nil { + in, out := &in.Name, &out.Name + *out = new(string) + **out = **in + } + if in.Permissions != nil { + in, out := &in.Permissions, &out.Permissions + *out = make([]Permission_STATUS, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.PropertiesType != nil { + in, out := &in.PropertiesType, &out.PropertiesType + *out = new(string) + **out = **in + } + if in.RoleName != nil { + in, out := &in.RoleName, &out.RoleName + *out = new(string) + **out = **in + } + if in.Type != nil { + in, out := &in.Type, &out.Type + *out = new(string) + **out = **in + } + if in.UpdatedBy != nil { + in, out := &in.UpdatedBy, &out.UpdatedBy + *out = new(string) + **out = **in + } + if in.UpdatedOn != nil { + in, out := &in.UpdatedOn, &out.UpdatedOn + *out = new(string) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RoleDefinition_STATUS. +func (in *RoleDefinition_STATUS) DeepCopy() *RoleDefinition_STATUS { + if in == nil { + return nil + } + out := new(RoleDefinition_STATUS) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RoleDefinition_STATUS_ARM) DeepCopyInto(out *RoleDefinition_STATUS_ARM) { + *out = *in + if in.Id != nil { + in, out := &in.Id, &out.Id + *out = new(string) + **out = **in + } + if in.Name != nil { + in, out := &in.Name, &out.Name + *out = new(string) + **out = **in + } + if in.Properties != nil { + in, out := &in.Properties, &out.Properties + *out = new(RoleDefinitionProperties_STATUS_ARM) + (*in).DeepCopyInto(*out) + } + if in.Type != nil { + in, out := &in.Type, &out.Type + *out = new(string) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RoleDefinition_STATUS_ARM. +func (in *RoleDefinition_STATUS_ARM) DeepCopy() *RoleDefinition_STATUS_ARM { + if in == nil { + return nil + } + out := new(RoleDefinition_STATUS_ARM) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RoleDefinition_Spec) DeepCopyInto(out *RoleDefinition_Spec) { + *out = *in + if in.AssignableScopesReferences != nil { + in, out := &in.AssignableScopesReferences, &out.AssignableScopesReferences + *out = make([]genruntime.ResourceReference, len(*in)) + copy(*out, *in) + } + if in.Description != nil { + in, out := &in.Description, &out.Description + *out = new(string) + **out = **in + } + if in.Owner != nil { + in, out := &in.Owner, &out.Owner + *out = new(genruntime.ArbitraryOwnerReference) + **out = **in + } + if in.Permissions != nil { + in, out := &in.Permissions, &out.Permissions + *out = make([]Permission, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.RoleName != nil { + in, out := &in.RoleName, &out.RoleName + *out = new(string) + **out = **in + } + if in.Type != nil { + in, out := &in.Type, &out.Type + *out = new(string) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RoleDefinition_Spec. +func (in *RoleDefinition_Spec) DeepCopy() *RoleDefinition_Spec { + if in == nil { + return nil + } + out := new(RoleDefinition_Spec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RoleDefinition_Spec_ARM) DeepCopyInto(out *RoleDefinition_Spec_ARM) { + *out = *in + if in.Properties != nil { + in, out := &in.Properties, &out.Properties + *out = new(RoleDefinitionProperties_ARM) + (*in).DeepCopyInto(*out) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RoleDefinition_Spec_ARM. +func (in *RoleDefinition_Spec_ARM) DeepCopy() *RoleDefinition_Spec_ARM { + if in == nil { + return nil + } + out := new(RoleDefinition_Spec_ARM) + in.DeepCopyInto(out) + return out +} diff --git a/v2/api/authorization/versions_matrix.md b/v2/api/authorization/versions_matrix.md index f6bd3e2097a..0bfc6025f17 100644 --- a/v2/api/authorization/versions_matrix.md +++ b/v2/api/authorization/versions_matrix.md @@ -1,6 +1,8 @@ | Type Definitions in package "authorization" | v1api20200801preview | v1api20220401 | |-----------------------------------------------|----------------------|---------------| | APIVersion | v1api20200801preview | v1api20220401 | +| Permission | | v1api20220401 | +| Permission_STATUS | | v1api20220401 | | RoleAssignment | v1api20200801preview | v1api20220401 | | RoleAssignmentProperties | v1api20200801preview | v1api20220401 | | RoleAssignmentProperties_PrincipalType | v1api20200801preview | v1api20220401 | @@ -8,3 +10,8 @@ | RoleAssignmentProperties_STATUS | v1api20200801preview | v1api20220401 | | RoleAssignment_STATUS | v1api20200801preview | v1api20220401 | | RoleAssignment_Spec | v1api20200801preview | v1api20220401 | +| RoleDefinition | | v1api20220401 | +| RoleDefinitionProperties | | v1api20220401 | +| RoleDefinitionProperties_STATUS | | v1api20220401 | +| RoleDefinition_STATUS | | v1api20220401 | +| RoleDefinition_Spec | | v1api20220401 | diff --git a/v2/api/documentdb/v1api20210515/sql_role_assignment_defaults.go b/v2/api/documentdb/v1api20210515/sql_role_assignment_defaults.go index 73491127e7a..b2d7f673fcf 100644 --- a/v2/api/documentdb/v1api20210515/sql_role_assignment_defaults.go +++ b/v2/api/documentdb/v1api20210515/sql_role_assignment_defaults.go @@ -39,10 +39,12 @@ func (assignment *SqlRoleAssignment) defaultAzureName() { ownerGK := assignment.Owner().GroupKind() gk := assignment.GroupVersionKind().GroupKind() assignment.Spec.AzureName = randextensions.MakeUUIDName( - ownerGK, - assignment.Spec.Owner.Name, - gk, - assignment.Namespace, - assignment.Name) + assignment.Name, + randextensions.MakeUniqueOwnerScopedString( + ownerGK, + assignment.Spec.Owner.Name, + gk, + assignment.Namespace, + assignment.Name)) } } diff --git a/v2/api/documentdb/v1api20231115/sql_role_assignment_defaults.go b/v2/api/documentdb/v1api20231115/sql_role_assignment_defaults.go index fe25deacd1e..11ec0df8df2 100644 --- a/v2/api/documentdb/v1api20231115/sql_role_assignment_defaults.go +++ b/v2/api/documentdb/v1api20231115/sql_role_assignment_defaults.go @@ -39,10 +39,12 @@ func (assignment *SqlRoleAssignment) defaultAzureName() { ownerGK := assignment.Owner().GroupKind() gk := assignment.GroupVersionKind().GroupKind() assignment.Spec.AzureName = randextensions.MakeUUIDName( - ownerGK, - assignment.Spec.Owner.Name, - gk, - assignment.Namespace, - assignment.Name) + assignment.Name, + randextensions.MakeUniqueOwnerScopedString( + ownerGK, + assignment.Spec.Owner.Name, + gk, + assignment.Namespace, + assignment.Name)) } } diff --git a/v2/azure-arm.yaml b/v2/azure-arm.yaml index e2fc9d2af2b..c590f03f8f6 100644 --- a/v2/azure-arm.yaml +++ b/v2/azure-arm.yaml @@ -1144,6 +1144,13 @@ objectModelConfiguration: $armReference: true PrincipalId: $importConfigMapMode: optional + RoleDefinition: + $export: true + $supportedFrom: v2.8.0 + $defaultAzureName: false + RoleDefinitionProperties: + AssignableScopes: + $armReference: true batch: 2021-01-01: BatchAccount: diff --git a/v2/internal/controllers/authorization_roledefinition_test.go b/v2/internal/controllers/authorization_roledefinition_test.go new file mode 100644 index 00000000000..4c896b21816 --- /dev/null +++ b/v2/internal/controllers/authorization_roledefinition_test.go @@ -0,0 +1,108 @@ +/* +Copyright (c) Microsoft Corporation. +Licensed under the MIT license. +*/ + +package controllers_test + +import ( + "fmt" + "testing" + + . "github.com/onsi/gomega" + + authorization "github.com/Azure/azure-service-operator/v2/api/authorization/v1api20220401" + "github.com/Azure/azure-service-operator/v2/internal/util/to" + "github.com/Azure/azure-service-operator/v2/pkg/genruntime" +) + +// See https://learn.microsoft.com/en-us/azure/role-based-access-control/custom-roles-template and +// https://learn.microsoft.com/en-us/azure/role-based-access-control/custom-roles-rest#create-a-custom-role +func Test_Authorization_RoleDefinitionSubscriptionScope_CRUD(t *testing.T) { + t.Parallel() + + tc := globalTestContext.ForTest(t) + + subARMID := fmt.Sprintf("/subscriptions/%s", tc.AzureSubscription) + + om := tc.MakeObjectMeta("roledef") + roleDef := &authorization.RoleDefinition{ + ObjectMeta: om, + Spec: authorization.RoleDefinition_Spec{ + Owner: &genruntime.ArbitraryOwnerReference{ + ARMID: subARMID, + }, + Type: to.Ptr("customRole"), + AssignableScopesReferences: []genruntime.ResourceReference{ + { + ARMID: subARMID, + }, + }, + RoleName: to.Ptr(om.Name), + Permissions: []authorization.Permission{ + { + Actions: []string{ + "Microsoft.Resources/subscriptions/resourceGroups/read", + }, + }, + }, + }, + } + + tc.CreateResourceAndWait(roleDef) + + tc.Expect(roleDef.Status.Id).ToNot(BeNil()) + armId := *roleDef.Status.Id + + tc.DeleteResourceAndWait(roleDef) + + // Ensure that the resource group was really deleted in Azure + exists, _, err := tc.AzureClient.CheckExistenceWithGetByID( + tc.Ctx, + armId, + string(authorization.APIVersion_Value)) + tc.Expect(err).ToNot(HaveOccurred()) + tc.Expect(exists).To(BeFalse()) +} + +func Test_Authorization_RoleDefinitionResourceGroupScope_CRUD(t *testing.T) { + t.Parallel() + + tc := globalTestContext.ForTest(t) + rg := tc.NewTestResourceGroup() + + om := tc.MakeObjectMeta("roledef") + roleDef := &authorization.RoleDefinition{ + ObjectMeta: om, + Spec: authorization.RoleDefinition_Spec{ + Owner: tc.AsExtensionOwner(rg), + Type: to.Ptr("customRole"), + AssignableScopesReferences: []genruntime.ResourceReference{ + *tc.MakeReferenceFromResource(rg), + }, + RoleName: to.Ptr(om.Name), + Permissions: []authorization.Permission{ + { + Actions: []string{ + "Microsoft.Resources/subscriptions/resourceGroups/read", + }, + }, + }, + }, + } + + tc.CreateResourcesAndWait(rg, roleDef) + + tc.Expect(roleDef.Status.Id).ToNot(BeNil()) + armId := *roleDef.Status.Id + + tc.DeleteResourceAndWait(roleDef) + + // Ensure that the resource group was really deleted in Azure + exists, _, err := tc.AzureClient.CheckExistenceWithGetByID( + tc.Ctx, + armId, + string(authorization.APIVersion_Value)) + tc.Expect(err).ToNot(HaveOccurred()) + tc.Expect(exists).To(BeFalse()) +} diff --git a/v2/internal/controllers/controller_resources_gen.go b/v2/internal/controllers/controller_resources_gen.go index d2a602f25a4..144aad900b2 100644 --- a/v2/internal/controllers/controller_resources_gen.go +++ b/v2/internal/controllers/controller_resources_gen.go @@ -384,6 +384,7 @@ func getKnownStorageTypes() []*registration.StorageType { }, }, }) + result = append(result, ®istration.StorageType{Obj: new(authorization_v20220401s.RoleDefinition)}) result = append(result, ®istration.StorageType{Obj: new(batch_v20210101s.BatchAccount)}) result = append(result, ®istration.StorageType{Obj: new(cache_v20230401s.Redis)}) result = append(result, ®istration.StorageType{Obj: new(cache_v20230401s.RedisFirewallRule)}) @@ -1194,8 +1195,14 @@ func getKnownTypes() []client.Object { result = append(result, new(appconfiguration_v20220501s.ConfigurationStore)) result = append(result, new(authorization_v20200801p.RoleAssignment)) result = append(result, new(authorization_v20200801ps.RoleAssignment)) - result = append(result, new(authorization_v20220401.RoleAssignment)) - result = append(result, new(authorization_v20220401s.RoleAssignment)) + result = append( + result, + new(authorization_v20220401.RoleAssignment), + new(authorization_v20220401.RoleDefinition)) + result = append( + result, + new(authorization_v20220401s.RoleAssignment), + new(authorization_v20220401s.RoleDefinition)) result = append(result, new(batch_v20210101.BatchAccount)) result = append(result, new(batch_v20210101s.BatchAccount)) result = append( @@ -2096,6 +2103,7 @@ func getResourceExtensions() []genruntime.ResourceExtension { result = append(result, &apimanagement_customizations.SubscriptionExtension{}) result = append(result, &appconfiguration_customizations.ConfigurationStoreExtension{}) result = append(result, &authorization_customizations.RoleAssignmentExtension{}) + result = append(result, &authorization_customizations.RoleDefinitionExtension{}) result = append(result, &batch_customizations.BatchAccountExtension{}) result = append(result, &cache_customizations.RedisEnterpriseDatabaseExtension{}) result = append(result, &cache_customizations.RedisEnterpriseExtension{}) diff --git a/v2/internal/controllers/recordings/Test_Authorization_RoleDefinitionResourceGroupScope_CRUD.yaml b/v2/internal/controllers/recordings/Test_Authorization_RoleDefinitionResourceGroupScope_CRUD.yaml new file mode 100644 index 00000000000..ed582e8691b --- /dev/null +++ b/v2/internal/controllers/recordings/Test_Authorization_RoleDefinitionResourceGroupScope_CRUD.yaml @@ -0,0 +1,476 @@ +--- +version: 2 +interactions: + - id: 0 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 93 + transfer_encoding: [] + trailer: {} + host: management.azure.com + remote_addr: "" + request_uri: "" + body: '{"location":"westus2","name":"asotest-rg-cwzlxv","tags":{"CreatedAt":"2001-02-03T04:05:06Z"}}' + form: {} + headers: + Accept: + - application/json + Content-Length: + - "93" + Content-Type: + - application/json + Test-Request-Hash: + - 31f5eddae5c789fced1f0faab43cd70946d346835de9ec71550b4dffd4014f35 + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-cwzlxv?api-version=2020-06-01 + method: PUT + response: + proto: HTTP/2.0 + proto_major: 2 + proto_minor: 0 + transfer_encoding: [] + trailer: {} + content_length: 276 + uncompressed: false + body: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-cwzlxv","name":"asotest-rg-cwzlxv","type":"Microsoft.Resources/resourceGroups","location":"westus2","tags":{"CreatedAt":"2001-02-03T04:05:06Z"},"properties":{"provisioningState":"Succeeded"}}' + headers: + Cache-Control: + - no-cache + Content-Length: + - "276" + Content-Type: + - application/json; charset=utf-8 + Expires: + - "-1" + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Cache: + - CONFIG_NOCACHE + X-Content-Type-Options: + - nosniff + X-Msedge-Ref: + - 'Ref A: 7E89B03B8EBE4D078865A760C15AB0BB Ref B: CO6AA3150217035 Ref C: 2024-06-11T00:39:46Z' + status: 201 Created + code: 201 + duration: 335.750618ms + - id: 1 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 0 + transfer_encoding: [] + trailer: {} + host: management.azure.com + remote_addr: "" + request_uri: "" + body: "" + form: {} + headers: + Accept: + - application/json + Test-Request-Attempt: + - "0" + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-cwzlxv?api-version=2020-06-01 + method: GET + response: + proto: HTTP/2.0 + proto_major: 2 + proto_minor: 0 + transfer_encoding: [] + trailer: {} + content_length: 276 + uncompressed: false + body: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-cwzlxv","name":"asotest-rg-cwzlxv","type":"Microsoft.Resources/resourceGroups","location":"westus2","tags":{"CreatedAt":"2001-02-03T04:05:06Z"},"properties":{"provisioningState":"Succeeded"}}' + headers: + Cache-Control: + - no-cache + Content-Length: + - "276" + Content-Type: + - application/json; charset=utf-8 + Expires: + - "-1" + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Cache: + - CONFIG_NOCACHE + X-Content-Type-Options: + - nosniff + X-Msedge-Ref: + - 'Ref A: B12D7315C87F4D6BB7579C415632C092 Ref B: CO6AA3150217035 Ref C: 2024-06-11T00:39:47Z' + status: 200 OK + code: 200 + duration: 29.648061ms + - id: 2 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 312 + transfer_encoding: [] + trailer: {} + host: management.azure.com + remote_addr: "" + request_uri: "" + body: '{"name":"683ff9b9-98d1-5af6-9381-ba194e279c28","properties":{"assignableScopes":["/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-cwzlxv"],"permissions":[{"actions":["Microsoft.Resources/subscriptions/resourceGroups/read"]}],"roleName":"asotest-roledef-aywylc","type":"customRole"}}' + form: {} + headers: + Accept: + - application/json + Content-Length: + - "312" + Content-Type: + - application/json + Test-Request-Hash: + - fb922a780cd446adf64cb83156068949db83795738eb01373e41f4706ec561f6 + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-cwzlxv/providers/Microsoft.Authorization/roleDefinitions/683ff9b9-98d1-5af6-9381-ba194e279c28?api-version=2022-04-01 + method: PUT + response: + proto: HTTP/2.0 + proto_major: 2 + proto_minor: 0 + transfer_encoding: [] + trailer: {} + content_length: 733 + uncompressed: false + body: '{"properties":{"roleName":"asotest-roledef-aywylc","type":"CustomRole","description":null,"assignableScopes":["/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-cwzlxv"],"permissions":[{"actions":["Microsoft.Resources/subscriptions/resourceGroups/read"],"notActions":[],"dataActions":[],"notDataActions":[]}],"createdOn":"2001-02-03T04:05:06Z","updatedOn":"2001-02-03T04:05:06Z","createdBy":null,"updatedBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb"},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/683ff9b9-98d1-5af6-9381-ba194e279c28","type":"Microsoft.Authorization/roleDefinitions","name":"683ff9b9-98d1-5af6-9381-ba194e279c28"}' + headers: + Cache-Control: + - no-cache + Content-Length: + - "733" + Content-Type: + - application/json; charset=utf-8 + Expires: + - "-1" + Pragma: + - no-cache + Set-Cookie: + - x-ms-gateway-slice=Production; path=/; secure; samesite=none; httponly + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Cache: + - CONFIG_NOCACHE + X-Content-Type-Options: + - nosniff + X-Msedge-Ref: + - 'Ref A: 039BA1D028D444C686ECE0D7D9B4C7ED Ref B: CO6AA3150217035 Ref C: 2024-06-11T00:39:49Z' + status: 201 Created + code: 201 + duration: 1.795729416s + - id: 3 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 0 + transfer_encoding: [] + trailer: {} + host: management.azure.com + remote_addr: "" + request_uri: "" + body: "" + form: {} + headers: + Test-Request-Attempt: + - "0" + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-cwzlxv/providers/Microsoft.Authorization/roleDefinitions/683ff9b9-98d1-5af6-9381-ba194e279c28?api-version=2022-04-01 + method: GET + response: + proto: HTTP/2.0 + proto_major: 2 + proto_minor: 0 + transfer_encoding: [] + trailer: {} + content_length: 767 + uncompressed: false + body: '{"properties":{"roleName":"asotest-roledef-aywylc","type":"CustomRole","description":null,"assignableScopes":["/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-cwzlxv"],"permissions":[{"actions":["Microsoft.Resources/subscriptions/resourceGroups/read"],"notActions":[],"dataActions":[],"notDataActions":[]}],"createdOn":"2001-02-03T04:05:06Z","updatedOn":"2001-02-03T04:05:06Z","createdBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb","updatedBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb"},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/683ff9b9-98d1-5af6-9381-ba194e279c28","type":"Microsoft.Authorization/roleDefinitions","name":"683ff9b9-98d1-5af6-9381-ba194e279c28"}' + headers: + Cache-Control: + - no-cache + Content-Length: + - "767" + Content-Type: + - application/json; charset=utf-8 + Expires: + - "-1" + Pragma: + - no-cache + Set-Cookie: + - x-ms-gateway-slice=Production; path=/; secure; samesite=none; httponly + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Cache: + - CONFIG_NOCACHE + X-Content-Type-Options: + - nosniff + X-Msedge-Ref: + - 'Ref A: 0DBAED4ECCD6429E9926483F32D4E306 Ref B: CO6AA3150217035 Ref C: 2024-06-11T00:39:53Z' + status: 200 OK + code: 200 + duration: 82.933348ms + - id: 4 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 0 + transfer_encoding: [] + trailer: {} + host: management.azure.com + remote_addr: "" + request_uri: "" + body: "" + form: {} + headers: + Accept: + - application/json + Test-Request-Attempt: + - "1" + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-cwzlxv/providers/Microsoft.Authorization/roleDefinitions/683ff9b9-98d1-5af6-9381-ba194e279c28?api-version=2022-04-01 + method: GET + response: + proto: HTTP/2.0 + proto_major: 2 + proto_minor: 0 + transfer_encoding: [] + trailer: {} + content_length: 767 + uncompressed: false + body: '{"properties":{"roleName":"asotest-roledef-aywylc","type":"CustomRole","description":null,"assignableScopes":["/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-cwzlxv"],"permissions":[{"actions":["Microsoft.Resources/subscriptions/resourceGroups/read"],"notActions":[],"dataActions":[],"notDataActions":[]}],"createdOn":"2001-02-03T04:05:06Z","updatedOn":"2001-02-03T04:05:06Z","createdBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb","updatedBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb"},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/683ff9b9-98d1-5af6-9381-ba194e279c28","type":"Microsoft.Authorization/roleDefinitions","name":"683ff9b9-98d1-5af6-9381-ba194e279c28"}' + headers: + Cache-Control: + - no-cache + Content-Length: + - "767" + Content-Type: + - application/json; charset=utf-8 + Expires: + - "-1" + Pragma: + - no-cache + Set-Cookie: + - x-ms-gateway-slice=Production; path=/; secure; samesite=none; httponly + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Cache: + - CONFIG_NOCACHE + X-Content-Type-Options: + - nosniff + X-Msedge-Ref: + - 'Ref A: 9EC6CE8B4D7B4DC484751C9D482C5F8E Ref B: CO6AA3150217035 Ref C: 2024-06-11T00:39:54Z' + status: 200 OK + code: 200 + duration: 37.0879ms + - id: 5 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 0 + transfer_encoding: [] + trailer: {} + host: management.azure.com + remote_addr: "" + request_uri: "" + body: "" + form: {} + headers: + Accept: + - application/json + Test-Request-Attempt: + - "0" + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-cwzlxv/providers/Microsoft.Authorization/roleDefinitions/683ff9b9-98d1-5af6-9381-ba194e279c28?api-version=2022-04-01 + method: DELETE + response: + proto: HTTP/2.0 + proto_major: 2 + proto_minor: 0 + transfer_encoding: [] + trailer: {} + content_length: 767 + uncompressed: false + body: '{"properties":{"roleName":"asotest-roledef-aywylc","type":"CustomRole","description":null,"assignableScopes":["/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-cwzlxv"],"permissions":[{"actions":["Microsoft.Resources/subscriptions/resourceGroups/read"],"notActions":[],"dataActions":[],"notDataActions":[]}],"createdOn":"2001-02-03T04:05:06Z","updatedOn":"2001-02-03T04:05:06Z","createdBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb","updatedBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb"},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/683ff9b9-98d1-5af6-9381-ba194e279c28","type":"Microsoft.Authorization/roleDefinitions","name":"683ff9b9-98d1-5af6-9381-ba194e279c28"}' + headers: + Cache-Control: + - no-cache + Content-Length: + - "767" + Content-Type: + - application/json; charset=utf-8 + Expires: + - "-1" + Pragma: + - no-cache + Set-Cookie: + - x-ms-gateway-slice=Production; path=/; secure; samesite=none; httponly + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Cache: + - CONFIG_NOCACHE + X-Content-Type-Options: + - nosniff + X-Msedge-Ref: + - 'Ref A: F858AD5BE4FA44D2BE92CFAD713C1FE9 Ref B: CO6AA3150217035 Ref C: 2024-06-11T00:39:58Z' + status: 200 OK + code: 200 + duration: 2.420745271s + - id: 6 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 0 + transfer_encoding: [] + trailer: {} + host: management.azure.com + remote_addr: "" + request_uri: "" + body: "" + form: {} + headers: + Accept: + - application/json + Test-Request-Attempt: + - "0" + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/683ff9b9-98d1-5af6-9381-ba194e279c28?api-version=2022-04-01 + method: GET + response: + proto: HTTP/2.0 + proto_major: 2 + proto_minor: 0 + transfer_encoding: [] + trailer: {} + content_length: 152 + uncompressed: false + body: '{"error":{"code":"RoleDefinitionDoesNotExist","message":"The specified role definition with ID ''683ff9b9-98d1-5af6-9381-ba194e279c28'' does not exist."}}' + headers: + Cache-Control: + - no-cache + Content-Length: + - "152" + Content-Type: + - application/json; charset=utf-8 + Expires: + - "-1" + Pragma: + - no-cache + Set-Cookie: + - x-ms-gateway-slice=Production; path=/; secure; samesite=none; httponly + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Cache: + - CONFIG_NOCACHE + X-Content-Type-Options: + - nosniff + X-Msedge-Ref: + - 'Ref A: 072B9A562C5A46EC9765F95FDB09FF24 Ref B: CO6AA3150217035 Ref C: 2024-06-11T00:40:03Z' + status: 404 Not Found + code: 404 + duration: 36.191596ms + - id: 7 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 0 + transfer_encoding: [] + trailer: {} + host: management.azure.com + remote_addr: "" + request_uri: "" + body: "" + form: {} + headers: + Accept: + - application/json + Test-Request-Attempt: + - "0" + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-cwzlxv?api-version=2020-06-01 + method: DELETE + response: + proto: HTTP/2.0 + proto_major: 2 + proto_minor: 0 + transfer_encoding: [] + trailer: {} + content_length: 0 + uncompressed: false + body: "" + headers: + Cache-Control: + - no-cache + Content-Length: + - "0" + Expires: + - "-1" + Location: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRDV1pMWFYtV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638536632039858188&c=MIIHpTCCBo2gAwIBAgITfwM6vSxODJvqjFP4oQAEAzq9LDANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDIwHhcNMjQwNTE1MTI0NjQwWhcNMjUwNTEwMTI0NjQwWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKa4cOTKf-wVpLKiG5Zei1-Oc5u5PvibFdqWIGFZDLmSA3G2jYrx6dKQ8NH10xxzVOMT_dqQOb2nPmPDhnS3CUlhwx_iI9VSftq8J182Ci01SlOzoieOj_kBg-1yQ4TB3DD7Rwgy40TMWgK-1lkliuLAgSHruwrRW8Kj8Q96A0oGxy1RQggyCNWVG8EsUp1ngtGu-yi1BZRa4Q-v_x9KFfbvtOc9KIfKRFs2r2zg4MWc4xCzQCYrRXIVfS-sFxEn1GbDqtYc4-y5T978_4OnKXidZCkJqT4v1ZRcgxKZpH8d4GmacrEfBoCqjg9ZayboCoIPz5wEIF9LOngoqXqnmYECAwEAAaOCBJIwggSOMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHaBggrBgEFBQcBAQSCAcwwggHIMGYGCCsGAQUFBzAChlpodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMig0KS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3J0MFYGCCsGAQUFBzAChkpodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDAyKDQpLmNydDBWBggrBgEFBQcwAoZKaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMig0KS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3J0MB0GA1UdDgQWBBRCKTJWBui0JqrIiMW81zJdA9-tSDAOBgNVHQ8BAf8EBAMCBaAwggE1BgNVHR8EggEsMIIBKDCCASSgggEgoIIBHIZCaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JsMIGdBgNVHSAEgZUwgZIwDAYKKwYBBAGCN3sBATBmBgorBgEEAYI3ewICMFgwVgYIKwYBBQUHAgIwSh5IADMAMwBlADAAMQA5ADIAMQAtADQAZAA2ADQALQA0AGYAOABjAC0AYQAwADUANQAtADUAYgBkAGEAZgBmAGQANQBlADMAMwBkMAwGCisGAQQBgjd7AwEwDAYKKwYBBAGCN3sEATAfBgNVHSMEGDAWgBSuecJrXSWIEwb2BwnDl3x7l48dVTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGJpRHLgYBJ-Hg0664G6_TgQ8luNO24um3ktexLaPrnailsQdaNThyJ4w9TTpMvyG31DlS7euSnKy8IsfMzCDxu1mmgziF9Urf-OpUw3u-ze-9z_PmzXym0G-rk8OrPpWWdAeApaUIHmydJGO_yrSQURQDLY9ATNa4gS1c9rQLruie0ZkPwjhAJCwpdK615q7s9ssaQ_HZEXM9r3mojVMYMB6b7TQJcwlVHBvkRO5u4HnAI26O2e-pcDzgccXJ6mqM158VJM-AyU1D2gWCqHj4zml1U005Ot-Fx-C3N3HCVImLvAllBxeQdwzOTae6Br-eXo1NCFf1ahI2fP4G_nB7o&s=UrYJiHyDj15rE9pxrrM6eykDVAELnCELQb0uk1sr0ZeMoPur-4c1obvQQCre8KzfS5FzWXT6iQkbCWef4SmSlVvLP_Fh-QHv9aeoaXchn5mak9X8Yz6ZfwfZ-PzKpe2go05rJN_Ifa8xpDHw1REVrmR2rkP6suUNPK4pkqU76k81VkzVGEus9yCZOfwmAk5yElOver7YLDUfBUl51nsbwmd4iFxl6uXVn7qy5iY3MbiCyEohotlex-pkKrddibDabGlxjRlNvXAprPTY-UxZ93EafzY8VIdvpIjsXvbazGVy-J-DjV5dUwcx-qQ11oVkzLq1s7kleZf0WNf6cZhzeA&h=R-RJhrFGUw7-RCQbUGEwVa4Uhpc5ureu9-GDaKpQ7hU + Pragma: + - no-cache + Retry-After: + - "15" + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Cache: + - CONFIG_NOCACHE + X-Content-Type-Options: + - nosniff + X-Msedge-Ref: + - 'Ref A: 52A3D90E28984723933CA903E513A62A Ref B: CO6AA3150217035 Ref C: 2024-06-11T00:40:03Z' + status: 202 Accepted + code: 202 + duration: 175.952449ms + - id: 8 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 0 + transfer_encoding: [] + trailer: {} + host: management.azure.com + remote_addr: "" + request_uri: "" + body: "" + form: {} + headers: + Test-Request-Attempt: + - "0" + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRDV1pMWFYtV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638536632039858188&c=MIIHpTCCBo2gAwIBAgITfwM6vSxODJvqjFP4oQAEAzq9LDANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDIwHhcNMjQwNTE1MTI0NjQwWhcNMjUwNTEwMTI0NjQwWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKa4cOTKf-wVpLKiG5Zei1-Oc5u5PvibFdqWIGFZDLmSA3G2jYrx6dKQ8NH10xxzVOMT_dqQOb2nPmPDhnS3CUlhwx_iI9VSftq8J182Ci01SlOzoieOj_kBg-1yQ4TB3DD7Rwgy40TMWgK-1lkliuLAgSHruwrRW8Kj8Q96A0oGxy1RQggyCNWVG8EsUp1ngtGu-yi1BZRa4Q-v_x9KFfbvtOc9KIfKRFs2r2zg4MWc4xCzQCYrRXIVfS-sFxEn1GbDqtYc4-y5T978_4OnKXidZCkJqT4v1ZRcgxKZpH8d4GmacrEfBoCqjg9ZayboCoIPz5wEIF9LOngoqXqnmYECAwEAAaOCBJIwggSOMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHaBggrBgEFBQcBAQSCAcwwggHIMGYGCCsGAQUFBzAChlpodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMig0KS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3J0MFYGCCsGAQUFBzAChkpodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDAyKDQpLmNydDBWBggrBgEFBQcwAoZKaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMig0KS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3J0MB0GA1UdDgQWBBRCKTJWBui0JqrIiMW81zJdA9-tSDAOBgNVHQ8BAf8EBAMCBaAwggE1BgNVHR8EggEsMIIBKDCCASSgggEgoIIBHIZCaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JsMIGdBgNVHSAEgZUwgZIwDAYKKwYBBAGCN3sBATBmBgorBgEEAYI3ewICMFgwVgYIKwYBBQUHAgIwSh5IADMAMwBlADAAMQA5ADIAMQAtADQAZAA2ADQALQA0AGYAOABjAC0AYQAwADUANQAtADUAYgBkAGEAZgBmAGQANQBlADMAMwBkMAwGCisGAQQBgjd7AwEwDAYKKwYBBAGCN3sEATAfBgNVHSMEGDAWgBSuecJrXSWIEwb2BwnDl3x7l48dVTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGJpRHLgYBJ-Hg0664G6_TgQ8luNO24um3ktexLaPrnailsQdaNThyJ4w9TTpMvyG31DlS7euSnKy8IsfMzCDxu1mmgziF9Urf-OpUw3u-ze-9z_PmzXym0G-rk8OrPpWWdAeApaUIHmydJGO_yrSQURQDLY9ATNa4gS1c9rQLruie0ZkPwjhAJCwpdK615q7s9ssaQ_HZEXM9r3mojVMYMB6b7TQJcwlVHBvkRO5u4HnAI26O2e-pcDzgccXJ6mqM158VJM-AyU1D2gWCqHj4zml1U005Ot-Fx-C3N3HCVImLvAllBxeQdwzOTae6Br-eXo1NCFf1ahI2fP4G_nB7o&s=UrYJiHyDj15rE9pxrrM6eykDVAELnCELQb0uk1sr0ZeMoPur-4c1obvQQCre8KzfS5FzWXT6iQkbCWef4SmSlVvLP_Fh-QHv9aeoaXchn5mak9X8Yz6ZfwfZ-PzKpe2go05rJN_Ifa8xpDHw1REVrmR2rkP6suUNPK4pkqU76k81VkzVGEus9yCZOfwmAk5yElOver7YLDUfBUl51nsbwmd4iFxl6uXVn7qy5iY3MbiCyEohotlex-pkKrddibDabGlxjRlNvXAprPTY-UxZ93EafzY8VIdvpIjsXvbazGVy-J-DjV5dUwcx-qQ11oVkzLq1s7kleZf0WNf6cZhzeA&h=R-RJhrFGUw7-RCQbUGEwVa4Uhpc5ureu9-GDaKpQ7hU + method: GET + response: + proto: HTTP/2.0 + proto_major: 2 + proto_minor: 0 + transfer_encoding: [] + trailer: {} + content_length: 0 + uncompressed: false + body: "" + headers: + Cache-Control: + - no-cache + Content-Length: + - "0" + Expires: + - "-1" + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Cache: + - CONFIG_NOCACHE + X-Content-Type-Options: + - nosniff + X-Msedge-Ref: + - 'Ref A: 3E4379B691904626ABD18E4B34D4F6E3 Ref B: CO6AA3150217035 Ref C: 2024-06-11T00:40:19Z' + status: 200 OK + code: 200 + duration: 26.967045ms diff --git a/v2/internal/controllers/recordings/Test_Authorization_RoleDefinitionSubscriptionScope_CRUD.yaml b/v2/internal/controllers/recordings/Test_Authorization_RoleDefinitionSubscriptionScope_CRUD.yaml new file mode 100644 index 00000000000..a721e9e8776 --- /dev/null +++ b/v2/internal/controllers/recordings/Test_Authorization_RoleDefinitionSubscriptionScope_CRUD.yaml @@ -0,0 +1,270 @@ +--- +version: 2 +interactions: + - id: 0 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 279 + transfer_encoding: [] + trailer: {} + host: management.azure.com + remote_addr: "" + request_uri: "" + body: '{"name":"0cd96ffd-edf1-5708-9e98-792d799e0790","properties":{"assignableScopes":["/subscriptions/00000000-0000-0000-0000-000000000000"],"permissions":[{"actions":["Microsoft.Resources/subscriptions/resourceGroups/read"]}],"roleName":"asotest-roledef-nszuqd","type":"customRole"}}' + form: {} + headers: + Accept: + - application/json + Content-Length: + - "279" + Content-Type: + - application/json + Test-Request-Hash: + - e6c501f0f061d2d8b4e658e0203b8027b94a2b8eff9d1abadee031e664400246 + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/0cd96ffd-edf1-5708-9e98-792d799e0790?api-version=2022-04-01 + method: PUT + response: + proto: HTTP/2.0 + proto_major: 2 + proto_minor: 0 + transfer_encoding: [] + trailer: {} + content_length: 700 + uncompressed: false + body: '{"properties":{"roleName":"asotest-roledef-nszuqd","type":"CustomRole","description":null,"assignableScopes":["/subscriptions/00000000-0000-0000-0000-000000000000"],"permissions":[{"actions":["Microsoft.Resources/subscriptions/resourceGroups/read"],"notActions":[],"dataActions":[],"notDataActions":[]}],"createdOn":"2001-02-03T04:05:06Z","updatedOn":"2001-02-03T04:05:06Z","createdBy":null,"updatedBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb"},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/0cd96ffd-edf1-5708-9e98-792d799e0790","type":"Microsoft.Authorization/roleDefinitions","name":"0cd96ffd-edf1-5708-9e98-792d799e0790"}' + headers: + Cache-Control: + - no-cache + Content-Length: + - "700" + Content-Type: + - application/json; charset=utf-8 + Expires: + - "-1" + Pragma: + - no-cache + Set-Cookie: + - x-ms-gateway-slice=Production; path=/; secure; samesite=none; httponly + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Cache: + - CONFIG_NOCACHE + X-Content-Type-Options: + - nosniff + X-Msedge-Ref: + - 'Ref A: 1188637F888B4AB385B204B3E9E94F5B Ref B: CO6AA3150219025 Ref C: 2024-06-11T00:38:57Z' + status: 201 Created + code: 201 + duration: 1.988427984s + - id: 1 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 0 + transfer_encoding: [] + trailer: {} + host: management.azure.com + remote_addr: "" + request_uri: "" + body: "" + form: {} + headers: + Test-Request-Attempt: + - "0" + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/0cd96ffd-edf1-5708-9e98-792d799e0790?api-version=2022-04-01 + method: GET + response: + proto: HTTP/2.0 + proto_major: 2 + proto_minor: 0 + transfer_encoding: [] + trailer: {} + content_length: 734 + uncompressed: false + body: '{"properties":{"roleName":"asotest-roledef-nszuqd","type":"CustomRole","description":null,"assignableScopes":["/subscriptions/00000000-0000-0000-0000-000000000000"],"permissions":[{"actions":["Microsoft.Resources/subscriptions/resourceGroups/read"],"notActions":[],"dataActions":[],"notDataActions":[]}],"createdOn":"2001-02-03T04:05:06Z","updatedOn":"2001-02-03T04:05:06Z","createdBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb","updatedBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb"},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/0cd96ffd-edf1-5708-9e98-792d799e0790","type":"Microsoft.Authorization/roleDefinitions","name":"0cd96ffd-edf1-5708-9e98-792d799e0790"}' + headers: + Cache-Control: + - no-cache + Content-Length: + - "734" + Content-Type: + - application/json; charset=utf-8 + Expires: + - "-1" + Pragma: + - no-cache + Set-Cookie: + - x-ms-gateway-slice=Production; path=/; secure; samesite=none; httponly + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Cache: + - CONFIG_NOCACHE + X-Content-Type-Options: + - nosniff + X-Msedge-Ref: + - 'Ref A: 175E2954F5E4488D92927C6AEC385FA9 Ref B: CO6AA3150219025 Ref C: 2024-06-11T00:39:03Z' + status: 200 OK + code: 200 + duration: 62.891543ms + - id: 2 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 0 + transfer_encoding: [] + trailer: {} + host: management.azure.com + remote_addr: "" + request_uri: "" + body: "" + form: {} + headers: + Accept: + - application/json + Test-Request-Attempt: + - "1" + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/0cd96ffd-edf1-5708-9e98-792d799e0790?api-version=2022-04-01 + method: GET + response: + proto: HTTP/2.0 + proto_major: 2 + proto_minor: 0 + transfer_encoding: [] + trailer: {} + content_length: 734 + uncompressed: false + body: '{"properties":{"roleName":"asotest-roledef-nszuqd","type":"CustomRole","description":null,"assignableScopes":["/subscriptions/00000000-0000-0000-0000-000000000000"],"permissions":[{"actions":["Microsoft.Resources/subscriptions/resourceGroups/read"],"notActions":[],"dataActions":[],"notDataActions":[]}],"createdOn":"2001-02-03T04:05:06Z","updatedOn":"2001-02-03T04:05:06Z","createdBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb","updatedBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb"},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/0cd96ffd-edf1-5708-9e98-792d799e0790","type":"Microsoft.Authorization/roleDefinitions","name":"0cd96ffd-edf1-5708-9e98-792d799e0790"}' + headers: + Cache-Control: + - no-cache + Content-Length: + - "734" + Content-Type: + - application/json; charset=utf-8 + Expires: + - "-1" + Pragma: + - no-cache + Set-Cookie: + - x-ms-gateway-slice=Production; path=/; secure; samesite=none; httponly + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Cache: + - CONFIG_NOCACHE + X-Content-Type-Options: + - nosniff + X-Msedge-Ref: + - 'Ref A: C6559CDEDD1A4FBE9611F611A68E9D99 Ref B: CO6AA3150219025 Ref C: 2024-06-11T00:39:03Z' + status: 200 OK + code: 200 + duration: 37.063403ms + - id: 3 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 0 + transfer_encoding: [] + trailer: {} + host: management.azure.com + remote_addr: "" + request_uri: "" + body: "" + form: {} + headers: + Accept: + - application/json + Test-Request-Attempt: + - "0" + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/0cd96ffd-edf1-5708-9e98-792d799e0790?api-version=2022-04-01 + method: DELETE + response: + proto: HTTP/2.0 + proto_major: 2 + proto_minor: 0 + transfer_encoding: [] + trailer: {} + content_length: 734 + uncompressed: false + body: '{"properties":{"roleName":"asotest-roledef-nszuqd","type":"CustomRole","description":null,"assignableScopes":["/subscriptions/00000000-0000-0000-0000-000000000000"],"permissions":[{"actions":["Microsoft.Resources/subscriptions/resourceGroups/read"],"notActions":[],"dataActions":[],"notDataActions":[]}],"createdOn":"2001-02-03T04:05:06Z","updatedOn":"2001-02-03T04:05:06Z","createdBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb","updatedBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb"},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/0cd96ffd-edf1-5708-9e98-792d799e0790","type":"Microsoft.Authorization/roleDefinitions","name":"0cd96ffd-edf1-5708-9e98-792d799e0790"}' + headers: + Cache-Control: + - no-cache + Content-Length: + - "734" + Content-Type: + - application/json; charset=utf-8 + Expires: + - "-1" + Pragma: + - no-cache + Set-Cookie: + - x-ms-gateway-slice=Production; path=/; secure; samesite=none; httponly + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Cache: + - CONFIG_NOCACHE + X-Content-Type-Options: + - nosniff + X-Msedge-Ref: + - 'Ref A: 5F17F81BA0EB4A63BA64EF8CCBC36A1A Ref B: CO6AA3150219025 Ref C: 2024-06-11T00:39:08Z' + status: 200 OK + code: 200 + duration: 2.045315968s + - id: 4 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 0 + transfer_encoding: [] + trailer: {} + host: management.azure.com + remote_addr: "" + request_uri: "" + body: "" + form: {} + headers: + Accept: + - application/json + Test-Request-Attempt: + - "2" + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/0cd96ffd-edf1-5708-9e98-792d799e0790?api-version=2022-04-01 + method: GET + response: + proto: HTTP/2.0 + proto_major: 2 + proto_minor: 0 + transfer_encoding: [] + trailer: {} + content_length: 152 + uncompressed: false + body: '{"error":{"code":"RoleDefinitionDoesNotExist","message":"The specified role definition with ID ''0cd96ffd-edf1-5708-9e98-792d799e0790'' does not exist."}}' + headers: + Cache-Control: + - no-cache + Content-Length: + - "152" + Content-Type: + - application/json; charset=utf-8 + Expires: + - "-1" + Pragma: + - no-cache + Set-Cookie: + - x-ms-gateway-slice=Production; path=/; secure; samesite=none; httponly + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Cache: + - CONFIG_NOCACHE + X-Content-Type-Options: + - nosniff + X-Msedge-Ref: + - 'Ref A: BD674CBE1E234DE4A54BE52EA13E2FA3 Ref B: CO6AA3150219025 Ref C: 2024-06-11T00:39:13Z' + status: 404 Not Found + code: 404 + duration: 36.6144ms diff --git a/v2/internal/controllers/recordings/Test_Samples_CreationAndDeletion/Test_Authorization_v1api20220401_CreationAndDeletion.yaml b/v2/internal/controllers/recordings/Test_Samples_CreationAndDeletion/Test_Authorization_v1api20220401_CreationAndDeletion.yaml index 0ad8894a001..57885a535ac 100644 --- a/v2/internal/controllers/recordings/Test_Samples_CreationAndDeletion/Test_Authorization_v1api20220401_CreationAndDeletion.yaml +++ b/v2/internal/controllers/recordings/Test_Samples_CreationAndDeletion/Test_Authorization_v1api20220401_CreationAndDeletion.yaml @@ -21,8 +21,6 @@ interactions: - "93" Content-Type: - application/json - Test-Request-Attempt: - - "0" Test-Request-Hash: - a2c557f33c27a42bbba00b1326aaccd2bb0f499f1de9e2adba5a7ad631f67cda url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk?api-version=2020-06-01 @@ -54,10 +52,10 @@ interactions: X-Content-Type-Options: - nosniff X-Msedge-Ref: - - 'Ref A: CF8029708CA94B5DBA66C552BC9D1BF3 Ref B: SYD03EDGE1717 Ref C: 2024-04-04T23:11:11Z' - status: 201 Created - code: 201 - duration: 3.200240459s + - 'Ref A: FDB6ABFB634A4227917787370B2A6F3D Ref B: CO6AA3150220023 Ref C: 2024-06-07T21:26:30Z' + status: 200 OK + code: 200 + duration: 197.256777ms - id: 1 request: proto: HTTP/1.1 @@ -105,10 +103,10 @@ interactions: X-Content-Type-Options: - nosniff X-Msedge-Ref: - - 'Ref A: 6EEA0CA47AC54D0C82A9020B249E9302 Ref B: SYD03EDGE1717 Ref C: 2024-04-04T23:11:17Z' + - 'Ref A: C43774D3A22D4163A138E3B68D7F805C Ref B: CO6AA3150220023 Ref C: 2024-06-07T21:26:30Z' status: 200 OK code: 200 - duration: 64.935667ms + duration: 20.1523ms - id: 2 request: proto: HTTP/1.1 @@ -129,8 +127,6 @@ interactions: - "64" Content-Type: - application/json - Test-Request-Attempt: - - "0" Test-Request-Hash: - 62bfba04d360857b6a5bff45361762c931fe822fa039b2afad402c502be0f949 url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk/providers/Microsoft.ManagedIdentity/userAssignedIdentities/sampleuserassignedidentity?api-version=2018-11-30 @@ -143,7 +139,7 @@ interactions: trailer: {} content_length: 478 uncompressed: false - body: '{"location":"westcentralus","tags":{},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/asotest-rg-fyvjhk/providers/Microsoft.ManagedIdentity/userAssignedIdentities/sampleuserassignedidentity","name":"sampleuserassignedidentity","type":"Microsoft.ManagedIdentity/userAssignedIdentities","properties":{"tenantId":"00000000-0000-0000-0000-000000000000","principalId":"2838fb22-92f0-48c6-af79-a612ff336844","clientId":"730b97e2-f048-4ae8-a24d-e206dcbaff93"}}' + body: '{"location":"westcentralus","tags":{},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/asotest-rg-fyvjhk/providers/Microsoft.ManagedIdentity/userAssignedIdentities/sampleuserassignedidentity","name":"sampleuserassignedidentity","type":"Microsoft.ManagedIdentity/userAssignedIdentities","properties":{"tenantId":"00000000-0000-0000-0000-000000000000","principalId":"ef0f37cb-d899-4ade-b0fe-92d24cd98218","clientId":"c73e2d8a-ff89-4916-a710-4bcac3fa7d9c"}}' headers: Cache-Control: - no-cache @@ -153,8 +149,6 @@ interactions: - application/json; charset=utf-8 Expires: - "-1" - Location: - - /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/asotest-rg-fyvjhk/providers/Microsoft.ManagedIdentity/userAssignedIdentities/sampleuserassignedidentity Pragma: - no-cache Strict-Transport-Security: @@ -164,36 +158,30 @@ interactions: X-Content-Type-Options: - nosniff X-Msedge-Ref: - - 'Ref A: D23B26C4347C4A2BBAE4CBA5B64DFD6C Ref B: SYD03EDGE1717 Ref C: 2024-04-04T23:11:21Z' - status: 201 Created - code: 201 - duration: 2.30604325s + - 'Ref A: 4E1CBBD1C5904B3BA1000F0521441867 Ref B: CO6AA3150220023 Ref C: 2024-06-07T21:26:33Z' + status: 200 OK + code: 200 + duration: 549.865827ms - id: 3 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 64 + content_length: 0 transfer_encoding: [] trailer: {} host: management.azure.com remote_addr: "" request_uri: "" - body: '{"location":"westcentralus","name":"sampleuserassignedidentity"}' + body: "" form: {} headers: Accept: - application/json - Content-Length: - - "64" - Content-Type: - - application/json Test-Request-Attempt: - - "1" - Test-Request-Hash: - - 62bfba04d360857b6a5bff45361762c931fe822fa039b2afad402c502be0f949 + - "0" url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk/providers/Microsoft.ManagedIdentity/userAssignedIdentities/sampleuserassignedidentity?api-version=2018-11-30 - method: PUT + method: GET response: proto: HTTP/2.0 proto_major: 2 @@ -202,7 +190,7 @@ interactions: trailer: {} content_length: 478 uncompressed: false - body: '{"location":"westcentralus","tags":{},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/asotest-rg-fyvjhk/providers/Microsoft.ManagedIdentity/userAssignedIdentities/sampleuserassignedidentity","name":"sampleuserassignedidentity","type":"Microsoft.ManagedIdentity/userAssignedIdentities","properties":{"tenantId":"00000000-0000-0000-0000-000000000000","principalId":"2838fb22-92f0-48c6-af79-a612ff336844","clientId":"730b97e2-f048-4ae8-a24d-e206dcbaff93"}}' + body: '{"location":"westcentralus","tags":{},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/asotest-rg-fyvjhk/providers/Microsoft.ManagedIdentity/userAssignedIdentities/sampleuserassignedidentity","name":"sampleuserassignedidentity","type":"Microsoft.ManagedIdentity/userAssignedIdentities","properties":{"tenantId":"00000000-0000-0000-0000-000000000000","principalId":"ef0f37cb-d899-4ade-b0fe-92d24cd98218","clientId":"c73e2d8a-ff89-4916-a710-4bcac3fa7d9c"}}' headers: Cache-Control: - no-cache @@ -221,50 +209,56 @@ interactions: X-Content-Type-Options: - nosniff X-Msedge-Ref: - - 'Ref A: 037FCFA9FB284E6ABCA0769C321ECAA4 Ref B: SYD03EDGE1717 Ref C: 2024-04-04T23:11:26Z' + - 'Ref A: C9E300949CBB441B8F47766BDDE11B04 Ref B: CO6AA3150220023 Ref C: 2024-06-07T21:26:34Z' status: 200 OK code: 200 - duration: 1.087862584s + duration: 251.093746ms - id: 4 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 0 + content_length: 275 transfer_encoding: [] trailer: {} host: management.azure.com remote_addr: "" request_uri: "" - body: "" + body: '{"name":"4185f9fe-2b34-59f4-aee4-575692fb2264","properties":{"assignableScopes":["/subscriptions/00000000-0000-0000-0000-000000000000"],"permissions":[{"actions":["Microsoft.Resources/subscriptions/resourceGroups/read"]}],"roleName":"aso-sample-roledef","type":"customRole"}}' form: {} headers: Accept: - application/json - Test-Request-Attempt: - - "0" - url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk/providers/Microsoft.ManagedIdentity/userAssignedIdentities/sampleuserassignedidentity?api-version=2018-11-30 - method: GET + Content-Length: + - "275" + Content-Type: + - application/json + Test-Request-Hash: + - 4db76f489afed19b9bbbad786c0c23ab0f511bba7570ec85345135246009626a + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/4185f9fe-2b34-59f4-aee4-575692fb2264?api-version=2022-04-01 + method: PUT response: proto: HTTP/2.0 proto_major: 2 proto_minor: 0 transfer_encoding: [] trailer: {} - content_length: 478 + content_length: 696 uncompressed: false - body: '{"location":"westcentralus","tags":{},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/asotest-rg-fyvjhk/providers/Microsoft.ManagedIdentity/userAssignedIdentities/sampleuserassignedidentity","name":"sampleuserassignedidentity","type":"Microsoft.ManagedIdentity/userAssignedIdentities","properties":{"tenantId":"00000000-0000-0000-0000-000000000000","principalId":"2838fb22-92f0-48c6-af79-a612ff336844","clientId":"730b97e2-f048-4ae8-a24d-e206dcbaff93"}}' + body: '{"properties":{"roleName":"aso-sample-roledef","type":"CustomRole","description":null,"assignableScopes":["/subscriptions/00000000-0000-0000-0000-000000000000"],"permissions":[{"actions":["Microsoft.Resources/subscriptions/resourceGroups/read"],"notActions":[],"dataActions":[],"notDataActions":[]}],"createdOn":"2001-02-03T04:05:06Z","updatedOn":"2001-02-03T04:05:06Z","createdBy":null,"updatedBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb"},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/4185f9fe-2b34-59f4-aee4-575692fb2264","type":"Microsoft.Authorization/roleDefinitions","name":"4185f9fe-2b34-59f4-aee4-575692fb2264"}' headers: Cache-Control: - no-cache Content-Length: - - "478" + - "696" Content-Type: - application/json; charset=utf-8 Expires: - "-1" Pragma: - no-cache + Set-Cookie: + - x-ms-gateway-slice=Production; path=/; secure; samesite=none; httponly Strict-Transport-Security: - max-age=31536000; includeSubDomains X-Cache: @@ -272,10 +266,10 @@ interactions: X-Content-Type-Options: - nosniff X-Msedge-Ref: - - 'Ref A: D2C890741C1145B7886AAEB7B9977C81 Ref B: SYD03EDGE1717 Ref C: 2024-04-04T23:11:28Z' - status: 200 OK - code: 200 - duration: 822.691709ms + - 'Ref A: 478811456A4F46CBB0499E897B241F9E Ref B: CO6AA3150220023 Ref C: 2024-06-07T21:26:33Z' + status: 201 Created + code: 201 + duration: 1.984922647s - id: 5 request: proto: HTTP/1.1 @@ -287,7 +281,7 @@ interactions: host: management.azure.com remote_addr: "" request_uri: "" - body: '{"name":"2d76d181-4aba-5dac-a920-cd42487a00ab","properties":{"principalId":"2838fb22-92f0-48c6-af79-a612ff336844","roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"}}' + body: '{"name":"2d76d181-4aba-5dac-a920-cd42487a00ab","properties":{"principalId":"ef0f37cb-d899-4ade-b0fe-92d24cd98218","roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"}}' form: {} headers: Accept: @@ -296,10 +290,8 @@ interactions: - "275" Content-Type: - application/json - Test-Request-Attempt: - - "0" Test-Request-Hash: - - f80c97eca58c41b254502f52a9a3d25d711437bbdbfba7205b0bda4ca984b432 + - 271b417335149635f0d55ee70d8c4513906766f5fcb7001fd1cc5e477cf874f1 url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk/providers/Microsoft.Authorization/roleAssignments/2d76d181-4aba-5dac-a920-cd42487a00ab?api-version=2022-04-01 method: PUT response: @@ -308,14 +300,14 @@ interactions: proto_minor: 0 transfer_encoding: [] trailer: {} - content_length: 489 + content_length: 889 uncompressed: false - body: '{"error":{"code":"PrincipalNotFound","message":"Principal 2838fb2292f048c6af79a612ff336844 does not exist in the directory 00000000-0000-0000-0000-000000000000. Check that you have the correct principal ID. If you are creating this principal and then immediately assigning a role, this error might be related to a replication delay. In this case, set the role assignment principalType property to a value, such as ServicePrincipal, User, or Group. See https://aka.ms/docs-principaltype"}}' + body: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c","principalId":"ef0f37cb-d899-4ade-b0fe-92d24cd98218","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk","condition":null,"conditionVersion":null,"createdOn":"2001-02-03T04:05:06Z","updatedOn":"2001-02-03T04:05:06Z","createdBy":null,"updatedBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk/providers/Microsoft.Authorization/roleAssignments/2d76d181-4aba-5dac-a920-cd42487a00ab","type":"Microsoft.Authorization/roleAssignments","name":"2d76d181-4aba-5dac-a920-cd42487a00ab"}' headers: Cache-Control: - no-cache Content-Length: - - "489" + - "889" Content-Type: - application/json; charset=utf-8 Expires: @@ -331,50 +323,95 @@ interactions: X-Content-Type-Options: - nosniff X-Msedge-Ref: - - 'Ref A: 35D7418BB3B941739F12C020FF1F3B78 Ref B: SYD03EDGE1717 Ref C: 2024-04-04T23:11:30Z' - status: 400 Bad Request - code: 400 - duration: 640.784083ms + - 'Ref A: E440A5C2838F405E8D8CEABF0C30CD84 Ref B: CO6AA3150220023 Ref C: 2024-06-07T21:26:35Z' + status: 201 Created + code: 201 + duration: 2.786403233s - id: 6 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 275 + content_length: 0 transfer_encoding: [] trailer: {} host: management.azure.com remote_addr: "" request_uri: "" - body: '{"name":"2d76d181-4aba-5dac-a920-cd42487a00ab","properties":{"principalId":"2838fb22-92f0-48c6-af79-a612ff336844","roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"}}' + body: "" form: {} headers: - Accept: - - application/json + Test-Request-Attempt: + - "0" + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/4185f9fe-2b34-59f4-aee4-575692fb2264?api-version=2022-04-01 + method: GET + response: + proto: HTTP/2.0 + proto_major: 2 + proto_minor: 0 + transfer_encoding: [] + trailer: {} + content_length: 730 + uncompressed: false + body: '{"properties":{"roleName":"aso-sample-roledef","type":"CustomRole","description":null,"assignableScopes":["/subscriptions/00000000-0000-0000-0000-000000000000"],"permissions":[{"actions":["Microsoft.Resources/subscriptions/resourceGroups/read"],"notActions":[],"dataActions":[],"notDataActions":[]}],"createdOn":"2001-02-03T04:05:06Z","updatedOn":"2001-02-03T04:05:06Z","createdBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb","updatedBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb"},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/4185f9fe-2b34-59f4-aee4-575692fb2264","type":"Microsoft.Authorization/roleDefinitions","name":"4185f9fe-2b34-59f4-aee4-575692fb2264"}' + headers: + Cache-Control: + - no-cache Content-Length: - - "275" + - "730" Content-Type: + - application/json; charset=utf-8 + Expires: + - "-1" + Pragma: + - no-cache + Set-Cookie: + - x-ms-gateway-slice=Production; path=/; secure; samesite=none; httponly + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Cache: + - CONFIG_NOCACHE + X-Content-Type-Options: + - nosniff + X-Msedge-Ref: + - 'Ref A: 12643750B4C640929EAD03DBEB545DFE Ref B: CO6AA3150220023 Ref C: 2024-06-07T21:26:39Z' + status: 200 OK + code: 200 + duration: 59.950398ms + - id: 7 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 0 + transfer_encoding: [] + trailer: {} + host: management.azure.com + remote_addr: "" + request_uri: "" + body: "" + form: {} + headers: + Accept: - application/json Test-Request-Attempt: - "1" - Test-Request-Hash: - - f80c97eca58c41b254502f52a9a3d25d711437bbdbfba7205b0bda4ca984b432 - url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk/providers/Microsoft.Authorization/roleAssignments/2d76d181-4aba-5dac-a920-cd42487a00ab?api-version=2022-04-01 - method: PUT + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/4185f9fe-2b34-59f4-aee4-575692fb2264?api-version=2022-04-01 + method: GET response: proto: HTTP/2.0 proto_major: 2 proto_minor: 0 transfer_encoding: [] trailer: {} - content_length: 889 + content_length: 730 uncompressed: false - body: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c","principalId":"2838fb22-92f0-48c6-af79-a612ff336844","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk","condition":null,"conditionVersion":null,"createdOn":"2001-02-03T04:05:06Z","updatedOn":"2001-02-03T04:05:06Z","createdBy":null,"updatedBy":"b5f56733-c999-4afb-883d-eb085d905ec9","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk/providers/Microsoft.Authorization/roleAssignments/2d76d181-4aba-5dac-a920-cd42487a00ab","type":"Microsoft.Authorization/roleAssignments","name":"2d76d181-4aba-5dac-a920-cd42487a00ab"}' + body: '{"properties":{"roleName":"aso-sample-roledef","type":"CustomRole","description":null,"assignableScopes":["/subscriptions/00000000-0000-0000-0000-000000000000"],"permissions":[{"actions":["Microsoft.Resources/subscriptions/resourceGroups/read"],"notActions":[],"dataActions":[],"notDataActions":[]}],"createdOn":"2001-02-03T04:05:06Z","updatedOn":"2001-02-03T04:05:06Z","createdBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb","updatedBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb"},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/4185f9fe-2b34-59f4-aee4-575692fb2264","type":"Microsoft.Authorization/roleDefinitions","name":"4185f9fe-2b34-59f4-aee4-575692fb2264"}' headers: Cache-Control: - no-cache Content-Length: - - "889" + - "730" Content-Type: - application/json; charset=utf-8 Expires: @@ -390,11 +427,11 @@ interactions: X-Content-Type-Options: - nosniff X-Msedge-Ref: - - 'Ref A: 275539817F9E46669C166146AFD883A4 Ref B: SYD03EDGE1717 Ref C: 2024-04-04T23:11:36Z' - status: 201 Created - code: 201 - duration: 4.565137792s - - id: 7 + - 'Ref A: 7744823D8652472286264B757F469CFA Ref B: CO6AA3150220023 Ref C: 2024-06-07T21:26:39Z' + status: 200 OK + code: 200 + duration: 30.534452ms + - id: 8 request: proto: HTTP/1.1 proto_major: 1 @@ -420,7 +457,7 @@ interactions: trailer: {} content_length: 923 uncompressed: false - body: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c","principalId":"2838fb22-92f0-48c6-af79-a612ff336844","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk","condition":null,"conditionVersion":null,"createdOn":"2001-02-03T04:05:06Z","updatedOn":"2001-02-03T04:05:06Z","createdBy":"b5f56733-c999-4afb-883d-eb085d905ec9","updatedBy":"b5f56733-c999-4afb-883d-eb085d905ec9","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk/providers/Microsoft.Authorization/roleAssignments/2d76d181-4aba-5dac-a920-cd42487a00ab","type":"Microsoft.Authorization/roleAssignments","name":"2d76d181-4aba-5dac-a920-cd42487a00ab"}' + body: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c","principalId":"ef0f37cb-d899-4ade-b0fe-92d24cd98218","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk","condition":null,"conditionVersion":null,"createdOn":"2001-02-03T04:05:06Z","updatedOn":"2001-02-03T04:05:06Z","createdBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb","updatedBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk/providers/Microsoft.Authorization/roleAssignments/2d76d181-4aba-5dac-a920-cd42487a00ab","type":"Microsoft.Authorization/roleAssignments","name":"2d76d181-4aba-5dac-a920-cd42487a00ab"}' headers: Cache-Control: - no-cache @@ -441,11 +478,11 @@ interactions: X-Content-Type-Options: - nosniff X-Msedge-Ref: - - 'Ref A: 21FB63342270402CAE655FA00D91BCC1 Ref B: SYD03EDGE1717 Ref C: 2024-04-04T23:11:46Z' + - 'Ref A: 7FB3431582DC463291DFC1A2575D99A6 Ref B: CO6AA3150220023 Ref C: 2024-06-07T21:26:40Z' status: 200 OK code: 200 - duration: 84.109334ms - - id: 8 + duration: 71.053454ms + - id: 9 request: proto: HTTP/1.1 proto_major: 1 @@ -473,7 +510,7 @@ interactions: trailer: {} content_length: 923 uncompressed: false - body: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c","principalId":"2838fb22-92f0-48c6-af79-a612ff336844","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk","condition":null,"conditionVersion":null,"createdOn":"2001-02-03T04:05:06Z","updatedOn":"2001-02-03T04:05:06Z","createdBy":"b5f56733-c999-4afb-883d-eb085d905ec9","updatedBy":"b5f56733-c999-4afb-883d-eb085d905ec9","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk/providers/Microsoft.Authorization/roleAssignments/2d76d181-4aba-5dac-a920-cd42487a00ab","type":"Microsoft.Authorization/roleAssignments","name":"2d76d181-4aba-5dac-a920-cd42487a00ab"}' + body: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c","principalId":"ef0f37cb-d899-4ade-b0fe-92d24cd98218","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk","condition":null,"conditionVersion":null,"createdOn":"2001-02-03T04:05:06Z","updatedOn":"2001-02-03T04:05:06Z","createdBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb","updatedBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk/providers/Microsoft.Authorization/roleAssignments/2d76d181-4aba-5dac-a920-cd42487a00ab","type":"Microsoft.Authorization/roleAssignments","name":"2d76d181-4aba-5dac-a920-cd42487a00ab"}' headers: Cache-Control: - no-cache @@ -494,11 +531,11 @@ interactions: X-Content-Type-Options: - nosniff X-Msedge-Ref: - - 'Ref A: 3911511EC6E6454BBEED22B83EB12B5C Ref B: SYD03EDGE1717 Ref C: 2024-04-04T23:11:46Z' + - 'Ref A: 787DC1708F7149569E74E29D0B0DE0E3 Ref B: CO6AA3150220023 Ref C: 2024-06-07T21:26:40Z' status: 200 OK code: 200 - duration: 103.891292ms - - id: 9 + duration: 50.508451ms + - id: 10 request: proto: HTTP/1.1 proto_major: 1 @@ -535,7 +572,7 @@ interactions: Expires: - "-1" Location: - - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638478691148302899&c=MIIHADCCBeigAwIBAgITHgPrWOVrMb7qufvgEAAAA-tY5TANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDYwHhcNMjQwMjAxMDQxMjQzWhcNMjUwMTI2MDQxMjQzWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOil3F8MsZdl8FeicToFLcoRyDn0Zv76EQTwG1IZtUh-z6uwzGIgy23k7GrXNU1gKVyGJp8lO3encPC02rUQkI0lvN-NUJCoJAEnGZPYOLmA9NylSyr1Ik_Qaz1_UueFRAiyVJlo0Lz27ayfzTTSUd82wyh18q-LWdG49N7fSD_fM1rsfxbY7-Eo4Z5CjxDW3OWmAYKpS0tm17o2hEKrmjeNZJQsSqQxUL-1Be4vND7XzGhGI595ogShOZHOzCBueWR2-8fa5VrwlHqtU1AgvjFk3lYmZejl898JrGFMYH-QSC1iWyRweQ_m3289K-aPeRSWqRihXIG9oHEqouTO1xkCAwEAAaOCA-0wggPpMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHLBggrBgEFBQcBAQSCAb0wggG5MGMGCCsGAQUFBzAChldodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MFMGCCsGAQUFBzAChkdodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAyLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA2LmNydDBTBggrBgEFBQcwAoZHaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MB0GA1UdDgQWBBTew4tn2tBCof44yM20soU6sfep6zAOBgNVHQ8BAf8EBAMCBaAwggEmBgNVHR8EggEdMIIBGTCCARWgggERoIIBDYY_aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JsMBcGA1UdIAQQMA4wDAYKKwYBBAGCN3sBATAfBgNVHSMEGDAWgBTxRmjG8cPwKy19i2rhsvm-NfzRQTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGBANOAsl8fyImo8IXVQ_ybox-BzCeFiAddg9Ojd61exGTea02-HjvZzuL6GZ2k21c7rEjKSBHqk50RLm2yXrMcUGc1UO7MRchaKQm1WR7osgDiXAU0rDc9-H-i8I245Y_PbyKIBewiK7UQiCjda4b__7Amrw7q4oILOsxshnN_D1NBm2nSjm-dFiDeJ9jpG9X1jDJSBtOFUQ7Ala8ShJvWPMpbCR3gFHOGS9f13ebv6qXblaf7sHxE6T0OpuEZPL10Iu5yh42IOLo8wvp1euqb61U3JWoOmBXEB3mJ0owRfBHEjuAARDUzNVgq28F6FYqgACE3nKhqDKYDEQstlJK0&s=vMtXRFKi6YZm-HqZk29QyJ7Jz0jJjvDILpSeWzTWx7V7-zAbBtbql5C6kI46weS9MmqhTGj4MD2tTgovqrXBXdT8_zjwudHkGh-KhCzGTlhmuROq6KQELH408aNhD_Yv5rK7I15lmDHzA3Ipau7oNCkAVF-ffjyOfWFT4X90xDMoZ8KiTVHzVDbMfwQfBGCiyuaaixJ9mT3vwQHmOOsuLC2hz63pMCRL-9nRfBvpEV-3U4nLa_92wiU2XBGKfUBkrCJ-KS24mMuFRrSOMbc5sL2H1IU7Ewuy0VkxIgCypUsf3bN8kqCyM_kC_PjALgKkoEmiDgAarz6oew3-OHTllQ&h=VHZdUsg6CC7aqHcip3ERyPFdQwr6eB_456GhuAzI0bg + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638533924027418988&c=MIIHpTCCBo2gAwIBAgITfwM6vSxODJvqjFP4oQAEAzq9LDANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDIwHhcNMjQwNTE1MTI0NjQwWhcNMjUwNTEwMTI0NjQwWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKa4cOTKf-wVpLKiG5Zei1-Oc5u5PvibFdqWIGFZDLmSA3G2jYrx6dKQ8NH10xxzVOMT_dqQOb2nPmPDhnS3CUlhwx_iI9VSftq8J182Ci01SlOzoieOj_kBg-1yQ4TB3DD7Rwgy40TMWgK-1lkliuLAgSHruwrRW8Kj8Q96A0oGxy1RQggyCNWVG8EsUp1ngtGu-yi1BZRa4Q-v_x9KFfbvtOc9KIfKRFs2r2zg4MWc4xCzQCYrRXIVfS-sFxEn1GbDqtYc4-y5T978_4OnKXidZCkJqT4v1ZRcgxKZpH8d4GmacrEfBoCqjg9ZayboCoIPz5wEIF9LOngoqXqnmYECAwEAAaOCBJIwggSOMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHaBggrBgEFBQcBAQSCAcwwggHIMGYGCCsGAQUFBzAChlpodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMig0KS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3J0MFYGCCsGAQUFBzAChkpodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDAyKDQpLmNydDBWBggrBgEFBQcwAoZKaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMig0KS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3J0MB0GA1UdDgQWBBRCKTJWBui0JqrIiMW81zJdA9-tSDAOBgNVHQ8BAf8EBAMCBaAwggE1BgNVHR8EggEsMIIBKDCCASSgggEgoIIBHIZCaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JsMIGdBgNVHSAEgZUwgZIwDAYKKwYBBAGCN3sBATBmBgorBgEEAYI3ewICMFgwVgYIKwYBBQUHAgIwSh5IADMAMwBlADAAMQA5ADIAMQAtADQAZAA2ADQALQA0AGYAOABjAC0AYQAwADUANQAtADUAYgBkAGEAZgBmAGQANQBlADMAMwBkMAwGCisGAQQBgjd7AwEwDAYKKwYBBAGCN3sEATAfBgNVHSMEGDAWgBSuecJrXSWIEwb2BwnDl3x7l48dVTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGJpRHLgYBJ-Hg0664G6_TgQ8luNO24um3ktexLaPrnailsQdaNThyJ4w9TTpMvyG31DlS7euSnKy8IsfMzCDxu1mmgziF9Urf-OpUw3u-ze-9z_PmzXym0G-rk8OrPpWWdAeApaUIHmydJGO_yrSQURQDLY9ATNa4gS1c9rQLruie0ZkPwjhAJCwpdK615q7s9ssaQ_HZEXM9r3mojVMYMB6b7TQJcwlVHBvkRO5u4HnAI26O2e-pcDzgccXJ6mqM158VJM-AyU1D2gWCqHj4zml1U005Ot-Fx-C3N3HCVImLvAllBxeQdwzOTae6Br-eXo1NCFf1ahI2fP4G_nB7o&s=aj_ZSLN0Ie3J1s218jN6TjxnE_dB5XvVnZ7vB5u50EdL5arZMY3KzioVMhUkNsLSbPt0B8qkqKN490syUWsyAMvuSG4GEGJ-MiqwgzIFDNM59m3P7EeIRFl3DXl__6EQr72eU3iLfe1PPyYLaDpt3ruMYjiA1-CfJr0tQQTQmo7n4AvdezLf3HG7H13IFVCge6sXpKR5vC7Gr7Ftyf7UkDmUFfCVrhid_lCN7ei80izTIQE6XPpACJQZ0BkcS51NHKelNtIeiJXn1JGzpdjg8EVn-0ekWEpQyxMCIQf2nDPUtLBHiacpqvFdEKp8J4gux9lAI49rIlVHAQbmmxaKKQ&h=Dnt3ZhrdgNqnrmInk4f-DTw-F1L73JUEMvhd-miFHEU Pragma: - no-cache Retry-After: @@ -547,11 +584,68 @@ interactions: X-Content-Type-Options: - nosniff X-Msedge-Ref: - - 'Ref A: 3273F28F4CF549DFBEB4463B36D45C13 Ref B: SYD03EDGE1717 Ref C: 2024-04-04T23:11:50Z' + - 'Ref A: 41622BB9C526423FA8CE16DA4D21257F Ref B: CO6AA3150220023 Ref C: 2024-06-07T21:26:42Z' status: 202 Accepted code: 202 - duration: 4.846862458s - - id: 10 + duration: 134.043567ms + - id: 11 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 275 + transfer_encoding: [] + trailer: {} + host: management.azure.com + remote_addr: "" + request_uri: "" + body: '{"name":"2d76d181-4aba-5dac-a920-cd42487a00ab","properties":{"principalId":"ef0f37cb-d899-4ade-b0fe-92d24cd98218","roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"}}' + form: {} + headers: + Accept: + - application/json + Content-Length: + - "275" + Content-Type: + - application/json + Test-Request-Hash: + - 271b417335149635f0d55ee70d8c4513906766f5fcb7001fd1cc5e477cf874f1 + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk/providers/Microsoft.Authorization/roleAssignments/2d76d181-4aba-5dac-a920-cd42487a00ab?api-version=2022-04-01 + method: PUT + response: + proto: HTTP/2.0 + proto_major: 2 + proto_minor: 0 + transfer_encoding: [] + trailer: {} + content_length: 889 + uncompressed: false + body: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c","principalId":"ef0f37cb-d899-4ade-b0fe-92d24cd98218","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk","condition":null,"conditionVersion":null,"createdOn":"2001-02-03T04:05:06Z","updatedOn":"2001-02-03T04:05:06Z","createdBy":null,"updatedBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk/providers/Microsoft.Authorization/roleAssignments/2d76d181-4aba-5dac-a920-cd42487a00ab","type":"Microsoft.Authorization/roleAssignments","name":"2d76d181-4aba-5dac-a920-cd42487a00ab"}' + headers: + Cache-Control: + - no-cache + Content-Length: + - "889" + Content-Type: + - application/json; charset=utf-8 + Expires: + - "-1" + Pragma: + - no-cache + Set-Cookie: + - x-ms-gateway-slice=Production; path=/; secure; samesite=none; httponly + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Cache: + - CONFIG_NOCACHE + X-Content-Type-Options: + - nosniff + X-Msedge-Ref: + - 'Ref A: 9EA164F199DC407B946E885932D16870 Ref B: CO6AA3150220023 Ref C: 2024-06-07T21:26:41Z' + status: 201 Created + code: 201 + duration: 2.183819664s + - id: 12 request: proto: HTTP/1.1 proto_major: 1 @@ -566,8 +660,8 @@ interactions: form: {} headers: Test-Request-Attempt: - - "0" - url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638478691148302899&c=MIIHADCCBeigAwIBAgITHgPrWOVrMb7qufvgEAAAA-tY5TANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDYwHhcNMjQwMjAxMDQxMjQzWhcNMjUwMTI2MDQxMjQzWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOil3F8MsZdl8FeicToFLcoRyDn0Zv76EQTwG1IZtUh-z6uwzGIgy23k7GrXNU1gKVyGJp8lO3encPC02rUQkI0lvN-NUJCoJAEnGZPYOLmA9NylSyr1Ik_Qaz1_UueFRAiyVJlo0Lz27ayfzTTSUd82wyh18q-LWdG49N7fSD_fM1rsfxbY7-Eo4Z5CjxDW3OWmAYKpS0tm17o2hEKrmjeNZJQsSqQxUL-1Be4vND7XzGhGI595ogShOZHOzCBueWR2-8fa5VrwlHqtU1AgvjFk3lYmZejl898JrGFMYH-QSC1iWyRweQ_m3289K-aPeRSWqRihXIG9oHEqouTO1xkCAwEAAaOCA-0wggPpMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHLBggrBgEFBQcBAQSCAb0wggG5MGMGCCsGAQUFBzAChldodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MFMGCCsGAQUFBzAChkdodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAyLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA2LmNydDBTBggrBgEFBQcwAoZHaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MB0GA1UdDgQWBBTew4tn2tBCof44yM20soU6sfep6zAOBgNVHQ8BAf8EBAMCBaAwggEmBgNVHR8EggEdMIIBGTCCARWgggERoIIBDYY_aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JsMBcGA1UdIAQQMA4wDAYKKwYBBAGCN3sBATAfBgNVHSMEGDAWgBTxRmjG8cPwKy19i2rhsvm-NfzRQTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGBANOAsl8fyImo8IXVQ_ybox-BzCeFiAddg9Ojd61exGTea02-HjvZzuL6GZ2k21c7rEjKSBHqk50RLm2yXrMcUGc1UO7MRchaKQm1WR7osgDiXAU0rDc9-H-i8I245Y_PbyKIBewiK7UQiCjda4b__7Amrw7q4oILOsxshnN_D1NBm2nSjm-dFiDeJ9jpG9X1jDJSBtOFUQ7Ala8ShJvWPMpbCR3gFHOGS9f13ebv6qXblaf7sHxE6T0OpuEZPL10Iu5yh42IOLo8wvp1euqb61U3JWoOmBXEB3mJ0owRfBHEjuAARDUzNVgq28F6FYqgACE3nKhqDKYDEQstlJK0&s=vMtXRFKi6YZm-HqZk29QyJ7Jz0jJjvDILpSeWzTWx7V7-zAbBtbql5C6kI46weS9MmqhTGj4MD2tTgovqrXBXdT8_zjwudHkGh-KhCzGTlhmuROq6KQELH408aNhD_Yv5rK7I15lmDHzA3Ipau7oNCkAVF-ffjyOfWFT4X90xDMoZ8KiTVHzVDbMfwQfBGCiyuaaixJ9mT3vwQHmOOsuLC2hz63pMCRL-9nRfBvpEV-3U4nLa_92wiU2XBGKfUBkrCJ-KS24mMuFRrSOMbc5sL2H1IU7Ewuy0VkxIgCypUsf3bN8kqCyM_kC_PjALgKkoEmiDgAarz6oew3-OHTllQ&h=VHZdUsg6CC7aqHcip3ERyPFdQwr6eB_456GhuAzI0bg + - "2" + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk/providers/Microsoft.Authorization/roleAssignments/2d76d181-4aba-5dac-a920-cd42487a00ab?api-version=2022-04-01 method: GET response: proto: HTTP/2.0 @@ -575,22 +669,22 @@ interactions: proto_minor: 0 transfer_encoding: [] trailer: {} - content_length: 0 + content_length: 923 uncompressed: false - body: "" + body: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c","principalId":"ef0f37cb-d899-4ade-b0fe-92d24cd98218","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk","condition":null,"conditionVersion":null,"createdOn":"2001-02-03T04:05:06Z","updatedOn":"2001-02-03T04:05:06Z","createdBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb","updatedBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk/providers/Microsoft.Authorization/roleAssignments/2d76d181-4aba-5dac-a920-cd42487a00ab","type":"Microsoft.Authorization/roleAssignments","name":"2d76d181-4aba-5dac-a920-cd42487a00ab"}' headers: Cache-Control: - no-cache Content-Length: - - "0" + - "923" + Content-Type: + - application/json; charset=utf-8 Expires: - "-1" - Location: - - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638478691355356003&c=MIIHADCCBeigAwIBAgITHgPrWOVrMb7qufvgEAAAA-tY5TANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDYwHhcNMjQwMjAxMDQxMjQzWhcNMjUwMTI2MDQxMjQzWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOil3F8MsZdl8FeicToFLcoRyDn0Zv76EQTwG1IZtUh-z6uwzGIgy23k7GrXNU1gKVyGJp8lO3encPC02rUQkI0lvN-NUJCoJAEnGZPYOLmA9NylSyr1Ik_Qaz1_UueFRAiyVJlo0Lz27ayfzTTSUd82wyh18q-LWdG49N7fSD_fM1rsfxbY7-Eo4Z5CjxDW3OWmAYKpS0tm17o2hEKrmjeNZJQsSqQxUL-1Be4vND7XzGhGI595ogShOZHOzCBueWR2-8fa5VrwlHqtU1AgvjFk3lYmZejl898JrGFMYH-QSC1iWyRweQ_m3289K-aPeRSWqRihXIG9oHEqouTO1xkCAwEAAaOCA-0wggPpMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHLBggrBgEFBQcBAQSCAb0wggG5MGMGCCsGAQUFBzAChldodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MFMGCCsGAQUFBzAChkdodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAyLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA2LmNydDBTBggrBgEFBQcwAoZHaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MB0GA1UdDgQWBBTew4tn2tBCof44yM20soU6sfep6zAOBgNVHQ8BAf8EBAMCBaAwggEmBgNVHR8EggEdMIIBGTCCARWgggERoIIBDYY_aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JsMBcGA1UdIAQQMA4wDAYKKwYBBAGCN3sBATAfBgNVHSMEGDAWgBTxRmjG8cPwKy19i2rhsvm-NfzRQTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGBANOAsl8fyImo8IXVQ_ybox-BzCeFiAddg9Ojd61exGTea02-HjvZzuL6GZ2k21c7rEjKSBHqk50RLm2yXrMcUGc1UO7MRchaKQm1WR7osgDiXAU0rDc9-H-i8I245Y_PbyKIBewiK7UQiCjda4b__7Amrw7q4oILOsxshnN_D1NBm2nSjm-dFiDeJ9jpG9X1jDJSBtOFUQ7Ala8ShJvWPMpbCR3gFHOGS9f13ebv6qXblaf7sHxE6T0OpuEZPL10Iu5yh42IOLo8wvp1euqb61U3JWoOmBXEB3mJ0owRfBHEjuAARDUzNVgq28F6FYqgACE3nKhqDKYDEQstlJK0&s=F-eVG8renrOOqVn6xIPYram614yUtEdRwmwyj_Q0RspHT0zDz1fqrW1HNs497Uw1PdegNw3bgNyzlxs_Bnd-4eaENxAQlZd0ZfQMyR00Cmcf-eOxdbrMh49Rn3L5emMrZ6_MSMeAluHwyvre_A0mrZR3Xhc42L4ThMbzFPysmj2MS6JcsmL_HiKtY2BE6AMCz1ZUKXYOc4AJfhXVOKgg5edXXjzttkDJR-vBGMt45ggKh8NRGeMb8gPsHoqD5yxlaZ4yjz7SMpxpDQ_b2YNG37nm3XAgEa3gdG1IevYdC6dNWC5nX58lYYjzDxWZSw0Duw_EU8g8ODlWKN1Tm6mLKg&h=D16XLBLnpn3CJspAuje_5E6gViZJAA1p5wxkmIrbZjQ Pragma: - no-cache - Retry-After: - - "15" + Set-Cookie: + - x-ms-gateway-slice=Production; path=/; secure; samesite=none; httponly Strict-Transport-Security: - max-age=31536000; includeSubDomains X-Cache: @@ -598,11 +692,11 @@ interactions: X-Content-Type-Options: - nosniff X-Msedge-Ref: - - 'Ref A: BFDE7612F91443FEAFB61648E83D5CBD Ref B: SYD03EDGE1717 Ref C: 2024-04-04T23:12:14Z' - status: 202 Accepted - code: 202 - duration: 762.040084ms - - id: 11 + - 'Ref A: 1FD18C073AA341AE98A676B77C9C311E Ref B: CO6AA3150220023 Ref C: 2024-06-07T21:26:47Z' + status: 200 OK + code: 200 + duration: 41.475206ms + - id: 13 request: proto: HTTP/1.1 proto_major: 1 @@ -616,9 +710,11 @@ interactions: body: "" form: {} headers: + Accept: + - application/json Test-Request-Attempt: - - "1" - url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638478691148302899&c=MIIHADCCBeigAwIBAgITHgPrWOVrMb7qufvgEAAAA-tY5TANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDYwHhcNMjQwMjAxMDQxMjQzWhcNMjUwMTI2MDQxMjQzWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOil3F8MsZdl8FeicToFLcoRyDn0Zv76EQTwG1IZtUh-z6uwzGIgy23k7GrXNU1gKVyGJp8lO3encPC02rUQkI0lvN-NUJCoJAEnGZPYOLmA9NylSyr1Ik_Qaz1_UueFRAiyVJlo0Lz27ayfzTTSUd82wyh18q-LWdG49N7fSD_fM1rsfxbY7-Eo4Z5CjxDW3OWmAYKpS0tm17o2hEKrmjeNZJQsSqQxUL-1Be4vND7XzGhGI595ogShOZHOzCBueWR2-8fa5VrwlHqtU1AgvjFk3lYmZejl898JrGFMYH-QSC1iWyRweQ_m3289K-aPeRSWqRihXIG9oHEqouTO1xkCAwEAAaOCA-0wggPpMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHLBggrBgEFBQcBAQSCAb0wggG5MGMGCCsGAQUFBzAChldodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MFMGCCsGAQUFBzAChkdodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAyLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA2LmNydDBTBggrBgEFBQcwAoZHaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MB0GA1UdDgQWBBTew4tn2tBCof44yM20soU6sfep6zAOBgNVHQ8BAf8EBAMCBaAwggEmBgNVHR8EggEdMIIBGTCCARWgggERoIIBDYY_aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JsMBcGA1UdIAQQMA4wDAYKKwYBBAGCN3sBATAfBgNVHSMEGDAWgBTxRmjG8cPwKy19i2rhsvm-NfzRQTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGBANOAsl8fyImo8IXVQ_ybox-BzCeFiAddg9Ojd61exGTea02-HjvZzuL6GZ2k21c7rEjKSBHqk50RLm2yXrMcUGc1UO7MRchaKQm1WR7osgDiXAU0rDc9-H-i8I245Y_PbyKIBewiK7UQiCjda4b__7Amrw7q4oILOsxshnN_D1NBm2nSjm-dFiDeJ9jpG9X1jDJSBtOFUQ7Ala8ShJvWPMpbCR3gFHOGS9f13ebv6qXblaf7sHxE6T0OpuEZPL10Iu5yh42IOLo8wvp1euqb61U3JWoOmBXEB3mJ0owRfBHEjuAARDUzNVgq28F6FYqgACE3nKhqDKYDEQstlJK0&s=vMtXRFKi6YZm-HqZk29QyJ7Jz0jJjvDILpSeWzTWx7V7-zAbBtbql5C6kI46weS9MmqhTGj4MD2tTgovqrXBXdT8_zjwudHkGh-KhCzGTlhmuROq6KQELH408aNhD_Yv5rK7I15lmDHzA3Ipau7oNCkAVF-ffjyOfWFT4X90xDMoZ8KiTVHzVDbMfwQfBGCiyuaaixJ9mT3vwQHmOOsuLC2hz63pMCRL-9nRfBvpEV-3U4nLa_92wiU2XBGKfUBkrCJ-KS24mMuFRrSOMbc5sL2H1IU7Ewuy0VkxIgCypUsf3bN8kqCyM_kC_PjALgKkoEmiDgAarz6oew3-OHTllQ&h=VHZdUsg6CC7aqHcip3ERyPFdQwr6eB_456GhuAzI0bg + - "3" + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk/providers/Microsoft.Authorization/roleAssignments/2d76d181-4aba-5dac-a920-cd42487a00ab?api-version=2022-04-01 method: GET response: proto: HTTP/2.0 @@ -626,22 +722,22 @@ interactions: proto_minor: 0 transfer_encoding: [] trailer: {} - content_length: 0 + content_length: 923 uncompressed: false - body: "" + body: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c","principalId":"ef0f37cb-d899-4ade-b0fe-92d24cd98218","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk","condition":null,"conditionVersion":null,"createdOn":"2001-02-03T04:05:06Z","updatedOn":"2001-02-03T04:05:06Z","createdBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb","updatedBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/asotest-rg-fyvjhk/providers/Microsoft.Authorization/roleAssignments/2d76d181-4aba-5dac-a920-cd42487a00ab","type":"Microsoft.Authorization/roleAssignments","name":"2d76d181-4aba-5dac-a920-cd42487a00ab"}' headers: Cache-Control: - no-cache Content-Length: - - "0" + - "923" + Content-Type: + - application/json; charset=utf-8 Expires: - "-1" - Location: - - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638478691520643330&c=MIIHADCCBeigAwIBAgITHgPrWOVrMb7qufvgEAAAA-tY5TANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDYwHhcNMjQwMjAxMDQxMjQzWhcNMjUwMTI2MDQxMjQzWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOil3F8MsZdl8FeicToFLcoRyDn0Zv76EQTwG1IZtUh-z6uwzGIgy23k7GrXNU1gKVyGJp8lO3encPC02rUQkI0lvN-NUJCoJAEnGZPYOLmA9NylSyr1Ik_Qaz1_UueFRAiyVJlo0Lz27ayfzTTSUd82wyh18q-LWdG49N7fSD_fM1rsfxbY7-Eo4Z5CjxDW3OWmAYKpS0tm17o2hEKrmjeNZJQsSqQxUL-1Be4vND7XzGhGI595ogShOZHOzCBueWR2-8fa5VrwlHqtU1AgvjFk3lYmZejl898JrGFMYH-QSC1iWyRweQ_m3289K-aPeRSWqRihXIG9oHEqouTO1xkCAwEAAaOCA-0wggPpMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHLBggrBgEFBQcBAQSCAb0wggG5MGMGCCsGAQUFBzAChldodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MFMGCCsGAQUFBzAChkdodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAyLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA2LmNydDBTBggrBgEFBQcwAoZHaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MB0GA1UdDgQWBBTew4tn2tBCof44yM20soU6sfep6zAOBgNVHQ8BAf8EBAMCBaAwggEmBgNVHR8EggEdMIIBGTCCARWgggERoIIBDYY_aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JsMBcGA1UdIAQQMA4wDAYKKwYBBAGCN3sBATAfBgNVHSMEGDAWgBTxRmjG8cPwKy19i2rhsvm-NfzRQTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGBANOAsl8fyImo8IXVQ_ybox-BzCeFiAddg9Ojd61exGTea02-HjvZzuL6GZ2k21c7rEjKSBHqk50RLm2yXrMcUGc1UO7MRchaKQm1WR7osgDiXAU0rDc9-H-i8I245Y_PbyKIBewiK7UQiCjda4b__7Amrw7q4oILOsxshnN_D1NBm2nSjm-dFiDeJ9jpG9X1jDJSBtOFUQ7Ala8ShJvWPMpbCR3gFHOGS9f13ebv6qXblaf7sHxE6T0OpuEZPL10Iu5yh42IOLo8wvp1euqb61U3JWoOmBXEB3mJ0owRfBHEjuAARDUzNVgq28F6FYqgACE3nKhqDKYDEQstlJK0&s=Ob23TcmXskqP3HOrpVeJlyJcIr1J8lR9uFjJKupnt0ie_dDa2ZCFCgCNUyy8bFL1sWsTCFfXm_aJx5OxNyHoNqyce9qBZ9I_doXQXXsjNRC0MORATQU6v9f235aaQD7Oy8WA-QssutazneJZUWqCj__h9L7zcvS3AkV3quCn4wc06vFEJu4fXagPrXnzaX0AiBIkIa2cN8ybYgWlV6NmCQB8txZvxRdfUH2c0WTsVamszLZQ3uvF79TPQnKwWmTGsUQ1sDZRE_sxkhVY_ZmunKTmtqBzmZ8nIYN0dxiSdK7IIdFZd8bd6RUlbeLuV1THcPQS3YBJ3cC7U82RZTaizw&h=rROcmUzGTiQJPR6enssSUC6kMfyiuElWkhO12H2SLLE Pragma: - no-cache - Retry-After: - - "15" + Set-Cookie: + - x-ms-gateway-slice=Production; path=/; secure; samesite=none; httponly Strict-Transport-Security: - max-age=31536000; includeSubDomains X-Cache: @@ -649,11 +745,11 @@ interactions: X-Content-Type-Options: - nosniff X-Msedge-Ref: - - 'Ref A: 03DA2E6D6AC04E738B9D1C362EC72B66 Ref B: SYD03EDGE1717 Ref C: 2024-04-04T23:12:31Z' - status: 202 Accepted - code: 202 - duration: 755.559083ms - - id: 12 + - 'Ref A: 5ED4B6D7C8D74E0F8E6217C8DD35AB7A Ref B: CO6AA3150220023 Ref C: 2024-06-07T21:26:47Z' + status: 200 OK + code: 200 + duration: 43.016514ms + - id: 14 request: proto: HTTP/1.1 proto_major: 1 @@ -668,8 +764,8 @@ interactions: form: {} headers: Test-Request-Attempt: - - "2" - url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638478691148302899&c=MIIHADCCBeigAwIBAgITHgPrWOVrMb7qufvgEAAAA-tY5TANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDYwHhcNMjQwMjAxMDQxMjQzWhcNMjUwMTI2MDQxMjQzWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOil3F8MsZdl8FeicToFLcoRyDn0Zv76EQTwG1IZtUh-z6uwzGIgy23k7GrXNU1gKVyGJp8lO3encPC02rUQkI0lvN-NUJCoJAEnGZPYOLmA9NylSyr1Ik_Qaz1_UueFRAiyVJlo0Lz27ayfzTTSUd82wyh18q-LWdG49N7fSD_fM1rsfxbY7-Eo4Z5CjxDW3OWmAYKpS0tm17o2hEKrmjeNZJQsSqQxUL-1Be4vND7XzGhGI595ogShOZHOzCBueWR2-8fa5VrwlHqtU1AgvjFk3lYmZejl898JrGFMYH-QSC1iWyRweQ_m3289K-aPeRSWqRihXIG9oHEqouTO1xkCAwEAAaOCA-0wggPpMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHLBggrBgEFBQcBAQSCAb0wggG5MGMGCCsGAQUFBzAChldodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MFMGCCsGAQUFBzAChkdodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAyLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA2LmNydDBTBggrBgEFBQcwAoZHaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MB0GA1UdDgQWBBTew4tn2tBCof44yM20soU6sfep6zAOBgNVHQ8BAf8EBAMCBaAwggEmBgNVHR8EggEdMIIBGTCCARWgggERoIIBDYY_aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JsMBcGA1UdIAQQMA4wDAYKKwYBBAGCN3sBATAfBgNVHSMEGDAWgBTxRmjG8cPwKy19i2rhsvm-NfzRQTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGBANOAsl8fyImo8IXVQ_ybox-BzCeFiAddg9Ojd61exGTea02-HjvZzuL6GZ2k21c7rEjKSBHqk50RLm2yXrMcUGc1UO7MRchaKQm1WR7osgDiXAU0rDc9-H-i8I245Y_PbyKIBewiK7UQiCjda4b__7Amrw7q4oILOsxshnN_D1NBm2nSjm-dFiDeJ9jpG9X1jDJSBtOFUQ7Ala8ShJvWPMpbCR3gFHOGS9f13ebv6qXblaf7sHxE6T0OpuEZPL10Iu5yh42IOLo8wvp1euqb61U3JWoOmBXEB3mJ0owRfBHEjuAARDUzNVgq28F6FYqgACE3nKhqDKYDEQstlJK0&s=vMtXRFKi6YZm-HqZk29QyJ7Jz0jJjvDILpSeWzTWx7V7-zAbBtbql5C6kI46weS9MmqhTGj4MD2tTgovqrXBXdT8_zjwudHkGh-KhCzGTlhmuROq6KQELH408aNhD_Yv5rK7I15lmDHzA3Ipau7oNCkAVF-ffjyOfWFT4X90xDMoZ8KiTVHzVDbMfwQfBGCiyuaaixJ9mT3vwQHmOOsuLC2hz63pMCRL-9nRfBvpEV-3U4nLa_92wiU2XBGKfUBkrCJ-KS24mMuFRrSOMbc5sL2H1IU7Ewuy0VkxIgCypUsf3bN8kqCyM_kC_PjALgKkoEmiDgAarz6oew3-OHTllQ&h=VHZdUsg6CC7aqHcip3ERyPFdQwr6eB_456GhuAzI0bg + - "0" + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638533924027418988&c=MIIHpTCCBo2gAwIBAgITfwM6vSxODJvqjFP4oQAEAzq9LDANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDIwHhcNMjQwNTE1MTI0NjQwWhcNMjUwNTEwMTI0NjQwWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKa4cOTKf-wVpLKiG5Zei1-Oc5u5PvibFdqWIGFZDLmSA3G2jYrx6dKQ8NH10xxzVOMT_dqQOb2nPmPDhnS3CUlhwx_iI9VSftq8J182Ci01SlOzoieOj_kBg-1yQ4TB3DD7Rwgy40TMWgK-1lkliuLAgSHruwrRW8Kj8Q96A0oGxy1RQggyCNWVG8EsUp1ngtGu-yi1BZRa4Q-v_x9KFfbvtOc9KIfKRFs2r2zg4MWc4xCzQCYrRXIVfS-sFxEn1GbDqtYc4-y5T978_4OnKXidZCkJqT4v1ZRcgxKZpH8d4GmacrEfBoCqjg9ZayboCoIPz5wEIF9LOngoqXqnmYECAwEAAaOCBJIwggSOMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHaBggrBgEFBQcBAQSCAcwwggHIMGYGCCsGAQUFBzAChlpodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMig0KS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3J0MFYGCCsGAQUFBzAChkpodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDAyKDQpLmNydDBWBggrBgEFBQcwAoZKaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMig0KS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3J0MB0GA1UdDgQWBBRCKTJWBui0JqrIiMW81zJdA9-tSDAOBgNVHQ8BAf8EBAMCBaAwggE1BgNVHR8EggEsMIIBKDCCASSgggEgoIIBHIZCaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JsMIGdBgNVHSAEgZUwgZIwDAYKKwYBBAGCN3sBATBmBgorBgEEAYI3ewICMFgwVgYIKwYBBQUHAgIwSh5IADMAMwBlADAAMQA5ADIAMQAtADQAZAA2ADQALQA0AGYAOABjAC0AYQAwADUANQAtADUAYgBkAGEAZgBmAGQANQBlADMAMwBkMAwGCisGAQQBgjd7AwEwDAYKKwYBBAGCN3sEATAfBgNVHSMEGDAWgBSuecJrXSWIEwb2BwnDl3x7l48dVTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGJpRHLgYBJ-Hg0664G6_TgQ8luNO24um3ktexLaPrnailsQdaNThyJ4w9TTpMvyG31DlS7euSnKy8IsfMzCDxu1mmgziF9Urf-OpUw3u-ze-9z_PmzXym0G-rk8OrPpWWdAeApaUIHmydJGO_yrSQURQDLY9ATNa4gS1c9rQLruie0ZkPwjhAJCwpdK615q7s9ssaQ_HZEXM9r3mojVMYMB6b7TQJcwlVHBvkRO5u4HnAI26O2e-pcDzgccXJ6mqM158VJM-AyU1D2gWCqHj4zml1U005Ot-Fx-C3N3HCVImLvAllBxeQdwzOTae6Br-eXo1NCFf1ahI2fP4G_nB7o&s=aj_ZSLN0Ie3J1s218jN6TjxnE_dB5XvVnZ7vB5u50EdL5arZMY3KzioVMhUkNsLSbPt0B8qkqKN490syUWsyAMvuSG4GEGJ-MiqwgzIFDNM59m3P7EeIRFl3DXl__6EQr72eU3iLfe1PPyYLaDpt3ruMYjiA1-CfJr0tQQTQmo7n4AvdezLf3HG7H13IFVCge6sXpKR5vC7Gr7Ftyf7UkDmUFfCVrhid_lCN7ei80izTIQE6XPpACJQZ0BkcS51NHKelNtIeiJXn1JGzpdjg8EVn-0ekWEpQyxMCIQf2nDPUtLBHiacpqvFdEKp8J4gux9lAI49rIlVHAQbmmxaKKQ&h=Dnt3ZhrdgNqnrmInk4f-DTw-F1L73JUEMvhd-miFHEU method: GET response: proto: HTTP/2.0 @@ -688,7 +784,7 @@ interactions: Expires: - "-1" Location: - - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638478691685780565&c=MIIHADCCBeigAwIBAgITHgPrWOVrMb7qufvgEAAAA-tY5TANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDYwHhcNMjQwMjAxMDQxMjQzWhcNMjUwMTI2MDQxMjQzWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOil3F8MsZdl8FeicToFLcoRyDn0Zv76EQTwG1IZtUh-z6uwzGIgy23k7GrXNU1gKVyGJp8lO3encPC02rUQkI0lvN-NUJCoJAEnGZPYOLmA9NylSyr1Ik_Qaz1_UueFRAiyVJlo0Lz27ayfzTTSUd82wyh18q-LWdG49N7fSD_fM1rsfxbY7-Eo4Z5CjxDW3OWmAYKpS0tm17o2hEKrmjeNZJQsSqQxUL-1Be4vND7XzGhGI595ogShOZHOzCBueWR2-8fa5VrwlHqtU1AgvjFk3lYmZejl898JrGFMYH-QSC1iWyRweQ_m3289K-aPeRSWqRihXIG9oHEqouTO1xkCAwEAAaOCA-0wggPpMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHLBggrBgEFBQcBAQSCAb0wggG5MGMGCCsGAQUFBzAChldodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MFMGCCsGAQUFBzAChkdodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAyLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA2LmNydDBTBggrBgEFBQcwAoZHaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MB0GA1UdDgQWBBTew4tn2tBCof44yM20soU6sfep6zAOBgNVHQ8BAf8EBAMCBaAwggEmBgNVHR8EggEdMIIBGTCCARWgggERoIIBDYY_aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JsMBcGA1UdIAQQMA4wDAYKKwYBBAGCN3sBATAfBgNVHSMEGDAWgBTxRmjG8cPwKy19i2rhsvm-NfzRQTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGBANOAsl8fyImo8IXVQ_ybox-BzCeFiAddg9Ojd61exGTea02-HjvZzuL6GZ2k21c7rEjKSBHqk50RLm2yXrMcUGc1UO7MRchaKQm1WR7osgDiXAU0rDc9-H-i8I245Y_PbyKIBewiK7UQiCjda4b__7Amrw7q4oILOsxshnN_D1NBm2nSjm-dFiDeJ9jpG9X1jDJSBtOFUQ7Ala8ShJvWPMpbCR3gFHOGS9f13ebv6qXblaf7sHxE6T0OpuEZPL10Iu5yh42IOLo8wvp1euqb61U3JWoOmBXEB3mJ0owRfBHEjuAARDUzNVgq28F6FYqgACE3nKhqDKYDEQstlJK0&s=CiM_PcxDg5vQlLt4CLfJJR12MNHJdCjiIgxPCXYVcpewCpwhXtU71e0EBA5YTt_3gqUso7J-Fjc7xiH_oS4cc_pbLHvsgKE8WgJcafnn3bOrJpeN1TDTvvUkiBLXBZyoL3MLFuud9CF6p1UIqQtEy5FRbzXIINWaZG1xeVCGzrZb1oVn46ndr2DrMNnbxKtyPhMlUNR3EJkGhI4wdb8RMsU5C7INd6rAfFXK5G33Z_XXTcL5FLJZPuwQjeWChqxGWJfM4JQMhDB85dqplIf98d-tyRDHOojLArXP0_RFIMoUOImMsoE_goFsJDfmE-yv6YVJZvRt4m_fbjQDpAxubg&h=lzkTerT42co9ui1lebncJA5i7x8btkKExxopW2qeJnU + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638533924179375665&c=MIIHpTCCBo2gAwIBAgITfwM6vSxODJvqjFP4oQAEAzq9LDANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDIwHhcNMjQwNTE1MTI0NjQwWhcNMjUwNTEwMTI0NjQwWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKa4cOTKf-wVpLKiG5Zei1-Oc5u5PvibFdqWIGFZDLmSA3G2jYrx6dKQ8NH10xxzVOMT_dqQOb2nPmPDhnS3CUlhwx_iI9VSftq8J182Ci01SlOzoieOj_kBg-1yQ4TB3DD7Rwgy40TMWgK-1lkliuLAgSHruwrRW8Kj8Q96A0oGxy1RQggyCNWVG8EsUp1ngtGu-yi1BZRa4Q-v_x9KFfbvtOc9KIfKRFs2r2zg4MWc4xCzQCYrRXIVfS-sFxEn1GbDqtYc4-y5T978_4OnKXidZCkJqT4v1ZRcgxKZpH8d4GmacrEfBoCqjg9ZayboCoIPz5wEIF9LOngoqXqnmYECAwEAAaOCBJIwggSOMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHaBggrBgEFBQcBAQSCAcwwggHIMGYGCCsGAQUFBzAChlpodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMig0KS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3J0MFYGCCsGAQUFBzAChkpodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDAyKDQpLmNydDBWBggrBgEFBQcwAoZKaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMig0KS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3J0MB0GA1UdDgQWBBRCKTJWBui0JqrIiMW81zJdA9-tSDAOBgNVHQ8BAf8EBAMCBaAwggE1BgNVHR8EggEsMIIBKDCCASSgggEgoIIBHIZCaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JsMIGdBgNVHSAEgZUwgZIwDAYKKwYBBAGCN3sBATBmBgorBgEEAYI3ewICMFgwVgYIKwYBBQUHAgIwSh5IADMAMwBlADAAMQA5ADIAMQAtADQAZAA2ADQALQA0AGYAOABjAC0AYQAwADUANQAtADUAYgBkAGEAZgBmAGQANQBlADMAMwBkMAwGCisGAQQBgjd7AwEwDAYKKwYBBAGCN3sEATAfBgNVHSMEGDAWgBSuecJrXSWIEwb2BwnDl3x7l48dVTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGJpRHLgYBJ-Hg0664G6_TgQ8luNO24um3ktexLaPrnailsQdaNThyJ4w9TTpMvyG31DlS7euSnKy8IsfMzCDxu1mmgziF9Urf-OpUw3u-ze-9z_PmzXym0G-rk8OrPpWWdAeApaUIHmydJGO_yrSQURQDLY9ATNa4gS1c9rQLruie0ZkPwjhAJCwpdK615q7s9ssaQ_HZEXM9r3mojVMYMB6b7TQJcwlVHBvkRO5u4HnAI26O2e-pcDzgccXJ6mqM158VJM-AyU1D2gWCqHj4zml1U005Ot-Fx-C3N3HCVImLvAllBxeQdwzOTae6Br-eXo1NCFf1ahI2fP4G_nB7o&s=QM4g-jb2RE23V0qTWnECB2127HAr5lSVuk6R8esjYmjn2j2IVYWHABmMQiWovirU5ovNPL9yiDD9yhgWPXYbefXnLK_dGxb2DR9fL6ziBu9k_z8L-4qbvkvFjjCGmqm527aoyAZ1q6AKFa305FCRdFEbr-6dVIsmxlQoN10U_myUl1mH11IXEmWCZOAMHBWaczsBTLJvWCSnBRyr6XDqYiKeTKHocSBKScv5h-OPozqdGn6aHnL1n81ruy28iBvei6T2SJWy3GuriXN7CU9MMKaGOexCJsnbZWgmgDB4cn5Yj_wqVgRy9dXbwQ91YxyFK4_FRVspj8T_5G9OKWd8AA&h=8ZpXL-3OGufyVc-4QbNZd5hWVjzmeAgIYmIydq4Nc4o Pragma: - no-cache Retry-After: @@ -700,11 +796,11 @@ interactions: X-Content-Type-Options: - nosniff X-Msedge-Ref: - - 'Ref A: D172B38B877247C3A908C51A042D0507 Ref B: SYD03EDGE1717 Ref C: 2024-04-04T23:12:47Z' + - 'Ref A: 93F66F81D18742F0A433D587728D83A6 Ref B: CO6AA3150220023 Ref C: 2024-06-07T21:26:57Z' status: 202 Accepted code: 202 - duration: 824.382584ms - - id: 13 + duration: 29.557447ms + - id: 15 request: proto: HTTP/1.1 proto_major: 1 @@ -719,8 +815,8 @@ interactions: form: {} headers: Test-Request-Attempt: - - "3" - url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638478691148302899&c=MIIHADCCBeigAwIBAgITHgPrWOVrMb7qufvgEAAAA-tY5TANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDYwHhcNMjQwMjAxMDQxMjQzWhcNMjUwMTI2MDQxMjQzWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOil3F8MsZdl8FeicToFLcoRyDn0Zv76EQTwG1IZtUh-z6uwzGIgy23k7GrXNU1gKVyGJp8lO3encPC02rUQkI0lvN-NUJCoJAEnGZPYOLmA9NylSyr1Ik_Qaz1_UueFRAiyVJlo0Lz27ayfzTTSUd82wyh18q-LWdG49N7fSD_fM1rsfxbY7-Eo4Z5CjxDW3OWmAYKpS0tm17o2hEKrmjeNZJQsSqQxUL-1Be4vND7XzGhGI595ogShOZHOzCBueWR2-8fa5VrwlHqtU1AgvjFk3lYmZejl898JrGFMYH-QSC1iWyRweQ_m3289K-aPeRSWqRihXIG9oHEqouTO1xkCAwEAAaOCA-0wggPpMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHLBggrBgEFBQcBAQSCAb0wggG5MGMGCCsGAQUFBzAChldodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MFMGCCsGAQUFBzAChkdodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAyLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA2LmNydDBTBggrBgEFBQcwAoZHaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MB0GA1UdDgQWBBTew4tn2tBCof44yM20soU6sfep6zAOBgNVHQ8BAf8EBAMCBaAwggEmBgNVHR8EggEdMIIBGTCCARWgggERoIIBDYY_aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JsMBcGA1UdIAQQMA4wDAYKKwYBBAGCN3sBATAfBgNVHSMEGDAWgBTxRmjG8cPwKy19i2rhsvm-NfzRQTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGBANOAsl8fyImo8IXVQ_ybox-BzCeFiAddg9Ojd61exGTea02-HjvZzuL6GZ2k21c7rEjKSBHqk50RLm2yXrMcUGc1UO7MRchaKQm1WR7osgDiXAU0rDc9-H-i8I245Y_PbyKIBewiK7UQiCjda4b__7Amrw7q4oILOsxshnN_D1NBm2nSjm-dFiDeJ9jpG9X1jDJSBtOFUQ7Ala8ShJvWPMpbCR3gFHOGS9f13ebv6qXblaf7sHxE6T0OpuEZPL10Iu5yh42IOLo8wvp1euqb61U3JWoOmBXEB3mJ0owRfBHEjuAARDUzNVgq28F6FYqgACE3nKhqDKYDEQstlJK0&s=vMtXRFKi6YZm-HqZk29QyJ7Jz0jJjvDILpSeWzTWx7V7-zAbBtbql5C6kI46weS9MmqhTGj4MD2tTgovqrXBXdT8_zjwudHkGh-KhCzGTlhmuROq6KQELH408aNhD_Yv5rK7I15lmDHzA3Ipau7oNCkAVF-ffjyOfWFT4X90xDMoZ8KiTVHzVDbMfwQfBGCiyuaaixJ9mT3vwQHmOOsuLC2hz63pMCRL-9nRfBvpEV-3U4nLa_92wiU2XBGKfUBkrCJ-KS24mMuFRrSOMbc5sL2H1IU7Ewuy0VkxIgCypUsf3bN8kqCyM_kC_PjALgKkoEmiDgAarz6oew3-OHTllQ&h=VHZdUsg6CC7aqHcip3ERyPFdQwr6eB_456GhuAzI0bg + - "1" + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638533924027418988&c=MIIHpTCCBo2gAwIBAgITfwM6vSxODJvqjFP4oQAEAzq9LDANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDIwHhcNMjQwNTE1MTI0NjQwWhcNMjUwNTEwMTI0NjQwWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKa4cOTKf-wVpLKiG5Zei1-Oc5u5PvibFdqWIGFZDLmSA3G2jYrx6dKQ8NH10xxzVOMT_dqQOb2nPmPDhnS3CUlhwx_iI9VSftq8J182Ci01SlOzoieOj_kBg-1yQ4TB3DD7Rwgy40TMWgK-1lkliuLAgSHruwrRW8Kj8Q96A0oGxy1RQggyCNWVG8EsUp1ngtGu-yi1BZRa4Q-v_x9KFfbvtOc9KIfKRFs2r2zg4MWc4xCzQCYrRXIVfS-sFxEn1GbDqtYc4-y5T978_4OnKXidZCkJqT4v1ZRcgxKZpH8d4GmacrEfBoCqjg9ZayboCoIPz5wEIF9LOngoqXqnmYECAwEAAaOCBJIwggSOMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHaBggrBgEFBQcBAQSCAcwwggHIMGYGCCsGAQUFBzAChlpodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMig0KS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3J0MFYGCCsGAQUFBzAChkpodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDAyKDQpLmNydDBWBggrBgEFBQcwAoZKaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMig0KS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3J0MB0GA1UdDgQWBBRCKTJWBui0JqrIiMW81zJdA9-tSDAOBgNVHQ8BAf8EBAMCBaAwggE1BgNVHR8EggEsMIIBKDCCASSgggEgoIIBHIZCaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JsMIGdBgNVHSAEgZUwgZIwDAYKKwYBBAGCN3sBATBmBgorBgEEAYI3ewICMFgwVgYIKwYBBQUHAgIwSh5IADMAMwBlADAAMQA5ADIAMQAtADQAZAA2ADQALQA0AGYAOABjAC0AYQAwADUANQAtADUAYgBkAGEAZgBmAGQANQBlADMAMwBkMAwGCisGAQQBgjd7AwEwDAYKKwYBBAGCN3sEATAfBgNVHSMEGDAWgBSuecJrXSWIEwb2BwnDl3x7l48dVTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGJpRHLgYBJ-Hg0664G6_TgQ8luNO24um3ktexLaPrnailsQdaNThyJ4w9TTpMvyG31DlS7euSnKy8IsfMzCDxu1mmgziF9Urf-OpUw3u-ze-9z_PmzXym0G-rk8OrPpWWdAeApaUIHmydJGO_yrSQURQDLY9ATNa4gS1c9rQLruie0ZkPwjhAJCwpdK615q7s9ssaQ_HZEXM9r3mojVMYMB6b7TQJcwlVHBvkRO5u4HnAI26O2e-pcDzgccXJ6mqM158VJM-AyU1D2gWCqHj4zml1U005Ot-Fx-C3N3HCVImLvAllBxeQdwzOTae6Br-eXo1NCFf1ahI2fP4G_nB7o&s=aj_ZSLN0Ie3J1s218jN6TjxnE_dB5XvVnZ7vB5u50EdL5arZMY3KzioVMhUkNsLSbPt0B8qkqKN490syUWsyAMvuSG4GEGJ-MiqwgzIFDNM59m3P7EeIRFl3DXl__6EQr72eU3iLfe1PPyYLaDpt3ruMYjiA1-CfJr0tQQTQmo7n4AvdezLf3HG7H13IFVCge6sXpKR5vC7Gr7Ftyf7UkDmUFfCVrhid_lCN7ei80izTIQE6XPpACJQZ0BkcS51NHKelNtIeiJXn1JGzpdjg8EVn-0ekWEpQyxMCIQf2nDPUtLBHiacpqvFdEKp8J4gux9lAI49rIlVHAQbmmxaKKQ&h=Dnt3ZhrdgNqnrmInk4f-DTw-F1L73JUEMvhd-miFHEU method: GET response: proto: HTTP/2.0 @@ -739,7 +835,7 @@ interactions: Expires: - "-1" Location: - - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638478691848797611&c=MIIHADCCBeigAwIBAgITHgPrWOVrMb7qufvgEAAAA-tY5TANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDYwHhcNMjQwMjAxMDQxMjQzWhcNMjUwMTI2MDQxMjQzWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOil3F8MsZdl8FeicToFLcoRyDn0Zv76EQTwG1IZtUh-z6uwzGIgy23k7GrXNU1gKVyGJp8lO3encPC02rUQkI0lvN-NUJCoJAEnGZPYOLmA9NylSyr1Ik_Qaz1_UueFRAiyVJlo0Lz27ayfzTTSUd82wyh18q-LWdG49N7fSD_fM1rsfxbY7-Eo4Z5CjxDW3OWmAYKpS0tm17o2hEKrmjeNZJQsSqQxUL-1Be4vND7XzGhGI595ogShOZHOzCBueWR2-8fa5VrwlHqtU1AgvjFk3lYmZejl898JrGFMYH-QSC1iWyRweQ_m3289K-aPeRSWqRihXIG9oHEqouTO1xkCAwEAAaOCA-0wggPpMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHLBggrBgEFBQcBAQSCAb0wggG5MGMGCCsGAQUFBzAChldodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MFMGCCsGAQUFBzAChkdodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAyLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA2LmNydDBTBggrBgEFBQcwAoZHaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MB0GA1UdDgQWBBTew4tn2tBCof44yM20soU6sfep6zAOBgNVHQ8BAf8EBAMCBaAwggEmBgNVHR8EggEdMIIBGTCCARWgggERoIIBDYY_aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JsMBcGA1UdIAQQMA4wDAYKKwYBBAGCN3sBATAfBgNVHSMEGDAWgBTxRmjG8cPwKy19i2rhsvm-NfzRQTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGBANOAsl8fyImo8IXVQ_ybox-BzCeFiAddg9Ojd61exGTea02-HjvZzuL6GZ2k21c7rEjKSBHqk50RLm2yXrMcUGc1UO7MRchaKQm1WR7osgDiXAU0rDc9-H-i8I245Y_PbyKIBewiK7UQiCjda4b__7Amrw7q4oILOsxshnN_D1NBm2nSjm-dFiDeJ9jpG9X1jDJSBtOFUQ7Ala8ShJvWPMpbCR3gFHOGS9f13ebv6qXblaf7sHxE6T0OpuEZPL10Iu5yh42IOLo8wvp1euqb61U3JWoOmBXEB3mJ0owRfBHEjuAARDUzNVgq28F6FYqgACE3nKhqDKYDEQstlJK0&s=UVWg8o-_sUsOAT0YRpTwK0BIwt5dlyt8a_DNX6Hsp-nNj33aBi8Jz9DLgDTywgjo7pfl9_f1wxdyfvZSoC_p_9wy8bxpKvwwZ-YworLHU3o5qDMo755sSnP2sJn5Ive1jij1GiiVdSzPrbWIB9n67-5qfT9JcYT7ayLdNMqU-8iophjZt8avX8NFGzA2HGC4ZYbzPSx-TPkcQArOKjwNYO0Ag9X7mF3UfBl6GUWCySzHQHIzLvOGjFjIXPJug3moQ0P93zd_9z9grhAQg5fFeOH7r02uIOSoK5dj9YI30ipJjX6qhEu1l7xyTA-j2hVLBC8DEKGQBGy4oELb_7ze0g&h=8n4fStJavEQZj41HCfexE9nYhSUmWiGG8HyyyukiQ18 + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638533924330026690&c=MIIHpTCCBo2gAwIBAgITfwM6vSxODJvqjFP4oQAEAzq9LDANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDIwHhcNMjQwNTE1MTI0NjQwWhcNMjUwNTEwMTI0NjQwWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKa4cOTKf-wVpLKiG5Zei1-Oc5u5PvibFdqWIGFZDLmSA3G2jYrx6dKQ8NH10xxzVOMT_dqQOb2nPmPDhnS3CUlhwx_iI9VSftq8J182Ci01SlOzoieOj_kBg-1yQ4TB3DD7Rwgy40TMWgK-1lkliuLAgSHruwrRW8Kj8Q96A0oGxy1RQggyCNWVG8EsUp1ngtGu-yi1BZRa4Q-v_x9KFfbvtOc9KIfKRFs2r2zg4MWc4xCzQCYrRXIVfS-sFxEn1GbDqtYc4-y5T978_4OnKXidZCkJqT4v1ZRcgxKZpH8d4GmacrEfBoCqjg9ZayboCoIPz5wEIF9LOngoqXqnmYECAwEAAaOCBJIwggSOMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHaBggrBgEFBQcBAQSCAcwwggHIMGYGCCsGAQUFBzAChlpodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMig0KS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3J0MFYGCCsGAQUFBzAChkpodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDAyKDQpLmNydDBWBggrBgEFBQcwAoZKaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMig0KS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3J0MB0GA1UdDgQWBBRCKTJWBui0JqrIiMW81zJdA9-tSDAOBgNVHQ8BAf8EBAMCBaAwggE1BgNVHR8EggEsMIIBKDCCASSgggEgoIIBHIZCaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JsMIGdBgNVHSAEgZUwgZIwDAYKKwYBBAGCN3sBATBmBgorBgEEAYI3ewICMFgwVgYIKwYBBQUHAgIwSh5IADMAMwBlADAAMQA5ADIAMQAtADQAZAA2ADQALQA0AGYAOABjAC0AYQAwADUANQAtADUAYgBkAGEAZgBmAGQANQBlADMAMwBkMAwGCisGAQQBgjd7AwEwDAYKKwYBBAGCN3sEATAfBgNVHSMEGDAWgBSuecJrXSWIEwb2BwnDl3x7l48dVTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGJpRHLgYBJ-Hg0664G6_TgQ8luNO24um3ktexLaPrnailsQdaNThyJ4w9TTpMvyG31DlS7euSnKy8IsfMzCDxu1mmgziF9Urf-OpUw3u-ze-9z_PmzXym0G-rk8OrPpWWdAeApaUIHmydJGO_yrSQURQDLY9ATNa4gS1c9rQLruie0ZkPwjhAJCwpdK615q7s9ssaQ_HZEXM9r3mojVMYMB6b7TQJcwlVHBvkRO5u4HnAI26O2e-pcDzgccXJ6mqM158VJM-AyU1D2gWCqHj4zml1U005Ot-Fx-C3N3HCVImLvAllBxeQdwzOTae6Br-eXo1NCFf1ahI2fP4G_nB7o&s=JyMQoOUCTVzpGHGPFR8JgkH-rd2ZS_C5SnnVkIRWRloSXCSxzbafBJlTdI-ScaIAOw9TR_0lmTFnEV_3Px2AoMTKgWrXC0Q9lFIFHFP70AzsW5dK7-RE2w63nW86WPgMD0y48d2wPnciP09nPAu6eF58Rf8e2NB6TDX8LIWKcDEtrbsuxGcZFGKh9yxchbXMaDpbxUACfXRhbw9L2xbeEB8Qyy0IuYeheYtN_LYQY_veI5en88wjgpCCwUrpLHnsVLdqAC1QECWhktP50cFNo0-BmrLLEoFHynj5rtKLA4tBpD1mu-1APMORN-IyCogXUZwzfJxUkh2gJ1QURbDSwQ&h=SoleZUEA0Ibhrjdyvdu8_XNICr78h18ufJ49EmhcCNE Pragma: - no-cache Retry-After: @@ -751,11 +847,11 @@ interactions: X-Content-Type-Options: - nosniff X-Msedge-Ref: - - 'Ref A: CFC033F3031644C7B41154D59BFC737A Ref B: SYD03EDGE1717 Ref C: 2024-04-04T23:13:04Z' + - 'Ref A: A464213C01F5447C83CD1AF02C720A98 Ref B: CO6AA3150220023 Ref C: 2024-06-07T21:27:12Z' status: 202 Accepted code: 202 - duration: 385.389292ms - - id: 14 + duration: 37.147186ms + - id: 16 request: proto: HTTP/1.1 proto_major: 1 @@ -770,8 +866,8 @@ interactions: form: {} headers: Test-Request-Attempt: - - "4" - url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638478691148302899&c=MIIHADCCBeigAwIBAgITHgPrWOVrMb7qufvgEAAAA-tY5TANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDYwHhcNMjQwMjAxMDQxMjQzWhcNMjUwMTI2MDQxMjQzWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOil3F8MsZdl8FeicToFLcoRyDn0Zv76EQTwG1IZtUh-z6uwzGIgy23k7GrXNU1gKVyGJp8lO3encPC02rUQkI0lvN-NUJCoJAEnGZPYOLmA9NylSyr1Ik_Qaz1_UueFRAiyVJlo0Lz27ayfzTTSUd82wyh18q-LWdG49N7fSD_fM1rsfxbY7-Eo4Z5CjxDW3OWmAYKpS0tm17o2hEKrmjeNZJQsSqQxUL-1Be4vND7XzGhGI595ogShOZHOzCBueWR2-8fa5VrwlHqtU1AgvjFk3lYmZejl898JrGFMYH-QSC1iWyRweQ_m3289K-aPeRSWqRihXIG9oHEqouTO1xkCAwEAAaOCA-0wggPpMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHLBggrBgEFBQcBAQSCAb0wggG5MGMGCCsGAQUFBzAChldodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MFMGCCsGAQUFBzAChkdodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAyLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA2LmNydDBTBggrBgEFBQcwAoZHaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MB0GA1UdDgQWBBTew4tn2tBCof44yM20soU6sfep6zAOBgNVHQ8BAf8EBAMCBaAwggEmBgNVHR8EggEdMIIBGTCCARWgggERoIIBDYY_aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JsMBcGA1UdIAQQMA4wDAYKKwYBBAGCN3sBATAfBgNVHSMEGDAWgBTxRmjG8cPwKy19i2rhsvm-NfzRQTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGBANOAsl8fyImo8IXVQ_ybox-BzCeFiAddg9Ojd61exGTea02-HjvZzuL6GZ2k21c7rEjKSBHqk50RLm2yXrMcUGc1UO7MRchaKQm1WR7osgDiXAU0rDc9-H-i8I245Y_PbyKIBewiK7UQiCjda4b__7Amrw7q4oILOsxshnN_D1NBm2nSjm-dFiDeJ9jpG9X1jDJSBtOFUQ7Ala8ShJvWPMpbCR3gFHOGS9f13ebv6qXblaf7sHxE6T0OpuEZPL10Iu5yh42IOLo8wvp1euqb61U3JWoOmBXEB3mJ0owRfBHEjuAARDUzNVgq28F6FYqgACE3nKhqDKYDEQstlJK0&s=vMtXRFKi6YZm-HqZk29QyJ7Jz0jJjvDILpSeWzTWx7V7-zAbBtbql5C6kI46weS9MmqhTGj4MD2tTgovqrXBXdT8_zjwudHkGh-KhCzGTlhmuROq6KQELH408aNhD_Yv5rK7I15lmDHzA3Ipau7oNCkAVF-ffjyOfWFT4X90xDMoZ8KiTVHzVDbMfwQfBGCiyuaaixJ9mT3vwQHmOOsuLC2hz63pMCRL-9nRfBvpEV-3U4nLa_92wiU2XBGKfUBkrCJ-KS24mMuFRrSOMbc5sL2H1IU7Ewuy0VkxIgCypUsf3bN8kqCyM_kC_PjALgKkoEmiDgAarz6oew3-OHTllQ&h=VHZdUsg6CC7aqHcip3ERyPFdQwr6eB_456GhuAzI0bg + - "2" + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638533924027418988&c=MIIHpTCCBo2gAwIBAgITfwM6vSxODJvqjFP4oQAEAzq9LDANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDIwHhcNMjQwNTE1MTI0NjQwWhcNMjUwNTEwMTI0NjQwWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKa4cOTKf-wVpLKiG5Zei1-Oc5u5PvibFdqWIGFZDLmSA3G2jYrx6dKQ8NH10xxzVOMT_dqQOb2nPmPDhnS3CUlhwx_iI9VSftq8J182Ci01SlOzoieOj_kBg-1yQ4TB3DD7Rwgy40TMWgK-1lkliuLAgSHruwrRW8Kj8Q96A0oGxy1RQggyCNWVG8EsUp1ngtGu-yi1BZRa4Q-v_x9KFfbvtOc9KIfKRFs2r2zg4MWc4xCzQCYrRXIVfS-sFxEn1GbDqtYc4-y5T978_4OnKXidZCkJqT4v1ZRcgxKZpH8d4GmacrEfBoCqjg9ZayboCoIPz5wEIF9LOngoqXqnmYECAwEAAaOCBJIwggSOMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHaBggrBgEFBQcBAQSCAcwwggHIMGYGCCsGAQUFBzAChlpodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMig0KS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3J0MFYGCCsGAQUFBzAChkpodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDAyKDQpLmNydDBWBggrBgEFBQcwAoZKaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMig0KS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3J0MB0GA1UdDgQWBBRCKTJWBui0JqrIiMW81zJdA9-tSDAOBgNVHQ8BAf8EBAMCBaAwggE1BgNVHR8EggEsMIIBKDCCASSgggEgoIIBHIZCaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JsMIGdBgNVHSAEgZUwgZIwDAYKKwYBBAGCN3sBATBmBgorBgEEAYI3ewICMFgwVgYIKwYBBQUHAgIwSh5IADMAMwBlADAAMQA5ADIAMQAtADQAZAA2ADQALQA0AGYAOABjAC0AYQAwADUANQAtADUAYgBkAGEAZgBmAGQANQBlADMAMwBkMAwGCisGAQQBgjd7AwEwDAYKKwYBBAGCN3sEATAfBgNVHSMEGDAWgBSuecJrXSWIEwb2BwnDl3x7l48dVTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGJpRHLgYBJ-Hg0664G6_TgQ8luNO24um3ktexLaPrnailsQdaNThyJ4w9TTpMvyG31DlS7euSnKy8IsfMzCDxu1mmgziF9Urf-OpUw3u-ze-9z_PmzXym0G-rk8OrPpWWdAeApaUIHmydJGO_yrSQURQDLY9ATNa4gS1c9rQLruie0ZkPwjhAJCwpdK615q7s9ssaQ_HZEXM9r3mojVMYMB6b7TQJcwlVHBvkRO5u4HnAI26O2e-pcDzgccXJ6mqM158VJM-AyU1D2gWCqHj4zml1U005Ot-Fx-C3N3HCVImLvAllBxeQdwzOTae6Br-eXo1NCFf1ahI2fP4G_nB7o&s=aj_ZSLN0Ie3J1s218jN6TjxnE_dB5XvVnZ7vB5u50EdL5arZMY3KzioVMhUkNsLSbPt0B8qkqKN490syUWsyAMvuSG4GEGJ-MiqwgzIFDNM59m3P7EeIRFl3DXl__6EQr72eU3iLfe1PPyYLaDpt3ruMYjiA1-CfJr0tQQTQmo7n4AvdezLf3HG7H13IFVCge6sXpKR5vC7Gr7Ftyf7UkDmUFfCVrhid_lCN7ei80izTIQE6XPpACJQZ0BkcS51NHKelNtIeiJXn1JGzpdjg8EVn-0ekWEpQyxMCIQf2nDPUtLBHiacpqvFdEKp8J4gux9lAI49rIlVHAQbmmxaKKQ&h=Dnt3ZhrdgNqnrmInk4f-DTw-F1L73JUEMvhd-miFHEU method: GET response: proto: HTTP/2.0 @@ -790,7 +886,7 @@ interactions: Expires: - "-1" Location: - - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638478692006576210&c=MIIHADCCBeigAwIBAgITHgPrWOVrMb7qufvgEAAAA-tY5TANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDYwHhcNMjQwMjAxMDQxMjQzWhcNMjUwMTI2MDQxMjQzWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOil3F8MsZdl8FeicToFLcoRyDn0Zv76EQTwG1IZtUh-z6uwzGIgy23k7GrXNU1gKVyGJp8lO3encPC02rUQkI0lvN-NUJCoJAEnGZPYOLmA9NylSyr1Ik_Qaz1_UueFRAiyVJlo0Lz27ayfzTTSUd82wyh18q-LWdG49N7fSD_fM1rsfxbY7-Eo4Z5CjxDW3OWmAYKpS0tm17o2hEKrmjeNZJQsSqQxUL-1Be4vND7XzGhGI595ogShOZHOzCBueWR2-8fa5VrwlHqtU1AgvjFk3lYmZejl898JrGFMYH-QSC1iWyRweQ_m3289K-aPeRSWqRihXIG9oHEqouTO1xkCAwEAAaOCA-0wggPpMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHLBggrBgEFBQcBAQSCAb0wggG5MGMGCCsGAQUFBzAChldodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MFMGCCsGAQUFBzAChkdodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAyLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA2LmNydDBTBggrBgEFBQcwAoZHaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MB0GA1UdDgQWBBTew4tn2tBCof44yM20soU6sfep6zAOBgNVHQ8BAf8EBAMCBaAwggEmBgNVHR8EggEdMIIBGTCCARWgggERoIIBDYY_aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JsMBcGA1UdIAQQMA4wDAYKKwYBBAGCN3sBATAfBgNVHSMEGDAWgBTxRmjG8cPwKy19i2rhsvm-NfzRQTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGBANOAsl8fyImo8IXVQ_ybox-BzCeFiAddg9Ojd61exGTea02-HjvZzuL6GZ2k21c7rEjKSBHqk50RLm2yXrMcUGc1UO7MRchaKQm1WR7osgDiXAU0rDc9-H-i8I245Y_PbyKIBewiK7UQiCjda4b__7Amrw7q4oILOsxshnN_D1NBm2nSjm-dFiDeJ9jpG9X1jDJSBtOFUQ7Ala8ShJvWPMpbCR3gFHOGS9f13ebv6qXblaf7sHxE6T0OpuEZPL10Iu5yh42IOLo8wvp1euqb61U3JWoOmBXEB3mJ0owRfBHEjuAARDUzNVgq28F6FYqgACE3nKhqDKYDEQstlJK0&s=CUe-p7_-FSLee3JLUeZjsf4IyJadTTWLqWvCGgtsFapqBv2Cpdo_mIbJuJMCRwwazdZ13dt6tbxlwYctFXPkcanOkWHdVB-MSGDDUs22dC5aG5Hs-CSM-5HYWokpgvf2CnQFhwVH_iJyJD7JMJrc33U8MLoP_H6djeYerfTRMJ5ZcftY52ZT_bnCk6VwiMbavsNCF1OVb42GRMmhEMD2yiDOmTh-eRn5xJZxCmW6kuxuZmyuKo8-rmPI3pmOcjkH24hrRlqkiJRPIpJoOZR_8BrvcshekMWjgLk5s9reDISgtsRzM8upXB5e8RJk13dgf7fu4czznlfG_LtXjg5wDQ&h=S1lNrCTfWw3Xyp1Wd1kHLT8mhX3dZipe3jN2IU5unxc + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638533924480910846&c=MIIHpTCCBo2gAwIBAgITfwM6vSxODJvqjFP4oQAEAzq9LDANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDIwHhcNMjQwNTE1MTI0NjQwWhcNMjUwNTEwMTI0NjQwWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKa4cOTKf-wVpLKiG5Zei1-Oc5u5PvibFdqWIGFZDLmSA3G2jYrx6dKQ8NH10xxzVOMT_dqQOb2nPmPDhnS3CUlhwx_iI9VSftq8J182Ci01SlOzoieOj_kBg-1yQ4TB3DD7Rwgy40TMWgK-1lkliuLAgSHruwrRW8Kj8Q96A0oGxy1RQggyCNWVG8EsUp1ngtGu-yi1BZRa4Q-v_x9KFfbvtOc9KIfKRFs2r2zg4MWc4xCzQCYrRXIVfS-sFxEn1GbDqtYc4-y5T978_4OnKXidZCkJqT4v1ZRcgxKZpH8d4GmacrEfBoCqjg9ZayboCoIPz5wEIF9LOngoqXqnmYECAwEAAaOCBJIwggSOMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHaBggrBgEFBQcBAQSCAcwwggHIMGYGCCsGAQUFBzAChlpodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMig0KS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3J0MFYGCCsGAQUFBzAChkpodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDAyKDQpLmNydDBWBggrBgEFBQcwAoZKaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMig0KS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3J0MB0GA1UdDgQWBBRCKTJWBui0JqrIiMW81zJdA9-tSDAOBgNVHQ8BAf8EBAMCBaAwggE1BgNVHR8EggEsMIIBKDCCASSgggEgoIIBHIZCaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JsMIGdBgNVHSAEgZUwgZIwDAYKKwYBBAGCN3sBATBmBgorBgEEAYI3ewICMFgwVgYIKwYBBQUHAgIwSh5IADMAMwBlADAAMQA5ADIAMQAtADQAZAA2ADQALQA0AGYAOABjAC0AYQAwADUANQAtADUAYgBkAGEAZgBmAGQANQBlADMAMwBkMAwGCisGAQQBgjd7AwEwDAYKKwYBBAGCN3sEATAfBgNVHSMEGDAWgBSuecJrXSWIEwb2BwnDl3x7l48dVTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGJpRHLgYBJ-Hg0664G6_TgQ8luNO24um3ktexLaPrnailsQdaNThyJ4w9TTpMvyG31DlS7euSnKy8IsfMzCDxu1mmgziF9Urf-OpUw3u-ze-9z_PmzXym0G-rk8OrPpWWdAeApaUIHmydJGO_yrSQURQDLY9ATNa4gS1c9rQLruie0ZkPwjhAJCwpdK615q7s9ssaQ_HZEXM9r3mojVMYMB6b7TQJcwlVHBvkRO5u4HnAI26O2e-pcDzgccXJ6mqM158VJM-AyU1D2gWCqHj4zml1U005Ot-Fx-C3N3HCVImLvAllBxeQdwzOTae6Br-eXo1NCFf1ahI2fP4G_nB7o&s=HunCoQnhqTGGmyivRw6_3ATxPwsXHCX4ZScDSew8Zmgs9AlaqOpVcIRAZIKbbTGkMLqX2i7fWjsJ2DFtpvexaVsgZsPWn9UdakeL5sv3mqS6I_fORsIUTu7fV9Ps5KphYO3CNJIKf6bktxhY8GYgRS-YBazLMoE48Z_rbxIyfpkYgDVKvDXHMnJWnvcD59l39VxNGkwXfOWLE6p-pcK4I-RI2h-JDGxA36w8gF8m1lVmGLL2i1qXmnSAgqU3Pv6vRIuE5knq0RsqljZq7hEp-asprUyZnQ4DNgVT3ospdi-C58GSBG2-tMADjySTDBY7bRHj_26212Yciyq4_bt4nQ&h=0F5uEy0xNkjCo8p7W8hZljMjt-bQquAj2paHzpLdZGA Pragma: - no-cache Retry-After: @@ -802,11 +898,11 @@ interactions: X-Content-Type-Options: - nosniff X-Msedge-Ref: - - 'Ref A: F744B9B5BB2C43EABC249D8AB4D1B505 Ref B: SYD03EDGE1717 Ref C: 2024-04-04T23:13:20Z' + - 'Ref A: 14A9D80CC5B74026B0737425565669F8 Ref B: CO6AA3150220023 Ref C: 2024-06-07T21:27:28Z' status: 202 Accepted code: 202 - duration: 386.940583ms - - id: 15 + duration: 43.966122ms + - id: 17 request: proto: HTTP/1.1 proto_major: 1 @@ -821,8 +917,8 @@ interactions: form: {} headers: Test-Request-Attempt: - - "5" - url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638478691148302899&c=MIIHADCCBeigAwIBAgITHgPrWOVrMb7qufvgEAAAA-tY5TANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDYwHhcNMjQwMjAxMDQxMjQzWhcNMjUwMTI2MDQxMjQzWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOil3F8MsZdl8FeicToFLcoRyDn0Zv76EQTwG1IZtUh-z6uwzGIgy23k7GrXNU1gKVyGJp8lO3encPC02rUQkI0lvN-NUJCoJAEnGZPYOLmA9NylSyr1Ik_Qaz1_UueFRAiyVJlo0Lz27ayfzTTSUd82wyh18q-LWdG49N7fSD_fM1rsfxbY7-Eo4Z5CjxDW3OWmAYKpS0tm17o2hEKrmjeNZJQsSqQxUL-1Be4vND7XzGhGI595ogShOZHOzCBueWR2-8fa5VrwlHqtU1AgvjFk3lYmZejl898JrGFMYH-QSC1iWyRweQ_m3289K-aPeRSWqRihXIG9oHEqouTO1xkCAwEAAaOCA-0wggPpMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHLBggrBgEFBQcBAQSCAb0wggG5MGMGCCsGAQUFBzAChldodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MFMGCCsGAQUFBzAChkdodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAyLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA2LmNydDBTBggrBgEFBQcwAoZHaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MB0GA1UdDgQWBBTew4tn2tBCof44yM20soU6sfep6zAOBgNVHQ8BAf8EBAMCBaAwggEmBgNVHR8EggEdMIIBGTCCARWgggERoIIBDYY_aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JsMBcGA1UdIAQQMA4wDAYKKwYBBAGCN3sBATAfBgNVHSMEGDAWgBTxRmjG8cPwKy19i2rhsvm-NfzRQTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGBANOAsl8fyImo8IXVQ_ybox-BzCeFiAddg9Ojd61exGTea02-HjvZzuL6GZ2k21c7rEjKSBHqk50RLm2yXrMcUGc1UO7MRchaKQm1WR7osgDiXAU0rDc9-H-i8I245Y_PbyKIBewiK7UQiCjda4b__7Amrw7q4oILOsxshnN_D1NBm2nSjm-dFiDeJ9jpG9X1jDJSBtOFUQ7Ala8ShJvWPMpbCR3gFHOGS9f13ebv6qXblaf7sHxE6T0OpuEZPL10Iu5yh42IOLo8wvp1euqb61U3JWoOmBXEB3mJ0owRfBHEjuAARDUzNVgq28F6FYqgACE3nKhqDKYDEQstlJK0&s=vMtXRFKi6YZm-HqZk29QyJ7Jz0jJjvDILpSeWzTWx7V7-zAbBtbql5C6kI46weS9MmqhTGj4MD2tTgovqrXBXdT8_zjwudHkGh-KhCzGTlhmuROq6KQELH408aNhD_Yv5rK7I15lmDHzA3Ipau7oNCkAVF-ffjyOfWFT4X90xDMoZ8KiTVHzVDbMfwQfBGCiyuaaixJ9mT3vwQHmOOsuLC2hz63pMCRL-9nRfBvpEV-3U4nLa_92wiU2XBGKfUBkrCJ-KS24mMuFRrSOMbc5sL2H1IU7Ewuy0VkxIgCypUsf3bN8kqCyM_kC_PjALgKkoEmiDgAarz6oew3-OHTllQ&h=VHZdUsg6CC7aqHcip3ERyPFdQwr6eB_456GhuAzI0bg + - "3" + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638533924027418988&c=MIIHpTCCBo2gAwIBAgITfwM6vSxODJvqjFP4oQAEAzq9LDANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDIwHhcNMjQwNTE1MTI0NjQwWhcNMjUwNTEwMTI0NjQwWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKa4cOTKf-wVpLKiG5Zei1-Oc5u5PvibFdqWIGFZDLmSA3G2jYrx6dKQ8NH10xxzVOMT_dqQOb2nPmPDhnS3CUlhwx_iI9VSftq8J182Ci01SlOzoieOj_kBg-1yQ4TB3DD7Rwgy40TMWgK-1lkliuLAgSHruwrRW8Kj8Q96A0oGxy1RQggyCNWVG8EsUp1ngtGu-yi1BZRa4Q-v_x9KFfbvtOc9KIfKRFs2r2zg4MWc4xCzQCYrRXIVfS-sFxEn1GbDqtYc4-y5T978_4OnKXidZCkJqT4v1ZRcgxKZpH8d4GmacrEfBoCqjg9ZayboCoIPz5wEIF9LOngoqXqnmYECAwEAAaOCBJIwggSOMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHaBggrBgEFBQcBAQSCAcwwggHIMGYGCCsGAQUFBzAChlpodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMig0KS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3J0MFYGCCsGAQUFBzAChkpodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDAyKDQpLmNydDBWBggrBgEFBQcwAoZKaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMig0KS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3J0MB0GA1UdDgQWBBRCKTJWBui0JqrIiMW81zJdA9-tSDAOBgNVHQ8BAf8EBAMCBaAwggE1BgNVHR8EggEsMIIBKDCCASSgggEgoIIBHIZCaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JsMIGdBgNVHSAEgZUwgZIwDAYKKwYBBAGCN3sBATBmBgorBgEEAYI3ewICMFgwVgYIKwYBBQUHAgIwSh5IADMAMwBlADAAMQA5ADIAMQAtADQAZAA2ADQALQA0AGYAOABjAC0AYQAwADUANQAtADUAYgBkAGEAZgBmAGQANQBlADMAMwBkMAwGCisGAQQBgjd7AwEwDAYKKwYBBAGCN3sEATAfBgNVHSMEGDAWgBSuecJrXSWIEwb2BwnDl3x7l48dVTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGJpRHLgYBJ-Hg0664G6_TgQ8luNO24um3ktexLaPrnailsQdaNThyJ4w9TTpMvyG31DlS7euSnKy8IsfMzCDxu1mmgziF9Urf-OpUw3u-ze-9z_PmzXym0G-rk8OrPpWWdAeApaUIHmydJGO_yrSQURQDLY9ATNa4gS1c9rQLruie0ZkPwjhAJCwpdK615q7s9ssaQ_HZEXM9r3mojVMYMB6b7TQJcwlVHBvkRO5u4HnAI26O2e-pcDzgccXJ6mqM158VJM-AyU1D2gWCqHj4zml1U005Ot-Fx-C3N3HCVImLvAllBxeQdwzOTae6Br-eXo1NCFf1ahI2fP4G_nB7o&s=aj_ZSLN0Ie3J1s218jN6TjxnE_dB5XvVnZ7vB5u50EdL5arZMY3KzioVMhUkNsLSbPt0B8qkqKN490syUWsyAMvuSG4GEGJ-MiqwgzIFDNM59m3P7EeIRFl3DXl__6EQr72eU3iLfe1PPyYLaDpt3ruMYjiA1-CfJr0tQQTQmo7n4AvdezLf3HG7H13IFVCge6sXpKR5vC7Gr7Ftyf7UkDmUFfCVrhid_lCN7ei80izTIQE6XPpACJQZ0BkcS51NHKelNtIeiJXn1JGzpdjg8EVn-0ekWEpQyxMCIQf2nDPUtLBHiacpqvFdEKp8J4gux9lAI49rIlVHAQbmmxaKKQ&h=Dnt3ZhrdgNqnrmInk4f-DTw-F1L73JUEMvhd-miFHEU method: GET response: proto: HTTP/2.0 @@ -841,7 +937,7 @@ interactions: Expires: - "-1" Location: - - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638478692168263015&c=MIIHADCCBeigAwIBAgITHgPrWOVrMb7qufvgEAAAA-tY5TANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDYwHhcNMjQwMjAxMDQxMjQzWhcNMjUwMTI2MDQxMjQzWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOil3F8MsZdl8FeicToFLcoRyDn0Zv76EQTwG1IZtUh-z6uwzGIgy23k7GrXNU1gKVyGJp8lO3encPC02rUQkI0lvN-NUJCoJAEnGZPYOLmA9NylSyr1Ik_Qaz1_UueFRAiyVJlo0Lz27ayfzTTSUd82wyh18q-LWdG49N7fSD_fM1rsfxbY7-Eo4Z5CjxDW3OWmAYKpS0tm17o2hEKrmjeNZJQsSqQxUL-1Be4vND7XzGhGI595ogShOZHOzCBueWR2-8fa5VrwlHqtU1AgvjFk3lYmZejl898JrGFMYH-QSC1iWyRweQ_m3289K-aPeRSWqRihXIG9oHEqouTO1xkCAwEAAaOCA-0wggPpMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHLBggrBgEFBQcBAQSCAb0wggG5MGMGCCsGAQUFBzAChldodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MFMGCCsGAQUFBzAChkdodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAyLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA2LmNydDBTBggrBgEFBQcwAoZHaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MB0GA1UdDgQWBBTew4tn2tBCof44yM20soU6sfep6zAOBgNVHQ8BAf8EBAMCBaAwggEmBgNVHR8EggEdMIIBGTCCARWgggERoIIBDYY_aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JsMBcGA1UdIAQQMA4wDAYKKwYBBAGCN3sBATAfBgNVHSMEGDAWgBTxRmjG8cPwKy19i2rhsvm-NfzRQTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGBANOAsl8fyImo8IXVQ_ybox-BzCeFiAddg9Ojd61exGTea02-HjvZzuL6GZ2k21c7rEjKSBHqk50RLm2yXrMcUGc1UO7MRchaKQm1WR7osgDiXAU0rDc9-H-i8I245Y_PbyKIBewiK7UQiCjda4b__7Amrw7q4oILOsxshnN_D1NBm2nSjm-dFiDeJ9jpG9X1jDJSBtOFUQ7Ala8ShJvWPMpbCR3gFHOGS9f13ebv6qXblaf7sHxE6T0OpuEZPL10Iu5yh42IOLo8wvp1euqb61U3JWoOmBXEB3mJ0owRfBHEjuAARDUzNVgq28F6FYqgACE3nKhqDKYDEQstlJK0&s=5iOJAF2ehwyoU3o-Voy31SE7Aj-dNYwLtEUZbF99R_-W3euz4vS979PL4Pzm-d6ahbLPNf7opOAHaPbVps-uVlmbuyjdhzd3dIg2ScfqHIrIiJPidPEaiho8KztbtgaxrzxDZTYWp3n86TCUf6c10ovZv47vM6b_FXA6TrhI-xUZj3tWhQ8_EJKFVomUBRG1YvqwgQrSXAyL_4W-8MSaVBzMJbDrb8AvjyLCWi8zP5qrCfTVH5CapAj7enBMAN8K6ZvvBEzBoMyKoGRwxqjCJTuuWFKy5uiJsNHpbHGQfifea6Hm5jlM93eego6JZzmXYOQeOq_67fMQw3Cq0xZ8cA&h=EsWx2EgTru0rrR1r2eDZJGfAgq3vt1XFMk9d_6Z1iPc + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638533924631992496&c=MIIHpTCCBo2gAwIBAgITfwM6vSxODJvqjFP4oQAEAzq9LDANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDIwHhcNMjQwNTE1MTI0NjQwWhcNMjUwNTEwMTI0NjQwWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKa4cOTKf-wVpLKiG5Zei1-Oc5u5PvibFdqWIGFZDLmSA3G2jYrx6dKQ8NH10xxzVOMT_dqQOb2nPmPDhnS3CUlhwx_iI9VSftq8J182Ci01SlOzoieOj_kBg-1yQ4TB3DD7Rwgy40TMWgK-1lkliuLAgSHruwrRW8Kj8Q96A0oGxy1RQggyCNWVG8EsUp1ngtGu-yi1BZRa4Q-v_x9KFfbvtOc9KIfKRFs2r2zg4MWc4xCzQCYrRXIVfS-sFxEn1GbDqtYc4-y5T978_4OnKXidZCkJqT4v1ZRcgxKZpH8d4GmacrEfBoCqjg9ZayboCoIPz5wEIF9LOngoqXqnmYECAwEAAaOCBJIwggSOMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHaBggrBgEFBQcBAQSCAcwwggHIMGYGCCsGAQUFBzAChlpodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMig0KS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3J0MFYGCCsGAQUFBzAChkpodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDAyKDQpLmNydDBWBggrBgEFBQcwAoZKaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMig0KS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3J0MB0GA1UdDgQWBBRCKTJWBui0JqrIiMW81zJdA9-tSDAOBgNVHQ8BAf8EBAMCBaAwggE1BgNVHR8EggEsMIIBKDCCASSgggEgoIIBHIZCaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JsMIGdBgNVHSAEgZUwgZIwDAYKKwYBBAGCN3sBATBmBgorBgEEAYI3ewICMFgwVgYIKwYBBQUHAgIwSh5IADMAMwBlADAAMQA5ADIAMQAtADQAZAA2ADQALQA0AGYAOABjAC0AYQAwADUANQAtADUAYgBkAGEAZgBmAGQANQBlADMAMwBkMAwGCisGAQQBgjd7AwEwDAYKKwYBBAGCN3sEATAfBgNVHSMEGDAWgBSuecJrXSWIEwb2BwnDl3x7l48dVTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGJpRHLgYBJ-Hg0664G6_TgQ8luNO24um3ktexLaPrnailsQdaNThyJ4w9TTpMvyG31DlS7euSnKy8IsfMzCDxu1mmgziF9Urf-OpUw3u-ze-9z_PmzXym0G-rk8OrPpWWdAeApaUIHmydJGO_yrSQURQDLY9ATNa4gS1c9rQLruie0ZkPwjhAJCwpdK615q7s9ssaQ_HZEXM9r3mojVMYMB6b7TQJcwlVHBvkRO5u4HnAI26O2e-pcDzgccXJ6mqM158VJM-AyU1D2gWCqHj4zml1U005Ot-Fx-C3N3HCVImLvAllBxeQdwzOTae6Br-eXo1NCFf1ahI2fP4G_nB7o&s=Pj9Y-a50FhDZ7DnCmzvCkiJzS2A-UlXfxl7hDIGdEPItdloZbbds1SWf7auxmmHseCuFu8a0Hv8fs72nNRpIAU02-WZLY3OfeWcHMHHlryxNDIOfw3KK00NtNdAGRhRmSUgdSND6yCsJrrY_c5fICjWZNmuU7J2cB3RGt4rHWsOJVRG6mJ37E7lT3p3rEDGGcpecBmMk-753_j1jJo-YZRvnCatd7xAzot_t29-sF36CStTByjyAsYwJZG457WyprQuukZczBtG3YGLDqrCybQCPk4DVQj71_EuWVAd0cwOAWhqyxeyXbbTBNNOo-tsF05NacXETrfc1GgaDtbWumw&h=5YQCwvp1o07vZdWGOgNQKSknWAKhfyoRwYL7d458fx4 Pragma: - no-cache Retry-After: @@ -853,11 +949,11 @@ interactions: X-Content-Type-Options: - nosniff X-Msedge-Ref: - - 'Ref A: C15FE8E2812148B19771CA39165F57FB Ref B: SYD03EDGE1717 Ref C: 2024-04-04T23:13:36Z' + - 'Ref A: 099B8E8B437647CBAF089465411DB4C4 Ref B: CO6AA3150220023 Ref C: 2024-06-07T21:27:43Z' status: 202 Accepted code: 202 - duration: 765.682709ms - - id: 16 + duration: 54.202275ms + - id: 18 request: proto: HTTP/1.1 proto_major: 1 @@ -872,8 +968,8 @@ interactions: form: {} headers: Test-Request-Attempt: - - "6" - url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638478691148302899&c=MIIHADCCBeigAwIBAgITHgPrWOVrMb7qufvgEAAAA-tY5TANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDYwHhcNMjQwMjAxMDQxMjQzWhcNMjUwMTI2MDQxMjQzWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOil3F8MsZdl8FeicToFLcoRyDn0Zv76EQTwG1IZtUh-z6uwzGIgy23k7GrXNU1gKVyGJp8lO3encPC02rUQkI0lvN-NUJCoJAEnGZPYOLmA9NylSyr1Ik_Qaz1_UueFRAiyVJlo0Lz27ayfzTTSUd82wyh18q-LWdG49N7fSD_fM1rsfxbY7-Eo4Z5CjxDW3OWmAYKpS0tm17o2hEKrmjeNZJQsSqQxUL-1Be4vND7XzGhGI595ogShOZHOzCBueWR2-8fa5VrwlHqtU1AgvjFk3lYmZejl898JrGFMYH-QSC1iWyRweQ_m3289K-aPeRSWqRihXIG9oHEqouTO1xkCAwEAAaOCA-0wggPpMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHLBggrBgEFBQcBAQSCAb0wggG5MGMGCCsGAQUFBzAChldodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MFMGCCsGAQUFBzAChkdodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAyLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA2LmNydDBTBggrBgEFBQcwAoZHaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MB0GA1UdDgQWBBTew4tn2tBCof44yM20soU6sfep6zAOBgNVHQ8BAf8EBAMCBaAwggEmBgNVHR8EggEdMIIBGTCCARWgggERoIIBDYY_aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JsMBcGA1UdIAQQMA4wDAYKKwYBBAGCN3sBATAfBgNVHSMEGDAWgBTxRmjG8cPwKy19i2rhsvm-NfzRQTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGBANOAsl8fyImo8IXVQ_ybox-BzCeFiAddg9Ojd61exGTea02-HjvZzuL6GZ2k21c7rEjKSBHqk50RLm2yXrMcUGc1UO7MRchaKQm1WR7osgDiXAU0rDc9-H-i8I245Y_PbyKIBewiK7UQiCjda4b__7Amrw7q4oILOsxshnN_D1NBm2nSjm-dFiDeJ9jpG9X1jDJSBtOFUQ7Ala8ShJvWPMpbCR3gFHOGS9f13ebv6qXblaf7sHxE6T0OpuEZPL10Iu5yh42IOLo8wvp1euqb61U3JWoOmBXEB3mJ0owRfBHEjuAARDUzNVgq28F6FYqgACE3nKhqDKYDEQstlJK0&s=vMtXRFKi6YZm-HqZk29QyJ7Jz0jJjvDILpSeWzTWx7V7-zAbBtbql5C6kI46weS9MmqhTGj4MD2tTgovqrXBXdT8_zjwudHkGh-KhCzGTlhmuROq6KQELH408aNhD_Yv5rK7I15lmDHzA3Ipau7oNCkAVF-ffjyOfWFT4X90xDMoZ8KiTVHzVDbMfwQfBGCiyuaaixJ9mT3vwQHmOOsuLC2hz63pMCRL-9nRfBvpEV-3U4nLa_92wiU2XBGKfUBkrCJ-KS24mMuFRrSOMbc5sL2H1IU7Ewuy0VkxIgCypUsf3bN8kqCyM_kC_PjALgKkoEmiDgAarz6oew3-OHTllQ&h=VHZdUsg6CC7aqHcip3ERyPFdQwr6eB_456GhuAzI0bg + - "4" + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638533924027418988&c=MIIHpTCCBo2gAwIBAgITfwM6vSxODJvqjFP4oQAEAzq9LDANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDIwHhcNMjQwNTE1MTI0NjQwWhcNMjUwNTEwMTI0NjQwWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKa4cOTKf-wVpLKiG5Zei1-Oc5u5PvibFdqWIGFZDLmSA3G2jYrx6dKQ8NH10xxzVOMT_dqQOb2nPmPDhnS3CUlhwx_iI9VSftq8J182Ci01SlOzoieOj_kBg-1yQ4TB3DD7Rwgy40TMWgK-1lkliuLAgSHruwrRW8Kj8Q96A0oGxy1RQggyCNWVG8EsUp1ngtGu-yi1BZRa4Q-v_x9KFfbvtOc9KIfKRFs2r2zg4MWc4xCzQCYrRXIVfS-sFxEn1GbDqtYc4-y5T978_4OnKXidZCkJqT4v1ZRcgxKZpH8d4GmacrEfBoCqjg9ZayboCoIPz5wEIF9LOngoqXqnmYECAwEAAaOCBJIwggSOMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHaBggrBgEFBQcBAQSCAcwwggHIMGYGCCsGAQUFBzAChlpodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMig0KS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3J0MFYGCCsGAQUFBzAChkpodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDAyKDQpLmNydDBWBggrBgEFBQcwAoZKaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMig0KS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3J0MB0GA1UdDgQWBBRCKTJWBui0JqrIiMW81zJdA9-tSDAOBgNVHQ8BAf8EBAMCBaAwggE1BgNVHR8EggEsMIIBKDCCASSgggEgoIIBHIZCaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JshjRodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDIoNCkuY3JsMIGdBgNVHSAEgZUwgZIwDAYKKwYBBAGCN3sBATBmBgorBgEEAYI3ewICMFgwVgYIKwYBBQUHAgIwSh5IADMAMwBlADAAMQA5ADIAMQAtADQAZAA2ADQALQA0AGYAOABjAC0AYQAwADUANQAtADUAYgBkAGEAZgBmAGQANQBlADMAMwBkMAwGCisGAQQBgjd7AwEwDAYKKwYBBAGCN3sEATAfBgNVHSMEGDAWgBSuecJrXSWIEwb2BwnDl3x7l48dVTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGJpRHLgYBJ-Hg0664G6_TgQ8luNO24um3ktexLaPrnailsQdaNThyJ4w9TTpMvyG31DlS7euSnKy8IsfMzCDxu1mmgziF9Urf-OpUw3u-ze-9z_PmzXym0G-rk8OrPpWWdAeApaUIHmydJGO_yrSQURQDLY9ATNa4gS1c9rQLruie0ZkPwjhAJCwpdK615q7s9ssaQ_HZEXM9r3mojVMYMB6b7TQJcwlVHBvkRO5u4HnAI26O2e-pcDzgccXJ6mqM158VJM-AyU1D2gWCqHj4zml1U005Ot-Fx-C3N3HCVImLvAllBxeQdwzOTae6Br-eXo1NCFf1ahI2fP4G_nB7o&s=aj_ZSLN0Ie3J1s218jN6TjxnE_dB5XvVnZ7vB5u50EdL5arZMY3KzioVMhUkNsLSbPt0B8qkqKN490syUWsyAMvuSG4GEGJ-MiqwgzIFDNM59m3P7EeIRFl3DXl__6EQr72eU3iLfe1PPyYLaDpt3ruMYjiA1-CfJr0tQQTQmo7n4AvdezLf3HG7H13IFVCge6sXpKR5vC7Gr7Ftyf7UkDmUFfCVrhid_lCN7ei80izTIQE6XPpACJQZ0BkcS51NHKelNtIeiJXn1JGzpdjg8EVn-0ekWEpQyxMCIQf2nDPUtLBHiacpqvFdEKp8J4gux9lAI49rIlVHAQbmmxaKKQ&h=Dnt3ZhrdgNqnrmInk4f-DTw-F1L73JUEMvhd-miFHEU method: GET response: proto: HTTP/2.0 @@ -891,12 +987,8 @@ interactions: - "0" Expires: - "-1" - Location: - - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638478692333319765&c=MIIHADCCBeigAwIBAgITHgPrWOVrMb7qufvgEAAAA-tY5TANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDYwHhcNMjQwMjAxMDQxMjQzWhcNMjUwMTI2MDQxMjQzWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOil3F8MsZdl8FeicToFLcoRyDn0Zv76EQTwG1IZtUh-z6uwzGIgy23k7GrXNU1gKVyGJp8lO3encPC02rUQkI0lvN-NUJCoJAEnGZPYOLmA9NylSyr1Ik_Qaz1_UueFRAiyVJlo0Lz27ayfzTTSUd82wyh18q-LWdG49N7fSD_fM1rsfxbY7-Eo4Z5CjxDW3OWmAYKpS0tm17o2hEKrmjeNZJQsSqQxUL-1Be4vND7XzGhGI595ogShOZHOzCBueWR2-8fa5VrwlHqtU1AgvjFk3lYmZejl898JrGFMYH-QSC1iWyRweQ_m3289K-aPeRSWqRihXIG9oHEqouTO1xkCAwEAAaOCA-0wggPpMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHLBggrBgEFBQcBAQSCAb0wggG5MGMGCCsGAQUFBzAChldodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MFMGCCsGAQUFBzAChkdodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAyLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA2LmNydDBTBggrBgEFBQcwAoZHaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MB0GA1UdDgQWBBTew4tn2tBCof44yM20soU6sfep6zAOBgNVHQ8BAf8EBAMCBaAwggEmBgNVHR8EggEdMIIBGTCCARWgggERoIIBDYY_aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JsMBcGA1UdIAQQMA4wDAYKKwYBBAGCN3sBATAfBgNVHSMEGDAWgBTxRmjG8cPwKy19i2rhsvm-NfzRQTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGBANOAsl8fyImo8IXVQ_ybox-BzCeFiAddg9Ojd61exGTea02-HjvZzuL6GZ2k21c7rEjKSBHqk50RLm2yXrMcUGc1UO7MRchaKQm1WR7osgDiXAU0rDc9-H-i8I245Y_PbyKIBewiK7UQiCjda4b__7Amrw7q4oILOsxshnN_D1NBm2nSjm-dFiDeJ9jpG9X1jDJSBtOFUQ7Ala8ShJvWPMpbCR3gFHOGS9f13ebv6qXblaf7sHxE6T0OpuEZPL10Iu5yh42IOLo8wvp1euqb61U3JWoOmBXEB3mJ0owRfBHEjuAARDUzNVgq28F6FYqgACE3nKhqDKYDEQstlJK0&s=iYvgj1wSTvdjXxBfX8o2WaobYR_3pECyDxRGtnbdDBXt7Opqu3QmzUF4Uv434b2DOQGOpGrHHHHJdU1gka9iRs_2IDQlprfj6vLB-h5pWqyHS5p28mqaLW5l1nIvnM8hOrjAZlhT1MLI_3R3B2lNfB7QyIeA1b0RnBRfUyv27-e-hRx2_KmBs6i4uXWmmwdnkGFZ7-Sq9ahcNtQo01gKGK858o6tQEINER7ychSS9ucKV96iZTt6BSQV7NBxGsKxbTTX40_yPnm_vmkWEeRCjCojTMSTg2l0_g4pxX57OSJn5bt-gSTZbXUulPOSPPXcCs1li8Dv3t6f-C3spzDkdg&h=o1d8GnSicOzuJD83ZodJKQEhAHho_Yp0JSQvZXRudlw Pragma: - no-cache - Retry-After: - - "15" Strict-Transport-Security: - max-age=31536000; includeSubDomains X-Cache: @@ -904,11 +996,11 @@ interactions: X-Content-Type-Options: - nosniff X-Msedge-Ref: - - 'Ref A: 8F35B7614DD74450A83C9E464BD31260 Ref B: SYD03EDGE1717 Ref C: 2024-04-04T23:13:52Z' - status: 202 Accepted - code: 202 - duration: 733.942666ms - - id: 17 + - 'Ref A: 0BB26D00AA5E433CA236B74E80566F28 Ref B: CO6AA3150220023 Ref C: 2024-06-07T21:27:58Z' + status: 200 OK + code: 200 + duration: 23.943322ms + - id: 19 request: proto: HTTP/1.1 proto_major: 1 @@ -922,28 +1014,34 @@ interactions: body: "" form: {} headers: + Accept: + - application/json Test-Request-Attempt: - - "7" - url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1BU09URVNUOjJEUkc6MkRGWVZKSEstV0VTVFVTMiIsImpvYkxvY2F0aW9uIjoid2VzdHVzMiJ9?api-version=2020-06-01&t=638478691148302899&c=MIIHADCCBeigAwIBAgITHgPrWOVrMb7qufvgEAAAA-tY5TANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDYwHhcNMjQwMjAxMDQxMjQzWhcNMjUwMTI2MDQxMjQzWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOil3F8MsZdl8FeicToFLcoRyDn0Zv76EQTwG1IZtUh-z6uwzGIgy23k7GrXNU1gKVyGJp8lO3encPC02rUQkI0lvN-NUJCoJAEnGZPYOLmA9NylSyr1Ik_Qaz1_UueFRAiyVJlo0Lz27ayfzTTSUd82wyh18q-LWdG49N7fSD_fM1rsfxbY7-Eo4Z5CjxDW3OWmAYKpS0tm17o2hEKrmjeNZJQsSqQxUL-1Be4vND7XzGhGI595ogShOZHOzCBueWR2-8fa5VrwlHqtU1AgvjFk3lYmZejl898JrGFMYH-QSC1iWyRweQ_m3289K-aPeRSWqRihXIG9oHEqouTO1xkCAwEAAaOCA-0wggPpMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFggvX2K4Py0SACAWQCAQowggHLBggrBgEFBQcBAQSCAb0wggG5MGMGCCsGAQUFBzAChldodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MFMGCCsGAQUFBzAChkdodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9CTDJQS0lJTlRDQTAyLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA2LmNydDBTBggrBgEFBQcwAoZHaHR0cDovL2NybDMuYW1lLmdibC9haWEvQkwyUEtJSU5UQ0EwMi5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwNi5jcnQwUwYIKwYBBQUHMAKGR2h0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JMMlBLSUlOVENBMDIuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3J0MB0GA1UdDgQWBBTew4tn2tBCof44yM20soU6sfep6zAOBgNVHQ8BAf8EBAMCBaAwggEmBgNVHR8EggEdMIIBGTCCARWgggERoIIBDYY_aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JshjFodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDYuY3JsMBcGA1UdIAQQMA4wDAYKKwYBBAGCN3sBATAfBgNVHSMEGDAWgBTxRmjG8cPwKy19i2rhsvm-NfzRQTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGBANOAsl8fyImo8IXVQ_ybox-BzCeFiAddg9Ojd61exGTea02-HjvZzuL6GZ2k21c7rEjKSBHqk50RLm2yXrMcUGc1UO7MRchaKQm1WR7osgDiXAU0rDc9-H-i8I245Y_PbyKIBewiK7UQiCjda4b__7Amrw7q4oILOsxshnN_D1NBm2nSjm-dFiDeJ9jpG9X1jDJSBtOFUQ7Ala8ShJvWPMpbCR3gFHOGS9f13ebv6qXblaf7sHxE6T0OpuEZPL10Iu5yh42IOLo8wvp1euqb61U3JWoOmBXEB3mJ0owRfBHEjuAARDUzNVgq28F6FYqgACE3nKhqDKYDEQstlJK0&s=vMtXRFKi6YZm-HqZk29QyJ7Jz0jJjvDILpSeWzTWx7V7-zAbBtbql5C6kI46weS9MmqhTGj4MD2tTgovqrXBXdT8_zjwudHkGh-KhCzGTlhmuROq6KQELH408aNhD_Yv5rK7I15lmDHzA3Ipau7oNCkAVF-ffjyOfWFT4X90xDMoZ8KiTVHzVDbMfwQfBGCiyuaaixJ9mT3vwQHmOOsuLC2hz63pMCRL-9nRfBvpEV-3U4nLa_92wiU2XBGKfUBkrCJ-KS24mMuFRrSOMbc5sL2H1IU7Ewuy0VkxIgCypUsf3bN8kqCyM_kC_PjALgKkoEmiDgAarz6oew3-OHTllQ&h=VHZdUsg6CC7aqHcip3ERyPFdQwr6eB_456GhuAzI0bg - method: GET + - "0" + url: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/4185f9fe-2b34-59f4-aee4-575692fb2264?api-version=2022-04-01 + method: DELETE response: proto: HTTP/2.0 proto_major: 2 proto_minor: 0 transfer_encoding: [] trailer: {} - content_length: 0 + content_length: 730 uncompressed: false - body: "" + body: '{"properties":{"roleName":"aso-sample-roledef","type":"CustomRole","description":null,"assignableScopes":["/subscriptions/00000000-0000-0000-0000-000000000000"],"permissions":[{"actions":["Microsoft.Resources/subscriptions/resourceGroups/read"],"notActions":[],"dataActions":[],"notDataActions":[]}],"createdOn":"2001-02-03T04:05:06Z","updatedOn":"2001-02-03T04:05:06Z","createdBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb","updatedBy":"f5d11ebc-8494-4b5f-a0fc-5fbbfd56f7bb"},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/4185f9fe-2b34-59f4-aee4-575692fb2264","type":"Microsoft.Authorization/roleDefinitions","name":"4185f9fe-2b34-59f4-aee4-575692fb2264"}' headers: Cache-Control: - no-cache Content-Length: - - "0" + - "730" + Content-Type: + - application/json; charset=utf-8 Expires: - "-1" Pragma: - no-cache + Set-Cookie: + - x-ms-gateway-slice=Production; path=/; secure; samesite=none; httponly Strict-Transport-Security: - max-age=31536000; includeSubDomains X-Cache: @@ -951,11 +1049,11 @@ interactions: X-Content-Type-Options: - nosniff X-Msedge-Ref: - - 'Ref A: 32D25F721984461E9284A888FBF10F5B Ref B: SYD03EDGE1717 Ref C: 2024-04-04T23:14:09Z' + - 'Ref A: C8E3FF1BF2AF4CC7BDF93C87270F4139 Ref B: CO6AA3150220023 Ref C: 2024-06-07T21:28:02Z' status: 200 OK code: 200 - duration: 786.7225ms - - id: 18 + duration: 2.530765115s + - id: 20 request: proto: HTTP/1.1 proto_major: 1 @@ -1004,11 +1102,11 @@ interactions: X-Ms-Failure-Cause: - gateway X-Msedge-Ref: - - 'Ref A: 0BBC0C8886DE426199905F7A02A3F484 Ref B: SYD03EDGE1717 Ref C: 2024-04-04T23:14:15Z' + - 'Ref A: 4A9B1F647F154DB09F6EBE6EEF6B8CC9 Ref B: CO6AA3150220023 Ref C: 2024-06-07T21:28:12Z' status: 404 Not Found code: 404 - duration: 154.629ms - - id: 19 + duration: 317.954727ms + - id: 21 request: proto: HTTP/1.1 proto_major: 1 @@ -1053,7 +1151,7 @@ interactions: X-Content-Type-Options: - nosniff X-Msedge-Ref: - - 'Ref A: 93DC638E696D437F9FA1594580D13993 Ref B: SYD03EDGE1717 Ref C: 2024-04-04T23:14:15Z' + - 'Ref A: 9131B6D927A141AB9958FAD1384C8D7A Ref B: CO6AA3150220023 Ref C: 2024-06-07T21:28:12Z' status: 204 No Content code: 204 - duration: 2.871391875s + duration: 2.382195191s diff --git a/v2/internal/testcommon/samples_tester.go b/v2/internal/testcommon/samples_tester.go index 73d8f3e00cd..a2e56ae2c77 100644 --- a/v2/internal/testcommon/samples_tester.go +++ b/v2/internal/testcommon/samples_tester.go @@ -23,9 +23,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "github.com/Azure/azure-service-operator/v2/internal/reflecthelpers" - "github.com/Azure/azure-service-operator/v2/internal/resolver" - "github.com/Azure/azure-service-operator/v2/pkg/genruntime" ) @@ -34,8 +32,8 @@ const ( defaultResourceGroup = "aso-sample-rg" ) -// Regex to match '/00000000-0000-0000-0000-000000000000/' strings, to replace with the subscriptionID -var subRegex = regexp.MustCompile("\\/([0]+-?)+\\/") +// Regex to match '/00000000-0000-0000-0000-000000000000' strings, to replace with the subscriptionID +var subRegex = regexp.MustCompile("\\/([0]+-?)+") // An empty GUID, used to replace the subscriptionID and tenantID in the sample files var emptyGuid = uuid.Nil.String() @@ -351,12 +349,17 @@ func (t *SamplesTester) visitStruct(this *reflecthelpers.ReflectVisitor, it refl // Set the value of any SubscriptionID Field that's got an empty GUID as the value if field := it.FieldByNameFunc(isField("subscriptionID")); field.IsValid() { - t.assignString(field, t.azureSubscription) + t.conditionalAssignString(field, emptyGuid, t.azureSubscription) + } + + // Replace the empty-guid value in any armID field + if field := it.FieldByNameFunc(isField("armId")); field.IsValid() { + t.replaceString(field, emptyGuid, t.azureSubscription) } // Set the value of any TenantID Field that's got an empty GUID as the value if field := it.FieldByNameFunc(isField("tenantID")); field.IsValid() { - t.assignString(field, t.azureTenant) + t.conditionalAssignString(field, emptyGuid, t.azureTenant) } return reflecthelpers.IdentityVisitStruct(this, it, ctx) @@ -369,22 +372,34 @@ func isField(field string) func(name string) bool { } } -func (t *SamplesTester) assignString(field reflect.Value, value string) { - if field.Kind() == reflect.String && - // Set simple string field - field.String() == emptyGuid { - field.SetString(value) +func (t *SamplesTester) conditionalAssignString(field reflect.Value, match string, value string) { + if field.Kind() == reflect.Ptr { + field = field.Elem() + } + + if field.Kind() != reflect.String { return } - if field.Kind() == reflect.Ptr && - field.Elem().Kind() == reflect.String && - field.Elem().String() == emptyGuid { - // Set pointer to string field - field.Elem().SetString(value) + if field.String() == match { + field.SetString(value) } } +func (t *SamplesTester) replaceString(field reflect.Value, old string, new string) { + if field.Kind() == reflect.Ptr { + field = field.Elem() + } + + if field.Kind() != reflect.String { + return + } + + val := field.String() + val = strings.Replace(val, old, new, -1) + field.SetString(val) +} + // visitResourceReference checks and sets the SubscriptionID and ResourceGroup name for ARM references to current values func (t *SamplesTester) visitResourceReference(_ *reflecthelpers.ReflectVisitor, it reflect.Value, _ any) error { if !it.CanInterface() { @@ -404,7 +419,7 @@ func (t *SamplesTester) visitResourceReference(_ *reflecthelpers.ReflectVisitor, armIDString := armIDField.String() armIDString = strings.ReplaceAll(armIDString, defaultResourceGroup, t.rgName) - armIDString = subRegex.ReplaceAllString(armIDString, fmt.Sprint("/", t.azureSubscription, "/")) + armIDString = subRegex.ReplaceAllString(armIDString, fmt.Sprint("/", t.azureSubscription)) armIDField.SetString(armIDString) diff --git a/v2/internal/util/randextensions/uuid5.go b/v2/internal/util/randextensions/uuid5.go index 355f9bc2963..66c8b2b28da 100644 --- a/v2/internal/util/randextensions/uuid5.go +++ b/v2/internal/util/randextensions/uuid5.go @@ -13,27 +13,38 @@ import ( // Namespace is the ASOv2 UUIDv5 namespace UUID var Namespace = uuid.Must(uuid.Parse("9a329043-7ad7-4b1c-812f-9c7a93d6392a")) -// MakeUniqueResourceString generates a string that uniquely identifies a cluster resource. -func MakeUniqueResourceString(group string, kind string, namespace string, name string) string { - return fmt.Sprintf("%s/%s:%s/%s", group, kind, namespace, name) +// MakeUniqueResourceScopedString generates a string that uniquely identifies a cluster resource. It includes the +// following distinguishing parts: +// * Group +// * Kind +// * Namespace +// * Name +func MakeUniqueResourceScopedString(gk schema.GroupKind, namespace string, name string) string { + return fmt.Sprintf("%s/%s:%s/%s", gk.Group, gk.Kind, namespace, name) } -// TODO: Fix name -// MakeUniqueResourceString generates a string that uniquely identifies a cluster resource. -func MakeUniqueResourceString2(ownerGK schema.GroupKind, ownerName string, gk schema.GroupKind, namespace string, name string) string { +// TODO: This method has a bug where it is called with an empty owner gk when the owner is an ARM ID. +// MakeUniqueOwnerScopedString generates a string that uniquely identifies a cluster resource. It includes the +// following distinguishing parts: +// * Owner group +// * Owner kind +// * Owner name +// * Group +// * Kind +// * Namespace +// * Name +func MakeUniqueOwnerScopedString(ownerGK schema.GroupKind, ownerName string, gk schema.GroupKind, namespace string, name string) string { return fmt.Sprintf("%s/%s:%s/%s:%s/%s:%s/%s", ownerGK.Group, ownerGK.Kind, namespace, ownerName, gk.Kind, gk.Group, namespace, name) } -// MakeUUIDName creates a stable UUID (v5) based on the group, kind, namespace, and name of a resource and its owner. -// If the name of the resource is already a compliant UUID, we just use that. If the name is not a UUID one is -// generated and returned. -func MakeUUIDName(ownerGK schema.GroupKind, ownerName string, gk schema.GroupKind, namespace string, name string) string { +// MakeUUIDName creates a stable UUID (v5) if the provided name is not already a UUID based on the specified +// uniqueString. +func MakeUUIDName(name string, uniqueString string) string { // If name is already a UUID we can just use that _, err := uuid.Parse(name) if err == nil { return name } - uniqueStr := MakeUniqueResourceString2(ownerGK, ownerName, gk, namespace, name) - return uuid.NewSHA1(Namespace, []byte(uniqueStr)).String() + return uuid.NewSHA1(Namespace, []byte(uniqueString)).String() } diff --git a/v2/samples/authorization/v1api20220401/v1api20220401_roledefinition.yaml b/v2/samples/authorization/v1api20220401/v1api20220401_roledefinition.yaml new file mode 100644 index 00000000000..f47ea04a4ef --- /dev/null +++ b/v2/samples/authorization/v1api20220401/v1api20220401_roledefinition.yaml @@ -0,0 +1,25 @@ +apiVersion: authorization.azure.com/v1api20220401 +kind: RoleDefinition +metadata: + name: aso-sample-roledef + namespace: default +spec: + roleName: aso-sample-roledef + assignableScopesReferences: + - armId: /subscriptions/00000000-0000-0000-0000-000000000000 + # This can also be a reference to an ASO resource + # instead of an ARM resource, like so: + # group: resources.azure.com + # kind: ResourceGroup + # name: aso-sample-rg + owner: + armId: /subscriptions/00000000-0000-0000-0000-000000000000 + # This can also be a reference to an ASO resource + # instead of an ARM resource, like so: + # group: resources.azure.com + # kind: ResourceGroup + # name: aso-sample-rg + permissions: + - actions: + - Microsoft.Resources/subscriptions/resourceGroups/read + type: customRole