diff --git a/app/Console/Commands/Server/BulkPowerActionCommand.php b/app/Console/Commands/Server/BulkPowerActionCommand.php index 2132f0ee1..3b8853c62 100644 --- a/app/Console/Commands/Server/BulkPowerActionCommand.php +++ b/app/Console/Commands/Server/BulkPowerActionCommand.php @@ -3,11 +3,11 @@ namespace App\Console\Commands\Server; use App\Models\Server; +use App\Repositories\Daemon\DaemonServerRepository; use Illuminate\Console\Command; use Illuminate\Database\Eloquent\Builder; use Illuminate\Validation\ValidationException; use Illuminate\Validation\Factory as ValidatorFactory; -use App\Repositories\Daemon\DaemonPowerRepository; use Exception; class BulkPowerActionCommand extends Command @@ -19,7 +19,7 @@ class BulkPowerActionCommand extends Command protected $description = 'Perform bulk power management on large groupings of servers or nodes at once.'; - public function handle(DaemonPowerRepository $powerRepository, ValidatorFactory $validator): void + public function handle(DaemonServerRepository $serverRepository, ValidatorFactory $validator): void { $action = $this->argument('action'); $nodes = empty($this->option('nodes')) ? [] : explode(',', $this->option('nodes')); @@ -52,7 +52,7 @@ class BulkPowerActionCommand extends Command $bar = $this->output->createProgressBar($count); - $this->getQueryBuilder($servers, $nodes)->get()->each(function ($server, int $index) use ($action, $powerRepository, &$bar): mixed { + $this->getQueryBuilder($servers, $nodes)->get()->each(function ($server, int $index) use ($action, $serverRepository, &$bar): mixed { $bar->clear(); if (!$server instanceof Server) { @@ -60,7 +60,7 @@ class BulkPowerActionCommand extends Command } try { - $powerRepository->setServer($server)->send($action); + $serverRepository->setServer($server)->power($action); } catch (Exception $exception) { $this->output->error(trans('command/messages.server.power.action_failed', [ 'name' => $server->name, diff --git a/app/Extensions/Features/Schemas/GSLTokenSchema.php b/app/Extensions/Features/Schemas/GSLTokenSchema.php index 698d3bcdc..d6b7b455e 100644 --- a/app/Extensions/Features/Schemas/GSLTokenSchema.php +++ b/app/Extensions/Features/Schemas/GSLTokenSchema.php @@ -7,7 +7,7 @@ use App\Facades\Activity; use App\Models\Permission; use App\Models\Server; use App\Models\ServerVariable; -use App\Repositories\Daemon\DaemonPowerRepository; +use App\Repositories\Daemon\DaemonServerRepository; use Closure; use Exception; use Filament\Actions\Action; @@ -76,7 +76,7 @@ class GSLTokenSchema implements FeatureSchemaInterface ->prefix(fn () => '{{' . $serverVariable->variable->env_variable . '}}') ->helperText(fn () => empty($serverVariable->variable->description) ? '—' : $serverVariable->variable->description), ]) - ->action(function (array $data, DaemonPowerRepository $powerRepository) use ($server, $serverVariable) { + ->action(function (array $data, DaemonServerRepository $serverRepository) use ($server, $serverVariable) { /** @var Server $server */ $server = Filament::getTenant(); try { @@ -98,7 +98,7 @@ class GSLTokenSchema implements FeatureSchemaInterface ->log(); } - $powerRepository->setServer($server)->send('restart'); + $serverRepository->setServer($server)->power('restart'); Notification::make() ->title('GSL Token updated') diff --git a/app/Extensions/Features/Schemas/JavaVersionSchema.php b/app/Extensions/Features/Schemas/JavaVersionSchema.php index 6b79ff28d..827fcee21 100644 --- a/app/Extensions/Features/Schemas/JavaVersionSchema.php +++ b/app/Extensions/Features/Schemas/JavaVersionSchema.php @@ -6,7 +6,7 @@ use App\Extensions\Features\FeatureSchemaInterface; use App\Facades\Activity; use App\Models\Permission; use App\Models\Server; -use App\Repositories\Daemon\DaemonPowerRepository; +use App\Repositories\Daemon\DaemonServerRepository; use Exception; use Filament\Actions\Action; use Filament\Facades\Filament; @@ -59,7 +59,7 @@ class JavaVersionSchema implements FeatureSchemaInterface ->preload() ->native(false), ]) - ->action(function (array $data, DaemonPowerRepository $powerRepository) use ($server) { + ->action(function (array $data, DaemonServerRepository $serverRepository) use ($server) { try { $new = $data['image']; $original = $server->image; @@ -71,7 +71,7 @@ class JavaVersionSchema implements FeatureSchemaInterface ->log(); } - $powerRepository->setServer($server)->send('restart'); + $serverRepository->setServer($server)->power('restart'); Notification::make() ->title('Docker image updated') diff --git a/app/Extensions/Features/Schemas/MinecraftEulaSchema.php b/app/Extensions/Features/Schemas/MinecraftEulaSchema.php index 9249748d6..fb40c30c1 100644 --- a/app/Extensions/Features/Schemas/MinecraftEulaSchema.php +++ b/app/Extensions/Features/Schemas/MinecraftEulaSchema.php @@ -5,7 +5,7 @@ namespace App\Extensions\Features\Schemas; use App\Extensions\Features\FeatureSchemaInterface; use App\Models\Server; use App\Repositories\Daemon\DaemonFileRepository; -use App\Repositories\Daemon\DaemonPowerRepository; +use App\Repositories\Daemon\DaemonServerRepository; use Exception; use Filament\Actions\Action; use Filament\Facades\Filament; @@ -35,14 +35,14 @@ class MinecraftEulaSchema implements FeatureSchemaInterface ->modalHeading('Minecraft EULA') ->modalDescription(new HtmlString(Blade::render('By pressing "I Accept" below you are indicating your agreement to the Minecraft EULA .'))) ->modalSubmitActionLabel('I Accept') - ->action(function (DaemonFileRepository $fileRepository, DaemonPowerRepository $powerRepository) { + ->action(function (DaemonFileRepository $fileRepository, DaemonServerRepository $serverRepository) { try { /** @var Server $server */ $server = Filament::getTenant(); $fileRepository->setServer($server)->putContent('eula.txt', 'eula=true'); - $powerRepository->setServer($server)->send('restart'); + $serverRepository->setServer($server)->power('restart'); Notification::make() ->title('Minecraft EULA accepted') diff --git a/app/Filament/App/Resources/ServerResource/Pages/ListServers.php b/app/Filament/App/Resources/ServerResource/Pages/ListServers.php index 484bc8823..959f19a82 100644 --- a/app/Filament/App/Resources/ServerResource/Pages/ListServers.php +++ b/app/Filament/App/Resources/ServerResource/Pages/ListServers.php @@ -8,7 +8,7 @@ use App\Filament\Components\Tables\Columns\ServerEntryColumn; use App\Filament\Server\Pages\Console; use App\Models\Permission; use App\Models\Server; -use App\Repositories\Daemon\DaemonPowerRepository; +use App\Repositories\Daemon\DaemonServerRepository; use App\Traits\Filament\CanCustomizeHeaderActions; use App\Traits\Filament\CanCustomizeHeaderWidgets; use Filament\Notifications\Notification; @@ -38,11 +38,11 @@ class ListServers extends ListRecords public const WARNING_THRESHOLD = 0.7; - private DaemonPowerRepository $daemonPowerRepository; + private DaemonServerRepository $daemonServerRepository; public function boot(): void { - $this->daemonPowerRepository = new DaemonPowerRepository(); + $this->daemonServerRepository = new DaemonServerRepository(); } /** @return Stack[] */ @@ -204,7 +204,7 @@ class ListServers extends ListRecords public function powerAction(Server $server, string $action): void { try { - $this->daemonPowerRepository->setServer($server)->send($action); + $this->daemonServerRepository->setServer($server)->power($action); Notification::make() ->title(trans('server/dashboard.power_actions')) diff --git a/app/Http/Controllers/Api/Client/Servers/PowerController.php b/app/Http/Controllers/Api/Client/Servers/PowerController.php index dcf78e0a7..cef25effa 100644 --- a/app/Http/Controllers/Api/Client/Servers/PowerController.php +++ b/app/Http/Controllers/Api/Client/Servers/PowerController.php @@ -5,9 +5,9 @@ namespace App\Http\Controllers\Api\Client\Servers; use Illuminate\Http\Response; use App\Models\Server; use App\Facades\Activity; -use App\Repositories\Daemon\DaemonPowerRepository; use App\Http\Controllers\Api\Client\ClientApiController; use App\Http\Requests\Api\Client\Servers\SendPowerRequest; +use App\Repositories\Daemon\DaemonServerRepository; use Dedoc\Scramble\Attributes\Group; use Illuminate\Http\Client\ConnectionException; @@ -17,7 +17,7 @@ class PowerController extends ClientApiController /** * PowerController constructor. */ - public function __construct(private DaemonPowerRepository $repository) + public function __construct(private DaemonServerRepository $repository) { parent::__construct(); } @@ -31,7 +31,7 @@ class PowerController extends ClientApiController */ public function index(SendPowerRequest $request, Server $server): Response { - $this->repository->setServer($server)->send( + $this->repository->setServer($server)->power( $request->input('signal') ); diff --git a/app/Jobs/Schedule/RunTaskJob.php b/app/Jobs/Schedule/RunTaskJob.php index acb50f6d5..d4f1a0d1b 100644 --- a/app/Jobs/Schedule/RunTaskJob.php +++ b/app/Jobs/Schedule/RunTaskJob.php @@ -5,11 +5,11 @@ namespace App\Jobs\Schedule; use App\Jobs\Job; use Carbon\CarbonImmutable; use App\Models\Task; +use App\Repositories\Daemon\DaemonServerRepository; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use App\Services\Backups\InitiateBackupService; -use App\Repositories\Daemon\DaemonPowerRepository; use App\Services\Files\DeleteFilesService; use Exception; use Illuminate\Http\Client\ConnectionException; @@ -31,7 +31,7 @@ class RunTaskJob extends Job implements ShouldQueue */ public function handle( InitiateBackupService $backupService, - DaemonPowerRepository $powerRepository, + DaemonServerRepository $serverRepository, DeleteFilesService $deleteFilesService ): void { // Do not process a task that is not set to active, unless it's been manually triggered. @@ -57,7 +57,7 @@ class RunTaskJob extends Job implements ShouldQueue try { switch ($this->task->action) { case Task::ACTION_POWER: - $powerRepository->setServer($server)->send($this->task->payload); + $serverRepository->setServer($server)->power($this->task->payload); break; case Task::ACTION_COMMAND: $server->send($this->task->payload); diff --git a/app/Repositories/Daemon/DaemonPowerRepository.php b/app/Repositories/Daemon/DaemonPowerRepository.php deleted file mode 100644 index c34411421..000000000 --- a/app/Repositories/Daemon/DaemonPowerRepository.php +++ /dev/null @@ -1,21 +0,0 @@ -getHttpClient()->post("/api/servers/{$this->server->uuid}/power", - ['action' => $action], - ); - } -} diff --git a/app/Repositories/Daemon/DaemonServerRepository.php b/app/Repositories/Daemon/DaemonServerRepository.php index 552c55e32..e4abe7408 100644 --- a/app/Repositories/Daemon/DaemonServerRepository.php +++ b/app/Repositories/Daemon/DaemonServerRepository.php @@ -8,6 +8,7 @@ use Exception; use Filament\Notifications\Notification; use Illuminate\Http\Client\ConnectionException; use Illuminate\Http\Client\RequestException; +use Illuminate\Http\Client\Response; class DaemonServerRepository extends DaemonRepository { @@ -149,4 +150,16 @@ class DaemonServerRepository extends DaemonRepository ->throw() ->json('data'); } + + /** + * Sends a power action to the server instance. + * + * @throws ConnectionException + */ + public function power(string $action): Response + { + return $this->getHttpClient()->post("/api/servers/{$this->server->uuid}/power", + ['action' => $action], + ); + } } diff --git a/tests/Integration/Api/Client/Server/PowerControllerTest.php b/tests/Integration/Api/Client/Server/PowerControllerTest.php index 9fd4fadfe..9458fadde 100644 --- a/tests/Integration/Api/Client/Server/PowerControllerTest.php +++ b/tests/Integration/Api/Client/Server/PowerControllerTest.php @@ -4,7 +4,7 @@ namespace App\Tests\Integration\Api\Client\Server; use Illuminate\Http\Response; use App\Models\Permission; -use App\Repositories\Daemon\DaemonPowerRepository; +use App\Repositories\Daemon\DaemonServerRepository; use App\Tests\Integration\Api\Client\ClientApiIntegrationTestCase; use PHPUnit\Framework\Attributes\DataProvider; @@ -49,8 +49,8 @@ class PowerControllerTest extends ClientApiIntegrationTestCase #[DataProvider('validPowerActionDataProvider')] public function test_action_can_be_sent_to_server(string $action, string $permission): void { - $service = \Mockery::mock(DaemonPowerRepository::class); - $this->app->instance(DaemonPowerRepository::class, $service); + $service = \Mockery::mock(DaemonServerRepository::class); + $this->app->instance(DaemonServerRepository::class, $service); [$user, $server] = $this->generateTestAccount([$permission]); @@ -60,7 +60,7 @@ class PowerControllerTest extends ClientApiIntegrationTestCase })) ->andReturnSelf() ->getMock() - ->expects('send') + ->expects('power') ->with(trim($action)); $this->actingAs($user) diff --git a/tests/Integration/Jobs/Schedule/RunTaskJobTest.php b/tests/Integration/Jobs/Schedule/RunTaskJobTest.php index bb7a9c9f0..9cef21548 100644 --- a/tests/Integration/Jobs/Schedule/RunTaskJobTest.php +++ b/tests/Integration/Jobs/Schedule/RunTaskJobTest.php @@ -10,8 +10,8 @@ use App\Models\Server; use App\Models\Schedule; use Illuminate\Support\Facades\Bus; use App\Jobs\Schedule\RunTaskJob; +use App\Repositories\Daemon\DaemonServerRepository; use App\Tests\Integration\IntegrationTestCase; -use App\Repositories\Daemon\DaemonPowerRepository; use Illuminate\Http\Client\ConnectionException; use PHPUnit\Framework\Attributes\DataProvider; @@ -84,13 +84,13 @@ class RunTaskJobTest extends IntegrationTestCase 'continue_on_failure' => false, ]); - $mock = \Mockery::mock(DaemonPowerRepository::class); - $this->instance(DaemonPowerRepository::class, $mock); + $mock = \Mockery::mock(DaemonServerRepository::class); + $this->instance(DaemonServerRepository::class, $mock); $mock->expects('setServer')->with(\Mockery::on(function ($value) use ($server) { return $value instanceof Server && $value->id === $server->id; }))->andReturnSelf(); - $mock->expects('send')->with('start'); + $mock->expects('power')->with('start'); Bus::dispatchSync(new RunTaskJob($task, $isManualRun)); @@ -117,10 +117,10 @@ class RunTaskJobTest extends IntegrationTestCase 'continue_on_failure' => $continueOnFailure, ]); - $mock = \Mockery::mock(DaemonPowerRepository::class); - $this->instance(DaemonPowerRepository::class, $mock); + $mock = \Mockery::mock(DaemonServerRepository::class); + $this->instance(DaemonServerRepository::class, $mock); - $mock->expects('setServer->send')->andThrow(new ConnectionException()); + $mock->expects('setServer->power')->andThrow(new ConnectionException()); if (!$continueOnFailure) { $this->expectException(ConnectionException::class);