-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.ts
More file actions
230 lines (204 loc) · 6.26 KB
/
index.ts
File metadata and controls
230 lines (204 loc) · 6.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
import { dag, Container, Directory, object, func, Secret } from "@dagger.io/dagger"
import { connect } from "@dagger.io/dagger"
import { S3Client, CreateBucketCommand, PutObjectCommand, GetObjectCommand } from "@aws-sdk/client-s3"
import { ECRClient, CreateRepositoryCommand } from "@aws-sdk/client-ecr"
import { Readable } from "stream"
/**
* Example class demonstrating LocalStack Dagger module functionality
*/
@object()
export class Example {
/**
* Demonstrates basic LocalStack functionality using the community edition.
* Creates an S3 bucket and object to verify the setup is working correctly.
*
* @returns Promise<void>
*/
@func()
async localstack__quickstart() {
await connect(async (client) => {
// Start LocalStack using the module
const service = client.localstack().start()
await service.start()
const endpoint = await service.endpoint()
console.log(`LocalStack is running at ${endpoint}`)
// Create S3 client
const s3 = new S3Client({
endpoint: `http://${endpoint}`,
credentials: {
accessKeyId: "test",
secretAccessKey: "test"
},
region: "us-east-1",
forcePathStyle: true
})
// Create a test bucket
await s3.send(new CreateBucketCommand({
Bucket: "test-bucket"
}))
console.log("S3 bucket created")
// Create a test object
await s3.send(new PutObjectCommand({
Bucket: "test-bucket",
Key: "test-object",
Body: "Hello, LocalStack!"
}))
console.log("S3 object created")
// Verify the object was created
const response = await s3.send(new GetObjectCommand({
Bucket: "test-bucket",
Key: "test-object"
}))
const content = await streamToString(response.Body as Readable)
console.log(`S3 object content: ${content}`)
})
}
/**
* Demonstrates LocalStack Pro functionality by starting a Pro instance
* and creating an ECR repository.
*
* @param authToken - LocalStack Pro authentication token
* @returns Promise<void>
*/
@func()
async localstack__pro(authToken: Secret) {
await connect(async (client) => {
const service = client.localstack().start({
authToken,
configuration: "DEBUG=1,SERVICES=ecr",
})
await service.start()
const endpoint = await service.endpoint()
console.log(`LocalStack Pro is running at ${endpoint}`)
// Create ECR client
const ecr = new ECRClient({
endpoint: `http://${endpoint}`,
credentials: {
accessKeyId: "test",
secretAccessKey: "test"
},
region: "us-east-1"
})
// Create a test repository
const repositoryName = "test-ecr-repo"
await ecr.send(new CreateRepositoryCommand({
repositoryName
}))
console.log(`ECR repository '${repositoryName}' created`)
})
}
/**
* Demonstrates LocalStack state management functionality using Cloud Pods.
* Creates a test bucket, saves state to a pod, resets state, and loads it back.
*
* @param authToken - LocalStack Pro authentication token
* @returns Promise<void>
*/
@func()
async localstack__state(authToken: Secret) {
await connect(async (client) => {
const service = client.localstack().start({
authToken
})
await service.start()
const endpoint = await service.endpoint()
// Create S3 client and test bucket
const s3 = new S3Client({
endpoint: `http://${endpoint}`,
credentials: {
accessKeyId: "test",
secretAccessKey: "test"
},
region: "us-east-1",
forcePathStyle: true
})
await s3.send(new CreateBucketCommand({
Bucket: "test-bucket"
}))
console.log("Test bucket created")
// Save state to Cloud Pod
await client.localstack().state({
authToken,
save: "test-dagger-example-pod",
endpoint: `http://${endpoint}`
})
console.log("State saved to Cloud Pod")
// Reset state
await client.localstack().state({
reset: true,
endpoint: `http://${endpoint}`
})
console.log("State reset")
// Load state back
await client.localstack().state({
authToken,
load: "test-dagger-example-pod",
endpoint: `http://${endpoint}`
})
console.log("State loaded from Cloud Pod")
})
}
/**
* Demonstrates LocalStack ephemeral instance management.
* Creates an ephemeral instance, lists instances, retrieves logs,
* and cleans up by deleting the instance.
*
* @param authToken - LocalStack Pro authentication token
* @returns Promise<void>
*/
@func()
async localstack__ephemeral(authToken: Secret) {
await connect(async (client) => {
// Create a new ephemeral instance
await client.localstack().ephemeral(
authToken,
"create",
{
name: "test-dagger-example-instance",
lifetime: 60
}
)
console.log("Instance created")
// Wait for instance to be ready
await new Promise(resolve => setTimeout(resolve, 15000))
// List instances
const listResponse = await client.localstack().ephemeral(
authToken,
"list"
)
console.log(`Ephemeral instances: ${listResponse}`)
// Get instance logs
const instanceLogs = await client.localstack().ephemeral(
authToken,
"logs",
{
name: "test-dagger-example-instance"
}
)
console.log(`Instance logs: ${instanceLogs}`)
// Delete instance
await client.localstack().ephemeral(
authToken,
"delete",
{
name: "test-dagger-example-instance"
}
)
console.log("Instance deleted")
})
}
}
/**
* Helper function to convert a readable stream to a string.
* Used for processing responses from AWS SDK operations.
*
* @param stream - Readable stream to convert
* @returns Promise<string> The stream contents as a string
*/
async function streamToString(stream: Readable): Promise<string> {
const chunks: Buffer[] = []
for await (const chunk of stream) {
chunks.push(Buffer.from(chunk))
}
return Buffer.concat(chunks).toString("utf-8")
}