Refactor VM provisioning pipeline into focused services and add IP pool
management
This commit is contained in:
@@ -15,7 +15,7 @@ use Illuminate\Support\Facades\Log;
|
||||
* Cách cấu hình pools() bên dưới:
|
||||
*
|
||||
* // Theo CIDR:
|
||||
* ['network' => 'LAN-VPS-01', 'cidr' => '103.90.224.0/26']
|
||||
* ['network' => 'LAN-VPS-01', 'cidr' => '103.90.224.0/26', 'gateway' => '103.90.224.1']
|
||||
*
|
||||
* // Theo range:
|
||||
* ['network' => 'LAN-VPS-01', 'start' => '103.90.224.10', 'end' => '103.90.224.60']
|
||||
@@ -26,7 +26,7 @@ use Illuminate\Support\Facades\Log;
|
||||
* // Có thể dùng module_network_id thay vì tên network:
|
||||
* ['network_id' => 1, 'cidr' => '103.90.224.0/26']
|
||||
*
|
||||
* IP đầu (network address) và IP cuối (broadcast) trong CIDR tự động bị loại bỏ.
|
||||
* IP đầu (network address), IP cuối (broadcast), và gateway trong CIDR tự động bị loại bỏ.
|
||||
* Khi VM được tạo, hệ thống sẽ lấy IP đầu tiên chưa được assign trong module_ip_address.
|
||||
*/
|
||||
class IpPoolSeeder extends Seeder
|
||||
@@ -42,7 +42,8 @@ class IpPoolSeeder extends Seeder
|
||||
// --- Pool 1: VPS Public Network (module_network id=1, name="VM Network") ---
|
||||
[
|
||||
'network_id' => 1, // module_network.id
|
||||
'cidr' => '103.90.224.0/26', // /26 = 62 usable IPs (.1 → .62)
|
||||
'cidr' => '103.90.224.0/26', // /26, gateway .1, cấp phát .2 → .62
|
||||
'gateway' => '103.90.224.1',
|
||||
],
|
||||
|
||||
// --- Pool 2: thêm range thủ công ---
|
||||
@@ -91,6 +92,10 @@ class IpPoolSeeder extends Seeder
|
||||
[
|
||||
'ip_address' => $ip,
|
||||
'module_network_id' => $network->id,
|
||||
],
|
||||
[
|
||||
'gateway' => $pool['gateway'] ?? null,
|
||||
'cidr' => $this->resolveCidr($pool),
|
||||
]
|
||||
);
|
||||
|
||||
@@ -130,20 +135,53 @@ class IpPoolSeeder extends Seeder
|
||||
private function generateIps(array $pool): array
|
||||
{
|
||||
if (!empty($pool['ips'])) {
|
||||
return array_values(array_filter($pool['ips'], fn($ip) => filter_var($ip, FILTER_VALIDATE_IP)));
|
||||
return $this->withoutGateway(
|
||||
array_values(array_filter($pool['ips'], fn($ip) => filter_var($ip, FILTER_VALIDATE_IP))),
|
||||
$pool
|
||||
);
|
||||
}
|
||||
|
||||
if (!empty($pool['cidr'])) {
|
||||
return $this->ipsFromCidr($pool['cidr']);
|
||||
return $this->withoutGateway($this->ipsFromCidr($pool['cidr']), $pool);
|
||||
}
|
||||
|
||||
if (!empty($pool['start']) && !empty($pool['end'])) {
|
||||
return $this->ipsFromRange($pool['start'], $pool['end']);
|
||||
return $this->withoutGateway($this->ipsFromRange($pool['start'], $pool['end']), $pool);
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
private function resolveCidr(array $pool): int
|
||||
{
|
||||
if (!empty($pool['prefix'])) {
|
||||
return (int) $pool['prefix'];
|
||||
}
|
||||
|
||||
if (!empty($pool['cidr']) && str_contains($pool['cidr'], '/')) {
|
||||
return (int) explode('/', $pool['cidr'])[1];
|
||||
}
|
||||
|
||||
return 24;
|
||||
}
|
||||
|
||||
/**
|
||||
* Không đưa gateway vào IP pool để tránh cấp gateway cho VM.
|
||||
*
|
||||
* @param string[] $ips
|
||||
* @return string[]
|
||||
*/
|
||||
private function withoutGateway(array $ips, array $pool): array
|
||||
{
|
||||
$gateway = $pool['gateway'] ?? null;
|
||||
|
||||
if (!$gateway || !filter_var($gateway, FILTER_VALIDATE_IP)) {
|
||||
return $ips;
|
||||
}
|
||||
|
||||
return array_values(array_filter($ips, fn(string $ip): bool => $ip !== $gateway));
|
||||
}
|
||||
|
||||
/**
|
||||
* Lấy tất cả usable IPs từ CIDR (bỏ network address và broadcast).
|
||||
* Ví dụ: 103.90.224.0/26 → .1 đến .62
|
||||
|
||||
Reference in New Issue
Block a user