terrafaker 0.0.0 → 0.0.4

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.
Files changed (42) hide show
  1. package/README.md +24 -14
  2. package/dist/commands/generate/file.js +11 -9
  3. package/dist/commands/generate/repo.js +7 -3
  4. package/dist/constants/azure.js +187 -0
  5. package/dist/enums/providers.js +1 -0
  6. package/dist/enums/resource-types.js +8 -0
  7. package/dist/utilities/generators/aws-generator.js +68 -0
  8. package/dist/utilities/generators/azure-generator.js +45 -0
  9. package/dist/utilities/generators/file-generator.js +13 -0
  10. package/dist/utilities/generators/gcp-generator.js +53 -0
  11. package/dist/utilities/generators/generator-utils.js +8 -33
  12. package/dist/utilities/generators/provider-generator-factory.js +18 -0
  13. package/dist/utilities/generators/provider-generator.js +35 -0
  14. package/dist/utilities/generators/repo-generator.js +31 -0
  15. package/dist/utilities/string-utils.js +2 -1
  16. package/oclif.manifest.json +5 -3
  17. package/package.json +13 -14
  18. package/dist/commands/generate/file.d.ts +0 -13
  19. package/dist/commands/generate/index.d.ts +0 -7
  20. package/dist/commands/generate/repo.d.ts +0 -18
  21. package/dist/commands/gh/clone-repos.d.ts +0 -10
  22. package/dist/commands/gh/delete-repos.d.ts +0 -9
  23. package/dist/commands/gh/index.d.ts +0 -7
  24. package/dist/commands/util/format-psv.d.ts +0 -10
  25. package/dist/commands/util/format-tsv.d.ts +0 -13
  26. package/dist/commands/util/index.d.ts +0 -7
  27. package/dist/constants/aws.d.ts +0 -192
  28. package/dist/constants/gcp.d.ts +0 -88
  29. package/dist/constants/tags.d.ts +0 -5
  30. package/dist/enums/help-messages.d.ts +0 -4
  31. package/dist/enums/providers.d.ts +0 -8
  32. package/dist/index.d.ts +0 -1
  33. package/dist/types/object-values.d.ts +0 -2
  34. package/dist/utilities/base-command.d.ts +0 -5
  35. package/dist/utilities/flags.d.ts +0 -5
  36. package/dist/utilities/generators/aws-generators.d.ts +0 -4
  37. package/dist/utilities/generators/aws-generators.js +0 -80
  38. package/dist/utilities/generators/gcp-generators.d.ts +0 -4
  39. package/dist/utilities/generators/gcp-generators.js +0 -69
  40. package/dist/utilities/generators/generator-utils.d.ts +0 -80
  41. package/dist/utilities/github.d.ts +0 -8
  42. package/dist/utilities/string-utils.d.ts +0 -5
