diff --git a/.github/linters/.eslintrc.yml b/.github/linters/.eslintrc.yml new file mode 100644 index 00000000..3459e021 --- /dev/null +++ b/.github/linters/.eslintrc.yml @@ -0,0 +1,21 @@ +plugins: + - jsonc +overrides: + - files: "*.json" + parser: jsonc-eslint-parser + rules: + # These are the set of rules that belong to jsonc. For more information, + # https://ota-meshi.github.io/eslint-plugin-jsonc/rules + jsonc/comma-dangle: + - error + jsonc/indent: + - error + - 2 + jsonc/key-name-casing: + - error + - camelCase: true + snake_case: false + jsonc/key-spacing: + - error + jsonc/no-dupe-keys: + - error diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 57f58db2..affa29ee 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -28,9 +28,20 @@ jobs: uses: github/super-linter/slim@v4 env: VALIDATE_ALL_CODEBASE: true - DEFAULT_BRANCH: main GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} VALIDATE_MARKDOWN: true + VALIDATE_JSON: true + # superlinter runs each linter on a per file bases and does not look + # at tool specific configuration to determine whether or not to the + # lint the given file. + # + # Due to that we need to globally include or exclude files. This also + # makes tools less flexible with one another in that if a tool + # requires a specific folder to be included and excluded, but other + # tools require must lint the excluded folder, then this pattern does + # not work. Instead superlinter cannot be used in that case, and the + # linter itself needs to be ran outside of superlinter. + FILTER_REGEX_INCLUDE: .*\/(custom|examples|schemas)\/.* jsonschema: name: Validate Schemas and Examples diff --git a/custom/schema.json b/custom/schema.json index 4af49f94..3648bdb8 100644 --- a/custom/schema.json +++ b/custom/schema.json @@ -1,93 +1,93 @@ { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://cdevents.dev/0.4.0/schema/custom", - "properties": { - "context": { - "properties": { - "version": { - "type": "string", - "minLength": 1 - }, - "id": { - "type": "string", - "minLength": 1 - }, - "source": { - "type": "string", - "minLength": 1, - "format": "uri-reference" - }, - "type": { - "type": "string", - "pattern": "^dev.cdeventsx.[a-zA-Z0-9]+-[a-zA-Z]+.[a-zA-Z]+$" - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "schemaUri": { - "type": "string", - "minLength": 1, - "format": "uri" - } + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cdevents.dev/0.4.0/schema/custom", + "properties": { + "context": { + "properties": { + "version": { + "type": "string", + "minLength": 1 }, - "additionalProperties": false, - "type": "object", - "required": [ - "version", - "id", - "source", - "type", - "timestamp" - ] - }, - "subject": { - "properties": { - "id": { - "type": "string", - "minLength": 1 - }, - "source": { - "type": "string", - "minLength": 1, - "format": "uri-reference" - }, - "type": { - "type": "string", - "pattern": "^[a-zA-Z0-9]+-[a-zA-Z]+$" - }, - "content": { - "type": "object", - "additionalProperties": true - } + "id": { + "type": "string", + "minLength": 1 + }, + "source": { + "type": "string", + "minLength": 1, + "format": "uri-reference" + }, + "type": { + "type": "string", + "pattern": "^dev.cdeventsx.[a-zA-Z0-9]+-[a-zA-Z]+.[a-zA-Z]+$" }, - "additionalProperties": false, - "type": "object", - "required": [ - "id", - "type", - "content" - ] + "timestamp": { + "type": "string", + "format": "date-time" + }, + "schemaUri": { + "type": "string", + "minLength": 1, + "format": "uri" + } }, - "customData": { - "oneOf": [ - { - "type": "object" - }, - { - "type": "string", - "contentEncoding": "base64" - } - ] + "additionalProperties": false, + "type": "object", + "required": [ + "version", + "id", + "source", + "type", + "timestamp" + ] + }, + "subject": { + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "source": { + "type": "string", + "minLength": 1, + "format": "uri-reference" + }, + "type": { + "type": "string", + "pattern": "^[a-zA-Z0-9]+-[a-zA-Z]+$" + }, + "content": { + "type": "object", + "additionalProperties": true + } }, - "customDataContentType": { - "type": "string" - } + "additionalProperties": false, + "type": "object", + "required": [ + "id", + "type", + "content" + ] + }, + "customData": { + "oneOf": [ + { + "type": "object" + }, + { + "type": "string", + "contentEncoding": "base64" + } + ] }, - "additionalProperties": false, - "type": "object", - "required": [ - "context", - "subject" - ] - } \ No newline at end of file + "customDataContentType": { + "type": "string" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "context", + "subject" + ] +} \ No newline at end of file diff --git a/examples/incident_detected.json b/examples/incident_detected.json index 7eda29ab..18357a87 100644 --- a/examples/incident_detected.json +++ b/examples/incident_detected.json @@ -1,28 +1,28 @@ { "context": { - "version": "0.4.0", - "id": "F4BD2B55-B6F6-4F44-AF72-BD2D0E7A8708", - "chainId": "4c8cb7dd-3448-41de-8768-eec704e2829b", - "source": "/monitoring/prod1", - "type": "dev.cdevents.incident.detected.0.2.0", - "timestamp": "2022-11-11T13:52:20.079Z" + "version": "0.4.0", + "id": "F4BD2B55-B6F6-4F44-AF72-BD2D0E7A8708", + "chainId": "4c8cb7dd-3448-41de-8768-eec704e2829b", + "source": "/monitoring/prod1", + "type": "dev.cdevents.incident.detected.0.2.0", + "timestamp": "2022-11-11T13:52:20.079Z" }, "subject": { - "id": "incident-123", - "source": "/monitoring/prod1", - "type": "incident", - "content": { - "description": "Response time above threshold of 100ms", - "environment": { - "id": "prod1", - "source": "/iaas/geo1" - }, - "service": { - "id": "myApp", - "source": "/clusterA/namespaceB" - }, - "artifactId": "pkg:oci/myapp@sha256%3A0b31b1c02ff458ad9b7b81cbdf8f028bd54699fa151f221d1e8de6817db93427" - } + "id": "incident-123", + "source": "/monitoring/prod1", + "type": "incident", + "content": { + "description": "Response time above threshold of 100ms", + "environment": { + "id": "prod1", + "source": "/iaas/geo1" + }, + "service": { + "id": "myApp", + "source": "/clusterA/namespaceB" + }, + "artifactId": "pkg:oci/myapp@sha256%3A0b31b1c02ff458ad9b7b81cbdf8f028bd54699fa151f221d1e8de6817db93427" + } }, "customData": { "metric": "responseTime", diff --git a/examples/incident_reported.json b/examples/incident_reported.json index 00033a59..376111a6 100644 --- a/examples/incident_reported.json +++ b/examples/incident_reported.json @@ -1,29 +1,29 @@ { "context": { - "version": "0.4.0", - "id": "F4BD2B55-B6F6-4F44-AF72-BD2D0E7A8708", - "chainId": "4c8cb7dd-3448-41de-8768-eec704e2829b", - "source": "/monitoring/prod1", - "type": "dev.cdevents.incident.reported.0.2.0", - "timestamp": "2022-11-11T13:52:20.079Z" + "version": "0.4.0", + "id": "F4BD2B55-B6F6-4F44-AF72-BD2D0E7A8708", + "chainId": "4c8cb7dd-3448-41de-8768-eec704e2829b", + "source": "/monitoring/prod1", + "type": "dev.cdevents.incident.reported.0.2.0", + "timestamp": "2022-11-11T13:52:20.079Z" }, "subject": { - "id": "incident-123", - "source": "/monitoring/prod1", - "type": "incident", - "content": { - "description": "Response time above threshold of 100ms", - "environment": { - "id": "prod1", - "source": "/iaas/geo1" - }, - "service": { - "id": "myApp", - "source": "/clusterA/namespaceB" - }, - "artifactId": "pkg:oci/myapp@sha256%3A0b31b1c02ff458ad9b7b81cbdf8f028bd54699fa151f221d1e8de6817db93427", - "ticketURI": "https://my-issues.example/incidents/ticket-345" - } + "id": "incident-123", + "source": "/monitoring/prod1", + "type": "incident", + "content": { + "description": "Response time above threshold of 100ms", + "environment": { + "id": "prod1", + "source": "/iaas/geo1" + }, + "service": { + "id": "myApp", + "source": "/clusterA/namespaceB" + }, + "artifactId": "pkg:oci/myapp@sha256%3A0b31b1c02ff458ad9b7b81cbdf8f028bd54699fa151f221d1e8de6817db93427", + "ticketURI": "https://my-issues.example/incidents/ticket-345" + } }, "customData": { "severity": "medium", diff --git a/examples/incident_resolved.json b/examples/incident_resolved.json index 443afe3a..f62e735c 100644 --- a/examples/incident_resolved.json +++ b/examples/incident_resolved.json @@ -1,28 +1,28 @@ { "context": { - "version": "0.4.0", - "id": "F4BD2B55-B6F6-4F44-AF72-BD2D0E7A8708", - "chainId": "4c8cb7dd-3448-41de-8768-eec704e2829b", - "source": "/monitoring/prod1", - "type": "dev.cdevents.incident.resolved.0.2.0", - "timestamp": "2022-11-11T13:52:20.079Z" + "version": "0.4.0", + "id": "F4BD2B55-B6F6-4F44-AF72-BD2D0E7A8708", + "chainId": "4c8cb7dd-3448-41de-8768-eec704e2829b", + "source": "/monitoring/prod1", + "type": "dev.cdevents.incident.resolved.0.2.0", + "timestamp": "2022-11-11T13:52:20.079Z" }, "subject": { - "id": "incident-123", - "source": "/monitoring/prod1", - "type": "incident", - "content": { - "description": "Response time restored below 100ms", - "environment": { - "id": "prod1", - "source": "/iaas/geo1" - }, - "service": { - "id": "myApp", - "source": "/clusterA/namespaceB" - }, - "artifactId": "pkg:oci/myapp@sha256%3A0b31b1c02ff458ad9b7b81cbdf8f028bd54699fa151f221d1e8de6817db93439" - } + "id": "incident-123", + "source": "/monitoring/prod1", + "type": "incident", + "content": { + "description": "Response time restored below 100ms", + "environment": { + "id": "prod1", + "source": "/iaas/geo1" + }, + "service": { + "id": "myApp", + "source": "/clusterA/namespaceB" + }, + "artifactId": "pkg:oci/myapp@sha256%3A0b31b1c02ff458ad9b7b81cbdf8f028bd54699fa151f221d1e8de6817db93439" + } }, "customData": { "metric": "responseTime", diff --git a/examples/testcaserun_finished.json b/examples/testcaserun_finished.json index be854811..bdbeaaee 100644 --- a/examples/testcaserun_finished.json +++ b/examples/testcaserun_finished.json @@ -13,7 +13,7 @@ "source": "/event/source/123", "type": "testCaseRun", "content": { - "outcome" : "pass", + "outcome": "pass", "environment": { "id": "dev", "source": "testkube-dev-123" diff --git a/examples/testoutput_published.json b/examples/testoutput_published.json index 8fc7998d..794b9f80 100644 --- a/examples/testoutput_published.json +++ b/examples/testoutput_published.json @@ -13,8 +13,8 @@ "source": "/event/source/testrunreport-12123", "type": "testOutput", "content": { - "outputType" : "video", - "format" : "video/quicktime", + "outputType": "video", + "format": "video/quicktime", "testCaseRun": { "id": "myTestCaseRun123", "source": "testkube-dev-123" diff --git a/examples/testsuiterun_finished.json b/examples/testsuiterun_finished.json index 1d398a59..26326701 100644 --- a/examples/testsuiterun_finished.json +++ b/examples/testsuiterun_finished.json @@ -13,9 +13,9 @@ "source": "/event/source/123", "type": "testSuiteRun", "content": { - "outcome" : "fail", - "severity" : "critical", - "reason" : "Host 123.34.23.32 not found", + "outcome": "fail", + "severity": "critical", + "reason": "Host 123.34.23.32 not found", "environment": { "id": "dev", "source": "testkube-dev-123" diff --git a/schemas/servicedeployed.json b/schemas/servicedeployed.json index 74c0a214..f373cffc 100644 --- a/schemas/servicedeployed.json +++ b/schemas/servicedeployed.json @@ -117,8 +117,8 @@ "type": "object" }, { - "type": "string", - "contentEncoding": "base64" + "type": "string", + "contentEncoding": "base64" } ] },