#!/usr/bin/env python2 from __future__ import print_function from libs.environment import * from libs.glance import * from libs.keystone import * import argparse import glob import os import subprocess import sys import yaml def read_manifests(env): manifests = {} manifests_glob = "%s/*.yaml" % env.extra_envs["manifests_path"] for manifest_file in glob.glob(manifests_glob): with open(manifest_file, "r") as myfile: manifest = yaml.load(myfile.read()) if manifest["image_name"] in manifests: raise Exception("Duplicate image name in manifests: %s" % manifest["image_name"]) manifests[manifest["image_name"]] = manifest return manifests def check_image_tag_current(glance, manifest): image = glance.find("%s.%s.unvetted" % (manifest["image_name"], manifest["image_type"])) return image and str(manifest["tag"]) in image.tags def create_image(env, manifest): cmd = "disk-image-create %s -t %s -o /tmp/%s.%s 2>&1" % (manifest["elements"], manifest["image_type"], manifest["image_name"], manifest["image_type"]) environ = manifest["extra_envs"] if "extra_envs" in manifest else {} environ["ELEMENTS_PATH"] = env.extra_envs["elements_path"] p = subprocess.Popen([cmd], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=environ) out, err = p.communicate() if p.returncode != 0: raise Exception("Error running diskimage-builder:\n%s\n%s" % (out, err)) def main(args): env = Environment(args.os_auth_url, args.os_project_name, args.os_region_name, args.os_username, args.os_password, args.os_project_domain_name, args.os_user_domain_name, args.os_identity_api_version, args.os_image_api_version, {"elements_path": args.elements_path, "manifests_path": args.manifests_path}) manifests = read_manifests(env) keystone = Keystone(env) glance = Glance(keystone, endpoint_type="publicURL") for image_name, manifest in manifests.items(): if not check_image_tag_current(glance, manifest): create_image(env, manifest) glance.upload("%s.%s.unvetted" % (manifest["image_name"], manifest["image_type"]), manifest["image_type"], "/tmp/%s.%s" % (manifest["image_name"], manifest["image_type"]), "private", manifest["tag"]) if __name__ == "__main__": parser = argparse.ArgumentParser(description="Image Foundry CI Process") parser.add_argument("--os-auth-url", required=False, default=os.environ.get("OS_AUTH_URL", None), help="OpenStack openrc environment variable: OS_AUTH_URL") parser.add_argument("--os-project-name", required=False, default=os.environ.get("OS_PROJECT_NAME", None), help="OpenStack openrc environment variable: OS_PROJECT_NAME") parser.add_argument("--os-region-name", required=False, default=os.environ.get("OS_REGION_NAME", None), help="OpenStack openrc environment variable: OS_REGION_NAME") parser.add_argument("--os-username", required=False, default=os.environ.get("OS_USERNAME", None), help="OpenStack openrc environment variable: OS_USERNAME") parser.add_argument("--os-password", required=False, default=os.environ.get("OS_PASSWORD", None), help="OpenStack openrc environment variable: OS_PASSWORD") parser.add_argument("--os-project-domain-name", required=False, default=os.environ.get("OS_PROJECT_DOMAIN_NAME", None), help="OpenStack openrc environment variable: OS_PROJECT_DOMAIN_NAME") parser.add_argument("--os-user-domain-name", required=False, default=os.environ.get("OS_USER_DOMAIN_NAME", None), help="OpenStack openrc environment variable: OS_USER_DOMAIN_NAME") parser.add_argument("--os-identity-api-version", required=False, default=os.environ.get("OS_IDENTITY_API_VERSION", None), help="OpenStack openrc environment variable: OS_IDENTITY_API_VERSION") parser.add_argument("--os-image-api-version", required=False, default=os.environ.get("OS_IMAGE_API_VERSION", None), help="OpenStack openrc environment variable: OS_IMAGE_API_VERSION") parser.add_argument("--elements-path", required=False, default=os.environ.get("ELEMENTS_PATH", None), help="diskimage-builder environment variable: ELEMENTS_PATH") parser.add_argument("--manifests-path", required=False, default=os.environ.get("MANIFESTS_PATH", None), help="image-foundry environment variable: MANIFESTS_PATH") args = parser.parse_args() main(args) sys.exit(0)