summaryrefslogtreecommitdiff
path: root/ci-script.py
blob: e62d3daf49ee4040c06c489e356adc18f825ffa9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#!/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 run_shell_command(cmd):
    return subprocess.check_output(cmd, shell=True)


def read_manifests(env):
    manifests = {}
    manifests_glob = "%s/*.yaml" % env.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" % (manifest["image_name"], manifest["image_type"]))
    return image and str(manifest["tag"]) in image.tags


def create_image(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"])
    env = manifest["extra_envs"] if "extra_envs" in manifest else None
    p = subprocess.Popen([cmd], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env)
    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,
                      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,
                      args.elements_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(manifest)
            glance.upload("%s.%s" % (manifest["image_name"], manifest["image_type"]),
                          manifest["image_type"],
                          "/tmp/%s.%s" % (manifest["image_name"], manifest["image_type"]),
                          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",
                        required=False,
                        default=os.environ.get("OS_REGION", None),
                        help="OpenStack openrc environment variable: OS_REGION")
    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)