From f18b747865b073211389ebe652d5f3098f729649 Mon Sep 17 00:00:00 2001
From: Fulvio Galeazzi <fulvio.galeazzi@garr.it>
Date: Fri, 14 Sep 2018 15:57:27 +0000
Subject: [PATCH] 2018-09-14:  FG;  1) handle image parameters like
 min_size,min_ram 2) handle tags within extraargs 3) do not remove old image,
 rather rename - set private - update description.

---
 config.yml       | 35 +++++++++++++++++++++--------------
 update-images.py | 34 ++++++++++++++++++++++++++--------
 2 files changed, 47 insertions(+), 22 deletions(-)

diff --git a/config.yml b/config.yml
index b401e83..ba58ef2 100644
--- a/config.yml
+++ b/config.yml
@@ -3,6 +3,9 @@ images:
     name: Debian 8 - GARR
     url: https://cdimage.debian.org/cdimage/openstack/current-8/debian-8-openstack-amd64.qcow2
     disk_format: qcow2
+    extraargs:
+    - "min_disk=5"
+    - "min_ram=1024"
     tags:
     - "os_distro=debian"
     - "os_type=linux"
@@ -10,12 +13,13 @@ images:
     - "architecture=amd64"
     - "os_require_quiesce=yes"
     - "hw_qemu_guest_agent=yes"
-    - "hw_scsi_model=virtio-scsi"
-    - "hw_disk_bus=scsi"
   debian9:
     name: Debian 9 - GARR
     url: https://cdimage.debian.org/cdimage/openstack/current-9/debian-9-openstack-amd64.qcow2
     disk_format: qcow2
+    extraargs:
+    - "min_disk=5"
+    - "min_ram=1024"
     tags:
     - "os_distro=debian"
     - "os_type=linux"
@@ -23,13 +27,14 @@ images:
     - "architecture=amd64"
     - "os_require_quiesce=yes"
     - "hw_qemu_guest_agent=yes"
-    - "hw_scsi_model=virtio-scsi"
-    - "hw_disk_bus=scsi"
     - "hw_vif_multiqueue_enabled=true"
   fedora28q:
     name: Fedora 28 - GARR
     url: https://download.fedoraproject.org/pub/fedora/linux/releases/28/Cloud/x86_64/images/Fedora-Cloud-Base-28-1.1.x86_64.qcow2
     disk_format: qcow2
+    extraargs:
+    - "min_disk=5"
+    - "min_ram=1024"
     tags:
     - "os_distro=fedora"
     - "os_type=linux"
@@ -37,13 +42,14 @@ images:
     - "architecture=x86_64"
     - "os_require_quiesce=yes"
     - "hw_qemu_guest_agent=yes"
-    - "hw_scsi_model=virtio-scsi"
-    - "hw_disk_bus=scsi"
     - "hw_vif_multiqueue_enabled=true"
   centos7:
     name: CentOS 7 - GARR
     url: http://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2
     disk_format: qcow2
+    extraargs:
+    - "min_disk=5"
+    - "min_ram=1024"
     tags:
     - "os_distro=centos"
     - "os_type=linux"
@@ -51,13 +57,14 @@ images:
     - "architecture=x86_64"
     - "os_require_quiesce=yes"
     - "hw_qemu_guest_agent=yes"
-    - "hw_scsi_model=virtio-scsi"
-    - "hw_disk_bus=scsi"
     - "hw_vif_multiqueue_enabled=true"
   centos6:
     name: CentOS 6 - GARR
     url: http://cloud.centos.org/centos/6/images/CentOS-6-x86_64-GenericCloud.qcow2
     disk_format: qcow2
+    extraargs:
+    - "min_disk=5"
+    - "min_ram=1024"
     tags:
     - "os_distro=centos"
     - "os_type=linux"
@@ -65,12 +72,13 @@ images:
     - "architecture=x86_64"
     - "os_require_quiesce=yes"
     - "hw_qemu_guest_agent=yes"
-    - "hw_scsi_model=virtio-scsi"
-    - "hw_disk_bus=scsi"
   ubuntu-14.04:
     name: Ubuntu 14.04 - GARR
     url: https://cloud-images.ubuntu.com/releases/14.04/release/ubuntu-14.04-server-cloudimg-amd64-disk1.img
     disk_format: qcow2
