UNPKG

cdk8s-operator

Version:

Create Kubernetes CRD Operators using CDK8s Constructs

87 lines 12.1 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.Operator = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const fs = require("fs"); const os = require("os"); const path = require("path"); const cdk8s_1 = require("cdk8s"); /** * A CDK8s app which allows implementing Kubernetes operators using CDK8s constructs. */ class Operator extends cdk8s_1.App { constructor(props = {}) { const outdir = fs.mkdtempSync(path.join(os.tmpdir(), 'cdk8s')); super({ outdir }); this.providers = []; this.inputFile = props.inputFile ?? process.argv[2] ?? '/dev/stdin'; this.outputFile = props.outputFile; } /** * Adds a custom resource provider to this operator. * @param provider The provider to add */ addProvider(provider) { this.providers.push(provider); } /** * Reads a Kubernetes manifest in JSON format from STDIN or the file specified * as the first positional command-line argument. This manifest is expected to * include a single Kubernetes resource. Then, we match `apiVersion` and * `kind` to one of the registered providers and if we do, we invoke * `apply()`, passing it the `spec` of the input manifest and a chart as a * scope. The chart is then synthesized and the output manifest is written to * STDOUT. */ synth() { const input = JSON.parse(fs.readFileSync(this.inputFile, 'utf-8')); let write; if (this.outputFile) { const outfile = this.outputFile; write = (data) => fs.writeFileSync(outfile, data); } else { write = (data) => process.stdout.write(data); } if (typeof (input) !== 'object') { throw new Error('input must be a single kubernetes resource'); } const provider = this.findProvider(input); const name = input.metadata?.name; if (!name) { throw new Error('"metadata.name" must be defined'); } const namespace = input.metadata?.namespace; // TODO: namespace const spec = input.spec ?? {}; const chart = new cdk8s_1.Chart(this, name, { namespace }); console.error(`Synthesizing ${input.kind}.${input.apiVersion}`); provider.handler.apply(chart, name, spec); super.synth(); for (const file of fs.readdirSync(this.outdir)) { const filepath = path.join(this.outdir, file); const manifest = fs.readFileSync(filepath); write(new Uint8Array(manifest)); } } findProvider(input) { const { apiVersion, kind } = input; if (!apiVersion) { throw new Error('"apiVersion" is required'); } if (!kind) { throw new Error('"kind" is required'); } for (const p of this.providers) { if (p.apiVersion === apiVersion && p.kind === kind) { return p; } } throw new Error(`No custom resource provider found for ${kind}.${apiVersion}`); } } exports.Operator = Operator; _a = JSII_RTTI_SYMBOL_1; Operator[_a] = { fqn: "cdk8s-operator.Operator", version: "0.1.429" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvb3BlcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5QkFBeUI7QUFDekIseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUU3QixpQ0FBbUM7QUFnRG5DOztHQUVHO0FBQ0gsTUFBYSxRQUFTLFNBQVEsV0FBRztJQU8vQixZQUFZLFFBQXVCLEVBQUU7UUFDbkMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQy9ELEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFFbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFFcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDO1FBQ3BFLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksV0FBVyxDQUFDLFFBQWdDO1FBQ2pELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLEtBQUs7UUFDVixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRW5FLElBQUksS0FBSyxDQUFDO1FBQ1YsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUNoQyxLQUFLLEdBQUcsQ0FBQyxJQUFnQixFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoRSxDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssR0FBRyxDQUFDLElBQWdCLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFFRCxJQUFJLE9BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFMUMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQztRQUU1QyxrQkFBa0I7UUFDbEIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFFOUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxhQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFFbkQsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUNoRSxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRTFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUVkLEtBQUssTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMvQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDOUMsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzQyxLQUFLLENBQUMsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQztJQUVPLFlBQVksQ0FBQyxLQUEyQztRQUM5RCxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQztRQUVuQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUVELEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxDQUFDLFVBQVUsS0FBSyxVQUFVLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDbkQsT0FBTyxDQUFDLENBQUM7WUFDWCxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLElBQUksSUFBSSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7O0FBN0ZILDRCQThGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IEFwcCwgQ2hhcnQgfSBmcm9tICdjZGs4cyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuLyoqXG4gKiBUaGUgaGFuZGxlciBmb3IgdGhpcyBjdXN0b20gcmVzb3VyY2UgcHJvdmlkZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUN1c3RvbVJlc291cmNlUHJvdmlkZXJIYW5kbGVyIHtcbiAgLy8gcmVhZG9ubHkgc2NoZW1hOiBhbnk7XG5cbiAgYXBwbHkoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgc3BlYzogYW55KTogQ29uc3RydWN0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbVJlc291cmNlUHJvdmlkZXIge1xuICAvKipcbiAgICogS2luZCBvZiB0aGlzIGN1c3RvbSByZXNvdXJjZS5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6IHN0cmluZztcblxuICAvKipcbiAgICogQVBJIHZlcnNpb24gb2YgdGhlIGN1c3RvbSByZXNvdXJjZS5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJ2MVwiXG4gICAqL1xuICByZWFkb25seSBhcGlWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25zdHJ1Y3QgaGFuZGxlci5cbiAgICovXG4gIHJlYWRvbmx5IGhhbmRsZXI6IElDdXN0b21SZXNvdXJjZVByb3ZpZGVySGFuZGxlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVyYXRvclByb3BzIHtcbiAgLyoqXG4gICAqIEEgS3ViZXJuZXRlcyBKU09OIG1hbmlmZXN0IHdpdGggYSBzaW5nbGUgcmVzb3VyY2UgdGhhdCBpcyBtYXRjaGVkIGFnYWluc3RcbiAgICogb25lIG9mIHRoZSBwcm92aWRlcnMgd2l0aGluIHRoaXMgb3BlcmF0b3IuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZmlyc3QgcG9zaXRpb24gY29tbWFuZC1saW5lIGFyZ3VtZW50IG9yIFwiL2Rldi9zdGRpblwiXG4gICAqL1xuICByZWFkb25seSBpbnB1dEZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRvIHdyaXRlIHRoZSBzeW50aGVzaXplZCBvdXRwdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiL2Rldi9zdGRvdXRcIlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0RmlsZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIENESzhzIGFwcCB3aGljaCBhbGxvd3MgaW1wbGVtZW50aW5nIEt1YmVybmV0ZXMgb3BlcmF0b3JzIHVzaW5nIENESzhzIGNvbnN0cnVjdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVyYXRvciBleHRlbmRzIEFwcCB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpbnB1dEZpbGU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvdXRwdXRGaWxlPzogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvdmlkZXJzOiBDdXN0b21SZXNvdXJjZVByb3ZpZGVyW107XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IE9wZXJhdG9yUHJvcHMgPSB7fSkge1xuICAgIGNvbnN0IG91dGRpciA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ2NkazhzJykpO1xuICAgIHN1cGVyKHsgb3V0ZGlyIH0pO1xuXG4gICAgdGhpcy5wcm92aWRlcnMgPSBbXTtcblxuICAgIHRoaXMuaW5wdXRGaWxlID0gcHJvcHMuaW5wdXRGaWxlID8/IHByb2Nlc3MuYXJndlsyXSA/PyAnL2Rldi9zdGRpbic7XG4gICAgdGhpcy5vdXRwdXRGaWxlID0gcHJvcHMub3V0cHV0RmlsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY3VzdG9tIHJlc291cmNlIHByb3ZpZGVyIHRvIHRoaXMgb3BlcmF0b3IuXG4gICAqIEBwYXJhbSBwcm92aWRlciBUaGUgcHJvdmlkZXIgdG8gYWRkXG4gICAqL1xuICBwdWJsaWMgYWRkUHJvdmlkZXIocHJvdmlkZXI6IEN1c3RvbVJlc291cmNlUHJvdmlkZXIpIHtcbiAgICB0aGlzLnByb3ZpZGVycy5wdXNoKHByb3ZpZGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIEt1YmVybmV0ZXMgbWFuaWZlc3QgaW4gSlNPTiBmb3JtYXQgZnJvbSBTVERJTiBvciB0aGUgZmlsZSBzcGVjaWZpZWRcbiAgICogYXMgdGhlIGZpcnN0IHBvc2l0aW9uYWwgY29tbWFuZC1saW5lIGFyZ3VtZW50LiBUaGlzIG1hbmlmZXN0IGlzIGV4cGVjdGVkIHRvXG4gICAqIGluY2x1ZGUgYSBzaW5nbGUgS3ViZXJuZXRlcyByZXNvdXJjZS4gVGhlbiwgd2UgbWF0Y2ggYGFwaVZlcnNpb25gIGFuZFxuICAgKiBga2luZGAgdG8gb25lIG9mIHRoZSByZWdpc3RlcmVkIHByb3ZpZGVycyBhbmQgaWYgd2UgZG8sIHdlIGludm9rZVxuICAgKiBgYXBwbHkoKWAsIHBhc3NpbmcgaXQgdGhlIGBzcGVjYCBvZiB0aGUgaW5wdXQgbWFuaWZlc3QgYW5kIGEgY2hhcnQgYXMgYVxuICAgKiBzY29wZS4gVGhlIGNoYXJ0IGlzIHRoZW4gc3ludGhlc2l6ZWQgYW5kIHRoZSBvdXRwdXQgbWFuaWZlc3QgaXMgd3JpdHRlbiB0b1xuICAgKiBTVERPVVQuXG4gICAqL1xuICBwdWJsaWMgc3ludGgoKSB7XG4gICAgY29uc3QgaW5wdXQgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0aGlzLmlucHV0RmlsZSwgJ3V0Zi04JykpO1xuXG4gICAgbGV0IHdyaXRlO1xuICAgIGlmICh0aGlzLm91dHB1dEZpbGUpIHtcbiAgICAgIGNvbnN0IG91dGZpbGUgPSB0aGlzLm91dHB1dEZpbGU7XG4gICAgICB3cml0ZSA9IChkYXRhOiBVaW50OEFycmF5KSA9PiBmcy53cml0ZUZpbGVTeW5jKG91dGZpbGUsIGRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3cml0ZSA9IChkYXRhOiBVaW50OEFycmF5KSA9PiBwcm9jZXNzLnN0ZG91dC53cml0ZShkYXRhKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mKGlucHV0KSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW5wdXQgbXVzdCBiZSBhIHNpbmdsZSBrdWJlcm5ldGVzIHJlc291cmNlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLmZpbmRQcm92aWRlcihpbnB1dCk7XG5cbiAgICBjb25zdCBuYW1lID0gaW5wdXQubWV0YWRhdGE/Lm5hbWU7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wibWV0YWRhdGEubmFtZVwiIG11c3QgYmUgZGVmaW5lZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IG5hbWVzcGFjZSA9IGlucHV0Lm1ldGFkYXRhPy5uYW1lc3BhY2U7XG5cbiAgICAvLyBUT0RPOiBuYW1lc3BhY2VcbiAgICBjb25zdCBzcGVjID0gaW5wdXQuc3BlYyA/PyB7fTtcblxuICAgIGNvbnN0IGNoYXJ0ID0gbmV3IENoYXJ0KHRoaXMsIG5hbWUsIHsgbmFtZXNwYWNlIH0pO1xuXG4gICAgY29uc29sZS5lcnJvcihgU3ludGhlc2l6aW5nICR7aW5wdXQua2luZH0uJHtpbnB1dC5hcGlWZXJzaW9ufWApO1xuICAgIHByb3ZpZGVyLmhhbmRsZXIuYXBwbHkoY2hhcnQsIG5hbWUsIHNwZWMpO1xuXG4gICAgc3VwZXIuc3ludGgoKTtcblxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmcy5yZWFkZGlyU3luYyh0aGlzLm91dGRpcikpIHtcbiAgICAgIGNvbnN0IGZpbGVwYXRoID0gcGF0aC5qb2luKHRoaXMub3V0ZGlyLCBmaWxlKTtcbiAgICAgIGNvbnN0IG1hbmlmZXN0ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVwYXRoKTtcbiAgICAgIHdyaXRlKG5ldyBVaW50OEFycmF5KG1hbmlmZXN0KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaW5kUHJvdmlkZXIoaW5wdXQ6IHsga2luZDogc3RyaW5nOyBhcGlWZXJzaW9uOiBzdHJpbmcgfSkge1xuICAgIGNvbnN0IHsgYXBpVmVyc2lvbiwga2luZCB9ID0gaW5wdXQ7XG5cbiAgICBpZiAoIWFwaVZlcnNpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignXCJhcGlWZXJzaW9uXCIgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoIWtpbmQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignXCJraW5kXCIgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHAgb2YgdGhpcy5wcm92aWRlcnMpIHtcbiAgICAgIGlmIChwLmFwaVZlcnNpb24gPT09IGFwaVZlcnNpb24gJiYgcC5raW5kID09PSBraW5kKSB7XG4gICAgICAgIHJldHVybiBwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgTm8gY3VzdG9tIHJlc291cmNlIHByb3ZpZGVyIGZvdW5kIGZvciAke2tpbmR9LiR7YXBpVmVyc2lvbn1gKTtcbiAgfVxufVxuXG4iXX0=