Skip to content

Commit 487ace4

Browse files
committed
feat: #63 allow to manage storages for large files
1 parent ee773d9 commit 487ace4

20 files changed

+428
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
namespace App\Events\NodeTasks\CheckS3Storage;
4+
5+
use App\Events\NodeTasks\BaseTaskEvent;
6+
7+
class CheckS3StorageCompleted extends BaseTaskEvent
8+
{
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
namespace App\Events\NodeTasks\CheckS3Storage;
4+
5+
use App\Events\NodeTasks\BaseTaskEvent;
6+
7+
class CheckS3StorageFailed extends BaseTaskEvent
8+
{
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
namespace App\Events\NodeTasks\CreateS3Storage;
4+
5+
use App\Events\NodeTasks\BaseTaskEvent;
6+
7+
class CreateS3StorageCompleted extends BaseTaskEvent
8+
{
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
namespace App\Events\NodeTasks\CreateS3Storage;
4+
5+
use App\Events\NodeTasks\BaseTaskEvent;
6+
7+
class CreateS3StorageFailed extends BaseTaskEvent
8+
{
9+
}

app/Http/Controllers/SwarmController.php

+80
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@
88
use App\Models\NodeTaskGroup;
99
use App\Models\NodeTaskGroupType;
1010
use App\Models\NodeTasks\CheckRegistryAuth\CheckRegistryAuthMeta;
11+
use App\Models\NodeTasks\CheckS3Storage\CheckS3StorageMeta;
1112
use App\Models\NodeTasks\CreateConfig\CreateConfigMeta;
1213
use App\Models\NodeTasks\CreateRegistryAuth\CreateRegistryAuthMeta;
14+
use App\Models\NodeTasks\CreateS3Storage\CreateS3StorageMeta;
1315
use App\Models\NodeTaskType;
1416
use App\Models\Swarm;
1517
use App\Models\SwarmData;
@@ -147,4 +149,82 @@ public function updateDockerRegistries(Swarm $swarm, Request $request)
147149
}
148150
});
149151
}
152+
153+
public function updateS3Storages(Swarm $swarm, Request $request)
154+
{
155+
DB::transaction(function () use ($swarm, $request) {
156+
$swarmData = SwarmData::validateAndCreate([
157+
...$swarm->data->toArray(),
158+
's3Storages' => $request->get('s3Storages'),
159+
]);
160+
161+
$swarmData->s3StoragesRev += 1;
162+
163+
$tasks = [];
164+
165+
foreach ($swarmData->s3Storages as $s3Storage) {
166+
$previous = $s3Storage->dockerName ? $swarm->data->findS3Storage($s3Storage->dockerName) : null;
167+
if ($previous) {
168+
if ($s3Storage->sameAs($previous)) {
169+
$s3Storage->dockerName = $previous->dockerName;
170+
171+
continue;
172+
}
173+
}
174+
175+
$s3Storage->dockerName = dockerize_name('s3_r' . $swarmData->s3StoragesRev . '_' . $s3Storage->name);
176+
177+
$taskMeta = [
178+
's3StorageId' => $s3Storage->id,
179+
's3StorageName' => $s3Storage->name,
180+
];
181+
182+
$tasks[] = [
183+
'type' => NodeTaskType::CreateS3Storage,
184+
'meta' => CreateS3StorageMeta::validateAndCreate($taskMeta),
185+
'payload' => [
186+
'PrevConfigName' => $previous?->dockerName,
187+
'S3StorageSpec' => [
188+
'Endpoint' => $s3Storage->endpoint,
189+
'AccessKey' => $s3Storage->accessKey,
190+
'SecretKey' => $s3Storage->secretKey,
191+
'Region' => $s3Storage->region,
192+
'Bucket' => $s3Storage->bucket,
193+
'PathPrefix' => $s3Storage->pathPrefix,
194+
],
195+
'SwarmConfigSpec' => [
196+
'Name' => $s3Storage->dockerName,
197+
'Labels' => dockerize_labels([
198+
'id' => $s3Storage->id,
199+
'kind' => DockerConfigKind::S3Storage->value,
200+
'revision' => $swarmData->s3StoragesRev,
201+
]),
202+
],
203+
]
204+
];
205+
206+
$tasks[] = [
207+
'type' => NodeTaskType::CheckS3Storage,
208+
'meta' => CheckS3StorageMeta::validateAndCreate($taskMeta),
209+
'payload' => [
210+
'S3StorageConfigName' => $s3Storage->dockerName,
211+
]
212+
];
213+
}
214+
215+
$swarm->data = $swarmData;
216+
$swarm->save();
217+
218+
if (!empty($tasks)) {
219+
$taskGroup = NodeTaskGroup::create([
220+
'type' => NodeTaskGroupType::UpdateS3Storages,
221+
'swarm_id' => $swarm->id,
222+
'invoker_id' => auth()->user()->id,
223+
'team_id' => auth()->user()->current_team_id,
224+
]);
225+
226+
$taskGroup->tasks()->createMany($tasks);
227+
}
228+
});
229+
}
150230
}

