From 1fe07cdf866961829aa9e15cbc92fab80c606768 Mon Sep 17 00:00:00 2001 From: Marc Olivier Bergeron Date: Mon, 4 May 2026 23:13:37 -0400 Subject: [PATCH 1/6] Starting to add vm-remote and vm-project --- ctf/deploy.py | 37 +++++++++++++++---- ctf/generate.py | 12 +++++- ctf/models.py | 2 + ctf/redeploy.py | 10 +++++ .../init/.deploy/common/variables.tf | 12 +++++- ctf/utils.py | 20 +++++++++- 6 files changed, 81 insertions(+), 12 deletions(-) diff --git a/ctf/deploy.py b/ctf/deploy.py index d709d06..631c11c 100644 --- a/ctf/deploy.py +++ b/ctf/deploy.py @@ -46,6 +46,14 @@ def deploy( remote: Annotated[ str, typer.Option("--remote", help="Incus remote to deploy to") ] = "local", + vm_remote: Annotated[ + str | None, + typer.Option("--vm-remote", help="Incus remote for VM to be deployed to"), + ] = None, + vm_project: Annotated[ + str | None, + typer.Option("--vm-project", help="Incus project for VM to be deployed to"), + ] = None, redeploy: Annotated[ bool, typer.Option("--redeploy", help="Do not use. Use `ctf redeploy` instead.") ] = False, @@ -64,7 +72,12 @@ def deploy( ENV["INCUS_REMOTE"] = remote # Run generate first. distinct_tracks = generate( - tracks=tracks, production=production, remote=remote, redeploy=redeploy + tracks=tracks, + production=production, + remote=remote, + vm_remote=vm_remote, + vm_project=vm_project, + redeploy=redeploy, ) # Check if Git LFS is installed on the system as it is required for deployment. @@ -87,7 +100,11 @@ def deploy( ) if regenerated_tracks := terraform_apply( - tracks=tracks, production=production, remote=remote + tracks=tracks, + production=production, + remote=remote, + vm_remote=vm_remote, + vm_project=vm_project, ): distinct_tracks = regenerated_tracks @@ -121,7 +138,11 @@ def deploy( add_tracks_to_terraform_modules({track}) if regenerated_tracks := terraform_apply( - tracks=tracks, production=production, remote=remote + tracks=tracks, + production=production, + remote=remote, + vm_remote=vm_remote, + vm_project=vm_project, ): distinct_tracks = regenerated_tracks @@ -292,6 +313,8 @@ def deploy( tracks=tracks, production=production, remote=remote, + vm_remote=vm_remote, + vm_project=vm_project, ) except subprocess.CalledProcessError: LOG.critical( @@ -334,12 +357,10 @@ def terraform_apply( tracks: list[str], production: bool, remote: str, + vm_remote: str | None = None, + vm_project: str | None = None, ) -> set[Track]: - args = [ - terraform_binary(), - "apply", - "-auto-approve", - ] + args = [terraform_binary(), "apply", "-auto-approve"] try: subprocess.run( diff --git a/ctf/generate.py b/ctf/generate.py index 50f29ff..662917a 100644 --- a/ctf/generate.py +++ b/ctf/generate.py @@ -44,6 +44,14 @@ def generate( remote: Annotated[ str, typer.Option("--remote", help="Incus remote to deploy to") ] = "local", + vm_remote: Annotated[ + str | None, + typer.Option("--vm-remote", help="Incus remote for VM to be deployed to"), + ] = None, + vm_project: Annotated[ + str | None, + typer.Option("--vm-project", help="Incus project for VM to be deployed to"), + ] = None, redeploy: Annotated[ bool, typer.Option("--redeploy", help="Do not use. Use `ctf redeploy` instead.") ] = False, @@ -66,7 +74,7 @@ def generate( tmp_tracks: set[Track] = set() for track in distinct_tracks: tmp_tracks.add( - Track( + track := Track( name=track.name, remote=remote, production=production, @@ -74,6 +82,8 @@ def generate( has_virtual_machine=track_has_virtual_machine(track), ) ) + track.vm_project = vm_project + track.vm_remote = vm_remote distinct_tracks = tmp_tracks add_tracks_to_terraform_modules( diff --git a/ctf/models.py b/ctf/models.py index ee63e04..7319e99 100644 --- a/ctf/models.py +++ b/ctf/models.py @@ -19,6 +19,8 @@ class Track(BaseModel): # Every object is unique on it's name name: IncusStr remote: str = "local" + vm_remote: str | None = None + vm_project: str | None = None production: bool = False require_build_container: bool = False has_virtual_machine: bool = False diff --git a/ctf/redeploy.py b/ctf/redeploy.py index 80cb58d..b41b998 100644 --- a/ctf/redeploy.py +++ b/ctf/redeploy.py @@ -28,6 +28,14 @@ def redeploy( remote: Annotated[ str, typer.Option("--remote", help="Incus remote to deploy to") ] = "local", + vm_remote: Annotated[ + str | None, + typer.Option("--vm-remote", help="Incus remote for VM to be deployed to"), + ] = None, + vm_project: Annotated[ + str | None, + typer.Option("--vm-project", help="Incus project for VM to be deployed to"), + ] = None, force: Annotated[ bool, typer.Option( @@ -49,6 +57,8 @@ def redeploy( tracks=tracks, production=production, remote=remote, + vm_remote=vm_remote, + vm_project=vm_project, redeploy=True, force=force, skip_build=skip_build, diff --git a/ctf/templates/init/.deploy/common/variables.tf b/ctf/templates/init/.deploy/common/variables.tf index f9041fe..0a7a99d 100644 --- a/ctf/templates/init/.deploy/common/variables.tf +++ b/ctf/templates/init/.deploy/common/variables.tf @@ -1,5 +1,15 @@ variable "incus_remote" { - default = "local" + default = var.incus_remote + type = string +} + +variable "incus_vm_remote" { + default = null + type = string +} + +variable "incus_vm_project" { + default = null type = string } diff --git a/ctf/utils.py b/ctf/utils.py index 1130a57..9ffa53a 100644 --- a/ctf/utils.py +++ b/ctf/utils.py @@ -138,6 +138,8 @@ def add_tracks_to_terraform_modules(tracks: set[Track]): already_deployed = {{ 'true' if track.already_deployed else 'false' }} {% if track.production %}deploy = "production"{% endif %} {% if track.remote %}incus_remote = "{{ track.remote }}"{% endif %} + {% if track.vm_remote %}incus_vm_remote = "{{ track.vm_remote }}"{% endif %} + {% if track.vm_project %}incus_vm_project = "{{ track.vm_project }}"{% endif %} {% for ov in output_variables %} {{ ov }} = module.common.{{ ov }} {% endfor %} @@ -154,7 +156,12 @@ def add_tracks_to_terraform_modules(tracks: set[Track]): ) -def create_terraform_modules_file(remote: str, production: bool = False): +def create_terraform_modules_file( + remote: str, + vm_remote: str | None = None, + vm_project: str | None = None, + production: bool = False, +): with open( file=os.path.join(find_ctf_root_directory(), ".deploy", "modules.tf"), mode="w+" ) as fd: @@ -165,12 +172,21 @@ def create_terraform_modules_file(remote: str, production: bool = False): source = "./common" {% if production %}deploy = "production"{% endif %} {% if remote %}incus_remote = "{{ remote }}"{% endif %} + {% if vm_remote %}incus_vm_remote = "{{ vm_remote }}"{% endif %} + {% if vm_project %}incus_vm_project = "{{ track.vm_project }}"{% endif %} } """ ) ) - fd.write(template.render(production=production, remote=remote)) + fd.write( + template.render( + production=production, + remote=remote, + vm_remote=vm_remote, + vm_project=vm_project, + ) + ) def get_common_modules_output_variables() -> set[str]: From 4334ccc9b8b11d3949e7ec27e27e15e8219357f0 Mon Sep 17 00:00:00 2001 From: Marc Olivier Bergeron Date: Tue, 5 May 2026 10:54:16 -0400 Subject: [PATCH 2/6] Removed vm_remote and vm_project from useless places. Also make all tracks having the variables. --- ctf/deploy.py | 22 +++------------------- ctf/generate.py | 4 ++-- 2 files changed, 5 insertions(+), 21 deletions(-) diff --git a/ctf/deploy.py b/ctf/deploy.py index 631c11c..ec0d2d3 100644 --- a/ctf/deploy.py +++ b/ctf/deploy.py @@ -100,11 +100,7 @@ def deploy( ) if regenerated_tracks := terraform_apply( - tracks=tracks, - production=production, - remote=remote, - vm_remote=vm_remote, - vm_project=vm_project, + tracks=tracks, production=production, remote=remote ): distinct_tracks = regenerated_tracks @@ -138,11 +134,7 @@ def deploy( add_tracks_to_terraform_modules({track}) if regenerated_tracks := terraform_apply( - tracks=tracks, - production=production, - remote=remote, - vm_remote=vm_remote, - vm_project=vm_project, + tracks=tracks, production=production, remote=remote ): distinct_tracks = regenerated_tracks @@ -309,13 +301,7 @@ def deploy( if distinct_tracks: LOG.info(msg="Applying post-deploy Terraform resources...") try: - terraform_apply( - tracks=tracks, - production=production, - remote=remote, - vm_remote=vm_remote, - vm_project=vm_project, - ) + terraform_apply(tracks=tracks, production=production, remote=remote) except subprocess.CalledProcessError: LOG.critical( "Could not apply post-deploy Terraform resources. Fix the Terraform configuration and rerun `ctf deploy`." @@ -357,8 +343,6 @@ def terraform_apply( tracks: list[str], production: bool, remote: str, - vm_remote: str | None = None, - vm_project: str | None = None, ) -> set[Track]: args = [terraform_binary(), "apply", "-auto-approve"] diff --git a/ctf/generate.py b/ctf/generate.py index 662917a..9cd1005 100644 --- a/ctf/generate.py +++ b/ctf/generate.py @@ -80,10 +80,10 @@ def generate( production=production, require_build_container=does_track_require_build_container(track), has_virtual_machine=track_has_virtual_machine(track), + vm_project=vm_project, + vm_remote=vm_remote, ) ) - track.vm_project = vm_project - track.vm_remote = vm_remote distinct_tracks = tmp_tracks add_tracks_to_terraform_modules( From a6e36802f3a3d31d48c55e99f28e734a06978e3e Mon Sep 17 00:00:00 2001 From: Marc Olivier Bergeron Date: Tue, 5 May 2026 19:10:01 -0400 Subject: [PATCH 3/6] Update variables.tf --- ctf/templates/init/.deploy/common/variables.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctf/templates/init/.deploy/common/variables.tf b/ctf/templates/init/.deploy/common/variables.tf index 0a7a99d..8623707 100644 --- a/ctf/templates/init/.deploy/common/variables.tf +++ b/ctf/templates/init/.deploy/common/variables.tf @@ -1,5 +1,5 @@ variable "incus_remote" { - default = var.incus_remote + default = "local" type = string } From ece6e24380e58ae534ec7db48a4911efd00e59c7 Mon Sep 17 00:00:00 2001 From: Marc Olivier Bergeron Date: Tue, 5 May 2026 19:13:23 -0400 Subject: [PATCH 4/6] Update deploy.py --- ctf/deploy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctf/deploy.py b/ctf/deploy.py index 955d760..960fa18 100644 --- a/ctf/deploy.py +++ b/ctf/deploy.py @@ -81,11 +81,11 @@ def deploy( # Run generate first. distinct_tracks = generate( tracks=tracks, + exclude_tracks=exclude_tracks, production=production, remote=remote, vm_remote=vm_remote, vm_project=vm_project, - exclude_tracks=exclude_tracks, redeploy=redeploy, ) From 3ef04141ac0b74cb37ee6d005880e39c14fd1f41 Mon Sep 17 00:00:00 2001 From: Marc Olivier Bergeron Date: Tue, 5 May 2026 19:14:11 -0400 Subject: [PATCH 5/6] Update generate.py --- ctf/generate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctf/generate.py b/ctf/generate.py index 3da5833..fb87680 100644 --- a/ctf/generate.py +++ b/ctf/generate.py @@ -83,7 +83,7 @@ def generate( tmp_tracks: set[Track] = set() for track in distinct_tracks: tmp_tracks.add( - track := Track( + Track( name=track.name, remote=remote, production=production, From 14904c5137901195be74ff8ec92db1ca7da34a2b Mon Sep 17 00:00:00 2001 From: Marc Olivier Bergeron Date: Tue, 5 May 2026 19:18:14 -0400 Subject: [PATCH 6/6] Update pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index f3cb4c3..2a06fdc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,7 +20,7 @@ dependencies = [ "typer==0.24.1", "pydantic", ] -version = "4.5.2" +version = "4.6.0" classifiers = [ "Programming Language :: Python :: 3", "Operating System :: OS Independent",