@highstate/common 0.15.0 → 0.17.0

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 (91) hide show
  1. package/dist/{chunk-WFWXDYUX.js → chunk-X5BK6JSN.js} +877 -194
  2. package/dist/chunk-X5BK6JSN.js.map +1 -0
  3. package/dist/highstate.manifest.json +12 -2
  4. package/dist/index.js +1 -1
  5. package/dist/units/databases/etcd-patch/index.js +20 -0
  6. package/dist/units/databases/etcd-patch/index.js.map +1 -0
  7. package/dist/units/databases/existing-etcd/index.js +14 -0
  8. package/dist/units/databases/existing-etcd/index.js.map +1 -0
  9. package/dist/units/databases/existing-mariadb/index.js +2 -2
  10. package/dist/units/databases/existing-mariadb/index.js.map +1 -1
  11. package/dist/units/databases/existing-mongodb/index.js +2 -2
  12. package/dist/units/databases/existing-mongodb/index.js.map +1 -1
  13. package/dist/units/databases/existing-postgresql/index.js +2 -2
  14. package/dist/units/databases/existing-postgresql/index.js.map +1 -1
  15. package/dist/units/databases/existing-redis/index.js +2 -2
  16. package/dist/units/databases/existing-redis/index.js.map +1 -1
  17. package/dist/units/databases/existing-s3/index.js +18 -0
  18. package/dist/units/databases/existing-s3/index.js.map +1 -0
  19. package/dist/units/databases/mariadb-patch/index.js +24 -0
  20. package/dist/units/databases/mariadb-patch/index.js.map +1 -0
  21. package/dist/units/databases/mongodb-patch/index.js +24 -0
  22. package/dist/units/databases/mongodb-patch/index.js.map +1 -0
  23. package/dist/units/databases/postgresql-patch/index.js +24 -0
  24. package/dist/units/databases/postgresql-patch/index.js.map +1 -0
  25. package/dist/units/databases/redis-patch/index.js +27 -0
  26. package/dist/units/databases/redis-patch/index.js.map +1 -0
  27. package/dist/units/databases/s3-patch/index.js +25 -0
  28. package/dist/units/databases/s3-patch/index.js.map +1 -0
  29. package/dist/units/dns/record-set/index.js +14 -20
  30. package/dist/units/dns/record-set/index.js.map +1 -1
  31. package/dist/units/existing-server/index.js +3 -4
  32. package/dist/units/existing-server/index.js.map +1 -1
  33. package/dist/units/network/address-space/index.js +20 -0
  34. package/dist/units/network/address-space/index.js.map +1 -0
  35. package/dist/units/network/endpoint-filter/index.js +15 -0
  36. package/dist/units/network/endpoint-filter/index.js.map +1 -0
  37. package/dist/units/network/l3-endpoint/index.js +2 -2
  38. package/dist/units/network/l3-endpoint/index.js.map +1 -1
  39. package/dist/units/network/l4-endpoint/index.js +2 -2
  40. package/dist/units/network/l4-endpoint/index.js.map +1 -1
  41. package/dist/units/network/l7-endpoint/index.js +12 -0
  42. package/dist/units/network/l7-endpoint/index.js.map +1 -0
  43. package/dist/units/script/index.js +1 -1
  44. package/dist/units/server-patch/index.js +9 -12
  45. package/dist/units/server-patch/index.js.map +1 -1
  46. package/dist/units/ssh/key-pair/index.js +1 -1
  47. package/package.json +64 -10
  48. package/src/shared/command.ts +1 -1
  49. package/src/shared/dns.ts +11 -93
  50. package/src/shared/files.ts +3 -3
  51. package/src/shared/impl-ref.ts +4 -0
  52. package/src/shared/index.ts +2 -0
  53. package/src/shared/network/address-space.spec.ts +114 -0
  54. package/src/shared/network/address-space.ts +364 -0
  55. package/src/shared/network/address.spec.ts +109 -0
  56. package/src/shared/network/address.ts +119 -0
  57. package/src/shared/network/endpoints.spec.ts +249 -0
  58. package/src/shared/network/endpoints.ts +608 -0
  59. package/src/shared/network/index.ts +4 -0
  60. package/src/shared/network/ip.ts +236 -0
  61. package/src/shared/network/subnet.spec.ts +62 -0
  62. package/src/shared/network/subnet.ts +137 -0
  63. package/src/shared/ssh.ts +1 -1
  64. package/src/shared/tls.ts +21 -5
  65. package/src/shared/utils.ts +93 -0
  66. package/src/units/databases/etcd-patch/index.ts +23 -0
  67. package/src/units/databases/existing-etcd/index.ts +11 -0
  68. package/src/units/databases/existing-mariadb/index.ts +1 -1
  69. package/src/units/databases/existing-mongodb/index.ts +1 -1
  70. package/src/units/databases/existing-postgresql/index.ts +1 -1
  71. package/src/units/databases/existing-redis/index.ts +1 -1
  72. package/src/units/databases/existing-s3/index.ts +1 -1
  73. package/src/units/databases/mariadb-patch/index.ts +27 -0
  74. package/src/units/databases/mongodb-patch/index.ts +27 -0
  75. package/src/units/databases/postgresql-patch/index.ts +27 -0
  76. package/src/units/databases/redis-patch/index.ts +32 -0
  77. package/src/units/databases/s3-patch/index.ts +28 -0
  78. package/src/units/dns/record-set/index.ts +15 -20
  79. package/src/units/existing-server/index.ts +3 -4
  80. package/src/units/network/address-space/index.ts +20 -0
  81. package/src/units/network/endpoint-filter/index.ts +5 -5
  82. package/src/units/network/l3-endpoint/index.ts +2 -2
  83. package/src/units/network/l4-endpoint/index.ts +2 -2
  84. package/src/units/network/l7-endpoint/index.ts +2 -2
  85. package/src/units/remote-file/index.ts +12 -5
  86. package/src/units/server-patch/index.ts +10 -13
  87. package/dist/chunk-WFWXDYUX.js.map +0 -1
  88. package/dist/units/server-dns/index.js +0 -26
  89. package/dist/units/server-dns/index.js.map +0 -1
  90. package/src/shared/network.ts +0 -413
  91. package/src/units/server-dns/index.ts +0 -26