+    extraargs:
+    - "min_disk=5"
+    - "min_ram=1024"
     tags:
     - "os_distro=ubuntu"
     - "os_type=linux"
@@ -78,12 +86,13 @@ images:
     - "architecture=amd64"
     - "os_require_quiesce=yes"
     - "hw_qemu_guest_agent=yes"
-    - "hw_scsi_model=virtio-scsi"
-    - "hw_disk_bus=scsi"
   ubuntu-16.04:
     name: Ubuntu 16.04 - GARR
     url: https://cloud-images.ubuntu.com/releases/16.04/release/ubuntu-16.04-server-cloudimg-amd64-disk1.img
     disk_format: qcow2
+    extraargs:
+    - "min_disk=5"
+    - "min_ram=1024"
     tags:
     - "os_distro=ubuntu"
     - "os_type=linux"
@@ -91,6 +100,4 @@ images:
     - "architecture=amd64"
     - "os_require_quiesce=yes"
     - "hw_qemu_guest_agent=yes"
-    - "hw_scsi_model=virtio-scsi"
-    - "hw_disk_bus=scsi"
     - "hw_vif_multiqueue_enabled=true"
diff --git a/update-images.py b/update-images.py
index c756cc7..b0ad961 100755
--- a/update-images.py
+++ b/update-images.py
@@ -7,6 +7,8 @@ import time
 import os
 from pprint import pprint
 import shade
+import subprocess
+
 from tqdm import tqdm
 
 requests_session = requests.Session()
@@ -44,13 +46,14 @@ for image_key in sorted(config['images'].keys()):
     request_response.raise_for_status()
 
     http_last_modified = request_response.headers['Last-Modified']
-
     last_modified_time  = datetime.datetime.strptime(http_last_modified, '%a, %d %b %Y %H:%M:%S GMT')
-
     image_name = config['images'][image_key]['name']
 
     image = openstack_cloud_connection.get_image(name_or_id=image_name)
     download = False
+    dateNow = datetime.datetime.now()
+    dateNowStr = dateNow.strftime("%Y/%m/%d")
+    descNewImg = "%s: downloaded from %s" % (dateNowStr, url)
     if image == None:
         download = True
     else:
@@ -69,7 +72,15 @@ for image_key in sorted(config['images'].keys()):
                 download = True
 
         if download:
-            openstack_cloud_connection.delete_image(name_or_id=image_name, wait=True)
+            # Add to description field
+            descOldImg = "%s: superceded by new image" % (dateNowStr)
+            if 'properties' in image and 'description' in image['properties']:
+                descCur = image['properties']['description']
+                descOldImg = "%s \n %s" % (descOldImg, descCur)
+            # Rename image, update description, set image as private
+            image_name_old = "%s %s" % (image_name, dateNowStr)
+            print ("Rename old image, set private, update description: \n \t openstack image set --private --property description=\"{}\" --name \"{}\" {}".format(descOldImg[:30], image_name_old, image['id']))
+            subprocess.call("openstack image set --private --property description=\"{}\" --name \"{}\" {}".format(descOldImg, image_name_old, image['id']), shell=True)
 
     if download:
         download_image_file = download_dir
@@ -93,13 +104,20 @@ for image_key in sorted(config['images'].keys()):
         tagDict["last_modified"] = str(last_modified_time)
         if config['images'][image_key]['tags']:
             tagDict = dict(tag_desc.split('=',1) for tag_desc in sorted(config['images'][image_key]['tags']))
-        print("Tag dictionary: {}".format(tagDict))
+
+        argsDict = {}
+        if config['images'][image_key]['extraargs']:
+            argsDict = dict(args_desc.split('=',1) for args_desc in sorted(config['images'][image_key]['extraargs']))
+        if config['images'][image_key]['tags']:
+            argsDict.update({'meta':tagDict})
+        print("Args dictionary: {}".format(argsDict))
 
         time0 = int(time.time())
         openstack_cloud_connection.create_image(image_name,
-            filename=download_image_file,
-            disk_format=config['images'][image_key]['disk_format'],
-            meta=tagDict,
-            wait=True,is_public=True)
+                                                filename=download_image_file,
+                                                disk_format=config['images'][image_key]['disk_format'],
+                                                description=descNewImg,
+                                                **argsDict,
+                                                wait=True,is_public=True)
         time1 = int(time.time())
         print("Uploaded to Glance in {} seconds".format(time1-time0))
-- 
GitLab