creating networks wip

This commit is contained in:
2025-04-07 16:39:53 +01:00
parent 32d30e00aa
commit b2070e052d
11 changed files with 108 additions and 19 deletions

View File

@@ -0,0 +1,12 @@
<?php
namespace App\Data\ServerProviders;
class Network
{
public function __construct(
public string $id,
public string $name,
public string $ipRange,
) {}
}

View File

@@ -7,7 +7,7 @@ use App\Enums\Concerns\Arrayable;
enum FirewallRuleType: string enum FirewallRuleType: string
{ {
use Arrayable; use Arrayable;
case ALLOW = 'allow'; case ALLOW = 'allow';
case DENY = 'deny'; case DENY = 'deny';
} }

View File

@@ -5,9 +5,7 @@ namespace App\Events\Servers;
use App\Models\Server; use App\Models\Server;
use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
@@ -17,8 +15,7 @@ class ServerProvisioned
public function __construct( public function __construct(
protected Server $server, protected Server $server,
) ) {
{
// //
} }

View File

@@ -31,10 +31,10 @@ class ProvisionCallback extends Controller
if (! $isValidIp) { if (! $isValidIp) {
logger('someone tried to callback from an invalid IP'); logger('someone tried to callback from an invalid IP');
logger(' server ip: ' . $server->ipv4); logger(' server ip: '.$server->ipv4);
logger(' server ipv6: ' . $server->ipv6); logger(' server ipv6: '.$server->ipv6);
logger(' callback ip: ' . $request->ip()); logger(' callback ip: '.$request->ip());
logger(' server id: ' . $server->id); logger(' server id: '.$server->id);
return response('Unauthorized', 401); return response('Unauthorized', 401);
} }

View File

@@ -3,7 +3,6 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Actions\GenerateRandomSlug; use App\Actions\GenerateRandomSlug;
use App\Actions\GetProviderService;
use App\Enums\ServerStatus; use App\Enums\ServerStatus;
use App\Jobs\Servers\WaitForServerToConnect; use App\Jobs\Servers\WaitForServerToConnect;
use App\Models\Organisation; use App\Models\Organisation;

View File

@@ -0,0 +1,31 @@
<?php
namespace App\Http\Integrations\Requests\Hetzner\Servers;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Traits\Body\HasJsonBody;
class CreateNetworkRequest extends Request implements HasBody
{
use HasJsonBody;
protected Method $method = Method::POST;
public function __construct(
protected ?string $name = null,
) {}
protected function defaultBody(): array
{
return [
'name' => $this->name,
];
}
public function resolveEndpoint(): string
{
return '/networks';
}
}

View File

@@ -0,0 +1,31 @@
<?php
namespace App\Http\Integrations\Requests\Hetzner\Servers;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Traits\Body\HasJsonBody;
class GetNetworksRequest extends Request implements HasBody
{
use HasJsonBody;
protected Method $method = Method::GET;
public function __construct(
protected ?string $name = null,
) {}
protected function defaultBody(): array
{
return [
'name' => $this->name,
];
}
public function resolveEndpoint(): string
{
return '/networks';
}
}

View File

@@ -5,11 +5,13 @@ namespace App\Services\ServerProviders;
use App\Data\ServerProviders\CreatedServer; use App\Data\ServerProviders\CreatedServer;
use App\Data\ServerProviders\Image; use App\Data\ServerProviders\Image;
use App\Data\ServerProviders\Location; use App\Data\ServerProviders\Location;
use App\Data\ServerProviders\Network;
use App\Data\ServerProviders\ServerType; use App\Data\ServerProviders\ServerType;
use App\Http\Integrations\Connectors\HetznerConnector; use App\Http\Integrations\Connectors\HetznerConnector;
use App\Http\Integrations\Requests\Hetzner\Images\GetImagesRequest; use App\Http\Integrations\Requests\Hetzner\Images\GetImagesRequest;
use App\Http\Integrations\Requests\Hetzner\Locations\GetLocationsRequest; use App\Http\Integrations\Requests\Hetzner\Locations\GetLocationsRequest;
use App\Http\Integrations\Requests\Hetzner\Servers\CreateServerRequest; use App\Http\Integrations\Requests\Hetzner\Servers\CreateServerRequest;
use App\Http\Integrations\Requests\Hetzner\Servers\GetNetworksRequest;
use App\Http\Integrations\Requests\Hetzner\ServerTypes\GetServerTypesRequest; use App\Http\Integrations\Requests\Hetzner\ServerTypes\GetServerTypesRequest;
use App\Models\Provider; use App\Models\Provider;
use Exception; use Exception;
@@ -107,4 +109,27 @@ class HetznerService extends ServerProviderService
); );
})->where('osVersion', '!=', 'unknown')->values(); })->where('osVersion', '!=', 'unknown')->values();
} }
public function findNetwork(string $name): ?Network
{
$response = $this->connector->send(new GetNetworksRequest(
name: $name,
));
if ($response->status() !== 200) {
throw new Exception('Failed to fetch networks from Hetzner');
}
$network = collect($response->json('networks'))->where('name', $name)->first();
if ($network) {
return new Network(
id: $network['id'],
name: $network['name'],
ipRange: $network['ip_range'],
);
}
return null;
}
} }

View File

@@ -3,6 +3,7 @@
namespace App\Services\ServerProviders; namespace App\Services\ServerProviders;
use App\Data\ServerProviders\CreatedServer; use App\Data\ServerProviders\CreatedServer;
use App\Data\ServerProviders\Network;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Saloon\Http\Connector; use Saloon\Http\Connector;
@@ -22,4 +23,6 @@ abstract class ServerProviderService
abstract public function getLocations(): Collection; abstract public function getLocations(): Collection;
abstract public function getImages(): Collection; abstract public function getImages(): Collection;
abstract public function findNetwork(string $name): ?Network;
} }

View File

@@ -1,7 +1,5 @@
<?php <?php
use App\Actions\Servers\SyncWireguardRules;
use App\Enums\ServerStatus;
use App\Http\Controllers\ApplicationController; use App\Http\Controllers\ApplicationController;
use App\Http\Controllers\EnvironmentController; use App\Http\Controllers\EnvironmentController;
use App\Http\Controllers\OrganisationController; use App\Http\Controllers\OrganisationController;
@@ -9,11 +7,7 @@ use App\Http\Controllers\ProvisionCallback;
use App\Http\Controllers\ProvisionScript; use App\Http\Controllers\ProvisionScript;
use App\Http\Controllers\ServerController; use App\Http\Controllers\ServerController;
use App\Http\Controllers\ServiceController; use App\Http\Controllers\ServiceController;
use App\Models\Server;
use App\Support\Ip;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
use Inertia\Inertia;
Route::inertia('/', 'Welcome')->name('home'); Route::inertia('/', 'Welcome')->name('home');

View File

@@ -1,11 +1,8 @@
<?php <?php
use App\Actions\GetProviderService;
use App\Data\ServerProviders\CreatedServer;
use App\Models\Organisation; use App\Models\Organisation;
use App\Models\Server; use App\Models\Server;
use App\Models\User; use App\Models\User;
use Illuminate\Support\Str;
use Inertia\Testing\AssertableInertia; use Inertia\Testing\AssertableInertia;
use function Pest\Laravel\actingAs; use function Pest\Laravel\actingAs;