terrafaker 0.0.0 → 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -9
- package/dist/commands/generate/file.js +11 -9
- package/dist/commands/generate/repo.js +7 -3
- package/dist/constants/azure.d.ts +138 -0
- package/dist/constants/azure.js +187 -0
- package/dist/enums/providers.d.ts +1 -0
- package/dist/enums/providers.js +1 -0
- package/dist/enums/resource-types.d.ts +11 -0
- package/dist/enums/resource-types.js +8 -0
- package/dist/utilities/generators/aws-generator.d.ts +9 -0
- package/dist/utilities/generators/aws-generator.js +68 -0
- package/dist/utilities/generators/azure-generator.d.ts +7 -0
- package/dist/utilities/generators/azure-generator.js +46 -0
- package/dist/utilities/generators/file-generator.d.ts +12 -0
- package/dist/utilities/generators/file-generator.js +13 -0
- package/dist/utilities/generators/gcp-generator.d.ts +7 -0
- package/dist/utilities/generators/gcp-generator.js +53 -0
- package/dist/utilities/generators/generator-utils.d.ts +2 -57
- package/dist/utilities/generators/generator-utils.js +1 -32
- package/dist/utilities/generators/provider-generator-factory.d.ts +8 -0
- package/dist/utilities/generators/provider-generator-factory.js +18 -0
- package/dist/utilities/generators/provider-generator.d.ts +22 -0
- package/dist/utilities/generators/provider-generator.js +31 -0
- package/dist/utilities/generators/repo-generator.d.ts +39 -0
- package/dist/utilities/generators/repo-generator.js +31 -0
- package/dist/utilities/string-utils.d.ts +2 -1
- package/dist/utilities/string-utils.js +2 -1
- package/oclif.manifest.json +5 -3
- package/package.json +6 -3
- package/dist/utilities/generators/aws-generators.d.ts +0 -4
- package/dist/utilities/generators/aws-generators.js +0 -80
- package/dist/utilities/generators/gcp-generators.d.ts +0 -4
- package/dist/utilities/generators/gcp-generators.js +0 -69
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { AWS_INSTANCE_TYPES } from "../../constants/aws.js";
|
|
2
|
+
import { AZURE_LAMBDA_RUNTIMES, AZURE_REGIONS } from "../../constants/azure.js";
|
|
3
|
+
import { randomEnvironmentTag, randomItem, randomMemorableSlug, randomMemorySize, randomServiceTag, } from "./generator-utils.js";
|
|
4
|
+
import { ProviderGenerator } from "./provider-generator.js";
|
|
5
|
+
const AzureResourceType = {
|
|
6
|
+
ComputeInstance: "azurerm_linux_virtual_machine",
|
|
7
|
+
LambdaFunction: "azurerm_linux_function_app",
|
|
8
|
+
};
|
|
9
|
+
class AzureGenerator extends ProviderGenerator {
|
|
10
|
+
addProvider() {
|
|
11
|
+
const region = randomItem(AZURE_REGIONS);
|
|
12
|
+
this.tfg.provider("azurerm", { region });
|
|
13
|
+
}
|
|
14
|
+
addComputeInstance() {
|
|
15
|
+
const name = randomMemorableSlug();
|
|
16
|
+
const environment = randomEnvironmentTag();
|
|
17
|
+
const service = randomServiceTag();
|
|
18
|
+
const instanceType = randomItem(AWS_INSTANCE_TYPES);
|
|
19
|
+
this.tfg.resource(AzureResourceType.ComputeInstance, name, {
|
|
20
|
+
size: instanceType,
|
|
21
|
+
tags: { name, environment, service },
|
|
22
|
+
});
|
|
23
|
+
return this;
|
|
24
|
+
}
|
|
25
|
+
addLambdaFunction() {
|
|
26
|
+
const name = randomMemorableSlug();
|
|
27
|
+
const environment = randomEnvironmentTag();
|
|
28
|
+
const service = randomServiceTag();
|
|
29
|
+
const runtime = randomItem(AZURE_LAMBDA_RUNTIMES);
|
|
30
|
+
// There's a lot of different configurations listed, so just guessing here.
|
|
31
|
+
// https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale
|
|
32
|
+
const instanceMemoryInMb = randomMemorySize({
|
|
33
|
+
min: 128,
|
|
34
|
+
max: 4 * 1024,
|
|
35
|
+
step: 128,
|
|
36
|
+
});
|
|
37
|
+
this.tfg.resource(AzureResourceType.LambdaFunction, name, {
|
|
38
|
+
...runtime,
|
|
39
|
+
name,
|
|
40
|
+
instance_memory_in_mb: instanceMemoryInMb,
|
|
41
|
+
labels: { name, environment, service },
|
|
42
|
+
});
|
|
43
|
+
return this;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export { AzureGenerator };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type Provider } from "../../enums/providers.js";
|
|
2
|
+
interface GenerateOptions {
|
|
3
|
+
provider?: Provider;
|
|
4
|
+
directory?: string;
|
|
5
|
+
fileName?: string;
|
|
6
|
+
format?: boolean;
|
|
7
|
+
resourceCount?: number;
|
|
8
|
+
}
|
|
9
|
+
declare class FileGenerator {
|
|
10
|
+
static generate(options: GenerateOptions): void;
|
|
11
|
+
}
|
|
12
|
+
export { FileGenerator };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { randomProvider } from "./generator-utils.js";
|
|
2
|
+
import { ProviderGeneratorFactory } from "./provider-generator-factory.js";
|
|
3
|
+
class FileGenerator {
|
|
4
|
+
static generate(options) {
|
|
5
|
+
const { provider = randomProvider(), resourceCount = 3, fileName, directory, format, } = options;
|
|
6
|
+
const generator = ProviderGeneratorFactory.get(provider);
|
|
7
|
+
for (let i = 0; i < resourceCount; i++) {
|
|
8
|
+
generator.addRandomResource();
|
|
9
|
+
}
|
|
10
|
+
generator.writeToFile({ fileName, directory, format });
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export { FileGenerator };
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { GCP_GPU_MACHINE_TYPES, GCP_INSTANCE_TYPES, GCP_LAMBDA_RUNTIMES, GCP_REGIONS, } from "../../constants/gcp.js";
|
|
2
|
+
import { maybe, randomEnvironmentTag, randomInt, randomItem, randomMemorableSlug, randomMemorySize, randomServiceTag, } from "./generator-utils.js";
|
|
3
|
+
import { ProviderGenerator } from "./provider-generator.js";
|
|
4
|
+
const GcpResourceType = {
|
|
5
|
+
ComputeInstance: "google_compute_instance",
|
|
6
|
+
LambdaFunction: "google_cloudfunctions_function",
|
|
7
|
+
};
|
|
8
|
+
class GcpGenerator extends ProviderGenerator {
|
|
9
|
+
addProvider() {
|
|
10
|
+
const region = randomItem(GCP_REGIONS);
|
|
11
|
+
this.tfg.provider("google", { region });
|
|
12
|
+
}
|
|
13
|
+
addComputeInstance() {
|
|
14
|
+
const name = randomMemorableSlug();
|
|
15
|
+
const environment = randomEnvironmentTag();
|
|
16
|
+
const service = randomServiceTag();
|
|
17
|
+
const machineType = randomItem(GCP_INSTANCE_TYPES);
|
|
18
|
+
const guestAccelerator = maybe(0.5)
|
|
19
|
+
? {
|
|
20
|
+
guest_accelerator: {
|
|
21
|
+
type: randomItem(GCP_GPU_MACHINE_TYPES),
|
|
22
|
+
count: randomInt({ min: 1, max: 4 }),
|
|
23
|
+
},
|
|
24
|
+
}
|
|
25
|
+
: {};
|
|
26
|
+
this.tfg.resource(GcpResourceType.ComputeInstance, name, {
|
|
27
|
+
machine_type: machineType,
|
|
28
|
+
...guestAccelerator,
|
|
29
|
+
labels: { name, environment, service },
|
|
30
|
+
});
|
|
31
|
+
return this;
|
|
32
|
+
}
|
|
33
|
+
addLambdaFunction() {
|
|
34
|
+
const name = randomMemorableSlug();
|
|
35
|
+
const environment = randomEnvironmentTag();
|
|
36
|
+
const service = randomServiceTag();
|
|
37
|
+
const runtime = randomItem(GCP_LAMBDA_RUNTIMES);
|
|
38
|
+
// @see https://docs.cloud.google.com/run/docs/configuring/services/memory-limits
|
|
39
|
+
const availableMemoryMb = randomMemorySize({
|
|
40
|
+
min: 128,
|
|
41
|
+
max: 32 * 1024,
|
|
42
|
+
step: 128,
|
|
43
|
+
});
|
|
44
|
+
this.tfg.resource(GcpResourceType.LambdaFunction, name, {
|
|
45
|
+
runtime,
|
|
46
|
+
name,
|
|
47
|
+
available_memory_mb: availableMemoryMb,
|
|
48
|
+
labels: { name, environment, service },
|
|
49
|
+
});
|
|
50
|
+
return this;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export { GcpGenerator };
|
|
@@ -1,22 +1,11 @@
|
|
|
1
|
-
import type { TerraformGenerator } from "terraform-generator";
|
|
2
|
-
import type { Provider } from "../../enums/providers.js";
|
|
3
1
|
type StringGenerator = () => string;
|
|
4
|
-
interface ResourceGeneratorOptions {
|
|
5
|
-
tfg: TerraformGenerator;
|
|
6
|
-
environment?: string;
|
|
7
|
-
service?: string;
|
|
8
|
-
}
|
|
9
|
-
interface FileGeneratorOptions {
|
|
10
|
-
resourceCount?: number;
|
|
11
|
-
environment?: string;
|
|
12
|
-
}
|
|
13
2
|
/**
|
|
14
3
|
* Wraps a generator function to ensure the values it returns are not reused within the program runtime
|
|
15
4
|
*/
|
|
16
5
|
declare function unique(generator: StringGenerator): StringGenerator;
|
|
17
6
|
declare const randomMemorableSlug: StringGenerator;
|
|
18
7
|
declare const randomItem: <T>(values: T[]) => T;
|
|
19
|
-
declare const randomProvider: () => "aws" | "gcp";
|
|
8
|
+
declare const randomProvider: () => "aws" | "gcp" | "azure";
|
|
20
9
|
declare const randomId: StringGenerator;
|
|
21
10
|
declare const randomEnvironmentTag: () => string;
|
|
22
11
|
declare const randomServiceTag: () => string;
|
|
@@ -33,48 +22,4 @@ declare const randomInt: (options: RandomIntOptions) => number;
|
|
|
33
22
|
* Returns true/false depending on the provided probability (0 to 1)
|
|
34
23
|
*/
|
|
35
24
|
declare const maybe: (probability: number) => boolean;
|
|
36
|
-
|
|
37
|
-
provider: Provider;
|
|
38
|
-
}
|
|
39
|
-
declare const generateFileByProvider: (options: GenerateFileByProviderOptions) => TerraformGenerator;
|
|
40
|
-
interface GenerateRepoOptions {
|
|
41
|
-
/**
|
|
42
|
-
* Provider to generate a terraform file for.
|
|
43
|
-
*/
|
|
44
|
-
provider: Provider;
|
|
45
|
-
/**
|
|
46
|
-
* Environment to use for tags, etc.
|
|
47
|
-
*/
|
|
48
|
-
environment?: string;
|
|
49
|
-
/**
|
|
50
|
-
* Whether the terraform files should be formatted. Requires `terraform` to be installed.
|
|
51
|
-
*/
|
|
52
|
-
format: boolean;
|
|
53
|
-
/**
|
|
54
|
-
* Prefix for the repo
|
|
55
|
-
*/
|
|
56
|
-
prefix: string;
|
|
57
|
-
/**
|
|
58
|
-
* Directory to generate the repo in
|
|
59
|
-
*/
|
|
60
|
-
directory: string;
|
|
61
|
-
/**
|
|
62
|
-
* Number of files to generate
|
|
63
|
-
*/
|
|
64
|
-
fileCount: number;
|
|
65
|
-
/**
|
|
66
|
-
* Number of resources per file to generate
|
|
67
|
-
*/
|
|
68
|
-
resourceCount: number;
|
|
69
|
-
/**
|
|
70
|
-
* Whether output from the commands should be silenced
|
|
71
|
-
*/
|
|
72
|
-
quiet?: boolean;
|
|
73
|
-
}
|
|
74
|
-
interface GenerateRepoResult {
|
|
75
|
-
name: string;
|
|
76
|
-
path: string;
|
|
77
|
-
}
|
|
78
|
-
declare const generateRepo: (options: GenerateRepoOptions) => Promise<GenerateRepoResult>;
|
|
79
|
-
export type { FileGeneratorOptions, ResourceGeneratorOptions, StringGenerator };
|
|
80
|
-
export { generateFileByProvider, generateRepo, maybe, randomEnvironmentTag, randomId, randomInt, randomItem, randomMemorableSlug, randomMemorySize, randomProvider, randomServiceTag, unique, };
|
|
25
|
+
export { maybe, randomEnvironmentTag, randomId, randomInt, randomItem, randomMemorableSlug, randomMemorySize, randomProvider, randomServiceTag, unique, };
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
import { faker } from "@faker-js/faker";
|
|
2
2
|
import { snakeSlugify } from "../string-utils.js";
|
|
3
3
|
import { ENVIRONMENT_TAGS, SERVICE_TAGS } from "../../constants/tags.js";
|
|
4
|
-
import { mkdir } from "node:fs/promises";
|
|
5
|
-
import path from "node:path";
|
|
6
|
-
import { generateAwsFile } from "./aws-generators.js";
|
|
7
|
-
import { $ } from "zx";
|
|
8
|
-
import { generateGcpFile } from "./gcp-generators.js";
|
|
9
4
|
import { Providers } from "../../enums/providers.js";
|
|
10
5
|
import { range } from "lodash-es";
|
|
11
6
|
/**
|
|
@@ -43,30 +38,4 @@ const randomInt = (options) => {
|
|
|
43
38
|
* Returns true/false depending on the provided probability (0 to 1)
|
|
44
39
|
*/
|
|
45
40
|
const maybe = (probability) => Math.random() < probability;
|
|
46
|
-
|
|
47
|
-
const { provider, ...rest } = options;
|
|
48
|
-
switch (provider) {
|
|
49
|
-
case Providers.GCP:
|
|
50
|
-
return generateGcpFile(rest);
|
|
51
|
-
default:
|
|
52
|
-
case Providers.AWS:
|
|
53
|
-
return generateAwsFile(rest);
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
const generateRepo = async (options) => {
|
|
57
|
-
const { provider, format, prefix, fileCount, resourceCount, quiet } = options;
|
|
58
|
-
const directory = path.resolve(process.cwd(), options.directory);
|
|
59
|
-
const repoName = `${prefix}${randomMemorableSlug()}`;
|
|
60
|
-
const repoPath = path.join(directory, repoName);
|
|
61
|
-
const sh = $({ cwd: repoPath, stdio: quiet ? "ignore" : "inherit" });
|
|
62
|
-
await mkdir(repoPath);
|
|
63
|
-
await sh `git init`;
|
|
64
|
-
for (let i = 0; i < fileCount; i++) {
|
|
65
|
-
const tfFilename = `${randomMemorableSlug()}.tf`;
|
|
66
|
-
const tfg = generateFileByProvider({ provider, resourceCount });
|
|
67
|
-
tfg.write({ format, dir: repoPath, tfFilename });
|
|
68
|
-
}
|
|
69
|
-
await sh `git add . && git commit -m "initial commit"`;
|
|
70
|
-
return { name: repoName, path: repoPath };
|
|
71
|
-
};
|
|
72
|
-
export { generateFileByProvider, generateRepo, maybe, randomEnvironmentTag, randomId, randomInt, randomItem, randomMemorableSlug, randomMemorySize, randomProvider, randomServiceTag, unique, };
|
|
41
|
+
export { maybe, randomEnvironmentTag, randomId, randomInt, randomItem, randomMemorableSlug, randomMemorySize, randomProvider, randomServiceTag, unique, };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Provider } from "../../enums/providers.js";
|
|
2
|
+
import { AwsGenerator } from "./aws-generator.js";
|
|
3
|
+
import { AzureGenerator } from "./azure-generator.js";
|
|
4
|
+
import { GcpGenerator } from "./gcp-generator.js";
|
|
5
|
+
declare class ProviderGeneratorFactory {
|
|
6
|
+
static get(provider: Provider): AwsGenerator | AzureGenerator | GcpGenerator;
|
|
7
|
+
}
|
|
8
|
+
export { ProviderGeneratorFactory };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Providers } from "../../enums/providers.js";
|
|
2
|
+
import { AwsGenerator } from "./aws-generator.js";
|
|
3
|
+
import { AzureGenerator } from "./azure-generator.js";
|
|
4
|
+
import { GcpGenerator } from "./gcp-generator.js";
|
|
5
|
+
class ProviderGeneratorFactory {
|
|
6
|
+
static get(provider) {
|
|
7
|
+
switch (provider) {
|
|
8
|
+
case Providers.Azure:
|
|
9
|
+
return new AzureGenerator();
|
|
10
|
+
case Providers.GCP:
|
|
11
|
+
return new GcpGenerator();
|
|
12
|
+
default:
|
|
13
|
+
case Providers.AWS:
|
|
14
|
+
return new AwsGenerator();
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export { ProviderGeneratorFactory };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { TerraformGenerator } from "terraform-generator";
|
|
2
|
+
import type { ResourceType } from "../../enums/resource-types.js";
|
|
3
|
+
interface WriteToFileOptions {
|
|
4
|
+
directory?: string;
|
|
5
|
+
fileName?: string;
|
|
6
|
+
format?: boolean;
|
|
7
|
+
}
|
|
8
|
+
declare abstract class ProviderGenerator {
|
|
9
|
+
readonly tfg: TerraformGenerator;
|
|
10
|
+
constructor();
|
|
11
|
+
/**
|
|
12
|
+
* Adds a block for the provider, and typically the region to be used.
|
|
13
|
+
* This is called automatically by the constructor, so it shouldn't need to be called manually.
|
|
14
|
+
*/
|
|
15
|
+
abstract addProvider(): void;
|
|
16
|
+
abstract addComputeInstance(): this;
|
|
17
|
+
abstract addLambdaFunction(): this;
|
|
18
|
+
addResourceByType(type: ResourceType): this;
|
|
19
|
+
addRandomResource(): this;
|
|
20
|
+
writeToFile(options?: WriteToFileOptions): void;
|
|
21
|
+
}
|
|
22
|
+
export { ProviderGenerator };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { TerraformGenerator } from "terraform-generator";
|
|
2
|
+
import { ResourceTypes } from "../../enums/resource-types.js";
|
|
3
|
+
import { randomItem, randomMemorableSlug } from "./generator-utils.js";
|
|
4
|
+
import { formatTfFileName } from "../string-utils.js";
|
|
5
|
+
class ProviderGenerator {
|
|
6
|
+
tfg;
|
|
7
|
+
constructor() {
|
|
8
|
+
this.tfg = new TerraformGenerator();
|
|
9
|
+
this.addProvider();
|
|
10
|
+
}
|
|
11
|
+
addResourceByType(type) {
|
|
12
|
+
switch (type) {
|
|
13
|
+
case ResourceTypes.LambdaFunction:
|
|
14
|
+
return this.addLambdaFunction();
|
|
15
|
+
default:
|
|
16
|
+
case ResourceTypes.ComputeInstance: {
|
|
17
|
+
return this.addComputeInstance();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
addRandomResource() {
|
|
22
|
+
const type = randomItem(Object.values(ResourceTypes));
|
|
23
|
+
return this.addResourceByType(type);
|
|
24
|
+
}
|
|
25
|
+
writeToFile(options) {
|
|
26
|
+
const { directory, format = true } = options ?? {};
|
|
27
|
+
const fileName = formatTfFileName(options?.fileName ?? randomMemorableSlug());
|
|
28
|
+
this.tfg.write({ format, dir: directory, tfFilename: fileName });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export { ProviderGenerator };
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Provider } from "../../enums/providers.js";
|
|
2
|
+
interface GenerateOptions {
|
|
3
|
+
/**
|
|
4
|
+
* Provider to generate a terraform file for. If not provided, random providers will be used.
|
|
5
|
+
*/
|
|
6
|
+
provider?: Provider;
|
|
7
|
+
/**
|
|
8
|
+
* Whether the terraform files should be formatted. Requires `terraform` to be installed.
|
|
9
|
+
*/
|
|
10
|
+
format?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Prefix for the repo
|
|
13
|
+
*/
|
|
14
|
+
prefix?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Directory to generate the repo in
|
|
17
|
+
*/
|
|
18
|
+
directory?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Number of files to generate
|
|
21
|
+
*/
|
|
22
|
+
fileCount?: number;
|
|
23
|
+
/**
|
|
24
|
+
* Number of resources per file to generate
|
|
25
|
+
*/
|
|
26
|
+
resourceCount?: number;
|
|
27
|
+
/**
|
|
28
|
+
* Whether output from the commands should be silenced
|
|
29
|
+
*/
|
|
30
|
+
quiet?: boolean;
|
|
31
|
+
}
|
|
32
|
+
interface GenerateResult {
|
|
33
|
+
name: string;
|
|
34
|
+
path: string;
|
|
35
|
+
}
|
|
36
|
+
declare class RepoGenerator {
|
|
37
|
+
static generate(options: GenerateOptions): Promise<GenerateResult>;
|
|
38
|
+
}
|
|
39
|
+
export { RepoGenerator };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { FileGenerator } from "./file-generator.js";
|
|
3
|
+
import { randomMemorableSlug } from "./generator-utils.js";
|
|
4
|
+
import { $ } from "zx";
|
|
5
|
+
import { mkdir } from "node:fs/promises";
|
|
6
|
+
import { success } from "../string-utils.js";
|
|
7
|
+
class RepoGenerator {
|
|
8
|
+
static async generate(options) {
|
|
9
|
+
const { provider, prefix = "tf_", format, fileCount = 3, resourceCount, quiet, } = options;
|
|
10
|
+
const directory = path.resolve(process.cwd(), options.directory ?? ".");
|
|
11
|
+
const repoName = `${prefix}${randomMemorableSlug()}`;
|
|
12
|
+
const repoPath = path.join(directory, repoName);
|
|
13
|
+
const sh = $({ cwd: repoPath, stdio: quiet ? "ignore" : "inherit" });
|
|
14
|
+
await mkdir(repoPath);
|
|
15
|
+
await sh `git init`;
|
|
16
|
+
for (let i = 0; i < fileCount; i++) {
|
|
17
|
+
FileGenerator.generate({
|
|
18
|
+
directory: repoPath,
|
|
19
|
+
provider,
|
|
20
|
+
resourceCount,
|
|
21
|
+
format,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
await sh `git add . && git commit -m "initial commit"`;
|
|
25
|
+
if (!quiet) {
|
|
26
|
+
console.log(success(`Successfully generated '${repoPath}'`));
|
|
27
|
+
}
|
|
28
|
+
return { name: repoName, path: repoPath };
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export { RepoGenerator };
|
|
@@ -2,4 +2,5 @@ declare const slugify: (value: string) => string;
|
|
|
2
2
|
declare const snakeSlugify: (value: string) => string;
|
|
3
3
|
declare const success: (message: string) => string;
|
|
4
4
|
declare const stringifySingleLineArray: (values: string[]) => string;
|
|
5
|
-
|
|
5
|
+
declare const formatTfFileName: (fileName: string) => string;
|
|
6
|
+
export { formatTfFileName, slugify, snakeSlugify, stringifySingleLineArray, success, };
|
|
@@ -4,4 +4,5 @@ const slugify = (value) => faker.helpers.slugify(value).toLowerCase();
|
|
|
4
4
|
const snakeSlugify = (value) => slugify(value).replaceAll("-", "_");
|
|
5
5
|
const success = (message) => `${ux.colorize("green", "✓")} ${message}`;
|
|
6
6
|
const stringifySingleLineArray = (values) => `[${values.map((value) => `"${value}"`).join(", ")}]`;
|
|
7
|
-
|
|
7
|
+
const formatTfFileName = (fileName) => fileName.endsWith(".tf") ? fileName : `${fileName}.tf`;
|
|
8
|
+
export { formatTfFileName, slugify, snakeSlugify, stringifySingleLineArray, success, };
|
package/oclif.manifest.json
CHANGED
|
@@ -19,7 +19,8 @@
|
|
|
19
19
|
"multiple": false,
|
|
20
20
|
"options": [
|
|
21
21
|
"aws",
|
|
22
|
-
"gcp"
|
|
22
|
+
"gcp",
|
|
23
|
+
"azure"
|
|
23
24
|
],
|
|
24
25
|
"type": "option"
|
|
25
26
|
},
|
|
@@ -134,7 +135,8 @@
|
|
|
134
135
|
"multiple": false,
|
|
135
136
|
"options": [
|
|
136
137
|
"aws",
|
|
137
|
-
"gcp"
|
|
138
|
+
"gcp",
|
|
139
|
+
"azure"
|
|
138
140
|
],
|
|
139
141
|
"type": "option"
|
|
140
142
|
},
|
|
@@ -354,5 +356,5 @@
|
|
|
354
356
|
]
|
|
355
357
|
}
|
|
356
358
|
},
|
|
357
|
-
"version": "0.0.
|
|
359
|
+
"version": "0.0.1"
|
|
358
360
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"author": "Brandon Scott",
|
|
3
3
|
"bin": {
|
|
4
|
-
"terrafaker": "
|
|
4
|
+
"terrafaker": "bin/run.js"
|
|
5
5
|
},
|
|
6
6
|
"bugs": "https://github.com/brandongregoryscott/terrafaker/issues",
|
|
7
7
|
"dependencies": {
|
|
@@ -58,7 +58,10 @@
|
|
|
58
58
|
],
|
|
59
59
|
"topicSeparator": " "
|
|
60
60
|
},
|
|
61
|
-
"repository":
|
|
61
|
+
"repository": {
|
|
62
|
+
"type": "git",
|
|
63
|
+
"url": "git+https://github.com/brandongregoryscott/terrafaker.git"
|
|
64
|
+
},
|
|
62
65
|
"scripts": {
|
|
63
66
|
"build": "npm run clean && tsc -b",
|
|
64
67
|
"build:watch": "npm run clean && tsc --watch",
|
|
@@ -78,5 +81,5 @@
|
|
|
78
81
|
},
|
|
79
82
|
"type": "module",
|
|
80
83
|
"types": "dist/index.d.ts",
|
|
81
|
-
"version": "0.0.
|
|
84
|
+
"version": "0.0.1"
|
|
82
85
|
}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { TerraformGenerator } from "terraform-generator";
|
|
2
|
-
import { maybe, randomEnvironmentTag, randomId, randomItem, randomMemorableSlug, randomMemorySize, randomServiceTag, unique, } from "./generator-utils.js";
|
|
3
|
-
import { AWS_EBS_VOLUME_TYPES, AWS_INSTANCE_TYPES, AWS_LAMBDA_RUNTIMES, AWS_REGIONS, } from "../../constants/aws.js";
|
|
4
|
-
const AwsResourceType = {
|
|
5
|
-
Instance: "aws_instance",
|
|
6
|
-
LambdaFunction: "aws_lambda_function",
|
|
7
|
-
};
|
|
8
|
-
const randomRegion = () => randomItem(AWS_REGIONS);
|
|
9
|
-
const randomAmi = unique(() => `ami-${randomId()}`);
|
|
10
|
-
const randomRole = unique(() => `arn:aws:iam::${randomId()}:mfa/${randomMemorableSlug()}`);
|
|
11
|
-
const randomResourceType = () => randomItem(Object.values(AwsResourceType));
|
|
12
|
-
const generateAwsInstance = (options) => {
|
|
13
|
-
const { tfg, environment = randomEnvironmentTag(), service = randomServiceTag(), } = options;
|
|
14
|
-
const ami = randomAmi();
|
|
15
|
-
const instanceType = randomItem(AWS_INSTANCE_TYPES);
|
|
16
|
-
const name = randomMemorableSlug();
|
|
17
|
-
const rootBlockDevice = maybe(0.5)
|
|
18
|
-
? {
|
|
19
|
-
root_block_device: {
|
|
20
|
-
volume_size: randomMemorySize({
|
|
21
|
-
min: 1024,
|
|
22
|
-
max: 64 * 1024 * 1024,
|
|
23
|
-
step: 1024,
|
|
24
|
-
}),
|
|
25
|
-
volume_type: randomItem(AWS_EBS_VOLUME_TYPES),
|
|
26
|
-
},
|
|
27
|
-
}
|
|
28
|
-
: {};
|
|
29
|
-
tfg.resource(AwsResourceType.Instance, name, {
|
|
30
|
-
ami,
|
|
31
|
-
instance_type: instanceType,
|
|
32
|
-
...rootBlockDevice,
|
|
33
|
-
tags: { name, environment, service },
|
|
34
|
-
});
|
|
35
|
-
};
|
|
36
|
-
const generateAwsLambdaFunction = (options) => {
|
|
37
|
-
const { tfg, environment = randomEnvironmentTag(), service = randomServiceTag(), } = options;
|
|
38
|
-
const ami = randomAmi();
|
|
39
|
-
const name = randomMemorableSlug();
|
|
40
|
-
const runtime = randomItem(AWS_LAMBDA_RUNTIMES);
|
|
41
|
-
const functionName = randomItem(["run", "test", "handler"]);
|
|
42
|
-
const handler = `${randomItem(["exports", "index"])}.${functionName}`;
|
|
43
|
-
/** @see https://docs.aws.amazon.com/lambda/latest/dg/configuration-memory.html */
|
|
44
|
-
const memorySize = randomMemorySize({ min: 128, max: 10240, step: 128 });
|
|
45
|
-
const role = randomRole();
|
|
46
|
-
tfg.resource(AwsResourceType.LambdaFunction, name, {
|
|
47
|
-
ami,
|
|
48
|
-
runtime,
|
|
49
|
-
handler,
|
|
50
|
-
function_name: functionName,
|
|
51
|
-
memory_size: memorySize,
|
|
52
|
-
role,
|
|
53
|
-
tags: { name, environment, service },
|
|
54
|
-
});
|
|
55
|
-
};
|
|
56
|
-
const generateResourceByType = (options) => {
|
|
57
|
-
const { type, ...rest } = options;
|
|
58
|
-
switch (type) {
|
|
59
|
-
case AwsResourceType.LambdaFunction:
|
|
60
|
-
return generateAwsLambdaFunction(rest);
|
|
61
|
-
default:
|
|
62
|
-
case AwsResourceType.Instance: {
|
|
63
|
-
return generateAwsInstance(rest);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
const generateAwsFile = (options) => {
|
|
68
|
-
const { resourceCount = 3, environment = randomEnvironmentTag() } = options ?? {};
|
|
69
|
-
const tfg = new TerraformGenerator();
|
|
70
|
-
const region = randomRegion();
|
|
71
|
-
tfg.provider("aws", {
|
|
72
|
-
region,
|
|
73
|
-
});
|
|
74
|
-
for (let i = 0; i < resourceCount; i++) {
|
|
75
|
-
const type = randomResourceType();
|
|
76
|
-
generateResourceByType({ type, tfg, environment });
|
|
77
|
-
}
|
|
78
|
-
return tfg;
|
|
79
|
-
};
|
|
80
|
-
export { generateAwsFile };
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { TerraformGenerator } from "terraform-generator";
|
|
2
|
-
import { GCP_GPU_MACHINE_TYPES, GCP_INSTANCE_TYPES, GCP_LAMBDA_RUNTIMES, GCP_REGIONS, } from "../../constants/gcp.js";
|
|
3
|
-
import { maybe, randomEnvironmentTag, randomInt, randomItem, randomMemorableSlug, randomMemorySize, randomServiceTag, } from "./generator-utils.js";
|
|
4
|
-
const GcpResourceType = {
|
|
5
|
-
Instance: "google_compute_instance",
|
|
6
|
-
LambdaFunction: "google_cloudfunctions_function",
|
|
7
|
-
};
|
|
8
|
-
const randomRegion = () => randomItem(GCP_REGIONS);
|
|
9
|
-
const randomResourceType = () => randomItem(Object.values(GcpResourceType));
|
|
10
|
-
const generateGcpInstance = (options) => {
|
|
11
|
-
const { tfg, environment = randomEnvironmentTag(), service = randomServiceTag(), } = options;
|
|
12
|
-
const machineType = randomItem(GCP_INSTANCE_TYPES);
|
|
13
|
-
const name = randomMemorableSlug();
|
|
14
|
-
const guestAccelerator = maybe(0.5)
|
|
15
|
-
? {
|
|
16
|
-
guest_accelerator: {
|
|
17
|
-
type: randomItem(GCP_GPU_MACHINE_TYPES),
|
|
18
|
-
count: randomInt({ min: 1, max: 4 }),
|
|
19
|
-
},
|
|
20
|
-
}
|
|
21
|
-
: {};
|
|
22
|
-
tfg.resource(GcpResourceType.Instance, name, {
|
|
23
|
-
machine_type: machineType,
|
|
24
|
-
...guestAccelerator,
|
|
25
|
-
labels: { name, environment, service },
|
|
26
|
-
});
|
|
27
|
-
};
|
|
28
|
-
const generateGcpLambdaFunction = (options) => {
|
|
29
|
-
const { tfg, environment = randomEnvironmentTag(), service = randomServiceTag(), } = options;
|
|
30
|
-
const runtime = randomItem(GCP_LAMBDA_RUNTIMES);
|
|
31
|
-
const name = randomMemorableSlug();
|
|
32
|
-
/** @see https://docs.cloud.google.com/run/docs/configuring/services/memory-limits */
|
|
33
|
-
const availableMemoryMb = randomMemorySize({
|
|
34
|
-
min: 128,
|
|
35
|
-
max: 32 * 1024,
|
|
36
|
-
step: 128,
|
|
37
|
-
});
|
|
38
|
-
tfg.resource(GcpResourceType.LambdaFunction, name, {
|
|
39
|
-
runtime,
|
|
40
|
-
name,
|
|
41
|
-
available_memory_mb: availableMemoryMb,
|
|
42
|
-
labels: { name, environment, service },
|
|
43
|
-
});
|
|
44
|
-
};
|
|
45
|
-
const generateResourceByType = (options) => {
|
|
46
|
-
const { type, ...rest } = options;
|
|
47
|
-
switch (type) {
|
|
48
|
-
case GcpResourceType.LambdaFunction:
|
|
49
|
-
return generateGcpLambdaFunction(rest);
|
|
50
|
-
default:
|
|
51
|
-
case GcpResourceType.Instance: {
|
|
52
|
-
return generateGcpInstance(rest);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
const generateGcpFile = (options) => {
|
|
57
|
-
const { resourceCount = 3, environment = randomEnvironmentTag() } = options ?? {};
|
|
58
|
-
const tfg = new TerraformGenerator();
|
|
59
|
-
const region = randomRegion();
|
|
60
|
-
tfg.provider("google", {
|
|
61
|
-
region,
|
|
62
|
-
});
|
|
63
|
-
for (let i = 0; i < resourceCount; i++) {
|
|
64
|
-
const type = randomResourceType();
|
|
65
|
-
generateResourceByType({ type, tfg, environment });
|
|
66
|
-
}
|
|
67
|
-
return tfg;
|
|
68
|
-
};
|
|
69
|
-
export { generateGcpFile };
|