route('organisation')); $server = $organisation->servers()->findOrFail($request->route('server')); $service = $server->services()->with('environment.application')->findOrFail($request->route('service')); $replica = $service->replicas() ->with(['server', 'operation.steps', 'operations.steps', 'operations.children.target']) ->findOrFail($request->route('replica')); return inertia('service-replicas/Show', [ 'server' => $server, 'service' => $service, 'replica' => $replica, ]); } public function restart(Request $request): RedirectResponse { $organisation = Organisation::findOrFail($request->route('organisation')); $server = $organisation->servers()->findOrFail($request->route('server')); $service = $server->services()->findOrFail($request->route('service')); $replica = $service->replicas()->findOrFail($request->route('replica')); $this->queueLifecycleOperation($replica, 'Restart replica', "docker restart {$replica->container_name}"); return redirect() ->route('service-replicas.show', [ 'organisation' => $organisation->id, 'server' => $server->id, 'service' => $service->id, 'replica' => $replica->id, ]) ->with('success', 'Replica restart queued.'); } public function start(Request $request): RedirectResponse { $organisation = Organisation::findOrFail($request->route('organisation')); $server = $organisation->servers()->findOrFail($request->route('server')); $service = $server->services()->findOrFail($request->route('service')); $replica = $service->replicas()->findOrFail($request->route('replica')); $this->queueLifecycleOperation($replica, 'Start replica', "docker start {$replica->container_name}"); return redirect() ->route('service-replicas.show', [ 'organisation' => $organisation->id, 'server' => $server->id, 'service' => $service->id, 'replica' => $replica->id, ]) ->with('success', 'Replica start queued.'); } public function stop(Request $request): RedirectResponse { $organisation = Organisation::findOrFail($request->route('organisation')); $server = $organisation->servers()->findOrFail($request->route('server')); $service = $server->services()->findOrFail($request->route('service')); $replica = $service->replicas()->findOrFail($request->route('replica')); $this->queueLifecycleOperation($replica, 'Stop replica', "docker stop {$replica->container_name}"); return redirect() ->route('service-replicas.show', [ 'organisation' => $organisation->id, 'server' => $server->id, 'service' => $service->id, 'replica' => $replica->id, ]) ->with('success', 'Replica stop queued.'); } private function queueLifecycleOperation(ServiceReplica $replica, string $name, string $script): void { $operation = $replica->operations()->create([ 'kind' => OperationKind::REPLICA_DEPLOY, 'status' => OperationStatus::PENDING, ]); $operation->steps()->create([ 'name' => $name, 'order' => 1, 'status' => OperationStatus::PENDING, 'script' => $script, ]); } }