@@ -0,0 +1,27 @@
1
+ import { databases } from "@highstate/library"
2
+ import { forUnit, toPromise } from "@highstate/pulumi"
3
+ import { l4EndpointToString, parseEndpoints } from "../../../shared"
4
+
5
+ const { args, inputs, outputs } = forUnit(databases.mongodbPatch)
6
+
7
+ const mongodb = await toPromise(inputs.mongodb)
8
+ const resolvedInputEndpoints = await toPromise(inputs.endpoints ?? [])
9
+
10
+ const shouldOverrideEndpoints =
11
+ args.endpoints.length > 0 || resolvedInputEndpoints.some(endpoint => endpoint != null)
12
+ const endpoints = shouldOverrideEndpoints
13
+ ? await parseEndpoints(args.endpoints, inputs.endpoints, 4)
14
+ : mongodb.endpoints
15
+
16
+ export default outputs({
17
+ mongodb: {
18
+ ...mongodb,
19
+ endpoints,
20
+ username: args.username ?? mongodb.username,
21
+ database: args.database ?? mongodb.database,
22
+ },
23
+
24
+ $statusFields: {
25
+ endpoints: endpoints.map(l4EndpointToString),
26
+ },
27
+ })
@@ -0,0 +1,27 @@
1
+ import { databases } from "@highstate/library"
2
+ import { forUnit, toPromise } from "@highstate/pulumi"
3
+ import { l4EndpointToString, parseEndpoints } from "../../../shared"
4
+
5
+ const { args, inputs, outputs } = forUnit(databases.postgresqlPatch)
6
+
7
+ const postgresql = await toPromise(inputs.postgresql)
8
+ const resolvedInputEndpoints = await toPromise(inputs.endpoints ?? [])
9
+
10
+ const shouldOverrideEndpoints =
11
+ args.endpoints.length > 0 || resolvedInputEndpoints.some(endpoint => endpoint != null)
12
+ const endpoints = shouldOverrideEndpoints
13
+ ? await parseEndpoints(args.endpoints, inputs.endpoints, 4)
14
+ : postgresql.endpoints
15
+
16
+ export default outputs({
17
+ postgresql: {
18
+ ...postgresql,
19
+ endpoints,
20
+ username: args.username ?? postgresql.username,
21
+ database: args.database ?? postgresql.database,
22
+ },
23
+
24
+ $statusFields: {
25
+ endpoints: endpoints.map(l4EndpointToString),
26
+ },
27
+ })
@@ -0,0 +1,32 @@
1
+ import { databases } from "@highstate/library"
2
+ import { forUnit, toPromise } from "@highstate/pulumi"
3
+ import { l4EndpointToString, parseEndpoints } from "../../../shared"
4
+
5
+ const { args, inputs, outputs } = forUnit(databases.redisPatch)
6
+
7
+ const redis = await toPromise(inputs.redis)
8
+ const resolvedInputEndpoints = await toPromise(inputs.endpoints ?? [])
9
+
10
+ const shouldOverrideEndpoints =
11
+ args.endpoints.length > 0 || resolvedInputEndpoints.some(endpoint => endpoint != null)
12
+ const endpoints = shouldOverrideEndpoints
13
+ ? await parseEndpoints(args.endpoints, inputs.endpoints, 4)
14
+ : redis.endpoints
15
+
16
+ const redisDatabase = args.database === undefined ? undefined : Number.parseInt(args.database, 10)
17
+
18
+ if (redisDatabase !== undefined && Number.isNaN(redisDatabase)) {
19
+ throw new Error(`Invalid Redis database number "${args.database}"`)
20
+ }
21
+
22
+ export default outputs({
23
+ redis: {
24
+ ...redis,
25
+ endpoints,
26
+ database: redisDatabase ?? redis.database,
27
+ },
28
+
29
+ $statusFields: {
30
+ endpoints: endpoints.map(l4EndpointToString),
31
+ },
32
+ })
@@ -0,0 +1,28 @@
1
+ import { databases } from "@highstate/library"
2
+ import { forUnit, toPromise } from "@highstate/pulumi"
3
+ import { l4EndpointToString, parseEndpoints } from "../../../shared"
4
+
5
+ const { args, inputs, outputs } = forUnit(databases.s3Patch)
6
+
7
+ const s3 = await toPromise(inputs.s3)
8
+ const resolvedInputEndpoints = await toPromise(inputs.endpoints ?? [])
9
+
10
+ const shouldOverrideEndpoints =
11
+ args.endpoints.length > 0 || resolvedInputEndpoints.some(endpoint => endpoint != null)
12
+ const endpoints = shouldOverrideEndpoints
13
+ ? await parseEndpoints(args.endpoints, inputs.endpoints, 4)
14
+ : s3.endpoints
15
+
16
+ export default outputs({
17
+ s3: {
18
+ ...s3,
19
+ endpoints,
20
+ region: args.region ?? s3.region,
21
+ accessKey: args.accessKey ?? s3.accessKey,
22
+ buckets: args.buckets ?? s3.buckets,
23
+ },
24
+
25
+ $statusFields: {
26
+ endpoints: endpoints.map(l4EndpointToString),
27
+ },
28
+ })
@@ -1,28 +1,23 @@
1
1
  import { dns } from "@highstate/library"
