← Back to team overview

canonical-ubuntu-qa team mailing list archive

[Merge] ~andersson123/autopkgtest-cloud:proposed-package-images into autopkgtest-cloud:master

 

Tim Andersson has proposed merging ~andersson123/autopkgtest-cloud:proposed-package-images into autopkgtest-cloud:master.

Requested reviews:
  Canonical's Ubuntu QA (canonical-ubuntu-qa)

For more details, see:
https://code.launchpad.net/~andersson123/autopkgtest-cloud/+git/autopkgtest-cloud/+merge/465334
-- 
Your team Canonical's Ubuntu QA is requested to review the proposed merge of ~andersson123/autopkgtest-cloud:proposed-package-images into autopkgtest-cloud:master.
diff --git a/charms/focal/autopkgtest-cloud-worker/autopkgtest-cloud/tools/create-nova-image-with-proposed-package b/charms/focal/autopkgtest-cloud-worker/autopkgtest-cloud/tools/create-nova-image-with-proposed-package
index e48f3f4..1ac3554 100755
--- a/charms/focal/autopkgtest-cloud-worker/autopkgtest-cloud/tools/create-nova-image-with-proposed-package
+++ b/charms/focal/autopkgtest-cloud-worker/autopkgtest-cloud/tools/create-nova-image-with-proposed-package
@@ -27,18 +27,29 @@ from glanceclient.common import utils
 
 def get_glance():
     """Return glance client object"""
-
     loader = keystoneauth1.loading.get_plugin_loader("password")
-    auth = loader.load_from_options(
-        auth_url=os.environ["OS_AUTH_URL"],
-        username=os.environ["OS_USERNAME"],
-        password=os.environ["OS_PASSWORD"],
-        tenant_name=os.environ["OS_TENANT_NAME"],
-    )
+    if os.environ.get("OS_IDENTITY_API_VERSION") == "3":
+        auth = loader.load_from_options(
+            auth_url=os.environ["OS_AUTH_URL"],
+            username=os.environ["OS_USERNAME"],
+            password=os.environ["OS_PASSWORD"],
+            tenant_name=os.environ["OS_TENANT_NAME"],
+            project_name=os.environ["OS_PROJECT_NAME"],
+            user_domain_name=os.environ["OS_USER_DOMAIN_NAME"],
+            project_domain_name=os.environ["OS_PROJECT_DOMAIN_NAME"],
+        )
+    else:
+        auth = loader.load_from_options(
+            auth_url=os.environ["OS_AUTH_URL"],
+            username=os.environ["OS_USERNAME"],
+            password=os.environ["OS_PASSWORD"],
+            tenant_name=os.environ["OS_TENANT_NAME"],
+        )
     session = keystoneauth1.session.Session(auth=auth)
