cdk8s-operator
Version:
Create Kubernetes CRD Operators using CDK8s Constructs
87 lines • 12.1 kB
JavaScript
;
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=