2
- import { forUnit } from "@highstate/pulumi"
3
- import { updateEndpointsWithFqdn } from "../../../shared"
2
+ import { forUnit, toPromise } from "@highstate/pulumi"
3
+ import { DnsRecordSet, mergeEndpoints, parseEndpoint, replaceEndpointBase } from "../../../shared"
4
4
 
5
5
  const { name, args, inputs, outputs } = forUnit(dns.recordSet)
6
6
 
7
- const { endpoints: l3Endpoints } = await updateEndpointsWithFqdn(
8
- inputs.l3Endpoints ?? [],
9
- args.fqdn ?? name,
10
- args.endpointFilter,
11
- args.patchMode,
12
- inputs.dnsProviders,
13
- `${args.fqdn ?? name}-l3`,
14
- )
7
+ const { l3Endpoints, l4Endpoints, l7Endpoints } = await toPromise(inputs)
8
+ const waitServers = await toPromise(inputs.waitServers)
15
9
 
16
- const { endpoints: l4Endpoints } = await updateEndpointsWithFqdn(
17
- inputs.l4Endpoints ?? [],
18
- args.fqdn ?? name,
19
- args.endpointFilter,
20
- args.patchMode,
21
- inputs.dnsProviders,
22
- `${args.fqdn ?? name}-l4`,
23
- )
10
+ new DnsRecordSet("record-set", {
11
+ providers: inputs.dnsProviders,
12
+ name: args.recordName ?? name,
13
+ values: [...args.values, ...l3Endpoints, ...l4Endpoints, ...l7Endpoints],
14
+ waitAt: [...(args.waitLocal ? ["local" as const] : []), ...waitServers],
15
+ })
16
+
17
+ const base = parseEndpoint(args.recordName ?? name)
24
18
 