app/Models/DockerConfigKind.php

+1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@
55
enum DockerConfigKind: string
66
{
77
case RegistryCredentials = 'registry-credentials';
8+
case S3Storage = 's3-storage';
89
}

app/Models/NodeTaskGroupType.php

+1
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@ enum NodeTaskGroupType: int
1010
case DeleteService = 3;
1111
case SelfUpgrade = 4;
1212
case UpdateDockerRegistries = 5;
13+
case UpdateS3Storages = 6;
1314
}

app/Models/NodeTaskType.php

+18
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
use App\Events\NodeTasks\CheckRegistryAuth\CheckRegistryAuthCompleted;
66
use App\Events\NodeTasks\CheckRegistryAuth\CheckRegistryAuthFailed;
7+
use App\Events\NodeTasks\CheckS3Storage\CheckS3StorageCompleted;
8+
use App\Events\NodeTasks\CheckS3Storage\CheckS3StorageFailed;
79
use App\Events\NodeTasks\ConfirmAgentUpgrade\ConfirmAgentUpgradeCompleted;
810
use App\Events\NodeTasks\ConfirmAgentUpgrade\ConfirmAgentUpgradeFailed;
911
use App\Events\NodeTasks\CreateConfig\CreateConfigCompleted;
@@ -12,6 +14,8 @@
1214
use App\Events\NodeTasks\CreateNetwork\CreateNetworkFailed;
1315
use App\Events\NodeTasks\CreateRegistryAuth\CreateRegistryAuthCompleted;
1416
use App\Events\NodeTasks\CreateRegistryAuth\CreateRegistryAuthFailed;
17+
use App\Events\NodeTasks\CreateS3Storage\CreateS3StorageCompleted;
18+
use App\Events\NodeTasks\CreateS3Storage\CreateS3StorageFailed;
1519
use App\Events\NodeTasks\CreateSecret\CreateSecretCompleted;
1620
use App\Events\NodeTasks\CreateSecret\CreateSecretFailed;
1721
use App\Events\NodeTasks\CreateService\CreateServiceCompleted;
@@ -36,6 +40,8 @@
3640
use App\Models\NodeTasks\ApplyCaddyConfig\ApplyCaddyConfigResult;
3741
use App\Models\NodeTasks\CheckRegistryAuth\CheckRegistryAuthMeta;
3842
use App\Models\NodeTasks\CheckRegistryAuth\CheckRegistryAuthResult;
43+
use App\Models\NodeTasks\CheckS3Storage\CheckS3StorageMeta;
44+
use App\Models\NodeTasks\CheckS3Storage\CheckS3StorageResult;
3945
use App\Models\NodeTasks\ConfirmAgentUpgrade\ConfirmAgentUpgradeMeta;
4046
use App\Models\NodeTasks\ConfirmAgentUpgrade\ConfirmAgentUpgradeResult;
4147
use App\Models\NodeTasks\CreateConfig\CreateConfigMeta;
@@ -44,6 +50,8 @@
4450
use App\Models\NodeTasks\CreateNetwork\CreateNetworkResult;
4551
use App\Models\NodeTasks\CreateRegistryAuth\CreateRegistryAuthMeta;
4652
use App\Models\NodeTasks\CreateRegistryAuth\CreateRegistryAuthResult;
53+
use App\Models\NodeTasks\CreateS3Storage\CreateS3StorageMeta;
54+
use App\Models\NodeTasks\CreateS3Storage\CreateS3StorageResult;
4755
use App\Models\NodeTasks\CreateSecret\CreateSecretMeta;
4856
use App\Models\NodeTasks\CreateSecret\CreateSecretResult;
4957
use App\Models\NodeTasks\CreateService\CreateServiceMeta;
@@ -81,6 +89,8 @@ enum NodeTaskType: int
8189
case CreateRegistryAuth = 12;
8290
case CheckRegistryAuth = 13;
8391
case PullDockerImage = 14;
92+
case CreateS3Storage = 15;
93+
case CheckS3Storage = 16;
8494

8595
public function meta(): string
8696
{
@@ -100,6 +110,8 @@ public function meta(): string
100110
self::CreateRegistryAuth => CreateRegistryAuthMeta::class,
101111
self::CheckRegistryAuth => CheckRegistryAuthMeta::class,
102112
self::PullDockerImage => PullDockerImageMeta::class,
113+
self::CreateS3Storage => CreateS3StorageMeta::class,
114+
self::CheckS3Storage => CheckS3StorageMeta::class,
103115
};
104116
}
105117

@@ -121,6 +133,8 @@ public function result(): string
121133
self::CreateRegistryAuth => CreateRegistryAuthResult::class,
122134
self::CheckRegistryAuth => CheckRegistryAuthResult::class,
123135
self::PullDockerImage => PullDockerImageResult::class,
136+
self::CreateS3Storage => CreateS3StorageResult::class,
137+
self::CheckS3Storage => CheckS3StorageResult::class,
124138
};
125139
}
126140

