From 1e74f86db7b0354fe792d65033c3dd4063785186 Mon Sep 17 00:00:00 2001 From: Brett DeFoy Date: Thu, 18 May 2023 17:03:59 -0700 Subject: [PATCH 1/2] Remove ResourceMustReferenceCommonTypes --- docs/resource-must-reference-common-types.md | 17 --- packages/rulesets/src/spectral/az-arm.ts | 12 -- .../resource-must-reference-common-types.ts | 46 ------ ...source-must-reference-common-types.test.ts | 144 ------------------ 4 files changed, 219 deletions(-) delete mode 100644 docs/resource-must-reference-common-types.md delete mode 100644 packages/rulesets/src/spectral/functions/resource-must-reference-common-types.ts delete mode 100644 packages/rulesets/src/spectral/test/resource-must-reference-common-types.test.ts diff --git a/docs/resource-must-reference-common-types.md b/docs/resource-must-reference-common-types.md deleted file mode 100644 index cc161babb..000000000 --- a/docs/resource-must-reference-common-types.md +++ /dev/null @@ -1,17 +0,0 @@ -# ResourceMustReferenceCommonTypes - -## Category - -ARM Error - -## Applies to - -ARM OpenAPI (Swagger) specs - -## Description - -Validates that any resource definitions use the definitions for ProxyResource or TrackedResource already defined in the common types. - -## How to fix the violation - -Ensure that all resource definitions reference the ProxyResource or TrackedResource definitions in the common types. diff --git a/packages/rulesets/src/spectral/az-arm.ts b/packages/rulesets/src/spectral/az-arm.ts index b74911bab..defc6605b 100644 --- a/packages/rulesets/src/spectral/az-arm.ts +++ b/packages/rulesets/src/spectral/az-arm.ts @@ -36,7 +36,6 @@ import { provisioningStateMustBeReadOnly } from "./functions/provisioning-state- import putGetPatchScehma from "./functions/put-get-patch-schema" import { putRequestResponseScheme } from "./functions/put-request-response-scheme" import { PutResponseSchemaDescription } from "./functions/put-response-schema-description" -import { resourceMustReferenceCommonTypes } from "./functions/resource-must-reference-common-types" import resourceNameRestriction from "./functions/resource-name-restriction" import responseSchemaSpecifiedForSuccessStatusCode from "./functions/response-schema-specified-for-success-status-code" import { securityDefinitionsStructure } from "./functions/security-definitions-structure" @@ -744,17 +743,6 @@ const ruleset: any = { /// ARM rules without an RPC code /// - ResourceMustReferenceCommonTypes: { - description: "Resource definitions must use the common types TrackedResource or ProxyResource definitions.", - message: "{{error}}", - severity: "off", // See https://github.com/Azure/azure-sdk-tools/issues/6071#issuecomment-1535560188 - resolved: false, - formats: [oas2], - given: ["$.paths.*.[get,put,patch].responses.200.schema.$ref"], - then: { - function: resourceMustReferenceCommonTypes, - }, - }, ProvisioningStateMustBeReadOnly: { description: "This is a rule introduced to validate if provisioningState property is set to readOnly or not.", message: "{{error}}", diff --git a/packages/rulesets/src/spectral/functions/resource-must-reference-common-types.ts b/packages/rulesets/src/spectral/functions/resource-must-reference-common-types.ts deleted file mode 100644 index b68c23305..000000000 --- a/packages/rulesets/src/spectral/functions/resource-must-reference-common-types.ts +++ /dev/null @@ -1,46 +0,0 @@ -// ResourceMustReferenceCommonTypes -// Validates that resource definitions use the common types TrackedResource or ProxyResource definitions. -// RPC Code: - -// regex matching paths that end with common-types/resource-management//types.json#definitions/ -const RESOURCE_COMMON_TYPES_REGEX = /.*common-types\/resource-management\/v\d+\/types.json#\/definitions\/(Proxy|Tracked)Resource/ - -export const resourceMustReferenceCommonTypes = (ref: any, _opts: any, ctx: any) => { - if (!ref) { - return [] - } - - const swagger = ctx?.documentInventory?.resolved - const definitions = swagger?.definitions - - if (!definitions) { - return [] - } - - // get the resource name using the last word of the ref path - const resourceName = ref.toString().split("/").pop() - // find the resource definition by name, get the references under it - const allOfRef = definitions[resourceName]?.properties?.allOf - const path = ["definitions", resourceName] - const error = [ - { - message: `Resource definition '${resourceName}' must reference the common types resource definition for ProxyResource or TrackedResource.`, - path: path, - }, - ] - - // if there are no refs under the resource definition, error - if (!allOfRef) { - return error - } - - // if any of the refs under the resource definition match the common types regex, return no errors - for (const refObj of allOfRef) { - if (refObj.$ref?.match(RESOURCE_COMMON_TYPES_REGEX)) { - return [] - } - } - - // none of the refs under the resource definition match the common types regex, so return an error - return error -} diff --git a/packages/rulesets/src/spectral/test/resource-must-reference-common-types.test.ts b/packages/rulesets/src/spectral/test/resource-must-reference-common-types.test.ts deleted file mode 100644 index 464c0ca42..000000000 --- a/packages/rulesets/src/spectral/test/resource-must-reference-common-types.test.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { Spectral } from "@stoplight/spectral-core" -import linterForRule from "./utils" - -let nonResolvingLinter: Spectral -const RULE = "ResourceMustReferenceCommonTypes" - -beforeAll(async () => { - nonResolvingLinter = linterForRule(RULE, true) - return nonResolvingLinter -}) - -test(`${RULE} should find errors`, async () => { - const oasDoc = { - swagger: "2.0", - paths: { - "/providers/Microsoft.Bakery/breads/{breadName}": { - get: { - responses: { - 200: { - description: "a response", - schema: { - $ref: "#/definitions/Bread", - }, - }, - }, - }, - put: { - responses: { - 200: { - description: "a response", - schema: { - $ref: "#/definitions/Bread", - }, - }, - }, - }, - }, - }, - definitions: { - Bread: { - type: "object", - properties: { - name: { - description: "bread name", - type: "string", - }, - }, - }, - }, - } - - return nonResolvingLinter.run(oasDoc).then((results) => { - expect(results.length).toBe(1) - expect(results[0].message).toBe( - "Resource definition 'Bread' must reference the common types resource definition for ProxyResource or TrackedResource." - ) - }) -}) - -test(`${RULE} should find no errors`, async () => { - const oasDoc = { - swagger: "2.0", - paths: { - "/providers/Microsoft.Bakery/breads/{breadName}": { - get: { - responses: { - 200: { - description: "a response", - schema: { - $ref: "#/definitions/Bread", - }, - }, - }, - }, - put: { - responses: { - 200: { - description: "a response", - schema: { - $ref: "#/definitions/Bread", - }, - }, - }, - }, - }, - }, - "/providers/Microsoft.Bakery/cookies/{cookieName}": { - get: { - responses: { - 200: { - description: "a response", - schema: { - $ref: "#/definitions/Cookie", - }, - }, - }, - }, - put: { - responses: { - 200: { - description: "a response", - schema: { - $ref: "#/definitions/Cookie", - }, - }, - }, - }, - }, - definitions: { - Bread: { - type: "object", - properties: { - name: { - description: "bread name", - type: "string", - }, - allOf: [ - { - $ref: "../../../../../common-types/resource-management/v1/types.json#/definitions/ProxyResource", - }, - ], - }, - }, - }, - Cookie: { - type: "object", - properties: { - name: { - description: "cookie name", - type: "string", - }, - allOf: [ - { - $ref: "../../../../../common-types/resource-management/v1/types.json#/definitions/TrackedResource", - }, - ], - }, - }, - } - - return nonResolvingLinter.run(oasDoc).then((results) => { - expect(results.length).toBe(0) - }) -}) From 7fcf781a97a1b5205dd2510de318a90330b256ba Mon Sep 17 00:00:00 2001 From: Brett DeFoy Date: Thu, 18 May 2023 17:07:46 -0700 Subject: [PATCH 2/2] Generate files --- ...ce-common-types-rule_2023-05-19-00-07.json | 10 +++++ docs/rules.md | 8 +--- .../rulesets/generated/spectral/az-arm.js | 42 ------------------- 3 files changed, 11 insertions(+), 49 deletions(-) create mode 100644 common/changes/@microsoft.azure/openapi-validator-rulesets/remove-resource-must-reference-common-types-rule_2023-05-19-00-07.json diff --git a/common/changes/@microsoft.azure/openapi-validator-rulesets/remove-resource-must-reference-common-types-rule_2023-05-19-00-07.json b/common/changes/@microsoft.azure/openapi-validator-rulesets/remove-resource-must-reference-common-types-rule_2023-05-19-00-07.json new file mode 100644 index 000000000..66234ee6b --- /dev/null +++ b/common/changes/@microsoft.azure/openapi-validator-rulesets/remove-resource-must-reference-common-types-rule_2023-05-19-00-07.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@microsoft.azure/openapi-validator-rulesets", + "comment": "Remove the ResourceMustReferenceCommonTypes rule", + "type": "patch" + } + ], + "packageName": "@microsoft.azure/openapi-validator-rulesets" +} \ No newline at end of file diff --git a/docs/rules.md b/docs/rules.md index d12d646d2..8da954932 100644 --- a/docs/rules.md +++ b/docs/rules.md @@ -679,7 +679,7 @@ Please refer to [operations-api-schema-uses-common-types.md](./operations-api-sc ### OperationsApiTenantLevelOnly -The get operation endpoint for the operations API must be scoped tenant-wide. Operations should _not_ vary per subscription. +The get operation endpoint for the operations API must be scoped tenant-wide. Operations **must not** vary per subscription. Please refer to [operations-api-tenant-level-only.md](./operations-api-tenant-level-only.md) for details. @@ -1046,12 +1046,6 @@ A 'Resource' definition must have x-ms-azure-resource extension enabled and set Please refer to [resource-has-x-ms-resource-enabled.md](./resource-has-x-ms-resource-enabled.md) for details. -### ResourceMustReferenceCommonTypes - -Validates that any resource definitions use the definitions for ProxyResource or TrackedResource already defined in the common types. - -Please refer to [resource-must-reference-common-types.md](./resource-must-reference-common-types.md) for details. - ### ResourceNameRestriction This rule ensures that the authors explicitly define these restrictions as a regex on the resource name. If a team does not have custom rules then the ARM's default rule should get applied. diff --git a/packages/rulesets/generated/spectral/az-arm.js b/packages/rulesets/generated/spectral/az-arm.js index e11a07721..b1d9a1c8b 100644 --- a/packages/rulesets/generated/spectral/az-arm.js +++ b/packages/rulesets/generated/spectral/az-arm.js @@ -2192,37 +2192,6 @@ const PutResponseSchemaDescription = (putResponseSchema, opts, ctx) => { return errors; }; -const RESOURCE_COMMON_TYPES_REGEX = /.*common-types\/resource-management\/v\d+\/types.json#\/definitions\/(Proxy|Tracked)Resource/; -const resourceMustReferenceCommonTypes = (ref, _opts, ctx) => { - var _a, _b, _c, _d; - if (!ref) { - return []; - } - const swagger = (_a = ctx === null || ctx === void 0 ? void 0 : ctx.documentInventory) === null || _a === void 0 ? void 0 : _a.resolved; - const definitions = swagger === null || swagger === void 0 ? void 0 : swagger.definitions; - if (!definitions) { - return []; - } - const resourceName = ref.toString().split("/").pop(); - const allOfRef = (_c = (_b = definitions[resourceName]) === null || _b === void 0 ? void 0 : _b.properties) === null || _c === void 0 ? void 0 : _c.allOf; - const path = ["definitions", resourceName]; - const error = [ - { - message: `Resource definition '${resourceName}' must reference the common types resource definition for ProxyResource or TrackedResource.`, - path: path, - }, - ]; - if (!allOfRef) { - return error; - } - for (const refObj of allOfRef) { - if ((_d = refObj.$ref) === null || _d === void 0 ? void 0 : _d.match(RESOURCE_COMMON_TYPES_REGEX)) { - return []; - } - } - return error; -}; - const resourceNameRestriction = (paths, _opts, ctx) => { if (paths === null || typeof paths !== "object") { return []; @@ -3064,17 +3033,6 @@ const ruleset = { function: operationsApiTenantLevelOnly, }, }, - ResourceMustReferenceCommonTypes: { - description: "Resource definitions must use the common types TrackedResource or ProxyResource definitions.", - message: "{{error}}", - severity: "off", - resolved: false, - formats: [oas2], - given: ["$.paths.*.[get,put,patch].responses.200.schema.$ref"], - then: { - function: resourceMustReferenceCommonTypes, - }, - }, ProvisioningStateMustBeReadOnly: { description: "This is a rule introduced to validate if provisioningState property is set to readOnly or not.", message: "{{error}}",