-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathalias.ts
156 lines (125 loc) · 4.11 KB
/
alias.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
import {domainHasCorrectDNSRecords} from './domains';
import { exec, isRemove, logError, run } from './utils';
export default async (subcommand?: string, aliasOrDeploymentPrefix?: string, hostname?: string) => {
interface IRule {
host: string;
}
interface ITLS {
hosts: string[];
}
function hasExistingRuleFactory(host?: string) {
return function hasExistingRule(rule: IRule) {
return rule.host === host;
};
}
function hasExistingTLSFactory(host?: string) {
return function hasExistingTLS(tls: ITLS) {
if (!host) {
return false;
}
return tls.hosts.indexOf(host) !== -1;
};
}
if (!subcommand || subcommand === 'ls') {
await run('kubectl get ingress/snow-ingress -o=jsonpath=\"{\'Host\'} {\'<Deployment>\'}{\'\\n\'}{range .spec.rules[*]}{.host} {.http.paths[*].backend.serviceName}{\'\\n\'}{end}\" | column -t');
return;
}
if (subcommand === 'set') {
const deployment = aliasOrDeploymentPrefix;
if (!aliasOrDeploymentPrefix) {
logError('deployment (required): snow alias set <deployment> <alias>');
return;
}
if (!hostname) {
logError('alias (required): snow alias set <deployment> <alias>');
return;
}
// Verify the domain name has the correct DNS records.
try {
await domainHasCorrectDNSRecords(hostname);
} catch (e) {
return;
}
// Given a deployment name, verify both a deployment and service exist.
try {
await run(`kubectl get service/${deployment}`);
} catch (e) {
logError(`No service exists for deployment '${deployment}'`);
return;
}
try {
await run(`kubectl get deployment/${deployment}`);
} catch (e) {
logError(`No deployment exists for '${deployment}'`);
return;
}
// Fetch the ingress spec.
const { stdout } = await exec('kubectl get ingress/snow-ingress -o json');
const ingressSpec = JSON.parse(stdout).spec;
const rule = {
host: hostname,
http: {
paths: [
{
backend: {
serviceName: deployment,
servicePort: 8080
}
}
]
}
};
// See if an existing rule exists.
const ruleIndex = ingressSpec.rules.findIndex(hasExistingRuleFactory(hostname));
if (ruleIndex === -1) {
// No rule exists. Create one.
ingressSpec.rules.push(rule);
} else {
// Update existing rule.
ingressSpec.rules[ruleIndex] = rule;
}
if (!ingressSpec.tls) {
ingressSpec.tls = [];
}
// See if an existing TLS entry exists.
const tlsIndex = ingressSpec.tls.findIndex(hasExistingTLSFactory(hostname));
if (tlsIndex === -1) {
ingressSpec.tls.push({
hosts: [hostname],
secretName: hostname
});
}
const ingressPatchString = JSON.stringify({spec: ingressSpec});
// Patch the ingress resource.
await run(`kubectl patch ingress/snow-ingress --patch '${ingressPatchString}'`);
return;
}
if (isRemove(subcommand)) {
const alias = aliasOrDeploymentPrefix;
if (!alias) {
logError('alias (required): snow alias rm <alias>');
return;
}
// Fetch the ingress spec.
const { stdout } = await exec('kubectl get ingress/snow-ingress -o json');
const ingressSpec = JSON.parse(stdout).spec;
// See if an existing rule exists.
const ruleIndex = ingressSpec.rules.findIndex(hasExistingRuleFactory(alias));
if (ruleIndex !== -1) {
ingressSpec.rules.splice(ruleIndex, 1);
}
// See if an existing TLS entry exists.
const tlsIndex = ingressSpec.tls.findIndex(hasExistingTLSFactory(alias));
/* Only remove the TLS entry if it exists as a certificate with
* a single hostname (e.g., the certificate has no SANs).
*/
if (tlsIndex !== -1 && ingressSpec.tls[tlsIndex].hosts.length === 1) {
ingressSpec.tls.splice(tlsIndex, 1);
}
const ingressPatchString = JSON.stringify({spec: ingressSpec});
// Patch the ingress resource.
await run(`kubectl patch ingress/snow-ingress --patch '${ingressPatchString}'`);
return;
}
logError('Invalid usage');
};