添加 Speed/ServerCreationService.php
This commit is contained in:
parent
41a9c77e11
commit
e75de004fb
116
Speed/ServerCreationService.php
Normal file
116
Speed/ServerCreationService.php
Normal file
@ -0,0 +1,116 @@
|
||||
<?php
|
||||
|
||||
namespace Convoy\Services\Servers;
|
||||
|
||||
use Convoy\Data\Server\Deployments\ServerDeploymentData;
|
||||
use Convoy\Enums\Server\Status;
|
||||
use Convoy\Exceptions\Service\Deployment\InvalidTemplateException;
|
||||
use Convoy\Exceptions\Service\Server\Allocation\NoUniqueUuidComboException;
|
||||
use Convoy\Exceptions\Service\Server\Allocation\NoUniqueVmidException;
|
||||
use Convoy\Models\Server;
|
||||
use Convoy\Models\Template;
|
||||
use Convoy\Repositories\Eloquent\ServerRepository;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
/**
|
||||
* Class ServerCreationService
|
||||
*/
|
||||
class ServerCreationService
|
||||
{
|
||||
public function __construct(
|
||||
private NetworkService $networkService, private ServerRepository $repository,
|
||||
private ServerBuildDispatchService $buildDispatchService,
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
public function handle(array $data)
|
||||
{
|
||||
$uuid = $this->generateUniqueUuidCombo();
|
||||
|
||||
$shouldCreateServer = Arr::get($data, 'should_create_server');
|
||||
$template = $shouldCreateServer ? Template::where(
|
||||
'uuid', '=', Arr::get($data, 'template_uuid'),
|
||||
)->firstOrFail() : null;
|
||||
|
||||
if ($template) {
|
||||
if ($template->group->node_id !== intval(Arr::get($data, 'node_id'))) {
|
||||
throw new InvalidTemplateException(
|
||||
'This template is inaccessible to the specified node',
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$nodeId = Arr::get($data, 'node_id');
|
||||
|
||||
$server = Server::create([
|
||||
'uuid' => $uuid,
|
||||
'uuid_short' => substr($uuid, 0, 8),
|
||||
'status' => $shouldCreateServer ? Status::INSTALLING->value : null,
|
||||
'name' => Arr::get($data, 'name'),
|
||||
'user_id' => Arr::get($data, 'user_id'),
|
||||
'node_id' => $nodeId,
|
||||
'vmid' => Arr::get($data, 'vmid') ?? $this->generateUniqueVmId($nodeId),
|
||||
'hostname' => Arr::get($data, 'hostname'),
|
||||
'cpu' => Arr::get($data, 'limits.cpu'),
|
||||
'memory' => Arr::get($data, 'limits.memory'),
|
||||
'disk' => Arr::get($data, 'limits.disk'),
|
||||
'snapshot_limit' => Arr::get($data, 'limits.snapshots'),
|
||||
'backup_limit' => Arr::get($data, 'limits.backups'),
|
||||
'bandwidth_limit' => Arr::get($data, 'limits.bandwidth'),
|
||||
]);
|
||||
|
||||
$server->refresh();
|
||||
|
||||
$deployment = ServerDeploymentData::from([
|
||||
'server' => $server,
|
||||
'template' => $template,
|
||||
'account_password' => Arr::get($data, 'account_password'),
|
||||
'should_create_server' => $shouldCreateServer,
|
||||
'start_on_completion' => Arr::get($data, 'start_on_completion'),
|
||||
]);
|
||||
|
||||
if ($addressIds = Arr::get($data, 'limits.address_ids')) {
|
||||
$this->networkService->updateAddresses($server, $addressIds);
|
||||
}
|
||||
|
||||
$this->buildDispatchService->build($deployment);
|
||||
|
||||
return $server;
|
||||
}
|
||||
|
||||
public function generateUniqueVmId(int $nodeId): int
|
||||
{
|
||||
$vmid = random_int(100, 999999999);
|
||||
$attempts = 0;
|
||||
|
||||
while (!$this->repository->isUniqueVmId($nodeId, $vmid)) {
|
||||
$vmid = random_int(100, 999999999);
|
||||
|
||||
if ($attempts++ > 10) {
|
||||
throw new NoUniqueVmidException();
|
||||
}
|
||||
}
|
||||
|
||||
return $vmid;
|
||||
}
|
||||
|
||||
public function generateUniqueUuidCombo(): string
|
||||
{
|
||||
$uuid = Str::uuid()->toString();
|
||||
$short = substr($uuid, 0, 8);
|
||||
$attempts = 0;
|
||||
|
||||
while (!$this->repository->isUniqueUuidCombo($uuid, $short)) {
|
||||
$uuid = Str::uuid()->toString();
|
||||
$short = substr($uuid, 0, 8);
|
||||
|
||||
if ($attempts++ > 10) {
|
||||
throw new NoUniqueUuidComboException();
|
||||
}
|
||||
}
|
||||
|
||||
return $uuid;
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user