@alchemy.run/daytona 0.0.0 → 2.0.0-beta.86
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/LICENSE +201 -0
- package/README.md +76 -4
- package/lib/ApiKey.d.ts +99 -0
- package/lib/ApiKey.d.ts.map +1 -0
- package/lib/ApiKey.js +152 -0
- package/lib/ApiKey.js.map +1 -0
- package/lib/AuthProvider.d.ts +55 -0
- package/lib/AuthProvider.d.ts.map +1 -0
- package/lib/AuthProvider.js +280 -0
- package/lib/AuthProvider.js.map +1 -0
- package/lib/Bootstrap.d.ts +8 -0
- package/lib/Bootstrap.d.ts.map +1 -0
- package/lib/Bootstrap.js +28 -0
- package/lib/Bootstrap.js.map +1 -0
- package/lib/ConnectSandbox.d.ts +72 -0
- package/lib/ConnectSandbox.d.ts.map +1 -0
- package/lib/ConnectSandbox.js +3 -0
- package/lib/ConnectSandbox.js.map +1 -0
- package/lib/ConnectSandboxHttp.d.ts +5 -0
- package/lib/ConnectSandboxHttp.d.ts.map +1 -0
- package/lib/ConnectSandboxHttp.js +22 -0
- package/lib/ConnectSandboxHttp.js.map +1 -0
- package/lib/Contributions.d.ts +7 -0
- package/lib/Contributions.d.ts.map +1 -0
- package/lib/Contributions.js +6 -0
- package/lib/Contributions.js.map +1 -0
- package/lib/CreateSandbox.d.ts +86 -0
- package/lib/CreateSandbox.d.ts.map +1 -0
- package/lib/CreateSandbox.js +3 -0
- package/lib/CreateSandbox.js.map +1 -0
- package/lib/CreateSandboxHttp.d.ts +5 -0
- package/lib/CreateSandboxHttp.d.ts.map +1 -0
- package/lib/CreateSandboxHttp.js +65 -0
- package/lib/CreateSandboxHttp.js.map +1 -0
- package/lib/CreateSecret.d.ts +56 -0
- package/lib/CreateSecret.d.ts.map +1 -0
- package/lib/CreateSecret.js +3 -0
- package/lib/CreateSecret.js.map +1 -0
- package/lib/CreateSecretHttp.d.ts +5 -0
- package/lib/CreateSecretHttp.d.ts.map +1 -0
- package/lib/CreateSecretHttp.js +39 -0
- package/lib/CreateSecretHttp.js.map +1 -0
- package/lib/CreateSnapshot.d.ts +80 -0
- package/lib/CreateSnapshot.d.ts.map +1 -0
- package/lib/CreateSnapshot.js +3 -0
- package/lib/CreateSnapshot.js.map +1 -0
- package/lib/CreateSnapshotHttp.d.ts +5 -0
- package/lib/CreateSnapshotHttp.d.ts.map +1 -0
- package/lib/CreateSnapshotHttp.js +47 -0
- package/lib/CreateSnapshotHttp.js.map +1 -0
- package/lib/CreateVolume.d.ts +81 -0
- package/lib/CreateVolume.d.ts.map +1 -0
- package/lib/CreateVolume.js +10 -0
- package/lib/CreateVolume.js.map +1 -0
- package/lib/CreateVolumeHttp.d.ts +5 -0
- package/lib/CreateVolumeHttp.d.ts.map +1 -0
- package/lib/CreateVolumeHttp.js +31 -0
- package/lib/CreateVolumeHttp.js.map +1 -0
- package/lib/Credentials.d.ts +9 -0
- package/lib/Credentials.d.ts.map +1 -0
- package/lib/Credentials.js +18 -0
- package/lib/Credentials.js.map +1 -0
- package/lib/DaytonaBindings.d.ts +51 -0
- package/lib/DaytonaBindings.d.ts.map +1 -0
- package/lib/DaytonaBindings.js +61 -0
- package/lib/DaytonaBindings.js.map +1 -0
- package/lib/IdentityProvider.d.ts +80 -0
- package/lib/IdentityProvider.d.ts.map +1 -0
- package/lib/IdentityProvider.js +111 -0
- package/lib/IdentityProvider.js.map +1 -0
- package/lib/MountVolume.d.ts +86 -0
- package/lib/MountVolume.d.ts.map +1 -0
- package/lib/MountVolume.js +27 -0
- package/lib/MountVolume.js.map +1 -0
- package/lib/OAuthClient.d.ts +14 -0
- package/lib/OAuthClient.d.ts.map +1 -0
- package/lib/OAuthClient.js +23 -0
- package/lib/OAuthClient.js.map +1 -0
- package/lib/Organization.d.ts +40 -0
- package/lib/Organization.d.ts.map +1 -0
- package/lib/Organization.js +80 -0
- package/lib/Organization.js.map +1 -0
- package/lib/OrganizationInvitation.d.ts +70 -0
- package/lib/OrganizationInvitation.d.ts.map +1 -0
- package/lib/OrganizationInvitation.js +109 -0
- package/lib/OrganizationInvitation.js.map +1 -0
- package/lib/OrganizationMember.d.ts +86 -0
- package/lib/OrganizationMember.d.ts.map +1 -0
- package/lib/OrganizationMember.js +109 -0
- package/lib/OrganizationMember.js.map +1 -0
- package/lib/OrganizationOtelConfig.d.ts +59 -0
- package/lib/OrganizationOtelConfig.d.ts.map +1 -0
- package/lib/OrganizationOtelConfig.js +87 -0
- package/lib/OrganizationOtelConfig.js.map +1 -0
- package/lib/OrganizationRole.d.ts +66 -0
- package/lib/OrganizationRole.d.ts.map +1 -0
- package/lib/OrganizationRole.js +106 -0
- package/lib/OrganizationRole.js.map +1 -0
- package/lib/OrganizationSettings.d.ts +76 -0
- package/lib/OrganizationSettings.d.ts.map +1 -0
- package/lib/OrganizationSettings.js +107 -0
- package/lib/OrganizationSettings.js.map +1 -0
- package/lib/Providers.d.ts +14 -0
- package/lib/Providers.d.ts.map +1 -0
- package/lib/Providers.js +53 -0
- package/lib/Providers.js.map +1 -0
- package/lib/ReadAuditLogs.d.ts +30 -0
- package/lib/ReadAuditLogs.d.ts.map +1 -0
- package/lib/ReadAuditLogs.js +17 -0
- package/lib/ReadAuditLogs.js.map +1 -0
- package/lib/ReadOrganization.d.ts +39 -0
- package/lib/ReadOrganization.d.ts.map +1 -0
- package/lib/ReadOrganization.js +39 -0
- package/lib/ReadOrganization.js.map +1 -0
- package/lib/ReadUsage.d.ts +31 -0
- package/lib/ReadUsage.d.ts.map +1 -0
- package/lib/ReadUsage.js +17 -0
- package/lib/ReadUsage.js.map +1 -0
- package/lib/Region.d.ts +78 -0
- package/lib/Region.d.ts.map +1 -0
- package/lib/Region.js +169 -0
- package/lib/Region.js.map +1 -0
- package/lib/Registry.d.ts +84 -0
- package/lib/Registry.d.ts.map +1 -0
- package/lib/Registry.js +97 -0
- package/lib/Registry.js.map +1 -0
- package/lib/Runner.d.ts +66 -0
- package/lib/Runner.d.ts.map +1 -0
- package/lib/Runner.js +116 -0
- package/lib/Runner.js.map +1 -0
- package/lib/Sandbox.d.ts +376 -0
- package/lib/Sandbox.d.ts.map +1 -0
- package/lib/Sandbox.js +565 -0
- package/lib/Sandbox.js.map +1 -0
- package/lib/SandboxClient.d.ts +258 -0
- package/lib/SandboxClient.d.ts.map +1 -0
- package/lib/SandboxClient.js +233 -0
- package/lib/SandboxClient.js.map +1 -0
- package/lib/Secret.d.ts +93 -0
- package/lib/Secret.d.ts.map +1 -0
- package/lib/Secret.js +130 -0
- package/lib/Secret.js.map +1 -0
- package/lib/Snapshot.d.ts +327 -0
- package/lib/Snapshot.d.ts.map +1 -0
- package/lib/Snapshot.js +447 -0
- package/lib/Snapshot.js.map +1 -0
- package/lib/Volume.d.ts +99 -0
- package/lib/Volume.d.ts.map +1 -0
- package/lib/Volume.js +152 -0
- package/lib/Volume.js.map +1 -0
- package/lib/WarmPool.d.ts +61 -0
- package/lib/WarmPool.d.ts.map +1 -0
- package/lib/WarmPool.js +81 -0
- package/lib/WarmPool.js.map +1 -0
- package/lib/Webhooks.d.ts +58 -0
- package/lib/Webhooks.d.ts.map +1 -0
- package/lib/Webhooks.js +75 -0
- package/lib/Webhooks.js.map +1 -0
- package/lib/index.d.ts +37 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +36 -0
- package/lib/index.js.map +1 -0
- package/lib/internal/BuildContext.d.ts +16 -0
- package/lib/internal/BuildContext.d.ts.map +1 -0
- package/lib/internal/BuildContext.js +50 -0
- package/lib/internal/BuildContext.js.map +1 -0
- package/lib/internal/Declared.d.ts +29 -0
- package/lib/internal/Declared.d.ts.map +1 -0
- package/lib/internal/Declared.js +31 -0
- package/lib/internal/Declared.js.map +1 -0
- package/lib/internal/Derived.d.ts +40 -0
- package/lib/internal/Derived.d.ts.map +1 -0
- package/lib/internal/Derived.js +64 -0
- package/lib/internal/Derived.js.map +1 -0
- package/lib/internal/Errors.d.ts +4 -0
- package/lib/internal/Errors.d.ts.map +1 -0
- package/lib/internal/Errors.js +1 -0
- package/lib/internal/Errors.js.map +1 -0
- package/lib/internal/Labels.d.ts +20 -0
- package/lib/internal/Labels.d.ts.map +1 -0
- package/lib/internal/Labels.js +22 -0
- package/lib/internal/Labels.js.map +1 -0
- package/lib/internal/Names.d.ts +18 -0
- package/lib/internal/Names.d.ts.map +1 -0
- package/lib/internal/Names.js +25 -0
- package/lib/internal/Names.js.map +1 -0
- package/lib/internal/Organization.d.ts +27 -0
- package/lib/internal/Organization.d.ts.map +1 -0
- package/lib/internal/Organization.js +32 -0
- package/lib/internal/Organization.js.map +1 -0
- package/lib/internal/Process.d.ts +14 -0
- package/lib/internal/Process.d.ts.map +1 -0
- package/lib/internal/Process.js +15 -0
- package/lib/internal/Process.js.map +1 -0
- package/lib/internal/Program.d.ts +83 -0
- package/lib/internal/Program.d.ts.map +1 -0
- package/lib/internal/Program.js +169 -0
- package/lib/internal/Program.js.map +1 -0
- package/lib/internal/Ref.d.ts +14 -0
- package/lib/internal/Ref.d.ts.map +1 -0
- package/lib/internal/Ref.js +7 -0
- package/lib/internal/Ref.js.map +1 -0
- package/lib/internal/Scoped.d.ts +31 -0
- package/lib/internal/Scoped.d.ts.map +1 -0
- package/lib/internal/Scoped.js +48 -0
- package/lib/internal/Scoped.js.map +1 -0
- package/lib/internal/Tar.d.ts +13 -0
- package/lib/internal/Tar.d.ts.map +1 -0
- package/lib/internal/Tar.js +62 -0
- package/lib/internal/Tar.js.map +1 -0
- package/lib/internal/Toolbox.d.ts +11 -0
- package/lib/internal/Toolbox.d.ts.map +1 -0
- package/lib/internal/Toolbox.js +20 -0
- package/lib/internal/Toolbox.js.map +1 -0
- package/lib/internal/Wait.d.ts +49 -0
- package/lib/internal/Wait.d.ts.map +1 -0
- package/lib/internal/Wait.js +57 -0
- package/lib/internal/Wait.js.map +1 -0
- package/package.json +64 -3
- package/src/ApiKey.ts +221 -0
- package/src/AuthProvider.ts +406 -0
- package/src/Bootstrap.ts +55 -0
- package/src/ConnectSandbox.ts +76 -0
- package/src/ConnectSandboxHttp.ts +26 -0
- package/src/Contributions.ts +9 -0
- package/src/CreateSandbox.ts +107 -0
- package/src/CreateSandboxHttp.ts +97 -0
- package/src/CreateSecret.ts +73 -0
- package/src/CreateSecretHttp.ts +58 -0
- package/src/CreateSnapshot.ts +133 -0
- package/src/CreateSnapshotHttp.ts +77 -0
- package/src/CreateVolume.ts +104 -0
- package/src/CreateVolumeHttp.ts +50 -0
- package/src/Credentials.ts +37 -0
- package/src/DaytonaBindings.ts +111 -0
- package/src/IdentityProvider.ts +181 -0
- package/src/MountVolume.ts +122 -0
- package/src/OAuthClient.ts +27 -0
- package/src/Organization.ts +121 -0
- package/src/OrganizationInvitation.ts +174 -0
- package/src/OrganizationMember.ts +174 -0
- package/src/OrganizationOtelConfig.ts +138 -0
- package/src/OrganizationRole.ts +167 -0
- package/src/OrganizationSettings.ts +187 -0
- package/src/Providers.ts +93 -0
- package/src/ReadAuditLogs.ts +50 -0
- package/src/ReadOrganization.ts +83 -0
- package/src/ReadUsage.ts +51 -0
- package/src/Region.ts +226 -0
- package/src/Registry.ts +164 -0
- package/src/Runner.ts +166 -0
- package/src/Sandbox.ts +927 -0
- package/src/SandboxClient.ts +625 -0
- package/src/Secret.ts +203 -0
- package/src/Snapshot.ts +685 -0
- package/src/Volume.ts +229 -0
- package/src/WarmPool.ts +128 -0
- package/src/Webhooks.ts +121 -0
- package/src/globals.d.ts +2 -0
- package/src/index.ts +46 -0
- package/src/internal/BuildContext.ts +62 -0
- package/src/internal/Declared.ts +80 -0
- package/src/internal/Derived.ts +97 -0
- package/src/internal/Errors.ts +4 -0
- package/src/internal/Labels.ts +39 -0
- package/src/internal/Names.ts +37 -0
- package/src/internal/Organization.ts +40 -0
- package/src/internal/Process.ts +25 -0
- package/src/internal/Program.ts +239 -0
- package/src/internal/Ref.ts +15 -0
- package/src/internal/Scoped.ts +102 -0
- package/src/internal/Tar.ts +72 -0
- package/src/internal/Toolbox.ts +27 -0
- package/src/internal/Wait.ts +105 -0
package/lib/Region.d.ts
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import * as organizations from "@distilled.cloud/daytona/organizations";
|
|
2
|
+
import * as Provider from "alchemy/Provider";
|
|
3
|
+
import { Resource } from "alchemy/Resource";
|
|
4
|
+
import * as Redacted from "effect/Redacted";
|
|
5
|
+
import type { Providers } from "./Providers.ts";
|
|
6
|
+
export interface RegionProps {
|
|
7
|
+
/** Region name. If omitted, generated from the stack, stage and logical ID. Changing it replaces the region. */
|
|
8
|
+
name?: string;
|
|
9
|
+
/** URL of the region's sandbox proxy. */
|
|
10
|
+
proxyUrl?: string;
|
|
11
|
+
/** URL of the region's SSH gateway. */
|
|
12
|
+
sshGatewayUrl?: string;
|
|
13
|
+
/** URL of the region's snapshot manager (image registry). */
|
|
14
|
+
snapshotManagerUrl?: string;
|
|
15
|
+
/** OTLP endpoint the region's runners export to. */
|
|
16
|
+
otelEndpoint?: string;
|
|
17
|
+
/** S3 bucket for Dockerfile build contexts. */
|
|
18
|
+
buildContextBucket?: string;
|
|
19
|
+
/** Region of that bucket. */
|
|
20
|
+
buildContextBucketRegion?: string;
|
|
21
|
+
/** IAM role Daytona assumes to use the bucket. */
|
|
22
|
+
buildContextRoleArn?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Bump a counter to rotate that credential on the next deploy.
|
|
25
|
+
*/
|
|
26
|
+
rotate?: {
|
|
27
|
+
proxyApiKey?: number;
|
|
28
|
+
sshGatewayApiKey?: number;
|
|
29
|
+
snapshotManagerCredentials?: number;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export interface RegionAttributes {
|
|
33
|
+
/** Region ID; what runners, snapshots and sandboxes take. */
|
|
34
|
+
regionId: string;
|
|
35
|
+
/** Region name. */
|
|
36
|
+
name: string;
|
|
37
|
+
/** API key the region's proxy authenticates with. */
|
|
38
|
+
proxyApiKey: Redacted.Redacted<string> | undefined;
|
|
39
|
+
/** API key the region's SSH gateway authenticates with. */
|
|
40
|
+
sshGatewayApiKey: Redacted.Redacted<string> | undefined;
|
|
41
|
+
/** Snapshot manager user name. */
|
|
42
|
+
snapshotManagerUsername: string | undefined;
|
|
43
|
+
/** Snapshot manager password. */
|
|
44
|
+
snapshotManagerPassword: Redacted.Redacted<string> | undefined;
|
|
45
|
+
/** Rotation counters applied. */
|
|
46
|
+
rotated: {
|
|
47
|
+
proxyApiKey: number;
|
|
48
|
+
sshGatewayApiKey: number;
|
|
49
|
+
snapshotManagerCredentials: number;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export type Region = Resource<"Daytona.Region", RegionProps, RegionAttributes, never, Providers>;
|
|
53
|
+
/**
|
|
54
|
+
* A custom region: your own compute (see {@link Runner}) registered with
|
|
55
|
+
* Daytona, so sandboxes run on machines you operate while Daytona runs
|
|
56
|
+
* the control plane. Needs an organization allowed to bring its own
|
|
57
|
+
* compute.
|
|
58
|
+
*
|
|
59
|
+
* Daytona shows the region's API keys only when they are created or
|
|
60
|
+
* rotated, so alchemy keeps them in state as `Redacted` values. Bump a
|
|
61
|
+
* `rotate` counter to rotate one.
|
|
62
|
+
* @see https://www.daytona.io/docs/en/regions/
|
|
63
|
+
*
|
|
64
|
+
* ### Bringing Your Own Compute
|
|
65
|
+
* **Example:** A region with its own proxy and SSH gateway
|
|
66
|
+
* ```typescript
|
|
67
|
+
* export const Home = Daytona.Region("Home", {
|
|
68
|
+
* proxyUrl: "https://proxy.daytona.example.com",
|
|
69
|
+
* sshGatewayUrl: "ssh.daytona.example.com:2222",
|
|
70
|
+
* });
|
|
71
|
+
* ```
|
|
72
|
+
*
|
|
73
|
+
* @resource
|
|
74
|
+
* @product Region
|
|
75
|
+
*/
|
|
76
|
+
export declare const Region: import("alchemy/Resource").ResourceClass<Region>;
|
|
77
|
+
export declare const RegionProvider: () => import("effect/Layer").Layer<Provider.Provider<Region>, never, import("alchemy/Stack").Stack | import("alchemy/Stage").Stage | organizations.DaytonaOpContext>;
|
|
78
|
+
//# sourceMappingURL=Region.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Region.d.ts","sources":["../src/Region.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,wCAAwC,CAAC;AAGxE,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAE5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,WAAW;IAC1B,gHAAgH;IAChH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,6BAA6B;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,kDAAkD;IAClD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;OAEG;IACH,MAAM,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAAC,0BAA0B,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACnG;AAED,MAAM,WAAW,gBAAgB;IAC/B,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IACnD,2DAA2D;IAC3D,gBAAgB,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IACxD,kCAAkC;IAClC,uBAAuB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,iCAAiC;IACjC,uBAAuB,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAC/D,iCAAiC;IACjC,OAAO,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,0BAA0B,EAAE,MAAM,CAAA;KAAE,CAAC;CAChG;AAED,MAAM,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;AAEjG;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,MAAM,kDAAqC,CAAC;AAiBzD,eAAO,MAAM,cAAc,sKAqIxB,CAAC"}
|
package/lib/Region.js
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import * as organizations from "@distilled.cloud/daytona/organizations";
|
|
2
|
+
import { Unowned } from "alchemy/AdoptPolicy";
|
|
3
|
+
import { isResolved } from "alchemy/Diff";
|
|
4
|
+
import * as Provider from "alchemy/Provider";
|
|
5
|
+
import { Resource } from "alchemy/Resource";
|
|
6
|
+
import * as Effect from "effect/Effect";
|
|
7
|
+
import * as Redacted from "effect/Redacted";
|
|
8
|
+
import { isOwnedName, resolveName } from "./internal/Names.js";
|
|
9
|
+
/**
|
|
10
|
+
* A custom region: your own compute (see {@link Runner}) registered with
|
|
11
|
+
* Daytona, so sandboxes run on machines you operate while Daytona runs
|
|
12
|
+
* the control plane. Needs an organization allowed to bring its own
|
|
13
|
+
* compute.
|
|
14
|
+
*
|
|
15
|
+
* Daytona shows the region's API keys only when they are created or
|
|
16
|
+
* rotated, so alchemy keeps them in state as `Redacted` values. Bump a
|
|
17
|
+
* `rotate` counter to rotate one.
|
|
18
|
+
* @see https://www.daytona.io/docs/en/regions/
|
|
19
|
+
*
|
|
20
|
+
* ### Bringing Your Own Compute
|
|
21
|
+
* **Example:** A region with its own proxy and SSH gateway
|
|
22
|
+
* ```typescript
|
|
23
|
+
* export const Home = Daytona.Region("Home", {
|
|
24
|
+
* proxyUrl: "https://proxy.daytona.example.com",
|
|
25
|
+
* sshGatewayUrl: "ssh.daytona.example.com:2222",
|
|
26
|
+
* });
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* @resource
|
|
30
|
+
* @product Region
|
|
31
|
+
*/
|
|
32
|
+
export const Region = Resource("Daytona.Region");
|
|
33
|
+
const redact = (value) => value === null || value === undefined
|
|
34
|
+
? undefined
|
|
35
|
+
: Redacted.isRedacted(value)
|
|
36
|
+
? value
|
|
37
|
+
: Redacted.make(value);
|
|
38
|
+
const getById = (id) => organizations.getRegion({ id }).pipe(Effect.catchTag("RegionNotFound", () => Effect.undefined));
|
|
39
|
+
const findByName = (name) => organizations
|
|
40
|
+
.listAvailableRegions({})
|
|
41
|
+
.pipe(Effect.map((all) => all.find((r) => r.name === name)));
|
|
42
|
+
export const RegionProvider = () => Provider.effect(Region, Effect.succeed({
|
|
43
|
+
stables: ["regionId"],
|
|
44
|
+
list: Effect.fn(function* () {
|
|
45
|
+
const all = yield* organizations.listAvailableRegions({});
|
|
46
|
+
return all
|
|
47
|
+
.filter((r) => r.organizationId)
|
|
48
|
+
.map((r) => ({
|
|
49
|
+
regionId: r.id,
|
|
50
|
+
name: r.name,
|
|
51
|
+
proxyApiKey: undefined,
|
|
52
|
+
sshGatewayApiKey: undefined,
|
|
53
|
+
snapshotManagerUsername: undefined,
|
|
54
|
+
snapshotManagerPassword: undefined,
|
|
55
|
+
rotated: { proxyApiKey: 0, sshGatewayApiKey: 0, snapshotManagerCredentials: 0 },
|
|
56
|
+
}));
|
|
57
|
+
}),
|
|
58
|
+
diff: Effect.fn(function* ({ id, news, output }) {
|
|
59
|
+
if (!isResolved(news) || output === undefined)
|
|
60
|
+
return undefined;
|
|
61
|
+
const name = yield* resolveName(id, news.name, news.name === undefined ? output.name : undefined);
|
|
62
|
+
if (name !== output.name)
|
|
63
|
+
return { action: "replace", deleteFirst: true };
|
|
64
|
+
}),
|
|
65
|
+
read: Effect.fn(function* ({ id, olds, output }) {
|
|
66
|
+
const name = yield* resolveName(id, olds?.name, output?.name);
|
|
67
|
+
const found = (output ? yield* getById(output.regionId) : undefined) ?? (yield* findByName(name));
|
|
68
|
+
if (found === undefined)
|
|
69
|
+
return undefined;
|
|
70
|
+
const attrs = output ?? {
|
|
71
|
+
regionId: found.id,
|
|
72
|
+
name: found.name,
|
|
73
|
+
proxyApiKey: undefined,
|
|
74
|
+
sshGatewayApiKey: undefined,
|
|
75
|
+
snapshotManagerUsername: undefined,
|
|
76
|
+
snapshotManagerPassword: undefined,
|
|
77
|
+
rotated: { proxyApiKey: 0, sshGatewayApiKey: 0, snapshotManagerCredentials: 0 },
|
|
78
|
+
};
|
|
79
|
+
return (yield* isOwnedName(id, found.name, output !== undefined)) ? attrs : Unowned(attrs);
|
|
80
|
+
}),
|
|
81
|
+
reconcile: Effect.fn(function* ({ id, news, output }) {
|
|
82
|
+
const name = yield* resolveName(id, news.name, output?.name);
|
|
83
|
+
const settings = {
|
|
84
|
+
proxyUrl: news.proxyUrl ?? null,
|
|
85
|
+
sshGatewayUrl: news.sshGatewayUrl ?? null,
|
|
86
|
+
snapshotManagerUrl: news.snapshotManagerUrl ?? null,
|
|
87
|
+
otelEndpoint: news.otelEndpoint ?? null,
|
|
88
|
+
buildContextBucket: news.buildContextBucket ?? null,
|
|
89
|
+
buildContextBucketRegion: news.buildContextBucketRegion ?? null,
|
|
90
|
+
buildContextRoleArn: news.buildContextRoleArn ?? null,
|
|
91
|
+
};
|
|
92
|
+
// Observe
|
|
93
|
+
const current = (output ? yield* getById(output.regionId) : undefined) ?? (yield* findByName(name));
|
|
94
|
+
let attrs;
|
|
95
|
+
// Ensure
|
|
96
|
+
if (current === undefined) {
|
|
97
|
+
const created = yield* organizations.createRegion({ name, ...settings });
|
|
98
|
+
attrs = {
|
|
99
|
+
regionId: created.id,
|
|
100
|
+
name,
|
|
101
|
+
proxyApiKey: redact(created.proxyApiKey),
|
|
102
|
+
sshGatewayApiKey: redact(created.sshGatewayApiKey),
|
|
103
|
+
snapshotManagerUsername: created.snapshotManagerUsername ?? undefined,
|
|
104
|
+
snapshotManagerPassword: redact(created.snapshotManagerPassword),
|
|
105
|
+
rotated: {
|
|
106
|
+
proxyApiKey: news.rotate?.proxyApiKey ?? 0,
|
|
107
|
+
sshGatewayApiKey: news.rotate?.sshGatewayApiKey ?? 0,
|
|
108
|
+
snapshotManagerCredentials: news.rotate?.snapshotManagerCredentials ?? 0,
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
attrs = output ?? {
|
|
114
|
+
regionId: current.id,
|
|
115
|
+
name,
|
|
116
|
+
proxyApiKey: undefined,
|
|
117
|
+
sshGatewayApiKey: undefined,
|
|
118
|
+
snapshotManagerUsername: undefined,
|
|
119
|
+
snapshotManagerPassword: undefined,
|
|
120
|
+
rotated: { proxyApiKey: 0, sshGatewayApiKey: 0, snapshotManagerCredentials: 0 },
|
|
121
|
+
};
|
|
122
|
+
// Sync settings against the observed region.
|
|
123
|
+
const drift = Object.keys(settings).some((k) => (current[k] ?? null) !== settings[k]);
|
|
124
|
+
if (drift)
|
|
125
|
+
yield* organizations.updateRegion({ id: current.id, ...settings });
|
|
126
|
+
}
|
|
127
|
+
// Sync rotations.
|
|
128
|
+
const want = news.rotate ?? {};
|
|
129
|
+
if ((want.proxyApiKey ?? 0) !== attrs.rotated.proxyApiKey) {
|
|
130
|
+
const { apiKey } = yield* organizations.regenerateProxyApiKey({ id: attrs.regionId });
|
|
131
|
+
attrs = {
|
|
132
|
+
...attrs,
|
|
133
|
+
proxyApiKey: redact(apiKey),
|
|
134
|
+
rotated: { ...attrs.rotated, proxyApiKey: want.proxyApiKey ?? 0 },
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
if ((want.sshGatewayApiKey ?? 0) !== attrs.rotated.sshGatewayApiKey) {
|
|
138
|
+
const { apiKey } = yield* organizations.regenerateSshGatewayApiKey({
|
|
139
|
+
id: attrs.regionId,
|
|
140
|
+
});
|
|
141
|
+
attrs = {
|
|
142
|
+
...attrs,
|
|
143
|
+
sshGatewayApiKey: redact(apiKey),
|
|
144
|
+
rotated: { ...attrs.rotated, sshGatewayApiKey: want.sshGatewayApiKey ?? 0 },
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
if ((want.snapshotManagerCredentials ?? 0) !== attrs.rotated.snapshotManagerCredentials) {
|
|
148
|
+
const creds = yield* organizations.regenerateSnapshotManagerCredentials({
|
|
149
|
+
id: attrs.regionId,
|
|
150
|
+
});
|
|
151
|
+
attrs = {
|
|
152
|
+
...attrs,
|
|
153
|
+
snapshotManagerUsername: creds.username,
|
|
154
|
+
snapshotManagerPassword: redact(creds.password),
|
|
155
|
+
rotated: {
|
|
156
|
+
...attrs.rotated,
|
|
157
|
+
snapshotManagerCredentials: want.snapshotManagerCredentials ?? 0,
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
return attrs;
|
|
162
|
+
}),
|
|
163
|
+
delete: Effect.fn(function* ({ output }) {
|
|
164
|
+
yield* organizations
|
|
165
|
+
.deleteRegion({ id: output.regionId })
|
|
166
|
+
.pipe(Effect.catchTag("RegionNotFound", () => Effect.void));
|
|
167
|
+
}),
|
|
168
|
+
}));
|
|
169
|
+
//# sourceMappingURL=Region.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Region.js","sources":["../src/Region.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import * as registries from "@distilled.cloud/daytona/docker_registry";
|
|
2
|
+
import * as Provider from "alchemy/Provider";
|
|
3
|
+
import { Resource } from "alchemy/Resource";
|
|
4
|
+
import type * as Redacted from "effect/Redacted";
|
|
5
|
+
import type { Providers } from "./Providers.ts";
|
|
6
|
+
export interface RegistryProps {
|
|
7
|
+
/**
|
|
8
|
+
* Registry name in Daytona. If omitted, a unique name is generated from
|
|
9
|
+
* the stack, stage and logical ID.
|
|
10
|
+
*/
|
|
11
|
+
name?: string;
|
|
12
|
+
/** Registry host, e.g. `ghcr.io`, `docker.io` or an ECR host. */
|
|
13
|
+
url: string;
|
|
14
|
+
/** User name for the registry. */
|
|
15
|
+
username: string;
|
|
16
|
+
/** Password or access token for the registry. Updated in place. */
|
|
17
|
+
password: string | Redacted.Redacted<string>;
|
|
18
|
+
/** Project or namespace within the registry, if it has them. */
|
|
19
|
+
project?: string;
|
|
20
|
+
/** IAM role Daytona assumes for mTLS to the registry (ECR). */
|
|
21
|
+
mtlsRoleArn?: string;
|
|
22
|
+
/** Secrets Manager ARN holding the mTLS client certificate. */
|
|
23
|
+
mtlsSecretArn?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface RegistryAttributes {
|
|
26
|
+
/** Registry ID. */
|
|
27
|
+
registryId: string;
|
|
28
|
+
/** Registry name. */
|
|
29
|
+
name: string;
|
|
30
|
+
/** Registry host. */
|
|
31
|
+
url: string;
|
|
32
|
+
/** User name. */
|
|
33
|
+
username: string;
|
|
34
|
+
/** Project or namespace. */
|
|
35
|
+
project: string;
|
|
36
|
+
/** `organization`, `internal`, … */
|
|
37
|
+
registryType: string;
|
|
38
|
+
}
|
|
39
|
+
export type Registry = Resource<"Daytona.Registry", RegistryProps, RegistryAttributes, never, Providers, RegistryLookup>;
|
|
40
|
+
/**
|
|
41
|
+
* Props for {@link Registry.lookup}: find a container registry this
|
|
42
|
+
* stack doesn't manage by its name.
|
|
43
|
+
*/
|
|
44
|
+
export interface RegistryLookup {
|
|
45
|
+
/** Registry name. */
|
|
46
|
+
name: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Credentials for a private container registry, so Daytona can pull
|
|
50
|
+
* private images into a {@link Snapshot}. Daytona picks the registry whose
|
|
51
|
+
* `url` matches the image's host.
|
|
52
|
+
* @see https://www.daytona.io/docs/en/snapshots/#images-from-private-registries
|
|
53
|
+
*
|
|
54
|
+
* ### Pulling a Private Image
|
|
55
|
+
* **Example:** GitHub Container Registry
|
|
56
|
+
* ```typescript
|
|
57
|
+
* export const Ghcr = Daytona.Registry("Ghcr", {
|
|
58
|
+
* url: "ghcr.io",
|
|
59
|
+
* username: "alchemy-run",
|
|
60
|
+
* password: Config.Redacted("GHCR_TOKEN"),
|
|
61
|
+
* });
|
|
62
|
+
*
|
|
63
|
+
* export const Base = Daytona.Snapshot("Base", {
|
|
64
|
+
* image: "ghcr.io/alchemy-run/base:1.0.0",
|
|
65
|
+
* registry: Ghcr,
|
|
66
|
+
* });
|
|
67
|
+
* ```
|
|
68
|
+
*
|
|
69
|
+
* ### Looking up an existing registry
|
|
70
|
+
* `Registry.lookup` references a registry Alchemy doesn't manage (created in
|
|
71
|
+
* the Daytona dashboard or by another stack). It is read during plan/deploy,
|
|
72
|
+
* never created, updated or deleted.
|
|
73
|
+
*
|
|
74
|
+
* **Example:** Reference an existing registry
|
|
75
|
+
* ```typescript
|
|
76
|
+
* const ghcr = Daytona.Registry.lookup({ name: "ghcr" });
|
|
77
|
+
* ```
|
|
78
|
+
*
|
|
79
|
+
* @resource
|
|
80
|
+
* @product Registry
|
|
81
|
+
*/
|
|
82
|
+
export declare const Registry: import("alchemy/Resource").ResourceClass<Registry>;
|
|
83
|
+
export declare const RegistryProvider: () => import("effect/Layer").Layer<Provider.Provider<Registry>, never, import("alchemy/Stack").Stack | import("alchemy/Stage").Stage | registries.DaytonaOpContext>;
|
|
84
|
+
//# sourceMappingURL=Registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Registry.d.ts","sources":["../src/Registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,0CAA0C,CAAC;AAEvE,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,KAAK,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;IACZ,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7C,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,mBAAmB;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,iBAAiB;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAC7B,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,KAAK,EACL,SAAS,EACT,cAAc,CACf,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,QAAQ,oDAAyC,CAAC;AAiB/D,eAAO,MAAM,gBAAgB,qKAkD1B,CAAC"}
|
package/lib/Registry.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import * as registries from "@distilled.cloud/daytona/docker_registry";
|
|
2
|
+
import { Unowned } from "alchemy/AdoptPolicy";
|
|
3
|
+
import * as Provider from "alchemy/Provider";
|
|
4
|
+
import { Resource } from "alchemy/Resource";
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
6
|
+
import { isOwnedName, resolveName } from "./internal/Names.js";
|
|
7
|
+
/**
|
|
8
|
+
* Credentials for a private container registry, so Daytona can pull
|
|
9
|
+
* private images into a {@link Snapshot}. Daytona picks the registry whose
|
|
10
|
+
* `url` matches the image's host.
|
|
11
|
+
* @see https://www.daytona.io/docs/en/snapshots/#images-from-private-registries
|
|
12
|
+
*
|
|
13
|
+
* ### Pulling a Private Image
|
|
14
|
+
* **Example:** GitHub Container Registry
|
|
15
|
+
* ```typescript
|
|
16
|
+
* export const Ghcr = Daytona.Registry("Ghcr", {
|
|
17
|
+
* url: "ghcr.io",
|
|
18
|
+
* username: "alchemy-run",
|
|
19
|
+
* password: Config.Redacted("GHCR_TOKEN"),
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* export const Base = Daytona.Snapshot("Base", {
|
|
23
|
+
* image: "ghcr.io/alchemy-run/base:1.0.0",
|
|
24
|
+
* registry: Ghcr,
|
|
25
|
+
* });
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* ### Looking up an existing registry
|
|
29
|
+
* `Registry.lookup` references a registry Alchemy doesn't manage (created in
|
|
30
|
+
* the Daytona dashboard or by another stack). It is read during plan/deploy,
|
|
31
|
+
* never created, updated or deleted.
|
|
32
|
+
*
|
|
33
|
+
* **Example:** Reference an existing registry
|
|
34
|
+
* ```typescript
|
|
35
|
+
* const ghcr = Daytona.Registry.lookup({ name: "ghcr" });
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* @resource
|
|
39
|
+
* @product Registry
|
|
40
|
+
*/
|
|
41
|
+
export const Registry = Resource("Daytona.Registry");
|
|
42
|
+
const toAttributes = (r) => ({
|
|
43
|
+
registryId: r.id,
|
|
44
|
+
name: r.name,
|
|
45
|
+
url: r.url,
|
|
46
|
+
username: r.username,
|
|
47
|
+
project: r.project,
|
|
48
|
+
registryType: r.registryType,
|
|
49
|
+
});
|
|
50
|
+
const getById = (id) => registries.getRegistry({ id }).pipe(Effect.catchTag("RegistryNotFound", () => Effect.undefined));
|
|
51
|
+
const findByName = (name) => registries.listRegistries({}).pipe(Effect.map((all) => all.find((r) => r.name === name)));
|
|
52
|
+
export const RegistryProvider = () => Provider.effect(Registry, Effect.succeed({
|
|
53
|
+
stables: ["registryId"],
|
|
54
|
+
list: Effect.fn(function* () {
|
|
55
|
+
const all = yield* registries.listRegistries({});
|
|
56
|
+
return all.filter((r) => r.registryType === "organization").map(toAttributes);
|
|
57
|
+
}),
|
|
58
|
+
lookup: Effect.fn(function* ({ name }) {
|
|
59
|
+
const found = yield* findByName(name);
|
|
60
|
+
return found === undefined ? undefined : toAttributes(found);
|
|
61
|
+
}),
|
|
62
|
+
read: Effect.fn(function* ({ id, olds, output }) {
|
|
63
|
+
const name = yield* resolveName(id, olds?.name, output?.name);
|
|
64
|
+
const found = (output ? yield* getById(output.registryId) : undefined) ?? (yield* findByName(name));
|
|
65
|
+
if (found === undefined)
|
|
66
|
+
return undefined;
|
|
67
|
+
const attrs = toAttributes(found);
|
|
68
|
+
return (yield* isOwnedName(id, found.name, output !== undefined)) ? attrs : Unowned(attrs);
|
|
69
|
+
}),
|
|
70
|
+
reconcile: Effect.fn(function* ({ id, news, output }) {
|
|
71
|
+
const name = yield* resolveName(id, news.name, output?.name);
|
|
72
|
+
// Observe
|
|
73
|
+
const current = (output ? yield* getById(output.registryId) : undefined) ?? (yield* findByName(name));
|
|
74
|
+
const desired = {
|
|
75
|
+
name,
|
|
76
|
+
url: news.url,
|
|
77
|
+
username: news.username,
|
|
78
|
+
password: news.password,
|
|
79
|
+
project: news.project,
|
|
80
|
+
mtlsRoleArn: news.mtlsRoleArn ?? null,
|
|
81
|
+
mtlsSecretArn: news.mtlsSecretArn ?? null,
|
|
82
|
+
};
|
|
83
|
+
// Ensure
|
|
84
|
+
if (current === undefined) {
|
|
85
|
+
return toAttributes(yield* registries.createRegistry(desired));
|
|
86
|
+
}
|
|
87
|
+
// Sync — the password can't be read back, so every reconcile
|
|
88
|
+
// writes the full registry (updateRegistry is a PATCH of all fields).
|
|
89
|
+
return toAttributes(yield* registries.updateRegistry({ id: current.id, ...desired }));
|
|
90
|
+
}),
|
|
91
|
+
delete: Effect.fn(function* ({ output }) {
|
|
92
|
+
yield* registries
|
|
93
|
+
.deleteRegistry({ id: output.registryId })
|
|
94
|
+
.pipe(Effect.catchTag("RegistryNotFound", () => Effect.void));
|
|
95
|
+
}),
|
|
96
|
+
}));
|
|
97
|
+
//# sourceMappingURL=Registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Registry.js","sources":["../src/Registry.ts"],"names":[],"mappings":"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"}
|
package/lib/Runner.d.ts
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import * as runners from "@distilled.cloud/daytona/runners";
|
|
2
|
+
import * as Provider from "alchemy/Provider";
|
|
3
|
+
import { Resource } from "alchemy/Resource";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import * as Redacted from "effect/Redacted";
|
|
6
|
+
import { type Ref } from "./internal/Ref.ts";
|
|
7
|
+
import type { Providers } from "./Providers.ts";
|
|
8
|
+
/** A region, by id. Accepts a `Daytona.Region` or `{ regionId }`. */
|
|
9
|
+
export type RunnerRegion = {
|
|
10
|
+
readonly regionId: string;
|
|
11
|
+
};
|
|
12
|
+
export interface RunnerProps {
|
|
13
|
+
/** Runner name. If omitted, generated from the stack, stage and logical ID. Changing it replaces the runner. */
|
|
14
|
+
name?: string;
|
|
15
|
+
/** Region the runner serves. Changing it replaces the runner. */
|
|
16
|
+
region: Ref<RunnerRegion>;
|
|
17
|
+
/** Tags the scheduler matches sandboxes against. Changing them replaces the runner. */
|
|
18
|
+
tags?: string[];
|
|
19
|
+
/** Sandbox class the runner hosts. Changing it replaces the runner. */
|
|
20
|
+
sandboxClass?: runners.CreateRunnerSandboxClass;
|
|
21
|
+
/** Stop scheduling new sandboxes on it. Updated in place. @default false */
|
|
22
|
+
unschedulable?: boolean;
|
|
23
|
+
/** Drain it: no new sandboxes, and existing ones move off. Updated in place. @default false */
|
|
24
|
+
draining?: boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface RunnerAttributes {
|
|
27
|
+
/** Runner ID. */
|
|
28
|
+
runnerId: string;
|
|
29
|
+
/** Runner name. */
|
|
30
|
+
name: string;
|
|
31
|
+
/** Region. */
|
|
32
|
+
region: string;
|
|
33
|
+
/** State. */
|
|
34
|
+
state: string;
|
|
35
|
+
/**
|
|
36
|
+
* The key the runner daemon authenticates with. Daytona shows it only at
|
|
37
|
+
* creation, so alchemy keeps it in state as a `Redacted` value.
|
|
38
|
+
*/
|
|
39
|
+
apiKey: Redacted.Redacted<string>;
|
|
40
|
+
}
|
|
41
|
+
export type Runner = Resource<"Daytona.Runner", RunnerProps, RunnerAttributes, never, Providers>;
|
|
42
|
+
/**
|
|
43
|
+
* A runner: a machine you operate that hosts sandboxes for a custom
|
|
44
|
+
* {@link Region}. Declaring it registers the runner and mints the API key
|
|
45
|
+
* its daemon uses; you then start the daemon on the machine with that key.
|
|
46
|
+
*
|
|
47
|
+
* ### Registering a Runner
|
|
48
|
+
* **Example:** A runner for a custom region
|
|
49
|
+
* ```typescript
|
|
50
|
+
* export const Box1 = Daytona.Runner("Box1", { region: Home });
|
|
51
|
+
* ```
|
|
52
|
+
*
|
|
53
|
+
* @resource
|
|
54
|
+
* @product Region
|
|
55
|
+
*/
|
|
56
|
+
export declare const Runner: import("alchemy/Resource").ResourceConstructor<Runner, Providers> & Effect.Effect<import("alchemy/Resource").ResourceConstructor<Runner, never>, never, never> & {
|
|
57
|
+
Self: import("alchemy/Self").Self<Runner>;
|
|
58
|
+
Provider: Provider.Provider<Runner>;
|
|
59
|
+
Aliases: readonly string[] | undefined;
|
|
60
|
+
ref(id: string, options?: {
|
|
61
|
+
stage?: string;
|
|
62
|
+
stack?: string;
|
|
63
|
+
}): Effect.Effect<Runner, never, never>;
|
|
64
|
+
} & ((id: string, props: import("./internal/Declared.ts").DeclaredProps<RunnerProps>) => Effect.Effect<Runner, never, Providers>);
|
|
65
|
+
export declare const RunnerProvider: () => import("effect/Layer").Layer<Provider.Provider<Runner>, never, import("alchemy/Stack").Stack | import("alchemy/Stage").Stage | runners.DaytonaOpContext>;
|
|
66
|
+
//# sourceMappingURL=Runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Runner.d.ts","sources":["../src/Runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kCAAkC,CAAC;AAG5D,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAG5C,OAAO,EAAY,KAAK,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,qEAAqE;AACrE,MAAM,MAAM,YAAY,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,gHAAgH;IAChH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,MAAM,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IAC1B,uFAAuF;IACvF,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,uEAAuE;IACvE,YAAY,CAAC,EAAE,OAAO,CAAC,wBAAwB,CAAC;IAChD,4EAA4E;IAC5E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc;IACd,MAAM,EAAE,MAAM,CAAC;IACf,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;AAEjG;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,MAAM;;;;;;;;iIAA2D,CAAC;AAO/E,eAAO,MAAM,cAAc,gKAgGxB,CAAC"}
|
package/lib/Runner.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import * as runners from "@distilled.cloud/daytona/runners";
|
|
2
|
+
import { Unowned } from "alchemy/AdoptPolicy";
|
|
3
|
+
import { deepEqual, isResolved } from "alchemy/Diff";
|
|
4
|
+
import * as Provider from "alchemy/Provider";
|
|
5
|
+
import { Resource } from "alchemy/Resource";
|
|
6
|
+
import * as Effect from "effect/Effect";
|
|
7
|
+
import * as Redacted from "effect/Redacted";
|
|
8
|
+
import { declarable } from "./internal/Declared.js";
|
|
9
|
+
import { isOwnedName, resolveName } from "./internal/Names.js";
|
|
10
|
+
import { resolved } from "./internal/Ref.js";
|
|
11
|
+
/**
|
|
12
|
+
* A runner: a machine you operate that hosts sandboxes for a custom
|
|
13
|
+
* {@link Region}. Declaring it registers the runner and mints the API key
|
|
14
|
+
* its daemon uses; you then start the daemon on the machine with that key.
|
|
15
|
+
*
|
|
16
|
+
* ### Registering a Runner
|
|
17
|
+
* **Example:** A runner for a custom region
|
|
18
|
+
* ```typescript
|
|
19
|
+
* export const Box1 = Daytona.Runner("Box1", { region: Home });
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* @resource
|
|
23
|
+
* @product Region
|
|
24
|
+
*/
|
|
25
|
+
export const Runner = declarable()(Resource("Daytona.Runner"));
|
|
26
|
+
const regionId = (region) => Effect.succeed(resolved(region).regionId);
|
|
27
|
+
const getById = (id) => runners.getRunner({ id }).pipe(Effect.catchTag("RunnerNotFound", () => Effect.undefined));
|
|
28
|
+
export const RunnerProvider = () => Provider.effect(Runner, Effect.succeed({
|
|
29
|
+
stables: ["runnerId", "apiKey"],
|
|
30
|
+
nuke: { dependsOn: [] },
|
|
31
|
+
list: Effect.fn(function* () {
|
|
32
|
+
// Organizations without custom regions aren't served runners at all.
|
|
33
|
+
const all = yield* runners
|
|
34
|
+
.listRunners({})
|
|
35
|
+
.pipe(Effect.catchTag("RunnersUnavailable", () => Effect.succeed([])));
|
|
36
|
+
return all.map((r) => ({
|
|
37
|
+
runnerId: r.id,
|
|
38
|
+
name: r.name,
|
|
39
|
+
region: r.region,
|
|
40
|
+
state: r.state,
|
|
41
|
+
apiKey: Redacted.make(""),
|
|
42
|
+
}));
|
|
43
|
+
}),
|
|
44
|
+
diff: Effect.fn(function* ({ id, olds, news, output }) {
|
|
45
|
+
if (!isResolved(news) || output === undefined)
|
|
46
|
+
return undefined;
|
|
47
|
+
const name = yield* resolveName(id, news.name, news.name === undefined ? output.name : undefined);
|
|
48
|
+
if (name !== output.name ||
|
|
49
|
+
(yield* regionId(news.region)) !== output.region ||
|
|
50
|
+
!deepEqual(news.tags ?? [], olds?.tags ?? []) ||
|
|
51
|
+
news.sandboxClass !== olds?.sandboxClass) {
|
|
52
|
+
return { action: "replace", deleteFirst: name === output.name };
|
|
53
|
+
}
|
|
54
|
+
}),
|
|
55
|
+
read: Effect.fn(function* ({ id, olds, output }) {
|
|
56
|
+
const name = yield* resolveName(id, olds?.name, output?.name);
|
|
57
|
+
const found = (output ? yield* getById(output.runnerId) : undefined) ??
|
|
58
|
+
(yield* runners.listRunners({})).find((r) => r.name === name);
|
|
59
|
+
if (found === undefined)
|
|
60
|
+
return undefined;
|
|
61
|
+
const attrs = {
|
|
62
|
+
runnerId: found.id,
|
|
63
|
+
name: found.name,
|
|
64
|
+
region: found.region,
|
|
65
|
+
state: found.state,
|
|
66
|
+
apiKey: output?.apiKey ?? Redacted.make(""),
|
|
67
|
+
};
|
|
68
|
+
return (yield* isOwnedName(id, found.name, output !== undefined)) ? attrs : Unowned(attrs);
|
|
69
|
+
}),
|
|
70
|
+
reconcile: Effect.fn(function* ({ id, news, output }) {
|
|
71
|
+
const name = yield* resolveName(id, news.name, output?.name);
|
|
72
|
+
const region = yield* regionId(news.region);
|
|
73
|
+
// Observe
|
|
74
|
+
let current = output ? yield* getById(output.runnerId) : undefined;
|
|
75
|
+
let apiKey = output?.apiKey;
|
|
76
|
+
// Ensure
|
|
77
|
+
if (current === undefined) {
|
|
78
|
+
const created = yield* runners.createRunner({
|
|
79
|
+
regionId: region,
|
|
80
|
+
name,
|
|
81
|
+
tags: news.tags,
|
|
82
|
+
sandboxClass: news.sandboxClass,
|
|
83
|
+
});
|
|
84
|
+
apiKey = Redacted.isRedacted(created.apiKey)
|
|
85
|
+
? created.apiKey
|
|
86
|
+
: Redacted.make(created.apiKey);
|
|
87
|
+
current = yield* runners.getRunner({ id: created.id });
|
|
88
|
+
}
|
|
89
|
+
// Sync scheduling flags.
|
|
90
|
+
if ((news.unschedulable ?? false) !== current.unschedulable) {
|
|
91
|
+
current = yield* runners.updateRunnerScheduling({
|
|
92
|
+
id: current.id,
|
|
93
|
+
unschedulable: news.unschedulable ?? false,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
if ((news.draining ?? false) !== (current.draining ?? false)) {
|
|
97
|
+
current = yield* runners.updateRunnerDraining({
|
|
98
|
+
id: current.id,
|
|
99
|
+
draining: news.draining ?? false,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
runnerId: current.id,
|
|
104
|
+
name: current.name,
|
|
105
|
+
region: current.region,
|
|
106
|
+
state: current.state,
|
|
107
|
+
apiKey: apiKey ?? Redacted.make(""),
|
|
108
|
+
};
|
|
109
|
+
}),
|
|
110
|
+
delete: Effect.fn(function* ({ output }) {
|
|
111
|
+
yield* runners
|
|
112
|
+
.deleteRunner({ id: output.runnerId })
|
|
113
|
+
.pipe(Effect.catchTag("RunnerNotFound", () => Effect.void));
|
|
114
|
+
}),
|
|
115
|
+
}));
|
|
116
|
+
//# sourceMappingURL=Runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Runner.js","sources":["../src/Runner.ts"],"names":[],"mappings":"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"}
|