mirror of
https://github.com/pelican-dev/panel.git
synced 2025-06-12 04:58:59 +02:00
Fix tests
This commit is contained in:
parent
b24ff8bb26
commit
f57232bc23
@ -28,10 +28,14 @@ class EndpointCollection implements Castable
|
||||
|
||||
public function set($model, $key, $value, $attributes)
|
||||
{
|
||||
if (!$value instanceof Collection) {
|
||||
if (!is_array($value) && !$value instanceof Collection) {
|
||||
return new Collection();
|
||||
}
|
||||
|
||||
if (!$value instanceof Collection) {
|
||||
$value = new Collection($value);
|
||||
}
|
||||
|
||||
return $value->map(fn ($endpoint) => (string) $endpoint);
|
||||
}
|
||||
};
|
||||
|
@ -110,6 +110,10 @@ class StoreServerRequest extends ApplicationApiRequest
|
||||
$validator->sometimes('deploy.port_range', 'present', function ($input) {
|
||||
return $input->deploy;
|
||||
});
|
||||
|
||||
$validator->sometimes('deploy.node_id', 'present', function ($input) {
|
||||
return $input->deploy;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@ -125,6 +129,7 @@ class StoreServerRequest extends ApplicationApiRequest
|
||||
$object->setDedicated($this->input('deploy.dedicated_ip', false));
|
||||
$object->setTags($this->input('deploy.tags', $this->input('deploy.locations', [])));
|
||||
$object->setPorts($this->input('deploy.port_range', []));
|
||||
$object->setNode($this->input('deploy.node_id'));
|
||||
|
||||
return $object;
|
||||
}
|
||||
|
@ -2,6 +2,8 @@
|
||||
|
||||
namespace App\Models\Objects;
|
||||
|
||||
use App\Models\Node;
|
||||
|
||||
class DeploymentObject
|
||||
{
|
||||
private bool $dedicated = false;
|
||||
@ -10,6 +12,8 @@ class DeploymentObject
|
||||
|
||||
private array $ports = [];
|
||||
|
||||
private Node $node;
|
||||
|
||||
public function isDedicated(): bool
|
||||
{
|
||||
return $this->dedicated;
|
||||
@ -46,4 +50,13 @@ class DeploymentObject
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getNode(): Node
|
||||
{
|
||||
return $this->node;
|
||||
}
|
||||
|
||||
public function setNode(Node $node): self
|
||||
{
|
||||
$this->node = $node;
|
||||
}
|
||||
}
|
||||
|
@ -2,9 +2,10 @@
|
||||
|
||||
namespace App\Models\Objects;
|
||||
|
||||
use Illuminate\Contracts\Support\Jsonable;
|
||||
use InvalidArgumentException;
|
||||
|
||||
class Endpoint
|
||||
class Endpoint implements Jsonable
|
||||
{
|
||||
public const CIDR_MAX_BITS = 27;
|
||||
public const CIDR_MIN_BITS = 32;
|
||||
@ -32,7 +33,7 @@ class Endpoint
|
||||
throw_unless($this->port < self::PORT_CEIL, "Port $this->port must be less than " . self::PORT_CEIL);
|
||||
}
|
||||
|
||||
public function __toString()
|
||||
public function __toString(): string
|
||||
{
|
||||
if ($this->ip === self::INADDR_ANY) {
|
||||
return (string) $this->port;
|
||||
@ -40,4 +41,9 @@ class Endpoint
|
||||
|
||||
return "$this->ip:$this->port";
|
||||
}
|
||||
|
||||
public function toJson($options = 0): string
|
||||
{
|
||||
return json_encode($this->__toString());
|
||||
}
|
||||
}
|
||||
|
@ -17,8 +17,8 @@ class ServerConfigurationStructureService
|
||||
/**
|
||||
* Return a configuration array for a specific server when passed a server model.
|
||||
*
|
||||
* DO NOT MODIFY THIS FUNCTION. This powers legacy code handling for the new daemon
|
||||
* daemon, if you modify the structure eggs will break unexpectedly.
|
||||
* DO NOT MODIFY THIS FUNCTION. This powers legacy code handling for wings
|
||||
* if you modify the structure eggs will break unexpectedly.
|
||||
*/
|
||||
public function handle(Server $server, array $override = []): array
|
||||
{
|
||||
@ -66,8 +66,8 @@ class ServerConfigurationStructureService
|
||||
'allocations' => [
|
||||
'force_outgoing_ip' => $server->egg->force_outgoing_ip,
|
||||
'default' => [
|
||||
'ip' => $server->getPrimaryEndpoint()->ip,
|
||||
'port' => $server->getPrimaryEndpoint()->port,
|
||||
'ip' => $server->getPrimaryEndpoint()?->ip,
|
||||
'port' => $server->getPrimaryEndpoint()?->port,
|
||||
],
|
||||
'mappings' => $server->getPortMappings(),
|
||||
],
|
||||
|
@ -51,13 +51,6 @@ class ServerCreationService
|
||||
$data['image'] = $data['image'] ?? collect($egg->docker_images)->first();
|
||||
$data['startup'] = $data['startup'] ?? $egg->startup;
|
||||
|
||||
// If a deployment object has been passed we need to get the allocation
|
||||
// that the server should use, and assign the node from that allocation.
|
||||
if ($deployment instanceof DeploymentObject) {
|
||||
// Todo: Refactor
|
||||
// $allocation = $this->configureDeployment($data, $deployment);
|
||||
}
|
||||
|
||||
Assert::false(empty($data['node_id']));
|
||||
|
||||
$eggVariableData = $this->validatorService
|
||||
@ -118,7 +111,7 @@ class ServerCreationService
|
||||
'cpu' => Arr::get($data, 'cpu'),
|
||||
'threads' => Arr::get($data, 'threads'),
|
||||
'oom_killer' => Arr::get($data, 'oom_killer') ?? false,
|
||||
'allocation_id' => Arr::get($data, 'allocation_id'),
|
||||
'ports' => Arr::get($data, 'ports') ?? [],
|
||||
'egg_id' => Arr::get($data, 'egg_id'),
|
||||
'startup' => Arr::get($data, 'startup'),
|
||||
'image' => Arr::get($data, 'image'),
|
||||
|
@ -25,7 +25,7 @@ class VariableValidatorService
|
||||
*
|
||||
* @throws \Illuminate\Validation\ValidationException
|
||||
*/
|
||||
public function handle(int $egg, array $fields = [], $validate = false): Collection
|
||||
public function handle(int $egg, array $fields = [], $validate = true): Collection
|
||||
{
|
||||
$query = EggVariable::query()->where('egg_id', $egg);
|
||||
if (!$this->isUserLevel(User::USER_LEVEL_ADMIN)) {
|
||||
|
@ -3,6 +3,7 @@
|
||||
namespace App\Transformers\Api\Client;
|
||||
|
||||
use App\Models\Egg;
|
||||
use App\Models\Objects\Endpoint;
|
||||
use App\Models\Server;
|
||||
use App\Models\Subuser;
|
||||
use League\Fractal\Resource\Item;
|
||||
@ -74,6 +75,7 @@ class ServerTransformer extends BaseClientTransformer
|
||||
// This field is deprecated, please use "status".
|
||||
'is_installing' => !$server->isInstalled(),
|
||||
'is_transferring' => !is_null($server->transfer),
|
||||
'ports' => $user->can(Permission::ACTION_ALLOCATION_READ, $server) ? $server->ports : collect(),
|
||||
];
|
||||
}
|
||||
|
||||
|
@ -20,12 +20,6 @@ return new class extends Migration
|
||||
$table->json('ports')->nullable();
|
||||
});
|
||||
|
||||
DB::table('servers')->update(['ports' => '[]']);
|
||||
|
||||
Schema::table('servers', function (Blueprint $table) {
|
||||
$table->json('ports')->change();
|
||||
});
|
||||
|
||||
$portMappings = [];
|
||||
foreach (DB::table('allocations')->get() as $allocation) {
|
||||
$portMappings[$allocation->server_id][] = "$allocation->ip:$allocation->port";
|
||||
@ -37,13 +31,15 @@ return new class extends Migration
|
||||
->update(['ports' => json_encode($ports)]);
|
||||
}
|
||||
|
||||
Schema::table('servers', function (Blueprint $table) {
|
||||
try {
|
||||
try {
|
||||
Schema::table('servers', function (Blueprint $table) {
|
||||
$table->dropForeign(['allocation_id']);
|
||||
} catch (Exception) {
|
||||
// pass
|
||||
}
|
||||
});
|
||||
} catch (Throwable) {
|
||||
|
||||
}
|
||||
|
||||
Schema::table('servers', function (Blueprint $table) {
|
||||
$table->dropUnique(['allocation_id']);
|
||||
$table->dropColumn(['allocation_id']);
|
||||
});
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Tests\Integration\Api\Client;
|
||||
|
||||
use App\Models\Objects\Endpoint;
|
||||
use App\Models\User;
|
||||
use App\Models\Server;
|
||||
use App\Models\Subuser;
|
||||
@ -260,13 +261,16 @@ class ClientControllerTest extends ClientApiIntegrationTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that a subuser without the allocation.read permission is only able to see the primary
|
||||
* allocation for the server.
|
||||
* Test that a subuser without the allocation.read permission cannot see any ports
|
||||
*/
|
||||
public function testOnlyPrimaryAllocationIsReturnedToSubuser(): void
|
||||
public function testNoPortsAreReturnedToSubuser(): void
|
||||
{
|
||||
/** @var \App\Models\Server $server */
|
||||
[$user, $server] = $this->generateTestAccount([Permission::ACTION_WEBSOCKET_CONNECT]);
|
||||
$server->ports->add(new Endpoint(1234));
|
||||
$server->ports->add(new Endpoint(2345, '1.2.3.4'));
|
||||
$server->ports->add(new Endpoint(3456));
|
||||
$server->save();
|
||||
|
||||
$server->refresh();
|
||||
$response = $this->actingAs($user)->getJson('/api/client');
|
||||
@ -275,7 +279,7 @@ class ClientControllerTest extends ClientApiIntegrationTestCase
|
||||
$response->assertJsonCount(1, 'data');
|
||||
$response->assertJsonPath('data.0.attributes.server_owner', false);
|
||||
$response->assertJsonPath('data.0.attributes.uuid', $server->uuid);
|
||||
$response->assertJsonCount(1, 'data.0.attributes.relationships.allocations.data');
|
||||
$response->assertJsonCount(0, 'data.0.attributes.ports');
|
||||
}
|
||||
|
||||
public static function filterTypeDataProvider(): array
|
||||
|
@ -31,7 +31,7 @@ class BuildModificationServiceTest extends IntegrationTestCase
|
||||
* the server data is updated in realtime. This test also ensures that only certain fields get updated
|
||||
* for the server, and not just any arbitrary field.
|
||||
*/
|
||||
public function testServerBuildDataIsProperlyUpdatedOndaemon(): void
|
||||
public function testServerBuildDataIsProperlyUpdatedOnDaemon(): void
|
||||
{
|
||||
$server = $this->createServerModel();
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Tests\Integration\Services\Servers;
|
||||
|
||||
use App\Models\Objects\Endpoint;
|
||||
use Mockery\MockInterface;
|
||||
use App\Models\Egg;
|
||||
use GuzzleHttp\Psr7\Request;
|
||||
@ -82,6 +83,7 @@ class ServerCreationServiceTest extends IntegrationTestCase
|
||||
'image' => 'java:8',
|
||||
'egg_id' => $egg->id,
|
||||
'ports' => [1234, 2345, 3456],
|
||||
'node_id' => $node->id,
|
||||
'environment' => [
|
||||
'BUNGEE_VERSION' => '123',
|
||||
'SERVER_JARFILE' => 'server2.jar',
|
||||
@ -121,6 +123,12 @@ class ServerCreationServiceTest extends IntegrationTestCase
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($key === 'ports') {
|
||||
$this->assertSame($value, $response->ports->map(fn (Endpoint $endpoint) => $endpoint->port)->all());
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
$this->assertSame($value, $response->{$key}, "Failed asserting equality of '$key' in server response. Got: [{$response->{$key}}] Expected: [$value]");
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user