25
19
  export default outputs({
26
- l3Endpoints,
27
- l4Endpoints,
20
+ l3Endpoints: mergeEndpoints(l3Endpoints.map(endpoint => replaceEndpointBase(endpoint, base))),
21
+ l4Endpoints: mergeEndpoints(l4Endpoints.map(endpoint => replaceEndpointBase(endpoint, base))),
22
+ l7Endpoints: mergeEndpoints(l7Endpoints.map(endpoint => replaceEndpointBase(endpoint, base))),
28
23
  })
@@ -1,15 +1,15 @@
1
1
  import { common } from "@highstate/library"
2
2
  import { forUnit } from "@highstate/pulumi"
3
3
  import { map } from "remeda"
4
- import { createServerBundle, l3EndpointToString, requireInputL3Endpoint } from "../../shared"
4
+ import { createServerBundle, l3EndpointToString, parseEndpoints } from "../../shared"
5
5
 
6
6
  const { name, args, inputs, secrets, outputs } = forUnit(common.existingServer)
7
7
 
8
- const endpoint = await requireInputL3Endpoint(args.endpoint, inputs.endpoint)
8
+ const endpoints = await parseEndpoints([args.endpoint], inputs.endpoints)
9
9
 
10
10
  const { server, terminal } = await createServerBundle({
11
11
  name,
12
- endpoints: [endpoint],
12
+ endpoints,
13
13
  sshArgs: args.ssh,
14
14
  sshPassword: secrets.sshPassword,
15
15
  sshPrivateKey: secrets.sshPrivateKey,
@@ -18,7 +18,6 @@ const { server, terminal } = await createServerBundle({
18
18
 
19
19
  export default outputs({
20
20
  server,
21
- endpoints: server.endpoints,
22
21
 
23
22
  $statusFields: {
24
23
  hostname: server.hostname,
@@ -0,0 +1,20 @@
1
+ import { network } from "@highstate/library"
2
+ import { forUnit, toPromise } from "@highstate/pulumi"
3
+ import { createAddressSpace, subnetToString } from "../../../shared"
4
+
5
+ const { args, inputs, outputs } = forUnit(network.addressSpace)
6
+
7
+ const resolvedInputs = await toPromise(inputs)
8
+
9
+ const addressSpace = createAddressSpace({
10
+ included: [...args.included, ...resolvedInputs.included],
11
+ excluded: [...args.excluded, ...resolvedInputs.excluded],
12
+ })
13
+
14
+ export default outputs({
15
+ addressSpace,
16
+
17
+ $statusFields: {
18
+ subnets: addressSpace.subnets.map(subnetToString),
19
+ },
20
+ })
@@ -1,13 +1,13 @@
1
1
  import { network } from "@highstate/library"
2
2
  import { forUnit, toPromise } from "@highstate/pulumi"
3
- import { filterEndpoints } from "../../../shared"
3
+ import { filterByExpression } from "../../../shared"
4
4
 
5
5
  const { args, inputs, outputs } = forUnit(network.endpointFilter)
6
6
 
7
- const l3EndpointsResolved = await toPromise(inputs.l3Endpoints)
8
- const l4EndpointsResolved = await toPromise(inputs.l4Endpoints)
7
+ const resolvedInputs = await toPromise(inputs)
9
8
 
10
9
  export default outputs({
11
- l3Endpoints: filterEndpoints(l3EndpointsResolved, args.endpointFilter),
12
- l4Endpoints: filterEndpoints(l4EndpointsResolved, args.endpointFilter),
10
+ l3Endpoints: filterByExpression(resolvedInputs.l3Endpoints, args.endpointFilter),
11
+ l4Endpoints: filterByExpression(resolvedInputs.l4Endpoints, args.endpointFilter),
12
+ l7Endpoints: filterByExpression(resolvedInputs.l7Endpoints, args.endpointFilter),
13
13
  })
@@ -1,9 +1,9 @@
1
1
  import { network } from "@highstate/library"
2
2
  import { forUnit } from "@highstate/pulumi"
3
- import { parseL3Endpoint } from "../../../shared"
3
+ import { addEndpointMetadata, parseEndpoint } from "../../../shared"
4
4
 
5
5
  const { args, outputs } = forUnit(network.l3Endpoint)
6
6
 
7
7
  export default outputs({
8
- endpoint: parseL3Endpoint(args.endpoint),
8
+ endpoint: addEndpointMetadata(parseEndpoint(args.endpoint), args.metadata),
9
9
  })
@@ -1,9 +1,9 @@
1
1
  import { network } from "@highstate/library"
2
2
  import { forUnit } from "@highstate/pulumi"
3
- import { parseL4Endpoint } from "../../../shared"
3
+ import { addEndpointMetadata, parseEndpoint } from "../../../shared"
4
4
 
5
5
  const { args, outputs } = forUnit(network.l4Endpoint)
6
6
 
7
7
  export default outputs({
8
- endpoint: parseL4Endpoint(args.endpoint),
8
+ endpoint: addEndpointMetadata(parseEndpoint(args.endpoint, 4), args.metadata),
9
9
  })
@@ -1,9 +1,9 @@
1
1
  import { network } from "@highstate/library"
2
2
  import { forUnit } from "@highstate/pulumi"
3
- import { parseL7Endpoint } from "../../../shared"
3
+ import { addEndpointMetadata, parseEndpoint } from "../../../shared"
4
4
 
5
5
  const { args, outputs } = forUnit(network.l7Endpoint)
6
6
 
7
7
  export default outputs({
8
- endpoint: parseL7Endpoint(args.endpoint),
8
+ endpoint: addEndpointMetadata(parseEndpoint(args.endpoint, 7), args.metadata),
9
9
  })
@@ -1,17 +1,24 @@
1
1
  import { common } from "@highstate/library"
2
- import { forUnit } from "@highstate/pulumi"
3
- import { parseL7Endpoint } from "../../shared"
2
+ import { forUnit, toPromise } from "@highstate/pulumi"
3
+ import { parseEndpoint } from "../../shared"
4
4
 
5
- const { args, inputs, outputs } = forUnit(common.remoteFile)
5
+ const { name, args, inputs, outputs } = forUnit(common.remoteFile)
6
+
7
+ const resolvedInputs = await toPromise(inputs)
8
+ if (!resolvedInputs.endpoint && !args.url) {
9
+ throw new Error("Either 'endpoint' input or 'url' argument must be provided.")
10
+ }
11
+
12
+ const endpoint = parseEndpoint(resolvedInputs.endpoint ?? args.url!, 7)
6
13
 
7
14
  export default outputs({
8
15
  file: {
9
16
  meta: {
10
- name: args.url ? new URL(args.url).pathname.split("/").pop() || "file" : "file",
17
+ name: args.fileName ?? endpoint.path?.split("/").pop() ?? name,
11
18
  },
12
19
  content: {
13
20
  type: "remote",
14
- endpoint: inputs.endpoint ? inputs.endpoint : parseL7Endpoint(args.url!),
21
+ endpoint,
15
22
  },
16
23
  },
17
24
  })
@@ -1,23 +1,20 @@
1
1
  import { common } from "@highstate/library"
2
- import { forUnit } from "@highstate/pulumi"
3
- import { l3EndpointToString, updateEndpoints } from "../../shared"
2
+ import { forUnit, toPromise } from "@highstate/pulumi"
3
+ import { l3EndpointToString, parseEndpoints } from "../../shared"
4
4
 
5
5
  const { args, inputs, outputs } = forUnit(common.serverPatch)
6
6
 
7
- const endpoints = await updateEndpoints(
8
- inputs.server.endpoints,
9
- args.endpoints,
10
- inputs.endpoints,
11
- args.endpointsPatchMode,
12
- )
7
+ const server = await toPromise(inputs.server)
8
+ const endpoints = await parseEndpoints(args.endpoints, inputs.endpoints, 3)
9
+
10
+ const newEndpoints = endpoints.length > 0 ? endpoints : server.endpoints
13
11
 
14
12
  export default outputs({
15
- server: inputs.server.apply(server => ({
13
+ server: {
16
14
  ...server,
17
- endpoints,
18
- })),
19
-
20
- endpoints,
15
+ hostname: args.hostname ?? server.hostname,
16
+ endpoints: newEndpoints,
17
+ },
21
18
 
22
19
  $statusFields: {
23
20
  endpoints: endpoints.map(l3EndpointToString),