From 9b53f7d976279bce8ae54efe74b0cce2587fb149 Mon Sep 17 00:00:00 2001 From: Florian Fordermaier Date: Sun, 15 Dec 2019 11:57:08 +0100 Subject: [PATCH] Initial commit --- .gitignore | 2 + README.md | 3 ++ package-lock.json | 20 +++++++ package.json | 21 ++++++++ src/IDisposable.ts | 14 +++++ src/TempYaml.ts | 22 ++++++++ src/cert-manager/v0.12.0/certificate.ts | 30 +++++++++++ src/cert-manager/v0.12.0/clusterissuer.ts | 66 +++++++++++++++++++++++ tsconfig.json | 11 ++++ 9 files changed, 189 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/IDisposable.ts create mode 100644 src/TempYaml.ts create mode 100644 src/cert-manager/v0.12.0/certificate.ts create mode 100644 src/cert-manager/v0.12.0/clusterissuer.ts create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ca54677 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/lib/ +/node_modules/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..1aa1519 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# pulumix + +My own extensions and helpers for use with pulumi. \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..07b8d0e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,20 @@ +{ + "name": "pulumix", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/node": { + "version": "8.10.59", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.59.tgz", + "integrity": "sha512-8RkBivJrDCyPpBXhVZcjh7cQxVBSmRk9QM7hOketZzp6Tg79c0N8kkpAIito9bnJ3HCVCHVYz+KHTEbfQNfeVQ==", + "dev": true + }, + "typescript": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.3.tgz", + "integrity": "sha512-Mcr/Qk7hXqFBXMN7p7Lusj1ktCBydylfQM/FZCk5glCNQJrCUKPkMHdo9R0MTFWsC/4kPFvDS0fDPvukfCkFsw==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..59c6de0 --- /dev/null +++ b/package.json @@ -0,0 +1,21 @@ +{ + "name": "pulumix", + "version": "1.0.0", + "description": "Some simple extensions and helpers for use with pulumi.", + "main": "index.js", + "scripts": { + "build": "tsc" + }, + "homepage": "https://github.com/codedevote/pulumix", + "repository": { + "type": "git", + "url": "https://github.com/codedevote/pulumix.git" + }, + "author": "codedevote@gmail.com", + "license": "MIT", + "devDependencies": { + "@types/node": "^8.10.59", + "typescript": "^3.7.3" + }, + "files": ["lib/**/*"] +} diff --git a/src/IDisposable.ts b/src/IDisposable.ts new file mode 100644 index 0000000..1c6b609 --- /dev/null +++ b/src/IDisposable.ts @@ -0,0 +1,14 @@ +interface IDisposable { + dispose() : void; +} + +function using(resource: T, func: (resource: T) => void) { + try { + func(resource); + } finally { + resource.dispose(); + } +} + +export default IDisposable; +export { IDisposable, using }; \ No newline at end of file diff --git a/src/TempYaml.ts b/src/TempYaml.ts new file mode 100644 index 0000000..5e2e706 --- /dev/null +++ b/src/TempYaml.ts @@ -0,0 +1,22 @@ +import * as fs from "fs" +import * as path from "path"; +import { IDisposable } from "./IDisposable" + +class TempYaml implements IDisposable { + + fileName : string; + dir : string; + + constructor(yaml: string) { + this.dir = fs.mkdtempSync("sarooma"); + this.fileName = path.join(this.dir, "temp.yaml"); + fs.writeFileSync(this.fileName, yaml); + } + + dispose() { + fs.unlinkSync(this.fileName); + fs.rmdirSync(this.dir); + } +} + +export default TempYaml; diff --git a/src/cert-manager/v0.12.0/certificate.ts b/src/cert-manager/v0.12.0/certificate.ts new file mode 100644 index 0000000..ce2c0fe --- /dev/null +++ b/src/cert-manager/v0.12.0/certificate.ts @@ -0,0 +1,30 @@ +import TempYaml from "../../TempYaml" + +class Certificate { + /** + * Creates a ClusterIssuer resource using letsencrypt staging servers and returns the yaml as string. + * + * @param name Name of the cluster issuer resource + */ + public createCertificate(certName: string, namespace: string, dnsName: string, clusterIssuer: string) : TempYaml { + + var certificateTemplate = +`apiVersion: cert-manager.io/v1alpha2 +kind: Certificate +metadata: + name: ${certName} + namespace: ${namespace} +spec: + secretName: ${certName} + commonName: ${dnsName} + dnsNames: + - ${dnsName} + issuerRef: + name: ${clusterIssuer} + kind: ClusterIssuer`; + + return new TempYaml(certificateTemplate); + } +} + +export default Certificate; \ No newline at end of file diff --git a/src/cert-manager/v0.12.0/clusterissuer.ts b/src/cert-manager/v0.12.0/clusterissuer.ts new file mode 100644 index 0000000..9c7ac96 --- /dev/null +++ b/src/cert-manager/v0.12.0/clusterissuer.ts @@ -0,0 +1,66 @@ +import TempYaml from "../../TempYaml" + +class ClusterIssuer { + + /** + * Creates a ClusterIssuer resource using letsencrypt staging servers and returns the yaml as string. + * + * @param name Name of the cluster issuer resource + */ + public createForStaging(name: String) : TempYaml { + return this.createYaml(name, true); + } + + /** + * Creates a ClusterIssuer resource using letsencrypt production servers and returns the yaml as string. + * + * @param name Name of the cluster issuer resource + */ + public createForProd(name: String) : TempYaml { + return this.createYaml(name, false); + } + + private createYaml(name: String, forStaging: Boolean) : TempYaml { + const acmeServer = + forStaging + ? "https://acme-staging-v02.api.letsencrypt.org/directory" + : "https://acme-v02.api.letsencrypt.org/directory"; + + const clusterIssuerTemplate = +`apiVersion: cert-manager.io/v1alpha2 +kind: ClusterIssuer +metadata: + name: ${name} + namespace: default +spec: + acme: + server: ${acmeServer} + email: support@sarooma.de + privateKeySecretRef: + name: ${name} + + # this is the 'new' way of defining solvers + solvers: + # empty selector will match all Certificate resources that reference this issuer. + # for selecting a specific solver from a Certificate resource (not required right now), see + # https://docs.cert-manager.io/en/latest/tasks/upgrading/upgrading-0.7-0.8.html#performing-an-incremental-switch-to-the-new-format + - selector: {} + dns01: + digitalocean: + tokenSecretRef: + name: dns01-solver-secret + key: token + - selector: + matchLabels: + use-http01-solver: "true" + http01: + ingress: + class: nginx`; + + return new TempYaml(clusterIssuerTemplate); + } +} + +export default ClusterIssuer; +export { ClusterIssuer }; + diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..1c147d9 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "target": "es2016", + "module": "commonjs", + "declaration": true, + "outDir": "./lib", + "strict": true + }, + "include": ["src"], + "exclude": ["node_modules", "**/__tests__/*"] + } \ No newline at end of file