-    return glanceclient.Client(
-        "2", session=session, region_name=os.environ["NOVA_REGION"]
+    os_region = os.environ.get(
+        "NOVA_REGION", os.environ.get("OS_REGION_NAME", "")
     )
+    return glanceclient.Client("2", session=session, region_name=os_region)
 
 
 def find_latest_image(img_re):
@@ -55,7 +66,7 @@ def find_latest_image(img_re):
     return latest
 
 
-def setup_image(image_path, source):
+def setup_image(image_path, source, release):
     # get a chroot shell into the image
     img_shell = subprocess.Popen(
         [
@@ -67,7 +78,7 @@ def setup_image(image_path, source):
             image_path,
             "chroot",
             "_MOUNTPOINT_",
-            "/bin/sh",
+            "/bin/bash",
         ],
         stdin=subprocess.PIPE,
     )
@@ -76,30 +87,37 @@ def setup_image(image_path, source):
     # pylint: disable=line-too-long
     img_shell.stdin.write(
         (
-            """
+            f"""
 set -e
 echo '* Creating policy-rc.d'
 printf '#!/bin/sh\\nexit 101\\n' > /usr/sbin/policy-rc.d
 chmod 755 /usr/sbin/policy-rc.d
 echo '* Generating apt sources for -proposed:'
-sed -rn 's/^(deb|deb-src) +(\[.*\] *)?([^ ]*(ubuntu.com|debian.org|ftpmaster)[^ ]*) +([^ -]+) +(.*)$/\\1 \\2\\3 \\5-proposed \\6/p' /etc/apt/sources.list `ls /etc/apt/sources.list.d/*.list 2>/dev/null|| true` > /etc/apt/sources.list.d/proposed.list
+
+touch /etc/apt/sources.list.d/proposed.list
+echo "deb     http://ftpmaster.internal/ubuntu/ {release}-proposed main restricted universe multiverse" > /etc/apt/sources.list.d/proposed.list
+echo "deb-src http://ftpmaster.internal/ubuntu/ {release}-proposed main restricted universe multiverse" >> /etc/apt/sources.list.d/proposed.list
+
 cat /etc/apt/sources.list.d/proposed.list
 
 echo '* apt-get update'
-apt-get update
+apt -o "Dir::Etc::sourcelist=/etc/apt/sources.list.d/proposed.list" update
 
-echo '* Determining which binaries of source %(src)s are installed and have a new version...'
-SRCS=$(python3 -c 'import sys, apt; src=sys.argv[1]; [print(pkg.name) for pkg in apt.Cache() if pkg.installed and pkg.candidate.source_name == src and pkg.candidate.version > pkg.installed.version]' %(src)s)
-echo "$SRCS"
+#echo '* Determining which binaries of source {source} are installed and have a new version...'
+#SRCS=$(python3 -c 'import sys, apt; src=sys.argv[1]; [print(pkg.name) for pkg in apt.Cache() if pkg.installed and pkg.candidate.source_name == src and pkg.candidate.version > pkg.installed.version]' %(src)s)
+#echo "$SRCS"
 
 echo '* Install the above packages'
-DEBIAN_FRONTEND=noninteractive apt-get install -y $SRCS
+DEBIAN_FRONTEND=noninteractive apt-get install -y {source}
 
-echo '* Cleaning up'
+echo '*Cleaning up apt'
+rm /etc/apt/sources.list.d/proposed.list
+apt update
 apt-get clean
+
+echo '* Cleaning up'
 rm -f /etc/machine-id /usr/sbin/policy-rc.d
    """
-            % {"src": source}
         ).encode()
     )
 
@@ -111,14 +129,16 @@ rm -f /etc/machine-id /usr/sbin/policy-rc.d
 # main
 #
 
-if len(sys.argv) != 3:
+if len(sys.argv) != 4:
     sys.stderr.write(
-        "Usage: %s <image RE> <proposed source package name>\n" % sys.argv[0]
+        "Usage: %s <image RE> <proposed source package name> <release-codename>\n"
+        % sys.argv[0]
     )
     sys.exit(1)
 
 image_re = re.compile(sys.argv[1])
 source = sys.argv[2]
+release = sys.argv[3]
 glance = get_glance()
 latest = find_latest_image(image_re)
 
@@ -129,8 +149,9 @@ workdir = tempfile.TemporaryDirectory(
 img = os.path.join(workdir.name, "image")
 utils.save_image(glance.images.data(latest.id), img)
 
-setup_image(img, source)
-
+print("* Image %s has been downloaded - now setting up")
+setup_image(img, source, release)
+print("* Image has been set up! Creating image via glance API")
 newimg_name = "proposed-%s/%s" % (source, os.path.basename(latest.name))
 newimg = glance.images.create(
     name=newimg_name,
@@ -140,3 +161,4 @@ newimg = glance.images.create(
 print("* Uploading new image %s (UUID: %s)..." % (newimg.name, newimg.id))
 with open(img, "rb") as f:
     glance.images.upload(newimg.id, f)
+print("* Image uploaded! All done.")
diff --git a/charms/focal/autopkgtest-cloud-worker/layer.yaml b/charms/focal/autopkgtest-cloud-worker/layer.yaml
index 70be935..a150607 100644
--- a/charms/focal/autopkgtest-cloud-worker/layer.yaml
+++ b/charms/focal/autopkgtest-cloud-worker/layer.yaml
@@ -30,4 +30,6 @@ options:
       - python3-swiftclient
       - ssmtp
       - vim
+      - qemu-user-static
+      - binfmt-support
     include_system_packages: true

Follow ups