package/README.md CHANGED
@@ -6,9 +6,11 @@ CLI for easily generating fake terraform files and repos
6
6
  [![Version](https://img.shields.io/npm/v/terrafaker.svg)](https://npmjs.org/package/terrafaker)
7
7
  [![Downloads/week](https://img.shields.io/npm/dw/terrafaker.svg)](https://npmjs.org/package/terrafaker)
8
8
 
9
- ## Why this exists
9
+ ## Goals
10
10
 
11
- This tool mostly exists to quickly seed data for testing out platforms that rely on infrastructure-as-code, like [Infracost](https://www.infracost.io/). If you find it useful, or there's a feature you'd like to see, feel free to open up an [issue](https://github.com/brandongregoryscott/terrafaker/issues).
11
+ The primary goal of this tool is to quickly generate seed data for testing out platforms that use infrastructure-as-code, like [Infracost](https://www.infracost.io/). The data used to generate the infrastructure configurations is based on public cloud provider docs, but there is no guarantee that the configurations are valid. For example, only some Azure VMs support _accelerators_ or GPU add-ons, but this tool does not encode any of that logic.
12
+
13
+ Obviously, you shouldn't use this tool to try to generate real production infrastructure.
12
14
 
13
15
  ## Features
14
16
 
@@ -19,12 +21,20 @@ This tool mostly exists to quickly seed data for testing out platforms that rely
19
21
  ### Supported providers and resources
20
22
 
21
23
  - AWS
22
- - EC2 instances
23
- - Lambda functions
24
+ - Compute instances
25
+ - Functions
24
26
  - GCP
25
27
  - Compute instances
26
28
  - Functions
27
- - TODO: Azure
29
+ - Azure
30
+ - Compute instances
31
+ - Functions
32
+
33
+ ## Issues
34
+
35
+ If you find a bug, feel free to [open up an issue](https://github.com/brandongregoryscott/terrafaker/issues/new) and try to describe it in detail with reproduction steps if possible.
36
+
37
+ If you would like to see a feature, and it isn't [already documented](https://github.com/brandongregoryscott/terrafaker/issues?q=is%3Aissue+is%3Aopen+label%3Aenhancement), feel free to open up a new issue and describe the desired behavior.
28
38
 
29
39
  <!-- prettier-ignore-start -->
30
40
  <!-- toc -->
@@ -41,7 +51,7 @@ $ npm install -g terrafaker
41
51
  $ terrafaker COMMAND
42
52
  running command...
43
53
  $ terrafaker (--version)
44
- terrafaker/0.0.0 darwin-arm64 node-v24.8.0
54
+ terrafaker/0.0.4 darwin-arm64 node-v24.8.0
45
55
  $ terrafaker --help [COMMAND]
46
56
  USAGE
47
57
  $ terrafaker COMMAND
@@ -64,21 +74,21 @@ Generates a terraform file.
64
74
 
65
75
  ```
66
76
  USAGE
67
- $ terrafaker generate file [--name <value>] [--provider aws|gcp] [--resource-count <value>] [-f] [-q]
77
+ $ terrafaker generate file [--name <value>] [--provider aws|gcp|azure] [--resource-count <value>] [-f] [-q]
68
78
 
69
79
  FLAGS
70
80
  -f, --[no-]format Format the output terraform files. Requires `terraform` to be in your $PATH.
71
81
  -q, --quiet Suppress the logging output.
72
82
  --name=<value> Name for the generated file, which must end in .tf
73
83
  --provider=<option> Cloud provider to generate resources for
74
- <options: aws|gcp>
84
+ <options: aws|gcp|azure>
75
85
  --resource-count=<value> [default: 3] Number of resources per file to generate
76
86
 
77
87
  DESCRIPTION
78
88
  Generates a terraform file.
79
89
  ```
80
90
 
81
- _See code: [src/commands/generate/file.ts](https://github.com/brandongregoryscott/terrafaker/blob/v0.0.0/src/commands/generate/file.ts)_
91
+ _See code: [src/commands/generate/file.ts](https://github.com/brandongregoryscott/terrafaker/blob/v0.0.4/src/commands/generate/file.ts)_
82
92
 
83
93
  ## `terrafaker generate repo`
84
94
 
@@ -87,7 +97,7 @@ Generates repo(s) with multiple terraform files.
87
97
  ```
88
98
  USAGE
89
99
  $ terrafaker generate repo [--directory <value>] [--count <value>] [--file-count <value>] [--resource-count
90
- <value>] [--prefix <value>] [--provider aws|gcp] [-f] [--create-remote] [--public] [-q]
100
+ <value>] [--prefix <value>] [--provider aws|gcp|azure] [-f] [--create-remote] [--public] [-q]
91
101
 
92
102
  FLAGS
93
103
  -f, --[no-]format Format the output terraform files. Requires `terraform` to be in your $PATH.
@@ -99,7 +109,7 @@ FLAGS
99
109
  --file-count=<value> [default: 3] Number of files per repo to generate
100
110
  --prefix=<value> [default: tf_] Prefix for repo names, useful for quickly identifying generated content
101
111
  --provider=<option> Cloud provider to generate resources for
102
- <options: aws|gcp>
112
+ <options: aws|gcp|azure>
103
113
  --public Whether the remote repo(s) created are public.
104
114
  --resource-count=<value> [default: 3] Number of resources per file to generate
105
115
 
@@ -107,7 +117,7 @@ DESCRIPTION
107
117
  Generates repo(s) with multiple terraform files.
108
118
  ```
109
119
 
110
- _See code: [src/commands/generate/repo.ts](https://github.com/brandongregoryscott/terrafaker/blob/v0.0.0/src/commands/generate/repo.ts)_
120
+ _See code: [src/commands/generate/repo.ts](https://github.com/brandongregoryscott/terrafaker/blob/v0.0.4/src/commands/generate/repo.ts)_
111
121
 
112
122
  ## `terrafaker gh clone-repos`
113
123
 
@@ -126,7 +136,7 @@ DESCRIPTION
126
136
  `gh` CLI to be installed. To install, run `brew install gh`.
127
137
  ```
128
138
 
129
- _See code: [src/commands/gh/clone-repos.ts](https://github.com/brandongregoryscott/terrafaker/blob/v0.0.0/src/commands/gh/clone-repos.ts)_
139
+ _See code: [src/commands/gh/clone-repos.ts](https://github.com/brandongregoryscott/terrafaker/blob/v0.0.4/src/commands/gh/clone-repos.ts)_
130
140
 
131
141
  ## `terrafaker gh delete-repos`
132
142
 
@@ -146,7 +156,7 @@ DESCRIPTION
146
156
  If the deletion fails, you may need to refresh your CLI permissions with `gh auth refresh -s delete_repo`
147
157
  ```
148
158
 
149
- _See code: [src/commands/gh/delete-repos.ts](https://github.com/brandongregoryscott/terrafaker/blob/v0.0.0/src/commands/gh/delete-repos.ts)_
159
+ _See code: [src/commands/gh/delete-repos.ts](https://github.com/brandongregoryscott/terrafaker/blob/v0.0.4/src/commands/gh/delete-repos.ts)_
150
160
 
151
161
  ## `terrafaker help [COMMAND]`
152
162
 
@@ -1,8 +1,9 @@
1
1
  import { Flags } from "@oclif/core";
2
2
  import { BaseCommand } from "../../utilities/base-command.js";
3
3
  import { formatFlag, providerFlag, quietFlag, resourceCountFlag, } from "../../utilities/flags.js";
4
- import { success } from "../../utilities/string-utils.js";
5
- import { generateFileByProvider, randomProvider, } from "../../utilities/generators/generator-utils.js";
4
+ import { formatTfFileName, success } from "../../utilities/string-utils.js";
5
+ import { randomProvider } from "../../utilities/generators/generator-utils.js";
6
+ import { FileGenerator } from "../../utilities/generators/file-generator.js";
6
7
  class File extends BaseCommand {
7
8
  static description = "Generates a terraform file.";
8
9
  static flags = {
@@ -18,14 +19,15 @@ class File extends BaseCommand {
18
19
  const { flags } = await this.parse(File);
19
20
  const { name, quiet, format, "resource-count": resourceCount } = flags;
20
21
  const provider = flags.provider ?? randomProvider();
21
- let tfFilename = name ?? "main.tf";
22
- if (!tfFilename.endsWith(".tf")) {
23
- tfFilename = `${tfFilename}.tf`;
24
- }
25
- const tfg = generateFileByProvider({ provider, resourceCount });
26
- tfg.write({ format, tfFilename });
22
+ const fileName = formatTfFileName(name ?? "main.tf");
23
+ FileGenerator.generate({
24
+ fileName,
25
+ provider,
26
+ resourceCount,
27
+ format,
28
+ });
27
29
  if (!quiet) {
28
- this.log(success(`Successfully generated ${tfFilename}`));
30
+ this.log(success(`Successfully generated '${fileName}'`));
29
31
  }
30
32
  }
31
33
  }
@@ -1,10 +1,11 @@
1
1
  import { Flags } from "@oclif/core";
2
2
  import path from "node:path";
3
- import { generateRepo, randomProvider, } from "../../utilities/generators/generator-utils.js";
4
3
  import { BaseCommand } from "../../utilities/base-command.js";
5
4
  import { formatFlag, providerFlag, quietFlag, resourceCountFlag, } from "../../utilities/flags.js";
6
5
  import { $ } from "zx";
7
6
  import { HelpMessages } from "../../enums/help-messages.js";
7
+ import { RepoGenerator } from "../../utilities/generators/repo-generator.js";
8
+ import { success } from "../../utilities/string-utils.js";
8
9
  class Repo extends BaseCommand {
9
10
  static description = "Generates repo(s) with multiple terraform files.";
10
11
  static flags = {
@@ -42,17 +43,20 @@ class Repo extends BaseCommand {
42
43
  const provider = flags.provider;
43
44
  const directory = path.resolve(process.cwd(), flags.directory);
44
45
  for (let i = 0; i < count; i++) {
45
- const { name, path } = await generateRepo({
46
+ const { name, path } = await RepoGenerator.generate({
46
47
  directory,
47
48
  fileCount,
48
49
  format,
49
50
  prefix,
50
- provider: provider ?? randomProvider(),
51
+ provider,
51
52
  resourceCount,
52
53
  quiet,
53
54
  });
54
55
  if (createRemote) {
55
56
  await $ `gh repo create ${name} --source ${path} ${isPublic ? "--public" : "--private"} --push`;
57
+ if (!quiet) {
58
+ this.log(success(`Successfully pushed '${name}'`));
59
+ }
56
60
  }
57
61
  }
58
62
  }
@@ -0,0 +1,187 @@
1
+ import { flatten } from "lodash-es";
2
+ // prettier-ignore
3
+ const AZURE_REGIONS = ["australiaeast", "austriaeast", "belgiumcentral", "brazilsouth", "canadacentral", "centralindia", "centralus", "chilecentral", "eastasia", "eastus", "eastus2", "francecentral", "germanywestcentral", "indonesiacentral", "israelcentral", "italynorth", "japaneast", "japanwest", "koreacentral", "malaysiawest", "mexicocentral", "newzealandnorth", "northeurope", "norwayeast", "polandcentral", "qatarcentral", "southafricanorth", "southcentralus", "southeastasia", "spaincentral", "swedencentral", "switzerlandnorth", "uaenorth", "uksouth", "westeurope", "westus2", "westus3"];
4
+ /**
5
+ * @see https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/overview?tabs=breakdownseries%2Cgeneralsizelist%2Ccomputesizelist%2Cmemorysizelist%2Cstoragesizelist%2Cgpusizelist%2Cfpgasizelist%2Chpcsizelist#general-purpose
6
+ */
7
+ // prettier-ignore
8
+ const AZURE_INSTANCE_TYPES_BY_FAMILY = {
9
+ "Av2": ["Standard_A1_v2", "Standard_A2_v2", "Standard_A4_v2", "Standard_A8_v2", "Standard_A2m_v2", "Standard_A4m_v2", "Standard_A8m_v2"],
10
+ "Bsv2": ["Standard_B2ts_v2", "Standard_B2ls_v2", "Standard_B2s_v2", "Standard_B4ls_v2", "Standard_B4s_v2", "Standard_B8ls_v2", "Standard_B8s_v2", "Standard_B16ls_v2", "Standard_B16s_v2", "Standard_B32ls_v2", "Standard_B32s_v2"],
11
+ "Basv2": ["Standard_B2ats_v2", "Standard_B2als_v2", "Standard_B2as_v2", "Standard_B4als_v2", "Standard_B4as_v2", "Standard_B8als_v2", "Standard_B8as_v2", "Standard_B16als_v2", "Standard_B16as_v2", "Standard_B32als_v2", "Standard_B32as_v2"],
12
+ "Bpsv2": ["Standard_B2pts_v2", "Standard_B2pls_v2", "Standard_B2ps_v2", "Standard_B4pls_v2", "Standard_B4ps_v2", "Standard_B8pls_v2", "Standard_B8ps_v2", "Standard_B16pls_v2", "Standard_B16ps_v2"],
13
+ "Dasv7": ["Standard_D2as_v7", "Standard_D4as_v7", "Standard_D8as_v7", "Standard_D16as_v7", "Standard_D32as_v7", "Standard_D48as_v7", "Standard_D64as_v7", "Standard_D96as_v7", "Standard_D128as_v7", "Standard_D160as_v7"],
14
+ "Dadsv7": ["Standard_D2ads_v7", "Standard_D4ads_v7", "Standard_D8ads_v7", "Standard_D16ads_v7", "Standard_D32ads_v7", "Standard_D48ads_v7", "Standard_D64ads_v7", "Standard_D96ads_v7", "Standard_D128ads_v7", "Standard_D160ads_v7"],
15
+ "Dalsv7": ["Standard_D2als_v7", "Standard_D4als_v7", "Standard_D8als_v7", "Standard_D16als_v7", "Standard_D32als_v7", "Standard_D48als_v7", "Standard_D64als_v7", "Standard_D96als_v7", "Standard_D128als_v7", "Standard_D160als_v7"],
16
+ "Daldsv7": ["Standard_D2alds_v7", "Standard_D4alds_v7", "Standard_D8alds_v7", "Standard_D16alds_v7", "Standard_D32alds_v7", "Standard_D48alds_v7", "Standard_D64alds_v7", "Standard_D96alds_v7", "Standard_D128alds_v7", "Standard_D160alds_v7"],
17
+ "Dsv6": ["Standard_D2s_v6", "Standard_D4s_v6", "Standard_D8s_v6", "Standard_D16s_v6", "Standard_D32s_v6", "Standard_D48s_v6", "Standard_D64s_v6", "Standard_D96s_v6", "Standard_D128s_v6", "Standard_D192s_v6"],
18
+ "Ddsv6": ["Standard_D2ds_v6", "Standard_D4ds_v6", "Standard_D8ds_v6", "Standard_D16ds_v6", "Standard_D32ds_v6", "Standard_D48ds_v6", "Standard_D64ds_v6", "Standard_D96ds_v6", "Standard_D128ds_v6", "Standard_D192ds_v6"],
19
+ "Dlsv6": ["Standard_D2ls_v6", "Standard_D4ls_v6", "Standard_D8ls_v6", "Standard_D16ls_v6", "Standard_D32ls_v6", "Standard_D48ls_v6", "Standard_D64ls_v6", "Standard_D96ls_v6", "Standard_D128ls_v6"],
20
+ "Dldsv6": ["Standard_D2lds_v6", "Standard_D4lds_v6", "Standard_D8lds_v6", "Standard_D16lds_v6", "Standard_D32lds_v6", "Standard_D48lds_v6", "Standard_D64lds_v6", "Standard_D96lds_v6", "Standard_D128lds_v6"],
21
+ "Dasv6": ["Standard_D2as_v6", "Standard_D4as_v6", "Standard_D8as_v6", "Standard_D16as_v6", "Standard_D32as_v6", "Standard_D48as_v6", "Standard_D64as_v6", "Standard_D96as_v6"],
22
+ "Dadsv6": ["Standard_D2ads_v6", "Standard_D4ads_v6", "Standard_D8ads_v6", "Standard_D16ads_v6", "Standard_D32ads_v6", "Standard_D48ads_v6", "Standard_D64ads_v6", "Standard_D96ads_v6"],
23
+ "Dalsv6": ["Standard_D2als_v6", "Standard_D4als_v6", "Standard_D8als_v6", "Standard_D16als_v6", "Standard_D32als_v6", "Standard_D48als_v6", "Standard_D64als_v6", "Standard_D96als_v6"],
24
+ "Daldsv6": ["Standard_D2alds_v6", "Standard_D4alds_v6", "Standard_D8alds_v6", "Standard_D16alds_v6", "Standard_D32alds_v6", "Standard_D48alds_v6", "Standard_D64alds_v6", "Standard_D96alds_v6"],
25
+ "Dpsv6": ["Standard_D2ps_v6", "Standard_D4ps_v6", "Standard_D8ps_v6", "Standard_D16ps_v6", "Standard_D32ps_v6", "Standard_D48ps_v6", "Standard_D64ps_v6", "Standard_D96ps_v6"],
26
+ "Dpdsv6": ["Standard_D2pds_v6", "Standard_D4pds_v6", "Standard_D8pds_v6", "Standard_D16pds_v6", "Standard_D32pds_v6", "Standard_D48pds_v6", "Standard_D64pds_v6", "Standard_D96pds_v6"],
27
+ "Dplsv6": ["Standard_D2pls_v6", "Standard_D4pls_v6", "Standard_D8pls_v6", "Standard_D16pls_v6", "Standard_D32pls_v6", "Standard_D48pls_v6", "Standard_D64pls_v6", "Standard_D96pls_v6"],
28
+ "Dpldsv6": ["Standard_D2plds_v6", "Standard_D4plds_v6", "Standard_D8plds_v6", "Standard_D16plds_v6", "Standard_D32plds_v6", "Standard_D48plds_v6", "Standard_D64plds_v6", "Standard_D96plds_v6"],
29
+ "Dv5": ["Standard_D2_v5", "Standard_D4_v5", "Standard_D8_v5", "Standard_D16_v5", "Standard_D32_v5", "Standard_D48_v5", "Standard_D64_v5", "Standard_D96_v5"],
30
+ "Dsv5": ["Standard_D2s_v5", "Standard_D4s_v5", "Standard_D8s_v5", "Standard_D16s_v5", "Standard_D32s_v5", "Standard_D48s_v5", "Standard_D64s_v5", "Standard_D96s_v5"],
31
+ "Ddv5": ["Standard_D2d_v5", "Standard_D4d_v5", "Standard_D8d_v5", "Standard_D16d_v5", "Standard_D32d_v5", "Standard_D48d_v5", "Standard_D64d_v5", "Standard_D96d_v5"],
32
+ "Ddsv5": ["Standard_D2ds_v5", "Standard_D4ds_v5", "Standard_D8ds_v5", "Standard_D16ds_v5", "Standard_D32ds_v5", "Standard_D48ds_v5", "Standard_D64ds_v5", "Standard_D96ds_v5"],
33
+ "Dasv5": ["Standard_D2as_v5", "Standard_D4as_v5", "Standard_D8as_v5", "Standard_D16as_v5", "Standard_D32as_v5", "Standard_D48as_v5", "Standard_D64as_v5", "Standard_D96as_v5"],
34
+ "Dadsv5": ["Standard_D2ads_v5", "Standard_D4ads_v5", "Standard_D8ads_v5", "Standard_D16ads_v5", "Standard_D32ads_v5", "Standard_D48ads_v5", "Standard_D64ads_v5", "Standard_D96ads_v5"],
35
+ "Dpsv5": ["Standard_D2ps_v5", "Standard_D4ps_v5", "Standard_D8ps_v5", "Standard_D16ps_v5", "Standard_D32ps_v5", "Standard_D48ps_v5", "Standard_D64ps_v5"],
36
+ "Dpdsv5": ["Standard_D2pds_v5", "Standard_D4pds_v5", "Standard_D8pds_v5", "Standard_D16pds_v5", "Standard_D32pds_v5", "Standard_D48pds_v5", "Standard_D64pds_v5"],
37
+ "Dplsv5": ["Standard_D2pls_v5", "Standard_D4pls_v5", "Standard_D8pls_v5", "Standard_D16pls_v5", "Standard_D32pls_v5", "Standard_D48pls_v5", "Standard_D64pls_v5"],
38
+ "Dpldsv5": ["Standard_D2plds_v5", "Standard_D4plds_v5", "Standard_D8plds_v5", "Standard_D16plds_v5", "Standard_D32plds_v5", "Standard_D48plds_v5", "Standard_D64plds_v5"],
39
+ "Dlsv5": ["Standard_D2ls_v5", "Standard_D4ls_v5", "Standard_D8ls_v5", "Standard_D16ls_v5", "Standard_D32ls_v5", "Standard_D48ls_v5", "Standard_D64ls_v5", "Standard_D96ls_v5"],
40
+ "Dldsv5": ["Standard_D2lds_v5", "Standard_D4lds_v5", "Standard_D8lds_v5", "Standard_D16lds_v5", "Standard_D32lds_v5", "Standard_D48lds_v5", "Standard_D64lds_v5", "Standard_D96lds_v5"],
41
+ "Dnsv6": ["Standard_D2ns_v6", "Standard_D4ns_v6", "Standard_D8ns_v6", "Standard_D16ns_v6", "Standard_D32ns_v6", "Standard_D48ns_v6", "Standard_D64ns_v6", "Standard_D96ns_v6", "Standard_D128ns_v6"],
42
+ "Dndsv6": ["Standard_D2nds_v6", "Standard_D4nds_v6", "Standard_D8nds_v6", "Standard_D16nds_v6", "Standard_D32nds_v6", "Standard_D48nds_v6", "Standard_D64nds_v6", "Standard_D96nds_v6", "Standard_D128nds_v6"],
43
+ "Dnlsv6": ["Standard_D2nls_v6", "Standard_D4nls_v6", "Standard_D8nls_v6", "Standard_D16nls_v6", "Standard_D32nls_v6", "Standard_D48nls_v6", "Standard_D64nls_v6", "Standard_D96nls_v6", "Standard_D128nls_v6"],
44
+ "Dnldsv6": ["Standard_D2nlds_v6", "Standard_D4nlds_v6", "Standard_D8nlds_v6", "Standard_D16nlds_v6", "Standard_D32nlds_v6", "Standard_D48nlds_v6", "Standard_D64nlds_v6", "Standard_D96nlds_v6", "Standard_D128nlds_v6"],
45
+ "Dv4": ["Standard_D2_v4", "Standard_D4_v4", "Standard_D8_v4", "Standard_D16_v4", "Standard_D32_v4", "Standard_D48_v4", "Standard_D64_v4"],
46
+ "Dsv4": ["Standard_D2s_v4", "Standard_D4s_v4", "Standard_D8s_v4", "Standard_D16s_v4", "Standard_D32s_v4", "Standard_D48s_v4", "Standard_D64s_v4"],
47
+ "Dav4": ["Standard_D2a_v41", "Standard_D4a_v4", "Standard_D8a_v4", "Standard_D16a_v4", "Standard_D32a_v4", "Standard_D48a_v4", "Standard_D64a_v4", "Standard_D96a_v4"],
48
+ "Dasv4": ["Standard_D2as_v4", "Standard_D4as_v4", "Standard_D8as_v4", "Standard_D16as_v4", "Standard_D32as_v4", "Standard_D48as_v4", "Standard_D64as_v4", "Standard_D96as_v4"],
49
+ "Ddv4": ["Standard_D2d_v4", "Standard_D4d_v4", "Standard_D8d_v4", "Standard_D16d_v4", "Standard_D32d_v4", "Standard_D48d_v4", "Standard_D64d_v4"],
50
+ "Ddsv4": ["Standard_D2ds_v4", "Standard_D4ds_v4", "Standard_D8ds_v4", "Standard_D16ds_v4", "Standard_D32ds_v4", "Standard_D48ds_v4", "Standard_D64ds_v4"],
51
+ "DCasv5": ["Standard_DC2as_v5", "Standard_DC4as_v5", "Standard_DC8as_v5", "Standard_DC16as_v5", "Standard_DC32as_v5", "Standard_DC48as_v5", "Standard_DC64as_v5", "Standard_DC96as_v5"],
52
+ "DCadsv5": ["Standard_DC2ads_v5", "Standard_DC4ads_v5", "Standard_DC8ads_v5", "Standard_DC16ads_v5", "Standard_DC32ads_v5", "Standard_DC48ads_v5", "Standard_DC64ads_v5", "Standard_DC96ads_v5"],
53
+ "DCasv6": ["Standard_DC2as_v6", "Standard_DC4as_v6", "Standard_DC8as_v6", "Standard_DC16as_v6", "Standard_DC32as_v6", "Standard_DC48as_v6", "Standard_DC64as_v6", "Standard_DC96as_v6"],
54
+ "DCadsv6": ["Standard_DC2ads_v6", "Standard_DC4ads_v6", "Standard_DC8ads_v6", "Standard_DC16ads_v6", "Standard_DC32ads_v6", "Standard_DC48ads_v6", "Standard_DC64ads_v6", "Standard_DC96ads_v6"],
55
+ "DCesv6": ["Standard_DC2es_v6", "Standard_DC4es_v6", "Standard_DC8es_v6", "Standard_DC16es_v6", "Standard_DC32es_v6", "Standard_DC48es_v6", "Standard_DC64es_v6", "Standard_DC96es_v6", "Standard_DC128es_v6"],
56
+ "DCas_cc_v5": ["Standard_DC4as_cc_v5", "Standard_DC8as_cc_v5", "Standard_DC16as_cc_v5", "Standard_DC32as_cc_v5", "Standard_DC48as_cc_v5", "Standard_DC64as_cc_v5", "Standard_DC96as_cc_v5"],
57
+ "DCads_cc_v5": ["Standard_DC4ads_cc_v5", "Standard_DC8ads_cc_v5", "Standard_DC16ads_cc_v5", "Standard_DC32ads_cc_v5", "Standard_DC48ads_cc_v5", "Standard_DC64ads_cc_v5", "Standard_DC96ads_cc_v5"],
58
+ "DCsv3": ["Standard_DC1s_v3", "Standard_DC2s_v3", "Standard_DC4s_v3", "Standard_DC8s_v3", "Standard_DC16s_v3", "Standard_DC24s_v3", "Standard_DC32s_v3", "Standard_DC48s_v3"],
59
+ "DCdsv3": ["Standard_DC1ds_v3", "Standard_DC2ds_v3", "Standard_DC4ds_v3", "Standard_DC8ds_v3", "Standard_DC16ds_v3", "Standard_DC24ds_v3", "Standard_DC32ds_v3", "Standard_DC48ds_v3"],
60
+ "DCsv": ["Standard_DC1s_v2", "Standard_DC2s_v2", "Standard_DC4s_v2", "Standard_DC8_v2"],
61
+ "Fasv7": ["Standard_F1as_v7", "Standard_F2as_v7", "Standard_F4as_v7", "Standard_F8as_v7", "Standard_F16as_v7", "Standard_F32as_v7", "Standard_F48as_v7", "Standard_F64as_v7", "Standard_F80as_v7"],
62
+ "Fadsv7": ["Standard_F1ads_v7", "Standard_F2ads_v7", "Standard_F4ads_v7", "Standard_F8ads_v7", "Standard_F16ads_v7", "Standard_F32ads_v7", "Standard_F48ads_v7", "Standard_F64ads_v7", "Standard_F80ads_v7"],
63
+ "Famsv7": ["Standard_F1ams_v7", "Standard_F2ams_v7", "Standard_F4ams_v7", "Standard_F8ams_v7", "Standard_F16ams_v7", "Standard_F32ams_v7", "Standard_F48ams_v7", "Standard_F64ams_v7", "Standard_F80ams_v7"],
64
+ "Famdsv7": ["Standard_F1amds_v7", "Standard_F2amds_v7", "Standard_F4amds_v7", "Standard_F8amds_v7", "Standard_F16amds_v7", "Standard_F32amds_v7", "Standard_F48amds_v7", "Standard_F64amds_v7", "Standard_F80amds_v7"],
65
+ "Falsv7": ["Standard_F1als_v7", "Standard_F2als_v7", "Standard_F4als_v7", "Standard_F8als_v7", "Standard_F16als_v7", "Standard_F32als_v7", "Standard_F48als_v7", "Standard_F64als_v7", "Standard_F80als_v7"],
66
+ "Faldsv7": ["Standard_F1alds_v7", "Standard_F2alds_v7", "Standard_F4alds_v7", "Standard_F8alds_v7", "Standard_F16alds_v7", "Standard_F32alds_v7", "Standard_F48alds_v7", "Standard_F64alds_v7", "Standard_F80alds_v7"],
67
+ "Fasv6": ["Standard_F2as_v6", "Standard_F4as_v6", "Standard_F8as_v6", "Standard_F16as_v6", "Standard_F32as_v6", "Standard_F48as_v6", "Standard_F64as_v6"],
68
+ "Falsv6": ["Standard_F2als_v6", "Standard_F4als_v6", "Standard_F8als_v6", "Standard_F16als_v6", "Standard_F32als_v6", "Standard_F48als_v6", "Standard_F64als_v6"],
69
+ "Famsv6": ["Standard_F2ams_v6", "Standard_F4ams_v6", "Standard_F8ams_v6", "Standard_F16ams_v6", "Standard_F32ams_v6", "Standard_F48ams_v6", "Standard_F64ams_v6"],
70
+ "Fsv2": ["Standard_F2s_v2", "Standard_F4s_v2", "Standard_F8s_v2", "Standard_F16s_v2", "Standard_F32s_v2", "Standard_F48s_v2", "Standard_F64s_v2", "Standard_F72s_v2"],
71
+ "FXmsv2": ["Standard_FX2ms_v2", "Standard_FX4ms_v2", "Standard_FX8ms_v2", "Standard_FX12ms_v2", "Standard_FX16ms_v2", "Standard_FX24ms_v2", "Standard_FX32ms_v2", "Standard_FX48ms_v2", "Standard_FX64ms_v2", "Standard_FX96ms_v2"],
72
+ "FXmdsv2": ["Standard_FX2mds_v2", "Standard_FX4mds_v2", "Standard_FX8mds_v2", "Standard_FX12mds_v2", "Standard_FX16mds_v2", "Standard_FX24mds_v2", "Standard_FX32mds_v2", "Standard_FX48mds_v2", "Standard_FX64mds_v2", "Standard_FX96mds_v2"],
73
+ "FX": ["Standard_FX4mds", "Standard_FX12mds", "Standard_FX24mds", "Standard_FX36mds", "Standard_FX48mds"],
74
+ "Easv7": ["Standard_E2as_v7", "Standard_E4as_v7", "Standard_E8as_v7", "Standard_E16as_v7", "Standard_E32as_v7", "Standard_E48as_v7", "Standard_E64as_v7", "Standard_E96as_v7", "Standard_E128as_v7", "Standard_E160as_v7"],
75
+ "Eadsv7": ["Standard_E2ads_v7", "Standard_E4ads_v7", "Standard_E8ads_v7", "Standard_E16ads_v7", "Standard_E32ads_v7", "Standard_E48ads_v7", "Standard_E64ads_v7", "Standard_E96ads_v7", "Standard_E128ads_v7", "Standard_E160ads_v7"],
76
+ "Esv6": ["Standard_E2s_v6", "Standard_E4s_v6", "Standard_E8s_v6", "Standard_E16s_v6", "Standard_E20s_v6", "Standard_E32s_v6", "Standard_E48s_v6", "Standard_E64s_v6", "Standard_E96s_v6", "Standard_E128s_v6", "Standard_E192is_v6"],
77
+ "Edsv6": ["Standard_E2ds_v6", "Standard_E4ds_v6", "Standard_E8ds_v6", "Standard_E16ds_v6", "Standard_E20ds_v6", "Standard_E32ds_v6", "Standard_E48ds_v6", "Standard_E64ds_v6", "Standard_E96ds_v6", "Standard_E128ds_v6", "Standard_E192ids_v6"],
78
+ "Epsv6": ["Standard_E2ps_v6", "Standard_E4ps_v6", "Standard_E8ps_v6", "Standard_E16ps_v6", "Standard_E32ps_v6", "Standard_E48ps_v6", "Standard_E64ps_v6", "Standard_E96ps_v6"],
79
+ "Epdsv6": ["Standard_E2pds_v6", "Standard_E4pds_v6", "Standard_E8pds_v6", "Standard_E16pds_v6", "Standard_E32pds_v6", "Standard_E48pds_v6", "Standard_E64pds_v6", "Standard_E96pds_v6"],
80
+ "Easv6": ["Standard_E2as_v6", "Standard_E4as_v6", "Standard_E8as_v6", "Standard_E16as_v6", "Standard_E20as_v6", "Standard_E32as_v6", "Standard_E48as_v6", "Standard_E64as_v6", "Standard_E96as_v6"],
81
+ "Eadsv6": ["Standard_E2ads_v6", "Standard_E4ads_v6", "Standard_E8ads_v6", "Standard_E16ads_v6", "Standard_E20ads_v6", "Standard_E32ads_v6", "Standard_E48ads_v6", "Standard_E64ads_v6", "Standard_E96ads_v6"],
82
+ "Ev5": ["Standard_E2_v5", "Standard_E4_v5", "Standard_E8_v5", "Standard_E16_v5", "Standard_E20_v5", "Standard_E32_v5", "Standard_E48_v5", "Standard_E64_v5", "Standard_E96_v5", "Standard_E104i_v5"],
83
+ "Esv5": ["Standard_E2s_v5", "Standard_E4s_v5", "Standard_E8s_v5", "Standard_E16s_v5", "Standard_E20s_v5", "Standard_E32s_v5", "Standard_E48s_v5", "Standard_E64s_v5", "Standard_E96s_v5", "Standard_E104is_v5"],
84
+ "Edv5": ["Standard_E2d_v5", "Standard_E4d_v5", "Standard_E8d_v5", "Standard_E16d_v5", "Standard_E20d_v5", "Standard_E32d_v5", "Standard_E48d_v5", "Standard_E64d_v5", "Standard_E96d_v5", "Standard_E104id_v52"],
85
+ "Edsv5": ["Standard_E2ds_v5", "Standard_E4ds_v5", "Standard_E8ds_v5", "Standard_E16ds_v5", "Standard_E20ds_v5", "Standard_E32ds_v5", "Standard_E48ds_v5", "Standard_E64ds_v5", "Standard_E96ds_v5", "Standard_E104ids_v5"],
86
+ "Easv5": ["Standard_E2as_v5", "Standard_E4as_v5", "Standard_E8as_v5", "Standard_E16as_v5", "Standard_E20as_v5", "Standard_E32as_v5", "Standard_E48as_v5", "Standard_E64as_v5", "Standard_E96as_v5", "Standard_E112ias_v5"],
87
+ "Eadsv5": ["Standard_E2ads_v5", "Standard_E4ads_v5", "Standard_E8ads_v5", "Standard_E16ads_v5", "Standard_E20ads_v5", "Standard_E32ads_v5", "Standard_E48ads_v5", "Standard_E64ads_v5", "Standard_E96ads_v5", "Standard_E112iads_v5"],
88
+ "Ensv6": ["Standard_E2ns_v6", "Standard_E4ns_v6", "Standard_E8ns_v6", "Standard_E16ns_v6", "Standard_E32ns_v6", "Standard_E48ns_v6", "Standard_E64ns_v6", "Standard_E96ns_v6", "Standard_E128ns_v6"],
89
+ "Endsv6": ["Standard_E2nds_v6", "Standard_E4nds_v6", "Standard_E8nds_v6", "Standard_E16nds_v6", "Standard_E32nds_v6", "Standard_E48nds_v6", "Standard_E64nds_v6", "Standard_E96nds_v6", "Standard_E128nds_v6"],
90
+ "Epsv5": ["Standard_E2ps_v5", "Standard_E4ps_v5", "Standard_E8ps_v5", "Standard_E16ps_v5", "Standard_E20ps_v5", "Standard_E32ps_v5"],
91
+ "Epdsv5": ["Standard_E2pds_v5", "Standard_E4pds_v5", "Standard_E8pds_v5", "Standard_E16pds_v5", "Standard_E20pds_v5", "Standard_E32pds_v5"],
92
+ "Edv4": ["Standard_E2d_v4", "Standard_E4d_v4", "Standard_E8d_v4", "Standard_E16d_v4", "Standard_E20d_v4", "Standard_E32d_v4", "Standard_E48d_v4", "Standard_E64d_v4"],
93
+ "Edsv4": ["Standard_E2ds_v4", "Standard_E4ds_v4", "Standard_E8ds_v4", "Standard_E16ds_v4", "Standard_E20ds_v4", "Standard_E32ds_v4", "Standard_E48ds_v4", "Standard_E64ds_v4", "Standard_E80ids_v4"],
94
+ "Eav4": ["Standard_E2a_v4", "Standard_E4a_v4", "Standard_E8a_v4", "Standard_E16a_v4", "Standard_E20a_v4", "Standard_E32a_v4", "Standard_E48a_v4", "Standard_E64a_v4", "Standard_E96a_v4"],
95
+ "Easv4": ["Standard_E2as_v4", "Standard_E4as_v4", "Standard_E8as_v4", "Standard_E16as_v4", "Standard_E20as_v4", "Standard_E32as_v4", "Standard_E48as_v4", "Standard_E64as_v4", "Standard_E96as_v4"],
96
+ "Ev4": ["Standard_E2_v4", "Standard_E4_v4", "Standard_E8_v4", "Standard_E16_v4", "Standard_E20_v4", "Standard_E32_v4", "Standard_E48_v4", "Standard_E64_v4"],
97
+ "Esv4": ["Standard_E2s_v4", "Standard_E4s_v4", "Standard_E8s_v4", "Standard_E16s_v4", "Standard_E20s_v4", "Standard_E32s_v4", "Standard_E48s_v4", "Standard_E64s_v4", "Standard_E80is_v4"],
98
+ "Ebsv6": ["Standard_E2bs_v6", "Standard_E4bs_v6", "Standard_E8bs_v6", "Standard_E16bs_v6", "Standard_E32bs_v6", "Standard_E48bs_v6", "Standard_E64bs_v6", "Standard_E96bs_v6", "Standard_E128bs_v6", "Standard_E192ibs_v6"],
99
+ "Ebdsv6": ["Standard_E2bds_v6", "Standard_E4bds_v6", "Standard_E8bds_v6", "Standard_E16bds_v6", "Standard_E32bds_v6", "Standard_E48bds_v6", "Standard_E64bds_v6", "Standard_E96bds_v6", "Standard_E128bds_v6", "Standard_E192ibds_v6"],
100
+ "Ebdsv5": ["Standard_E2bds_v5", "Standard_E4bds_v5", "Standard_E8bds_v5", "Standard_E16bds_v5", "Standard_E32bds_v5", "Standard_E48bds_v5", "Standard_E64bds_v5", "Standard_E96bds_v5", "Standard_E112ibds_v5"],
101
+ "Ebsv5": ["Standard_E2bs_v5", "Standard_E4bs_v5", "Standard_E8bs_v5", "Standard_E16bs_v5", "Standard_E32bs_v5", "Standard_E48bs_v5", "Standard_E64bs_v5", "Standard_E96bs_v5", "Standard_E112ibs_v5"],
102
+ "ECasv5": ["Standard_EC2as_v5", "Standard_EC4as_v5", "Standard_EC8as_v5", "Standard_EC16as_v5", "Standard_EC20as_v5", "Standard_EC32as_v5", "Standard_EC48as_v5", "Standard_EC64as_v5", "Standard_EC96as_v5"],
103
+ "ECadsv5": ["Standard_EC2ads_v5", "Standard_EC4ads_v5", "Standard_EC8ads_v5", "Standard_EC16ads_v5", "Standard_EC20ads_v5", "Standard_EC32ads_v5", "Standard_EC48ads_v5", "Standard_EC64ads_v5", "Standard_EC96ads_v5"],
104
+ "ECasv6": ["Standard_EC2as_v6", "Standard_EC4as_v6", "Standard_EC8as_v6", "Standard_EC16as_v6", "Standard_EC32as_v6", "Standard_EC48as_v6", "Standard_EC64as_v6", "Standard_EC96as_v6"],
105
+ "ECadsv6": ["Standard_EC2ads_v6", "Standard_EC4ads_v6", "Standard_EC8ads_v6", "Standard_EC16ads_v6", "Standard_EC32ads_v6", "Standard_EC48ads_v6", "Standard_EC64ads_v6", "Standard_EC96ads_v6"],
106
+ "ECesv6": ["Standard_EC2es_v6", "Standard_EC4es_v6", "Standard_EC8es_v6", "Standard_EC16es_v6", "Standard_EC32es_v6", "Standard_EC48es_v6", "Standard_EC64es_v6"],
107
+ "ECas_cc_v5": ["Standard_EC4as_cc_v5", "Standard_EC8as_cc_v5", "Standard_EC16as_cc_v5", "Standard_EC20as_cc_v5", "Standard_EC32as_cc_v5", "Standard_EC48as_cc_v5", "Standard_EC64as_cc_v5", "Standard_EC96as_cc_v5"],
108
+ "ECads_cc_v5": ["Standard_EC4ads_cc_v5", "Standard_EC8ads_cc_v5", "Standard_EC16ads_cc_v5", "Standard_EC20ads_cc_v5", "Standard_EC32ads_cc_v5", "Standard_EC48ads_cc_v5", "Standard_EC64ads_cc_v5", "Standard_EC96ads_cc_v5"],
109
+ "Mdsv3 Medium Memory": ["Standard_M12ds_v3", "Standard_M24ds_v3", "Standard_M48ds_1_v3", "Standard_M96ds_1_v3", "Standard_M96ds_2_v3", "Standard_M176ds_3_v3", "Standard_M176ds_4_v3"],
110
+ "Msv3 Medium Memory": ["Standard_M12s_v3", "Standard_M24s_v3", "Standard_M48s_1_v3", "Standard_M96s_1_v3", "Standard_M96s_2_v3", "Standard_M176s_3_v3", "Standard_M176s_4_v3"],
111
+ "Msv2 Medium Memory": ["Standard_M32ms_v2", "Standard_M64s_v2", "Standard_M64ms_v2", "Standard_M128s_v2", "Standard_M128ms_v2", "Standard_M192is_v2", "Standard_M192ims_v2"],
112
+ "Mdsv2 Medium Memory": ["Standard_M32dms_v2", "Standard_M64ds_v2", "Standard_M64dms_v2", "Standard_M128ds_v2", "Standard_M128dms_v2", "Standard_M192ids_v2", "Standard_M192idms_v2"],
113
+ "M": ["Standard_M8ms", "Standard_M16ms", "Standard_M32ts", "Standard_M32ls", "Standard_M32ms", "Standard_M64s", "Standard_M64ls", "Standard_M64ms", "Standard_M128s", "Standard_M128ms", "Standard_M64", "Standard_M64m", "Standard_M128", "Standard_M128m"],
114
+ "Msv3 High Memory": ["Standard_M416s_6_v3", "Standard_M416s_8_v3", "Standard_M624s_12_v3", "Standard_M832s_12_v3", "Standard_M832is_16_v3"],
115
+ "Mdsv3 High Memory": ["Standard_M416ds_6_v3", "Standard_M416ds_8_v3", "Standard_M624ds_12_v3", "Standard_M832ds_12_v3", "Standard_M832ids_16_v3"],
116
+ "Msv2 High Memory": ["Standard_M208s_v2", "Standard_M208ms_v2", "Standard_M416s_v2", "Standard_M416s_8_v2", "Standard_M416ms_v2"],
117
+ "Mdsv3 Very High Memory": ["Standard_M896ixds_32_v3", "Standard_M896ixds_24_v3", "Standard_M1792ixds_32_v3"],
118
+ "Mbsv3": ["Standard_M16bs_v3", "Standard_M32bs_v3", "Standard_M48bs_v3", "Standard_M64bs_v3", "Standard_M96bs_v3", "Standard_M128bs_v3", "Standard_M176bs_v3", "Standard_M416bs_v3"],
119
+ "Mbdsv3": ["Standard_M16bds_v3", "Standard_M32bds_v3", "Standard_M48bds_v3", "Standard_M64bds_v3", "Standard_M96bds_v3", "Standard_M128bds_v3", "Standard_M176bds_v3", "Standard_M64bds_1_v3", "Standard_M96bds_2_v3", "Standard_M128bds_3_v3", "Standard_M176bds_4_v3"],
120
+ "Laosv4": ["Standard_L2aos_v4", "Standard_L4aos_v4", "Standard_L8aos_v4", "Standard_L12aos_v4", "Standard_L16aos_v4", "Standard_L24aos_v4", "Standard_L32aos_v4"],
121
+ "Lasv4": ["Standard_L2as_v4", "Standard_L4as_v4", "Standard_L8as_v4", "Standard_L16as_v4", "Standard_L32as_v4", "Standard_L48as_v4", "Standard_L64as_v4", "Standard_L80as_v4", "Standard_L96as_v4"],
122
+ "Lsv4": ["Standard_L2s_v4", "Standard_L4s_v4", "Standard_L8s_v4", "Standard_L16s_v4", "Standard_L32s_v4", "Standard_L48s_v4", "Standard_L64s_v4", "Standard_L80s_v4", "Standard_L96s_v4"],
123
+ "Lsv3": ["Standard_L8s_v3", "Standard_L16s_v3", "Standard_L32s_v3", "Standard_L48s_v3", "Standard_L64s_v3", "Standard_L80s_v3"],
124
+ "Lasv3": ["Standard_L8as_v3", "Standard_L16as_v3", "Standard_L32as_v3", "Standard_L48as_v3", "Standard_L64as_v3", "Standard_L80as_v3"],
125
+ "HBv2": ["Standard_HB120rs_v2", "Standard_HB120-96rs_v2", "Standard_HB120-64rs_v2", "Standard_HB120-32rs_v2", "Standard_HB120-16rs_v2"],
126
+ "HBv3": ["Standard_HB120rs_v3", "Standard_HB120-96rs_v3", "Standard_HB120-64rs_v3", "Standard_HB120-32rs_v3", "Standard_HB120-16rs_v3"],
127
+ "HBv4": ["Standard_HB176rs_v4", "Standard_HB176-144rs_v4", "Standard_HB176-96rs_v4", "Standard_HB176-48rs_v4", "Standard_HB176-24rs_v4"],
128
+ "HBv5": ["Standard_HB368rs_v5", "Standard_HB368-336rs_v5", "Standard_HB368-288rs_v5", "Standard_HB368-240rs_v5", "Standard_HB368-192rs_v5", "Standard_HB368-144rs_v5", "Standard_HB368-96rs_v5", "Standard_HB368-48rs_v5"],
129
+ "HC": ["Standard_HC44rs", "Standard_HC44-16rs", "Standard_HC44-32rs"],
130
+ "HX": ["Standard_HX176rs", "Standard_HX176-144rs", "Standard_HX176-96rs", "Standard_HX176-48rs", "Standard_HX176-24rs"],
131
+ };
132
+ const AZURE_INSTANCE_TYPES = flatten(Object.values(AZURE_INSTANCE_TYPES_BY_FAMILY));
133
+ /**
134
+ * @see https://aka.ms/flexfxversions
135
+ * @see https://learn.microsoft.com/en-us/azure/azure-functions/functions-create-first-function-terraform
136
+ */
137
+ const AZURE_LAMBDA_RUNTIMES = [
138
+ {
139
+ runtime_name: "dotnet-isolated",
140
+ runtime_version: "8",
141
+ },
142
+ {
143
+ runtime_name: "dotnet-isolated",
144
+ runtime_version: "9",
145
+ },
146
+ {
147
+ runtime_name: "dotnet-isolated",
148
+ runtime_version: "10",
149
+ },
150
+ {
151
+ runtime_name: "java",
152
+ runtime_version: "11",
153
+ },
154
+ {
155
+ runtime_name: "java",
156
+ runtime_version: "17",
157
+ },
158
+ {
159
+ runtime_name: "java",
160
+ runtime_version: "21",
161
+ },
162
+ {
163
+ runtime_name: "node",
164
+ runtime_version: "20",
165
+ },
166
+ {
167
+ runtime_name: "node",
168
+ runtime_version: "22",
169
+ },
170
+ {
171
+ runtime_name: "powershell",
172
+ runtime_version: "7.4",
173
+ },
174
+ {
175
+ runtime_name: "python",
176
+ runtime_version: "3.10",
177
+ },
178
+ {
179
+ runtime_name: "python",
180
+ runtime_version: "3.11",
181
+ },
182
+ {
183
+ runtime_name: "python",
184
+ runtime_version: "3.12",
185
+ },
186
+ ];
187
+ export { AZURE_INSTANCE_TYPES, AZURE_INSTANCE_TYPES_BY_FAMILY, AZURE_LAMBDA_RUNTIMES, AZURE_REGIONS, };
@@ -1,5 +1,6 @@
1
1
  const Providers = {
2
2
  AWS: "aws",
3
3
  GCP: "gcp",
4
+ Azure: "azure",
4
5
  };
5
6
  export { Providers };
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Represents an abstract resource type that most providers offer, but may name differently.
3
+ */
4
+ const ResourceTypes = {
5
+ ComputeInstance: "compute-instance",
6
+ LambdaFunction: "lambda-function",
7
+ };
8
+ export { ResourceTypes };
@@ -0,0 +1,68 @@
1
+ import { AWS_EBS_VOLUME_TYPES, AWS_INSTANCE_TYPES, AWS_LAMBDA_RUNTIMES, AWS_REGIONS, } from "../../constants/aws.js";
2
+ import { maybe, randomEnvironmentTag, randomId, randomItem, randomMemorableSlug, randomMemorySize, randomServiceTag, unique, } from "./generator-utils.js";
3
+ import { ProviderGenerator } from "./provider-generator.js";
4
+ const AwsResourceType = {
5
+ ComputeInstance: "aws_instance",
6
+ LambdaFunction: "aws_lambda_function",
7
+ };
8
+ class AwsGenerator extends ProviderGenerator {
9
+ addProvider() {
10
+ const region = randomItem(AWS_REGIONS);
11
+ this.tfg.provider("aws", { region });
12
+ }
13
+ addComputeInstance() {
14
+ const name = randomMemorableSlug();
15
+ const environment = randomEnvironmentTag();
16
+ const service = randomServiceTag();
17
+ const ami = this.randomAmi();
18
+ const instanceType = randomItem(AWS_INSTANCE_TYPES);
19
+ const rootBlockDevice = maybe(0.5)
20
+ ? {
21
+ root_block_device: {
22
+ volume_size: randomMemorySize({
23
+ min: 1024,
24
+ max: 64 * 1024 * 1024,
25
+ step: 1024,
26
+ }),
27
+ volume_type: randomItem(AWS_EBS_VOLUME_TYPES),
28
+ },
29
+ }
30
+ : {};
31
+ this.tfg.resource(AwsResourceType.ComputeInstance, name, {
32
+ ami,
33
+ instance_type: instanceType,
34
+ ...rootBlockDevice,
35
+ tags: { name, environment, service },
36
+ });
37
+ return this;
38
+ }
39
+ addLambdaFunction() {
40
+ const name = randomMemorableSlug();
41
+ const environment = randomEnvironmentTag();
42
+ const service = randomServiceTag();
43
+ // https://docs.aws.amazon.com/lambda/latest/dg/configuration-memory.html
44
+ const memorySize = randomMemorySize({
45
+ min: 128,
46
+ max: 10240,
47
+ step: 128,
48
+ });
49
+ const ami = this.randomAmi();
50
+ const role = this.randomRole();
51
+ const runtime = randomItem(AWS_LAMBDA_RUNTIMES);
52
+ const functionName = randomItem(["run", "test", "handler"]);
53
+ const handler = `${randomItem(["exports", "index"])}.${functionName}`;
54
+ this.tfg.resource(AwsResourceType.LambdaFunction, name, {
55
+ ami,
56
+ runtime,
57
+ handler,
58
+ function_name: functionName,
59
+ memory_size: memorySize,
60
+ role,
61
+ tags: { name, environment, service },
62
+ });
63
+ return this;
64
+ }
65
+ randomAmi = unique(() => `ami-${randomId()}`);
66
+ randomRole = unique(() => `arn:aws:iam::${randomId()}:mfa/${randomMemorableSlug()}`);
67
+ }
68
+ export { AwsGenerator };
@@ -0,0 +1,45 @@
1
+ import { AZURE_INSTANCE_TYPES, AZURE_LAMBDA_RUNTIMES, AZURE_REGIONS, } from "../../constants/azure.js";
2
+ import { randomEnvironmentTag, randomItem, randomMemorableSlug, randomMemorySize, randomServiceTag, } from "./generator-utils.js";
3
+ import { ProviderGenerator } from "./provider-generator.js";
4
+ const AzureResourceType = {
5
+ ComputeInstance: "azurerm_linux_virtual_machine",
6
+ LambdaFunction: "azurerm_linux_function_app",
7
+ };
8
+ class AzureGenerator extends ProviderGenerator {
9
+ addProvider() {
10
+ const region = randomItem(AZURE_REGIONS);
11
+ this.tfg.provider("azurerm", { region });
12
+ }
13
+ addComputeInstance() {
14
+ const name = randomMemorableSlug();
15
+ const environment = randomEnvironmentTag();
16
+ const service = randomServiceTag();
17
+ const instanceType = randomItem(AZURE_INSTANCE_TYPES);
18
+ this.tfg.resource(AzureResourceType.ComputeInstance, name, {
19
+ size: instanceType,
20
+ tags: { name, environment, service },
21
+ });
22
+ return this;
23
+ }
24
+ addLambdaFunction() {
25
+ const name = randomMemorableSlug();
26
+ const environment = randomEnvironmentTag();
27
+ const service = randomServiceTag();
28
+ const runtime = randomItem(AZURE_LAMBDA_RUNTIMES);
29
+ // There's a lot of different configurations listed, so just guessing here.
30
+ // https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale
31
+ const instanceMemoryInMb = randomMemorySize({
32
+ min: 128,
33
+ max: 4 * 1024,
34
+ step: 128,
35
+ });
36
+ this.tfg.resource(AzureResourceType.LambdaFunction, name, {
37
+ ...runtime,
38
+ name,
39
+ instance_memory_in_mb: instanceMemoryInMb,
40
+ labels: { name, environment, service },
41
+ });
42
+ return this;
43
+ }
44
+ }
45
+ export { AzureGenerator };
@@ -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 };