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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
#!/usr/bin/env python2
from __future__ import print_function
from libs.environment import *
from libs.glance import *
from libs.keystone import *
from libs.openbook_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,
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,
"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"] and not check_image_exists_up2date(glance_src, manifest):
# 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"]))
# get AUTH_URLs
ob_client = OpenbookClient(host=env_src.extra_envs["openbook_host"],
port=env_src.extra_envs["openbook_port"],
username=env_src.extra_envs["openbook_user"],
password=env_src.extra_envs["openbook_pass"])
for region in [region for region in ob_client.get_service_managers()
if region["name"] not in manifest["regions_to_exclude"]]:
# upload image as public
env_dest = Environment(region["connectionUrl"],
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,
{
"manifests_path": args.glance_gateway_manifests_path,
"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")
print("%s.%s" % (manifest["image_name"], manifest["image_type"]))
# 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",
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("--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("--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)
|