-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
115 lines (97 loc) · 3.29 KB
/
index.js
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
import k8s from "@kubernetes/client-node";
import _ from "lodash";
import { customAlphabet } from "nanoid";
import fs from "fs/promises";
import path from "path";
import { fileURLToPath } from "url";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const kc = new k8s.KubeConfig();
kc.loadFromDefault();
const k8sApi = kc.makeApiClient(k8s.CoreV1Api);
// Only lowercase alphanumeric
const alphabet = "0123456789abcdefghijklmnopqrstuvwxyz";
const nanoid = customAlphabet(alphabet);
// Input files
const externalDomainsFile = 'external-domains.txt';
const internalSvcDomainsFile = "internal-svc-generated-domains.txt";
const internalUndefinedSvcDomainsFile = "internal-svc-undefined-domains.txt";
const main = async () => {
try {
const numberOfServices = 500;
const namespaceName = "coredns-services";
const ns = await k8sApi
.createNamespace({
metadata: { name: namespaceName },
})
.catch((e) => {
if (e.statusCode === 409) {
console.log("Namespace already exists");
return e;
}
throw new e();
});
const internalDomainContents = await generateAndCreateServices(namespaceName, numberOfServices);
const internalUndefinedDomainContents = await generateUndefinedServices(numberOfServices);
await mergeDomainFiles(
internalDomainContents,
internalUndefinedDomainContents
);
} catch (err) {
console.error(err);
}
};
const generateAndCreateServices = async (namespaceName, numberOfServices) => {
const svcsCreated = await k8sApi.listNamespacedService(namespaceName);
let serviceNames = [];
if (svcsCreated.body.items.length > 0) {
console.log(
`There are already ${svcsCreated.body.items.length} svcs created`
);
serviceNames = svcsCreated.body.items.map((svc) => svc.metadata.name);
} else {
serviceNames = generateRandomServiceNames(numberOfServices);
await Promise.all(
serviceNames.map((svcName) =>
k8sApi.createNamespacedService(namespaceName, {
metadata: { name: svcName },
spec: { ports: [{ port: 8080, protocol: "TCP" }] },
})
)
);
}
const fileContents = serviceNames.reduce(
(domains, d) => `${domains}${d}.${namespaceName}.svc.cluster.local A\n`,
""
)
await fs.writeFile(
path.join(__dirname, internalSvcDomainsFile),
fileContents
);
return fileContents;
};
const generateUndefinedServices = async (numberOfServices) => {
const undefinedServiceNames = generateRandomServiceNames(numberOfServices);
const fileContents = undefinedServiceNames.reduce(
(domains, d) => `${domains}${d}.undefined-namespace.svc.cluster.local A\n`,
""
)
await fs.writeFile(
path.join(__dirname, internalUndefinedSvcDomainsFile),
fileContents
);
return fileContents;
};
const mergeDomainFiles = async (internalDomainContents, internalUndefinedDomainContents) => {
const externalDomainContents = await fs.readFile(
path.join(__dirname, externalDomainsFile)
);
await fs.writeFile(
path.join(__dirname, "generated-file.txt"),
`${externalDomainContents}${internalDomainContents}${internalUndefinedDomainContents}`
);
}
const generateRandomServiceNames = (svcCount) => {
return _.times(svcCount, () => `coredns-svc-${nanoid()}`);
};
main();