Add per-node random regions and AWS parallel provisioning to WEBRUNNER
Each node chunk now carries its own region field, assigned round-robin across the full provider region list unless the user pinned a specific region. AWS uses the same async/poll:0 pattern as Linode but with a serial per-unique-region setup phase (key import + SG) before firing all creates in parallel. Teardown uses hostvars ec2_region per node so multi-region AWS teardowns hit the right endpoint. Infisical replaces interactive credential prompts for both providers. Linode vars.yaml instance type corrected to g6-nanode-1.
This commit is contained in:
+27
-39
@@ -4,7 +4,6 @@ Linode provider utilities for C2ingRed deployment system
|
||||
"""
|
||||
|
||||
import os
|
||||
import random
|
||||
import logging
|
||||
import subprocess
|
||||
from .common import COLORS, load_vars_file
|
||||
@@ -13,7 +12,6 @@ def get_linode_credentials(provider_vars=None):
|
||||
"""Get Linode API token — Infisical first, vars.yaml fallback, then prompt."""
|
||||
default_token = ''
|
||||
|
||||
# Try Infisical first
|
||||
try:
|
||||
default_token = subprocess.check_output(
|
||||
[os.path.expanduser('~/.local/bin/creds'), 'get', 'LINODE_TOKEN', 'homelab'],
|
||||
@@ -22,7 +20,6 @@ def get_linode_credentials(provider_vars=None):
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Fall back to vars.yaml
|
||||
if not default_token:
|
||||
if not provider_vars:
|
||||
provider_vars = load_vars_file('linode')
|
||||
@@ -37,56 +34,47 @@ def get_linode_credentials(provider_vars=None):
|
||||
|
||||
return {'linode_token': token}
|
||||
|
||||
def select_linode_region(provider_vars=None, component=None):
|
||||
"""Let the user select a Linode region"""
|
||||
def select_linode_regions(provider_vars=None) -> list[str]:
|
||||
"""Return region list — single entry if user specified one, all regions if blank (random per-node)."""
|
||||
if not provider_vars:
|
||||
provider_vars = load_vars_file('linode')
|
||||
|
||||
regions = provider_vars.get('region_choices', [])
|
||||
component_str = f" for {component}" if component else ""
|
||||
|
||||
if not regions:
|
||||
print(f"{COLORS['YELLOW']}No regions found for Linode, using us-east{COLORS['RESET']}")
|
||||
return "us-east"
|
||||
|
||||
print(f"\nAvailable Linode regions{component_str}:")
|
||||
|
||||
regions = provider_vars.get('region_choices', ['us-east'])
|
||||
|
||||
print(f"\nAvailable Linode regions:")
|
||||
for i, region in enumerate(regions, 1):
|
||||
print(f" {i}. {region}")
|
||||
|
||||
region_input = input(f"\nSelect region{component_str} (number or leave blank for random): ")
|
||||
|
||||
print(f" {i:2}. {region}")
|
||||
|
||||
region_input = input("\nSelect region (number or leave blank for random per-node): ").strip()
|
||||
|
||||
if not region_input:
|
||||
# Use random from reliable regions only (first 8 are most reliable)
|
||||
reliable_regions = regions[:8] if len(regions) >= 8 else regions
|
||||
return random.choice(reliable_regions)
|
||||
|
||||
return regions
|
||||
|
||||
try:
|
||||
region_choice = int(region_input)
|
||||
if 1 <= region_choice <= len(regions):
|
||||
return regions[region_choice - 1]
|
||||
else:
|
||||
print(f"{COLORS['RED']}Invalid choice, using random region{COLORS['RESET']}")
|
||||
return random.choice(regions)
|
||||
idx = int(region_input)
|
||||
if 1 <= idx <= len(regions):
|
||||
return [regions[idx - 1]]
|
||||
except ValueError:
|
||||
print(f"{COLORS['RED']}Invalid input, using random region{COLORS['RESET']}")
|
||||
return random.choice(regions)
|
||||
pass
|
||||
|
||||
print(f"{COLORS['RED']}Invalid input, using random per-node regions{COLORS['RESET']}")
|
||||
return regions
|
||||
|
||||
def gather_linode_config():
|
||||
"""Gather all Linode-specific configuration"""
|
||||
provider_vars = load_vars_file('linode')
|
||||
config = {}
|
||||
|
||||
# Get credentials
|
||||
|
||||
linode_creds = get_linode_credentials(provider_vars)
|
||||
if not linode_creds:
|
||||
return None
|
||||
config.update(linode_creds)
|
||||
|
||||
# Get region
|
||||
config['linode_region'] = select_linode_region(provider_vars)
|
||||
|
||||
# Additional Linode-specific settings
|
||||
|
||||
linode_regions = select_linode_regions(provider_vars)
|
||||
config['linode_regions'] = linode_regions
|
||||
config['linode_region'] = linode_regions[0]
|
||||
|
||||
config['linode_instance_type'] = provider_vars.get('linode_instance_type', 'g6-nanode-1')
|
||||
config['linode_image'] = provider_vars.get('linode_image', 'linode/kali')
|
||||
|
||||
config['linode_image'] = provider_vars.get('linode_image', 'linode/debian12')
|
||||
|
||||
return config
|
||||
|
||||
Reference in New Issue
Block a user