mirror of
https://github.com/tiennm99/coolify.git
synced 2026-08-26 16:26:53 +00:00
Split V5 dashboard behavior into domain controllers and policies, add agent token rotation/revocation, status reconciliation jobs, ingress firewall syncing, and canvas connection APIs. Add migrations for V5 status tracking, server capabilities, resource connection aliases, and revoked agent tokens.
74 lines
3.0 KiB
PHP
74 lines
3.0 KiB
PHP
<?php
|
|
|
|
use App\Events\V5CanvasResourceUpdated;
|
|
use App\Events\V5ClusterUpdated;
|
|
use App\Events\V5RealtimeTestEvent;
|
|
use App\Jobs\V5BootstrapServerJob;
|
|
use App\Jobs\V5DeployApplicationJob;
|
|
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
|
|
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
|
|
use Illuminate\Contracts\Queue\ShouldBeUnique;
|
|
use Illuminate\Support\Facades\Config;
|
|
use Illuminate\Support\Facades\Queue;
|
|
use Tests\TestCase;
|
|
|
|
uses(TestCase::class);
|
|
|
|
it('locks v5 deploy jobs per application for the job timeout plus a margin', function () {
|
|
$job = new V5DeployApplicationJob(42);
|
|
|
|
expect($job)->toBeInstanceOf(ShouldBeUnique::class)
|
|
->and($job->uniqueId())->toBe('42')
|
|
->and($job->uniqueFor)->toBe($job->timeout + 60);
|
|
});
|
|
|
|
it('locks v5 bootstrap jobs per server aligned with the controller bootstrap claim window', function () {
|
|
$job = new V5BootstrapServerJob(7, 13);
|
|
|
|
expect($job)->toBeInstanceOf(ShouldBeUnique::class)
|
|
->and($job->uniqueId())->toBe('13')
|
|
->and($job->uniqueFor)->toBe(V5BootstrapServerJob::TIMEOUT_SECONDS + 300);
|
|
});
|
|
|
|
it('does not queue a second v5 deploy job while one is pending for the same application', function () {
|
|
Config::set('cache.default', 'array');
|
|
Queue::fake();
|
|
|
|
V5DeployApplicationJob::dispatch(101);
|
|
V5DeployApplicationJob::dispatch(101);
|
|
V5DeployApplicationJob::dispatch(202);
|
|
|
|
Queue::assertPushed(V5DeployApplicationJob::class, 2);
|
|
Queue::assertPushed(V5DeployApplicationJob::class, fn (V5DeployApplicationJob $job): bool => $job->applicationId === 101);
|
|
Queue::assertPushed(V5DeployApplicationJob::class, fn (V5DeployApplicationJob $job): bool => $job->applicationId === 202);
|
|
});
|
|
|
|
it('does not queue a second v5 bootstrap job while one is pending for the same server', function () {
|
|
Config::set('cache.default', 'array');
|
|
Queue::fake();
|
|
|
|
V5BootstrapServerJob::dispatch(1, 55);
|
|
V5BootstrapServerJob::dispatch(2, 55);
|
|
V5BootstrapServerJob::dispatch(1, 66);
|
|
|
|
Queue::assertPushed(V5BootstrapServerJob::class, 2);
|
|
Queue::assertPushed(V5BootstrapServerJob::class, fn (V5BootstrapServerJob $job): bool => $job->serverId === 55);
|
|
Queue::assertPushed(V5BootstrapServerJob::class, fn (V5BootstrapServerJob $job): bool => $job->serverId === 66);
|
|
});
|
|
|
|
it('queues v5 canvas and cluster broadcasts after commit instead of pushing on the request thread', function () {
|
|
$canvasEvent = new V5CanvasResourceUpdated(1, 2);
|
|
$clusterEvent = new V5ClusterUpdated(1, 2);
|
|
|
|
expect($canvasEvent)->toBeInstanceOf(ShouldBroadcast::class)
|
|
->not->toBeInstanceOf(ShouldBroadcastNow::class)
|
|
->and($canvasEvent->afterCommit)->toBeTrue()
|
|
->and($clusterEvent)->toBeInstanceOf(ShouldBroadcast::class)
|
|
->not->toBeInstanceOf(ShouldBroadcastNow::class)
|
|
->and($clusterEvent->afterCommit)->toBeTrue();
|
|
});
|
|
|
|
it('keeps the manual v5 realtime test ping broadcasting immediately', function () {
|
|
expect(new V5RealtimeTestEvent(1, 'ping'))->toBeInstanceOf(ShouldBroadcastNow::class);
|
|
});
|