diff --git a/terraform/main.tf b/terraform/main.tf index d8f3cdd..4ba6ccb 100644 --- a/terraform/main.tf +++ b/terraform/main.tf @@ -31,7 +31,7 @@ resource "null_resource" "stage_talos_image" { provisioner "local-exec" { interpreter = ["python", "-c"] - command = "import subprocess; subprocess.run(['python', r'${path.module}/scripts/stage_talos_image.py', '--api-url', '${var.proxmox_api_url}', '--api-token', '${var.proxmox_api_token}', '--node', '${self.triggers.proxmox_node}', '--storage', '${var.talos_image_storage}', '--image-url', '${local.talos_iso_download_url}', '--filename', '${self.triggers.filename}'], check=True)" + command = "import subprocess; subprocess.run(['python', r'${path.module}/scripts/stage_talos_image.py', '--api-url', '${var.proxmox_api_url}', '--api-token', '${var.proxmox_api_token}', '--node', '${self.triggers.proxmox_node}', '--storage', '${var.talos_image_storage}', '--image-url', '${local.talos_iso_download_url}', '--filename', '${self.triggers.filename}', '--force'], check=True)" } } diff --git a/terraform/scripts/stage_talos_image.py b/terraform/scripts/stage_talos_image.py index 92b9a6a..7899803 100644 --- a/terraform/scripts/stage_talos_image.py +++ b/terraform/scripts/stage_talos_image.py @@ -21,13 +21,18 @@ def api_request(base_url, token, method, path, data=None): return json.loads(response.read().decode()) -def ensure_image(base_url, token, node, storage, image_url, filename): +def ensure_image(base_url, token, node, storage, image_url, filename, force=False): content_path = f"/api2/json/nodes/{node}/storage/{storage}/content" response = api_request(base_url, token, "GET", content_path) for item in response.get("data", []): if item.get("volid", "").endswith(filename): - return filename, False + if not force: + return filename, False + volume_path = urllib.parse.quote(f"iso/{filename}", safe="") + task = api_request(base_url, token, "DELETE", f"{content_path}/{volume_path}") + wait_for_task(base_url, token, node, task.get("data")) + break download_path = f"/api2/json/nodes/{node}/storage/{storage}/download-url" task = api_request(base_url, token, "POST", download_path, { @@ -82,10 +87,11 @@ def main(): parser.add_argument("--storage", required=True) parser.add_argument("--image-url", required=True) parser.add_argument("--filename", required=True) + parser.add_argument("--force", action="store_true") args = parser.parse_args() try: - filename, downloaded = ensure_image(args.api_url, args.api_token, args.node, args.storage, args.image_url, args.filename) + filename, downloaded = ensure_image(args.api_url, args.api_token, args.node, args.storage, args.image_url, args.filename, args.force) except urllib.error.HTTPError as exc: sys.stderr.write(exc.read().decode()) raise