diff --git a/config/resource-manager.hcl b/config/resource-manager.hcl index ac11d9ee83..67dc8f1777 100644 --- a/config/resource-manager.hcl +++ b/config/resource-manager.hcl @@ -145,7 +145,7 @@ service "containerservice" { } service "cosmos-db" { name = "CosmosDB" - available = ["2022-05-15", "2022-11-15", "2023-04-15", "2024-08-15", "2025-04-15", "2025-10-15"] + available = ["2022-05-15", "2022-11-15", "2023-04-15", "2024-08-15", "2025-04-15", "2025-10-15", "2026-03-15"] } service "cost-management" { name = "CostManagement" diff --git a/tools/importer-rest-api-specs/internal/components/apidefinitions/parser/resourceids/parse_segments.go b/tools/importer-rest-api-specs/internal/components/apidefinitions/parser/resourceids/parse_segments.go index 52db381921..48aa27d876 100644 --- a/tools/importer-rest-api-specs/internal/components/apidefinitions/parser/resourceids/parse_segments.go +++ b/tools/importer-rest-api-specs/internal/components/apidefinitions/parser/resourceids/parse_segments.go @@ -102,8 +102,18 @@ func (p *Parser) parseResourceIdFromOperation(uri string, operation *spec.Operat } } if isScope { - segments = append(segments, sdkModels.NewScopeResourceIDSegment(normalizedSegment)) - continue + precededByResourceType := false + if len(segments) > 0 { + previousSegment := segments[len(segments)-1] + if previousSegment.Type == sdkModels.StaticResourceIDSegmentType { + precededByResourceType = true + } + } + + if !precededByResourceType { + segments = append(segments, sdkModels.NewScopeResourceIDSegment(normalizedSegment)) + continue + } } if strings.EqualFold(normalizedSegment, "subscription") || strings.EqualFold(normalizedSegment, "subscriptionId") { diff --git a/tools/importer-rest-api-specs/internal/components/apidefinitions/parser/resourceids/parse_segments_test.go b/tools/importer-rest-api-specs/internal/components/apidefinitions/parser/resourceids/parse_segments_test.go index 0f45c12d5a..2c1678a5f0 100644 --- a/tools/importer-rest-api-specs/internal/components/apidefinitions/parser/resourceids/parse_segments_test.go +++ b/tools/importer-rest-api-specs/internal/components/apidefinitions/parser/resourceids/parse_segments_test.go @@ -388,6 +388,40 @@ func TestParseResourceIDFromOperation_UserAssignedIdentityId(t *testing.T) { validateSegmentsMatch(t, *resourceId.segments, expectedSegments) } +func TestParseResourceIDFromOperation_UserSpecifiedResourceIdSameAsKnownSegmentsUsedForScope(t *testing.T) { + t.Parallel() + swagger := spec.NewOperation("Example_Operation") + // `roleAssignmentId` is listed as known segments used for scope + uri := "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.DocumentDB/roleAssignments/{roleAssignmentId}" + + parser := NewParser(nil) + resourceId, err := parser.parseResourceIdFromOperation(uri, swagger) + if err != nil { + t.Fatalf("parsing Resource ID from %q: %+v", uri, err) + } + + if resourceId.uriSuffix != nil { + t.Fatalf("expected no uriSuffix but got %q", *resourceId.uriSuffix) + } + if len(resourceId.constants) != 0 { + t.Fatalf("expected 0 constants but got %d", len(resourceId.constants)) + } + if resourceId.segments == nil { + t.Fatalf("expected 8 segments but got 0") + } + expectedSegments := []sdkModels.ResourceIDSegment{ + sdkModels.NewStaticValueResourceIDSegment("subscriptions", "subscriptions"), + sdkModels.NewSubscriptionIDResourceIDSegment("subscriptionId"), + sdkModels.NewStaticValueResourceIDSegment("resourceGroups", "resourceGroups"), + sdkModels.NewResourceGroupNameResourceIDSegment("resourceGroupName"), + sdkModels.NewStaticValueResourceIDSegment("providers", "providers"), + sdkModels.NewResourceProviderResourceIDSegment("resourceProvider", "Microsoft.DocumentDB"), + sdkModels.NewStaticValueResourceIDSegment("roleAssignments", "roleAssignments"), + sdkModels.NewUserSpecifiedResourceIDSegment("roleAssignmentId", "roleAssignmentId"), + } + validateSegmentsMatch(t, *resourceId.segments, expectedSegments) +} + func validateSegmentsMatch(t *testing.T, actual []sdkModels.ResourceIDSegment, expected []sdkModels.ResourceIDSegment) { if len(actual) != len(expected) { t.Fatalf("expected there to be %d segments but got %d", len(expected), len(actual))