From 8f639094195c3da09ee45101421419cc92238150 Mon Sep 17 00:00:00 2001
From: istmxrein <maximilian.reinheimer@stud.h-da.de>
Date: Tue, 2 May 2023 12:14:39 +0200
Subject: [PATCH] wip: test timeout for server creation

---
 cleanup.py | 20 +++++++++++++++++++-
 env.py     |  1 +
 prepare.py | 34 +++++++++++++++++++---------------
 3 files changed, 39 insertions(+), 16 deletions(-)

diff --git a/cleanup.py b/cleanup.py
index 84c2919..d3f3e9e 100644
--- a/cleanup.py
+++ b/cleanup.py
@@ -10,17 +10,35 @@ def main() -> None:
     print("Delete openstack instances", flush=True)
     try:
         conn = openstack.connect()
+
         for server in conn.compute.servers(name=env.VM_NAME):
+            volumes = server.list_volumes()
             for i in range(5):
                 conn.delete_server(server.id, delete_ips=True)
                 time.sleep(5)
                 state = conn.compute.find_server(server.id, ignore_missing=True)
                 if state is None:
-                    print(f'Delete server {server.id} successful')
+                    print(f'Delete server {server.id} successful', flush=True)
                     break
+            
+            for volume in volumes:
+                start_time = time.time()
+                while time.time() - start_time < 300:  # Keep trying for up to 5 minutes
+                    try:
+                        if conn.block_storage.find_volume(volume.id):
+                            conn.block_storage.delete_volume(volume.id)
+                        print(f"Successfully deleted volume with ID {volume.id}", flush=True)
+                        return
+                    except openstack.exceptions.SDKException as e:
+                        print(f"Error deleting volume with ID {volume.id}: {e}", flush=True)
+                        print("Retrying in 10 seconds...", flush=True)
+                        time.sleep(10)
+                print(f"Unable to delete volume with ID {volume.id} after 5 minutes", flush=True)
+
         if os.path.exists(env.PRIVATE_KEY_PATH):
             os.remove(env.PRIVATE_KEY_PATH)
         conn.delete_keypair(env.KEY_PAIR_NAME)
+  
         conn.close()
     except Exception as e:
         traceback.print_exc()
diff --git a/env.py b/env.py
index 926ac64..4c66039 100644
--- a/env.py
+++ b/env.py
@@ -14,3 +14,4 @@ FLOATING_IP_NETWORK = os.getenv("FLOATING_IP_NETWORK") or "public"
 SSH_IP_VERSION = os.getenv("SSH_IP_VERSION") or "4"
 BUILD_FAILURE_EXIT_CODE = os.getenv("BUILD_FAILURE_EXIT_CODE")
 SYSTEM_FAILURE_EXIT_CODE = os.getenv("SYSTEM_FAILURE_EXIT_CODE")
+SERVER_CREATION_TIMEOUT = os.getenv("SERVER_CREATION_TIMEOUT") or "180"
diff --git a/prepare.py b/prepare.py
index 94b8990..8b71340 100644
--- a/prepare.py
+++ b/prepare.py
@@ -23,21 +23,25 @@ def provision_server(
     image = conn.compute.find_image(env.BUILDER_IMAGE)
     flavor = conn.compute.find_flavor(env.FLAVOR)
     network = conn.network.find_network(env.NETWORK)
-    server = conn.create_server(
-        name=env.VM_NAME,
-        flavor=flavor.id,
-        image=image.id,
-        boot_from_volume=True,
-        terminate_volume=True,
-        wait=True,
-        timeout=300,
-        volume_size=env.VOLUME_SIZE,
-        key_name=env.KEY_PAIR_NAME,
-        security_groups=[group for group in env.SECURITY_GROUPS.split()],
-        network=network.id
-    )
+    try:
+        server = conn.create_server(
+            name=env.VM_NAME,
+            flavor=flavor.id,
+            image=image.id,
+            boot_from_volume=True,
+            terminate_volume=True,
+            volume_size=env.VOLUME_SIZE,
+            key_name=env.KEY_PAIR_NAME,
+            security_groups=[group for group in env.SECURITY_GROUPS.split()],
+            network=network.id
+        )
+    except openstack.exceptions.SDKException as e:
+        print(e, flush=True)
+    except Exception as e:
+        print(e, flush=True)
 
-    server = conn.wait_for_server(server, timeout=180)
+    print(f'Waiting for server to come up...')
+    server = conn.wait_for_server(server, timeout=int(env.SERVER_CREATION_TIMEOUT))
     
     return server
 
@@ -104,7 +108,6 @@ def generate_rsa_keypair():
     with open(env.PRIVATE_KEY_PATH, 'w') as content_file:
         content_file.write(pem.decode('utf-8'))
     public_key_str = public_key.decode('utf-8')
-    print(f'Public Key: {public_key_str}')
     return public_key_str
 
 
@@ -118,6 +121,7 @@ def main() -> None:
         conn = openstack.connect()
         print(f"Provisioning an instance {env.VM_NAME}", flush=True)
         public_key = generate_rsa_keypair()
+        print(f'Public Key: {public_key}', flush=True)
         server = provision_server(conn, public_key)
         ip = get_server_ip(conn, server)
         print(f"Instance {env.VM_NAME} is running on address {ip}", flush=True)
-- 
GitLab