#!/usr/bin/env python2 from __future__ import print_function from libs.environment import * from libs.glance import * from libs.keystone import * from libs.service_status_client 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_exists_up2date(glance, manifest): image = glance.find("%s.%s" % (manifest["image_name"], manifest["image_type"])) return image and str(manifest["tag"]) in image.tags def main(args): env_src = 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, { "manifests_path": args.glance_gateway_manifests_path, "service_status_host": args.service_status_host, "openbook_host": args.openbook_host, "openbook_port": args.openbook_port, "openbook_user": args.openbook_user, "openbook_pass": args.openbook_pass }) manifests = read_manifests(env_src) keystone_src = Keystone(env_src) glance_src = Glance(keystone_src, endpoint_type="publicURL") for image_name, manifest in manifests.items(): if manifest["vetted"]: # download private image to /tmp glance_src.download("%s.%s.unvetted" % (manifest["image_name"], manifest["image_type"]), "/tmp/%s.%s" % (manifest["image_name"], manifest["image_type"])) service_status_client = ServiceStatusClient(host=env_src.extra_envs["service_status_host"]) regions = service_status_client.get_service_managers() if manifest["regions_to_exclude"] is None and manifest["regions_to_include"] is None: regions_filtered = regions elif manifest["regions_to_exclude"] is not None and manifest["regions_to_include"] is None: regions_filtered = [r for r in regions if r["name"] not in manifest["regions_to_exclude"]] elif manifest["regions_to_exclude"] is None and manifest["regions_to_include"] is not None: regions_filtered = [r for r in regions if r["name"] in manifest["regions_to_include"]] else: regions_filtered = [r for r in regions if r["name"] not in manifest["regions_to_exclude"] and r["name"] in manifest["regions_to_include"]] for region in regions_filtered: # upload image as public env_dest = Environment(region["connectionUrl"], 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, { "manifests_path": args.glance_gateway_manifests_path, "service_status_host": args.service_status_host, "openbook_host": args.openbook_host, "openbook_port": args.openbook_port, "openbook_user": args.openbook_user, "openbook_pass": args.openbook_pass }) keystone_dest = Keystone(env_dest) glance_dest = Glance(keystone_dest, endpoint_type="publicURL") if not check_image_exists_up2date(glance_dest, manifest): glance_dest.upload("%s.%s" % (manifest["image_name"], manifest["image_type"]), manifest["image_type"], "/tmp/%s.%s" % (manifest["image_name"], manifest["image_type"]), "public", manifest["tag"]) if __name__ == "__main__": parser = argparse.ArgumentParser(description="Glance Gateway 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("--glance-gateway-manifests-path", required=False, default=os.environ.get("GLANCE_GATEWAY_MANIFESTS_PATH", None), help="image-foundry environment variable: GLANCE_GATEWAY_MANIFESTS_PATH") parser.add_argument("--service-status-host", required=False, default=os.environ.get("SERVICE_STATUS_HOST", None), help="The hostname or IP of the node where service-status is running (or the load balancer frontend to same).") parser.add_argument("--openbook-host", required=False, default=os.environ.get("OPENBOOK_HOST", None), help="The hostname or IP of the node where Openbook is running (or the load balancer frontend to same).") parser.add_argument("--openbook-port", required=False, default=os.environ.get("OPENBOOK_PORT", None), help="The TCP port on OPENBOOK_HOST on which the API listener is bound.") parser.add_argument("--openbook-user", required=False, default=os.environ.get("OPENBOOK_USER", None), help="The admin auth username for Openbook.") parser.add_argument("--openbook-pass", required=False, default=os.environ.get("OPENBOOK_PASS", None), help="The admin auth password for Openbook.") args = parser.parse_args() main(args) sys.exit(0)