mirror of
https://github.com/coollabsio/coolify.git
synced 2026-08-24 02:24:11 -05:00
Add WireGuard networking fields (interface, management pool, listen port), container network pool, coold/corrosion versioning, and builder CPU quota to clusters and servers via new migrations and model fillables. Expose full cluster and server CRUD on the Clusters page with private key selection, pending state tracking, and new form primitives (Field, Input, Textarea). Add server status check fields and a lima test VM config for development.
125 lines
6.5 KiB
PHP
125 lines
6.5 KiB
PHP
<?php
|
|
|
|
it('delegates dev firewall commands to the coolify CLI instead of calling coold APIs directly', function () {
|
|
$script = file_get_contents(base_path('scripts/dev.sh'));
|
|
|
|
expect($script)->toContain('coolify_firewall()')
|
|
->and($script)->toContain('"$(coolify_cli_bin)" firewall "$command"')
|
|
->and($script)->toContain('--nodes "$nodes"')
|
|
->and($script)->toContain('--ssh-config "$ssh_config"')
|
|
->and($script)->not->toContain('/api/v1/firewall/allow')
|
|
->and($script)->not->toContain('firewall_api_for_each_vm');
|
|
});
|
|
|
|
it('installs the coolify CLI in both application container images', function (string $dockerfile) {
|
|
$contents = file_get_contents(base_path($dockerfile));
|
|
|
|
expect($contents)->toContain('ARG COOLIFY_CLI_VERSION=nightly')
|
|
->and($contents)->toContain('coolify-linux-musl-${COOLIFY_CLI_ARCH}.tar.gz')
|
|
->and($contents)->toContain('install -m 0755 /tmp/coolify /usr/local/bin/coolify');
|
|
})->with([
|
|
'development image' => 'docker/development/Dockerfile',
|
|
'production image' => 'docker/production/Dockerfile',
|
|
]);
|
|
|
|
it('does not require predefined UI node environment variables in the development app container', function () {
|
|
$compose = file_get_contents(base_path('docker-compose.dev.yml'));
|
|
$config = file_get_contents(base_path('config/coold.php'));
|
|
|
|
expect($compose)->not->toContain('COOLIFY_CLI_NODES:')
|
|
->and($compose)->not->toContain('COOLIFY_CLI_SSH_CONFIG:')
|
|
->and($compose)->not->toContain('COOLIFY_CLI_WG_LISTEN_PORT_OVERRIDES:')
|
|
->and($compose)->not->toContain('COOLIFY_CLI_WG_ENDPOINT_OVERRIDES:')
|
|
->and($compose)->not->toContain('COOLIFY_CLI_TIMEOUT:')
|
|
->and($config)->not->toContain('cli_nodes')
|
|
->and($config)->not->toContain('COOLIFY_CLI_NODES');
|
|
});
|
|
|
|
it('supports a naked up mode that starts VMs and Spin but skips server bootstrap wiring', function () {
|
|
$script = file_get_contents(base_path('scripts/dev.sh'));
|
|
|
|
expect($script)->toContain('local naked=false')
|
|
->and($script)->toContain('--naked')
|
|
->and($script)->toContain('if [ "${#spin_args[@]}" -gt 0 ]; then')
|
|
->and($script)->toContain('spin up -d "${spin_args[@]}"')
|
|
->and($script)->toContain('spin up -d')
|
|
->and($script)->toContain('if [ "$naked" = "true" ]; then')
|
|
->and($script)->toContain('Skipping coolify bootstrap and Flux VM wiring')
|
|
->and($script)->toContain('coolify_bootstrap_with_retry')
|
|
->and($script)->toContain('configure_flux_dev_for_vm "$index"')
|
|
->and($script)->toContain('sync_v5_dev_lima_servers');
|
|
});
|
|
|
|
it('retries dev coolify bootstrap because fresh Lima setup can complete across partial phases', function () {
|
|
$script = file_get_contents(base_path('scripts/dev.sh'));
|
|
|
|
expect($script)->toContain('coolify_bootstrap_with_retry()')
|
|
->and($script)->toContain('local attempts=5')
|
|
->and($script)->toContain('if coolify_bootstrap; then')
|
|
->and($script)->toContain('fresh Lima hosts can finish setup after partial bootstrap phases');
|
|
});
|
|
|
|
it('seeds bootstrapped Lima VMs into v5 development server state', function () {
|
|
$script = file_get_contents(base_path('scripts/dev.sh'));
|
|
$compose = file_get_contents(base_path('docker-compose.dev.yml'));
|
|
|
|
expect($script)->toContain('sync_v5_dev_lima_servers()')
|
|
->and($script)->toContain('COOLIFY_CLI_SSH_USER="$ssh_user"')
|
|
->and($script)->toContain('COOLIFY_CLI_SSH_USER="$(coolify_ssh_user)" spin up -d')
|
|
->and($script)->toContain('lima_ssh_port "$index"')
|
|
->and($script)->toContain('host.docker.internal')
|
|
->and($script)->toContain('v5:sync-dev-lima-servers')
|
|
->and($script)->toContain('--server="${instance}|host.docker.internal|${ssh_user}|${ssh_port}"')
|
|
->and($compose)->toContain('COOLIFY_CLI_SSH_USER: "${COOLIFY_CLI_SSH_USER:-}"')
|
|
->and($script)->not->toContain('db:seed --class=V5DevLimaSeeder --force')
|
|
->and($script)->not->toContain('--server "${instance}|${node}|$(coolify_ssh_user)|22"');
|
|
});
|
|
|
|
it('configures predictable Lima SSH local ports for dev VMs', function () {
|
|
$script = file_get_contents(base_path('scripts/dev.sh'));
|
|
$vmScript = file_get_contents(base_path('scripts/coold-vm.sh'));
|
|
$template = file_get_contents(base_path('dev/lima/coold.yaml'));
|
|
|
|
expect($script)->toContain('coold_vm_ssh_port()')
|
|
->and($script)->toContain('COOLIFY_COOLD_VM_SSH_PORT_')
|
|
->and($script)->toContain('6000${index}')
|
|
->and($script)->toContain('COOLIFY_COOLD_VM_SSH_PORT="$(coold_vm_ssh_port "$index")"')
|
|
->and($vmScript)->toContain('SSH_PORT="$(read_coolify_env COOLIFY_COOLD_VM_SSH_PORT 60002)"')
|
|
->and($vmScript)->toContain('{{COOLIFY_COOLD_VM_SSH_PORT}}')
|
|
->and($template)->toContain('ssh:')
|
|
->and($template)->toContain('localPort: {{COOLIFY_COOLD_VM_SSH_PORT}}');
|
|
});
|
|
|
|
it('authorizes the seeded testing host key in dev Lima VMs', function () {
|
|
$template = file_get_contents(base_path('dev/lima/coold.yaml'));
|
|
|
|
expect($template)->toContain('coolify_test_public_key=')
|
|
->and($template)->toContain('ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFuGmoeGq/pojrsyP1pszcNVuZx9iFkCELtxrh31QJ68')
|
|
->and($template)->toContain('authorized_keys')
|
|
->and($template)->toContain('grep -qxF "$coolify_test_public_key"')
|
|
->and($template)->toContain('install -d -m 700 /root/.ssh')
|
|
->and($template)->toContain('/root/.ssh/authorized_keys')
|
|
->and($template)->toContain('target_home="$(getent passwd 501 | cut -d: -f6 || true)"')
|
|
->and($template)->toContain('owner="$(stat -c \'%u:%g\' "$target_home")"')
|
|
->and($template)->not->toContain('mode: user')
|
|
->and($template)->not->toContain('user="$(basename "$home")"');
|
|
});
|
|
|
|
it('hardcodes the naked Lima VM ssh port for bootstrap testing', function () {
|
|
$template = file_get_contents(base_path('.dev/lima/coolify-naked-test.yaml'));
|
|
|
|
expect($template)->toContain('ssh:')
|
|
->and($template)->toContain('localPort: 60003');
|
|
});
|
|
|
|
it('supports down cleanup as the preferred VM cleanup command', function () {
|
|
$script = file_get_contents(base_path('scripts/dev.sh'));
|
|
|
|
expect($script)->toContain('local cleanup=false')
|
|
->and($script)->toContain('--cleanup')
|
|
->and($script)->toContain('if [ "$cleanup" = "true" ]; then')
|
|
->and($script)->toContain('clean_vms')
|
|
->and($script)->toContain('down --cleanup')
|
|
->and($script)->toContain('clean-vms Delete the coold Lima VMs and all VM-local runtime state (alias for down --cleanup)');
|
|
});
|