Skip to content

Commit 1e89034

Browse files
committed
feat: add custom kubernetes schema support
1 parent d3e36a3 commit 1e89034

File tree

2 files changed

+39
-8
lines changed

2 files changed

+39
-8
lines changed

src/languageserver/handlers/settingsHandlers.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ export class SettingsHandler {
323323
* @param languageSettings current server settings
324324
*/
325325
// eslint-disable-next-line @typescript-eslint/no-explicit-any
326-
private configureSchemas(
326+
public configureSchemas(
327327
uri: string,
328328
fileMatch: string[],
329329
schema: unknown,
@@ -338,12 +338,14 @@ export class SettingsHandler {
338338
languageSettings.schemas.push({ uri, fileMatch: fileMatch, schema: schema, priority: priorityLevel });
339339
}
340340

341-
if (fileMatch.constructor === Array && uri === KUBERNETES_SCHEMA_URL) {
342-
fileMatch.forEach((url) => {
343-
this.yamlSettings.specificValidatorPaths.push(url);
344-
});
345-
} else if (uri === KUBERNETES_SCHEMA_URL) {
346-
this.yamlSettings.specificValidatorPaths.push(fileMatch);
341+
if (uri.normalize().includes("kubernetes")) {
342+
if (fileMatch.constructor === Array) {
343+
fileMatch.forEach((url) => {
344+
this.yamlSettings.specificValidatorPaths.push(url);
345+
});
346+
} else {
347+
this.yamlSettings.specificValidatorPaths.push(fileMatch);
348+
}
347349
}
348350

349351
return languageSettings;

test/schemaValidation.test.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@ import { Diagnostic, DiagnosticSeverity, Position } from 'vscode-languageserver-
2222
import { expect } from 'chai';
2323
import { SettingsState, TextDocumentTestManager } from '../src/yamlSettings';
2424
import { ValidationHandler } from '../src/languageserver/handlers/validationHandlers';
25-
import { LanguageService } from '../src/languageservice/yamlLanguageService';
25+
import { LanguageService, SchemaPriority } from '../src/languageservice/yamlLanguageService';
2626
import { KUBERNETES_SCHEMA_URL } from '../src/languageservice/utils/schemaUrls';
2727
import { IProblem } from '../src/languageservice/parser/jsonParser07';
2828
import { JSONSchema } from '../src/languageservice/jsonSchema';
2929
import { TestTelemetry } from './utils/testsTypes';
30+
import { SettingsHandler } from '../src/languageserver/handlers/settingsHandlers';
31+
import { Connection } from 'vscode-languageserver';
3032

3133
describe('Validation Tests', () => {
3234
let languageSettingsSetup: ServiceSetup;
@@ -1902,5 +1904,32 @@ obj:
19021904
expect(result[0].message).to.eq('Matches multiple schemas when only one must validate.');
19031905
expect(telemetry.messages).to.be.empty;
19041906
});
1907+
1908+
it('custom kubernetes schema should return validation errors', (done) => {
1909+
const settingsHandler = new SettingsHandler(
1910+
{} as Connection,
1911+
languageService,
1912+
yamlSettings,
1913+
validationHandler,
1914+
telemetry
1915+
);
1916+
const initialSettings = languageSettingsSetup.withKubernetes(true).languageSettings;
1917+
const kubernetesSettings = settingsHandler.configureSchemas(
1918+
'https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.26.1-standalone-strict/all.json',
1919+
['**'],
1920+
undefined,
1921+
initialSettings,
1922+
SchemaPriority.SchemaAssociation
1923+
);
1924+
languageService.configure(kubernetesSettings);
1925+
const content = `apiVersion: apps/v1\nkind: Deployment\nfoo: bar`;
1926+
const validator = parseSetup(content);
1927+
validator
1928+
.then(function (result) {
1929+
assert.equal(result.length, 1);
1930+
// eslint-disable-next-line
1931+
assert.equal(result[0].message, `Property foo is not allowed.`);
1932+
}).then(done, done);
1933+
});
19051934
});
19061935
});

0 commit comments

Comments
 (0)