mirror of
https://github.com/vitodeploy/vito.git
synced 2025-07-02 22:46:16 +00:00
Add load balancer (#453)
This commit is contained in:
@ -2,18 +2,29 @@
|
||||
|
||||
namespace Tests\Feature\API;
|
||||
|
||||
use App\Enums\LoadBalancerMethod;
|
||||
use App\Enums\SourceControl;
|
||||
use App\Facades\SSH;
|
||||
use App\Models\Server;
|
||||
use App\Models\Site;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Laravel\Sanctum\Sanctum;
|
||||
use Tests\TestCase;
|
||||
use Tests\Traits\PrepareLoadBalancer;
|
||||
|
||||
class SitesTest extends TestCase
|
||||
{
|
||||
use PrepareLoadBalancer;
|
||||
use RefreshDatabase;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
$this->prepare();
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider create_data
|
||||
*/
|
||||
@ -67,6 +78,26 @@ public function test_see_sites_list(): void
|
||||
]);
|
||||
}
|
||||
|
||||
public function test_see_site(): void
|
||||
{
|
||||
Sanctum::actingAs($this->user, ['read', 'write']);
|
||||
|
||||
/** @var Site $site */
|
||||
$site = Site::factory()->create([
|
||||
'server_id' => $this->server->id,
|
||||
]);
|
||||
|
||||
$this->json('GET', route('api.projects.servers.sites.show', [
|
||||
'project' => $this->server->project,
|
||||
'server' => $this->server,
|
||||
'site' => $site,
|
||||
]))
|
||||
->assertSuccessful()
|
||||
->assertJsonFragment([
|
||||
'domain' => $site->domain,
|
||||
]);
|
||||
}
|
||||
|
||||
public function test_delete_site(): void
|
||||
{
|
||||
SSH::fake();
|
||||
@ -87,6 +118,54 @@ public function test_delete_site(): void
|
||||
->assertNoContent();
|
||||
}
|
||||
|
||||
public function test_update_load_balancer(): void
|
||||
{
|
||||
SSH::fake();
|
||||
|
||||
Sanctum::actingAs($this->user, ['read', 'write']);
|
||||
|
||||
$servers = Server::query()->where('id', '!=', $this->server->id)->get();
|
||||
$this->assertEquals(2, $servers->count());
|
||||
|
||||
$this->json('POST', route('api.projects.servers.sites.load-balancer', [
|
||||
'project' => $this->server->project,
|
||||
'server' => $this->server,
|
||||
'site' => $this->site,
|
||||
]), [
|
||||
'method' => LoadBalancerMethod::ROUND_ROBIN,
|
||||
'servers' => [
|
||||
[
|
||||
'server' => $servers[0]->local_ip,
|
||||
'port' => 80,
|
||||
'weight' => 1,
|
||||
'backup' => false,
|
||||
],
|
||||
[
|
||||
'server' => $servers[1]->local_ip,
|
||||
'port' => 80,
|
||||
'weight' => 1,
|
||||
'backup' => false,
|
||||
],
|
||||
],
|
||||
])
|
||||
->assertSuccessful();
|
||||
|
||||
$this->assertDatabaseHas('load_balancer_servers', [
|
||||
'load_balancer_id' => $this->site->id,
|
||||
'ip' => $servers[0]->local_ip,
|
||||
'port' => 80,
|
||||
'weight' => 1,
|
||||
'backup' => false,
|
||||
]);
|
||||
$this->assertDatabaseHas('load_balancer_servers', [
|
||||
'load_balancer_id' => $this->site->id,
|
||||
'ip' => $servers[1]->local_ip,
|
||||
'port' => 80,
|
||||
'weight' => 1,
|
||||
'backup' => false,
|
||||
]);
|
||||
}
|
||||
|
||||
public static function create_data(): array
|
||||
{
|
||||
return \Tests\Feature\SitesTest::create_data();
|
||||
|
90
tests/Feature/LoadBalancerTest.php
Normal file
90
tests/Feature/LoadBalancerTest.php
Normal file
@ -0,0 +1,90 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Enums\LoadBalancerMethod;
|
||||
use App\Facades\SSH;
|
||||
use App\Models\Server;
|
||||
use App\Web\Pages\Servers\Sites\View;
|
||||
use App\Web\Pages\Servers\Sites\Widgets\LoadBalancerServers;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Livewire\Livewire;
|
||||
use Tests\TestCase;
|
||||
use Tests\Traits\PrepareLoadBalancer;
|
||||
|
||||
class LoadBalancerTest extends TestCase
|
||||
{
|
||||
use PrepareLoadBalancer;
|
||||
use RefreshDatabase;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
$this->prepare();
|
||||
}
|
||||
|
||||
public function test_visit_load_balancer_servers(): void
|
||||
{
|
||||
$this->actingAs($this->user);
|
||||
|
||||
$this->get(
|
||||
View::getUrl([
|
||||
'server' => $this->server,
|
||||
'site' => $this->site,
|
||||
])
|
||||
)
|
||||
->assertSuccessful()
|
||||
->assertSee($this->site->domain)
|
||||
->assertSee('Load Balancer Servers');
|
||||
}
|
||||
|
||||
public function test_update_load_balancer_servers()
|
||||
{
|
||||
SSH::fake();
|
||||
|
||||
$this->actingAs($this->user);
|
||||
|
||||
$servers = Server::query()->where('id', '!=', $this->server->id)->get();
|
||||
$this->assertEquals(2, $servers->count());
|
||||
|
||||
Livewire::test(LoadBalancerServers::class, [
|
||||
'site' => $this->site,
|
||||
])
|
||||
->assertFormExists()
|
||||
->fillForm([
|
||||
'method' => LoadBalancerMethod::ROUND_ROBIN,
|
||||
'servers' => [
|
||||
[
|
||||
'server' => $servers[0]->local_ip,
|
||||
'port' => 80,
|
||||
'weight' => 1,
|
||||
'backup' => false,
|
||||
],
|
||||
[
|
||||
'server' => $servers[1]->local_ip,
|
||||
'port' => 80,
|
||||
'weight' => 1,
|
||||
'backup' => false,
|
||||
],
|
||||
],
|
||||
])
|
||||
->call('save')
|
||||
->assertSuccessful();
|
||||
|
||||
$this->assertDatabaseHas('load_balancer_servers', [
|
||||
'load_balancer_id' => $this->site->id,
|
||||
'ip' => $servers[0]->local_ip,
|
||||
'port' => 80,
|
||||
'weight' => 1,
|
||||
'backup' => false,
|
||||
]);
|
||||
$this->assertDatabaseHas('load_balancer_servers', [
|
||||
'load_balancer_id' => $this->site->id,
|
||||
'ip' => $servers[1]->local_ip,
|
||||
'port' => 80,
|
||||
'weight' => 1,
|
||||
'backup' => false,
|
||||
]);
|
||||
}
|
||||
}
|
@ -2,6 +2,7 @@
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Enums\LoadBalancerMethod;
|
||||
use App\Enums\SiteStatus;
|
||||
use App\Enums\SiteType;
|
||||
use App\Enums\SourceControl;
|
||||
@ -418,6 +419,15 @@ public static function create_data(): array
|
||||
'user' => 'example',
|
||||
],
|
||||
],
|
||||
[
|
||||
[
|
||||
'type' => SiteType::LOAD_BALANCER,
|
||||
'domain' => 'example.com',
|
||||
'aliases' => ['www.example.com'],
|
||||
'user' => 'example',
|
||||
'method' => LoadBalancerMethod::ROUND_ROBIN,
|
||||
],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
|
47
tests/Traits/PrepareLoadBalancer.php
Normal file
47
tests/Traits/PrepareLoadBalancer.php
Normal file
@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Traits;
|
||||
|
||||
use App\Enums\Database;
|
||||
use App\Enums\LoadBalancerMethod;
|
||||
use App\Enums\PHP;
|
||||
use App\Enums\ServiceStatus;
|
||||
use App\Enums\SiteType;
|
||||
use App\Enums\Webserver;
|
||||
use App\Models\Server;
|
||||
use App\Models\Site;
|
||||
|
||||
trait PrepareLoadBalancer
|
||||
{
|
||||
private function prepare(): void
|
||||
{
|
||||
$this->site->type = SiteType::LOAD_BALANCER;
|
||||
$this->site->type_data = [
|
||||
'method' => LoadBalancerMethod::ROUND_ROBIN,
|
||||
];
|
||||
$this->site->save();
|
||||
|
||||
$servers = Server::factory(2)->create([
|
||||
'user_id' => $this->user->id,
|
||||
'project_id' => $this->user->current_project_id,
|
||||
]);
|
||||
foreach ($servers as $server) {
|
||||
$server->type()->createServices([
|
||||
'webserver' => Webserver::NGINX,
|
||||
'database' => Database::NONE,
|
||||
'php' => PHP::NONE,
|
||||
]);
|
||||
$server->services()->update([
|
||||
'status' => ServiceStatus::READY,
|
||||
]);
|
||||
Site::factory()->create([
|
||||
'domain' => 'vito.test',
|
||||
'aliases' => ['www.vito.test'],
|
||||
'server_id' => $server->id,
|
||||
'type' => SiteType::PHP_BLANK,
|
||||
'path' => '/home/vito/vito.test',
|
||||
'web_directory' => '',
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user