119 lines
4.9 KiB
PHP
119 lines
4.9 KiB
PHP
<?php
|
|
|
|
namespace Database\Seeders;
|
|
|
|
use App\Models\Customer;
|
|
use App\Models\Datacenter;
|
|
use App\Models\Host;
|
|
use App\Models\Instance;
|
|
use App\Models\Order;
|
|
use App\Models\ProvisioningRun;
|
|
use App\Models\User;
|
|
use Illuminate\Database\Seeder;
|
|
use Illuminate\Support\Facades\Hash;
|
|
|
|
class DatabaseSeeder extends Seeder
|
|
{
|
|
/**
|
|
* Seed the application's database.
|
|
*/
|
|
public function run(): void
|
|
{
|
|
// Never create a known-credential account outside local/testing.
|
|
if (! app()->environment('local', 'testing')) {
|
|
return;
|
|
}
|
|
|
|
$admin = User::updateOrCreate(
|
|
['email' => env('SEED_ADMIN_EMAIL', 'admin@clupilot.local')],
|
|
[
|
|
'name' => 'Admin',
|
|
'password' => Hash::make(env('SEED_ADMIN_PASSWORD', 'password')),
|
|
'is_admin' => true,
|
|
],
|
|
);
|
|
if (! $admin->hasRole('Owner')) {
|
|
$admin->assignRole('Owner');
|
|
}
|
|
|
|
// A plain customer to exercise the portal (and prove the admin gate).
|
|
User::updateOrCreate(
|
|
['email' => 'kunde@clupilot.local'],
|
|
[
|
|
'name' => 'Dr. S. Berger',
|
|
'password' => Hash::make(env('SEED_ADMIN_PASSWORD', 'password')),
|
|
'is_admin' => false,
|
|
],
|
|
);
|
|
|
|
// Datacenters — hosts + orders pick their code.
|
|
foreach ([['fsn', 'Falkenstein', 'DE'], ['hel', 'Helsinki', 'FI']] as [$dcCode, $dcName, $dcLocation]) {
|
|
Datacenter::updateOrCreate(['code' => $dcCode], ['name' => $dcName, 'location' => $dcLocation, 'active' => true]);
|
|
}
|
|
|
|
// Demo fleet so the operator console hosts view has content locally.
|
|
$fleet = [
|
|
['name' => 'pve-fsn-1', 'datacenter' => 'fsn', 'public_ip' => '203.0.113.11', 'wg_ip' => '10.66.0.2'],
|
|
['name' => 'pve-hel-1', 'datacenter' => 'hel', 'public_ip' => '203.0.113.21', 'wg_ip' => '10.66.0.3'],
|
|
];
|
|
foreach ($fleet as $host) {
|
|
Host::updateOrCreate(['name' => $host['name']], [
|
|
'datacenter' => $host['datacenter'],
|
|
'public_ip' => $host['public_ip'],
|
|
'wg_ip' => $host['wg_ip'],
|
|
'status' => 'active',
|
|
'total_gb' => 2000,
|
|
'total_ram_mb' => 131072,
|
|
'cpu_cores' => 32,
|
|
'cpu_weight' => 32,
|
|
'reserve_pct' => 15,
|
|
'pve_version' => 'pve-manager/8.2.2',
|
|
'node' => $host['name'],
|
|
'last_seen_at' => now(),
|
|
]);
|
|
}
|
|
|
|
// A live customer (matched to the portal login) with an active instance.
|
|
$fsn1 = Host::query()->where('name', 'pve-fsn-1')->first();
|
|
$berger = Customer::updateOrCreate(
|
|
['email' => 'kunde@clupilot.local'],
|
|
['name' => 'Kanzlei Berger', 'locale' => 'de'],
|
|
);
|
|
$berger->ensureUser(); // links to the kunde@clupilot.local portal login (admin impersonation)
|
|
$bergerOrder = Order::updateOrCreate(
|
|
['stripe_event_id' => 'seed_berger'],
|
|
['customer_id' => $berger->id, 'plan' => 'team', 'amount_cents' => 17900, 'currency' => 'EUR', 'datacenter' => 'fsn', 'status' => 'active'],
|
|
);
|
|
Instance::updateOrCreate(
|
|
['subdomain' => 'kanzlei-berger'],
|
|
[
|
|
'customer_id' => $berger->id, 'order_id' => $bergerOrder->id, 'host_id' => $fsn1?->id,
|
|
'vmid' => 101, 'plan' => 'team', 'quota_gb' => 500, 'disk_gb' => 540, 'ram_mb' => 8192,
|
|
'cores' => 4, 'status' => 'active', 'cert_ok' => true, 'route_written' => true,
|
|
],
|
|
);
|
|
|
|
// A few in-flight runs so the operator provisioning console has content.
|
|
$demoRuns = [
|
|
['name' => 'Ordination Dr. Fux', 'plan' => 'start', 'step' => 7, 'status' => 'running'],
|
|
['name' => 'Weingut Prantl', 'plan' => 'business', 'step' => 13, 'status' => 'waiting'],
|
|
['name' => 'Praxis Sommer', 'plan' => 'team', 'step' => 2, 'status' => 'failed'],
|
|
];
|
|
foreach ($demoRuns as $i => $demo) {
|
|
$customer = Customer::updateOrCreate(
|
|
['email' => "demo{$i}@clupilot.local"],
|
|
['name' => $demo['name'], 'locale' => 'de'],
|
|
);
|
|
$customer->ensureUser(); // portal login so the admin can impersonate
|
|
$order = Order::updateOrCreate(
|
|
['stripe_event_id' => "seed_demo_{$i}"],
|
|
['customer_id' => $customer->id, 'plan' => $demo['plan'], 'amount_cents' => 1900, 'currency' => 'EUR', 'datacenter' => 'fsn', 'status' => 'provisioning'],
|
|
);
|
|
ProvisioningRun::updateOrCreate(
|
|
['subject_type' => Order::class, 'subject_id' => $order->id, 'pipeline' => 'customer'],
|
|
['current_step' => $demo['step'], 'status' => $demo['status'], 'attempt' => $demo['status'] === 'failed' ? 3 : 1, 'context' => []],
|
|
);
|
|
}
|
|
}
|
|
}
|