@@ -142,6 +156,8 @@ public function completed(): string
142156
self::CreateRegistryAuth => CreateRegistryAuthCompleted::class,
143157
self::CheckRegistryAuth => CheckRegistryAuthCompleted::class,
144158
self::PullDockerImage => PullDockerImageCompleted::class,
159+
self::CreateS3Storage => CreateS3StorageCompleted::class,
160+
self::CheckS3Storage => CheckS3StorageCompleted::class,
145161
};
146162
}
147163

@@ -163,6 +179,8 @@ public function failed(): string
163179
self::CreateRegistryAuth => CreateRegistryAuthFailed::class,
164180
self::CheckRegistryAuth => CheckRegistryAuthFailed::class,
165181
self::PullDockerImage => PullDockerImageFailed::class,
182+
self::CreateS3Storage => CreateS3StorageFailed::class,
183+
self::CheckS3Storage => CheckS3StorageFailed::class,
166184
};
167185
}
168186
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace App\Models\NodeTasks\CheckS3Storage;
4+
5+
use App\Models\NodeTasks\AbstractTaskMeta;
6+
7+
class CheckS3StorageMeta extends AbstractTaskMeta
8+
{
9+
public function __construct(
10+
public string $s3StorageId,
11+
public string $s3StorageName,
12+
)
13+
{
14+
//
15+
}
16+
17+
public function formattedHtml(): string
18+
{
19+
return "Check S3 Storage credentials for <code>{$this->s3StorageName}</code>";
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace App\Models\NodeTasks\CheckS3Storage;
4+
5+
use App\Models\NodeTasks\AbstractTaskResult;
6+
7+
class CheckS3StorageResult extends AbstractTaskResult
8+
{
9+
public function __construct(
10+
)
11+
{
12+
//
13+
}
14+
15+
public function formattedHtml(): string
16+
{
17+
return "Success.";
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace App\Models\NodeTasks\CreateS3Storage;
4+
5+
use App\Models\NodeTasks\AbstractTaskMeta;
6+
7+
class CreateS3StorageMeta extends AbstractTaskMeta
8+
{
9+
public function __construct(
10+
public string $s3StorageId,
11+
public string $s3StorageName,
12+
)
13+
{
14+
//
15+
}
16+
17+
public function formattedHtml(): string
18+
{
19+
return "Create S3 Storage config for <code>{$this->s3StorageName}</code>";
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace App\Models\NodeTasks\CreateS3Storage;
4+
5+
use App\Models\NodeTasks\AbstractTaskResult;
6+
use App\Models\NodeTasks\DockerId;
7+
8+
class CreateS3StorageResult extends AbstractTaskResult
9+
{
10+
public function __construct(
11+
public DockerId $docker,
12+
)
13+
{
14+
//
15+
}
16+
17+
public function formattedHtml(): string
18+
{
19+
return "Docker ID: <code>{$this->docker->id}</code>";
20+
}
21+
}

app/Models/SwarmData.php

+13-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace App\Models;
44

55
use App\Models\SwarmData\DockerRegistry;
6+
use App\Models\SwarmData\S3Storage;
67
use Spatie\LaravelData\Attributes\DataCollectionOf;
78
use Spatie\LaravelData\Data;
89

@@ -12,7 +13,11 @@ public function __construct(
1213
public int $registriesRev,
1314
#[DataCollectionOf(DockerRegistry::class)]
1415
/* @var DockerRegistry[] */
15-
public array $registries
16+
public array $registries,
17+
public int $s3StoragesRev,
18+
#[DataCollectionOf(S3Storage::class)]
19+
/* @var S3Storage[] */
20+
public array $s3Storages,
1621
)
1722
{
1823

@@ -24,4 +29,11 @@ public function findRegistry(string $dockerName): ?DockerRegistry
2429
->filter(fn (DockerRegistry $registry) => $registry->dockerName === $dockerName)
2530
->first();
2631
}
32+
33+
public function findS3Storage(string $dockerName): ?S3Storage
34+
{
35+
return collect($this->s3Storages)
36+
->filter(fn (S3Storage $s3Storage) => $s3Storage->dockerName === $dockerName)
37+
->first();
38+
}
2739
}

app/Models/SwarmData/S3Storage.php

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace App\Models\SwarmData;
4+
5+
use Spatie\LaravelData\Data;
6+
7+
class S3Storage extends Data
8+
{
9+
public function __construct(
10+
public string $id,
11+
public string $name,
12+
public string $endpoint,
13+
public string $accessKey,
14+
public string $secretKey,
15+
public string $region,
16+
public string $bucket,
17+
public string $pathPrefix,
18+
public ?string $dockerName,
19+
)
20+
{
21+
22+
}
23+
24+
public function sameAs(S3Storage $s3Storage): bool
25+
{
26+
return $this->endpoint === $s3Storage->endpoint
27+
&& $this->region === $s3Storage->region
28+
&& $this->bucket === $s3Storage->bucket
29+
&& $this->pathPrefix === $s3Storage->pathPrefix
30+
&& empty($this->accessKey)
31+
&& empty($this->secretKey);
32+
}
33+
}

0 commit comments

Comments
 (0)