diff options
| author | Carlos Konstanski <ckonstanski@pippiandcarlos.com> | 2017-11-08 12:32:35 -0700 |
|---|---|---|
| committer | Carlos Konstanski <ckonstanski@pippiandcarlos.com> | 2017-11-08 12:32:35 -0700 |
| commit | 6847b337f4c821a15aceccb0f01abafbe9c0f042 (patch) | |
| tree | 683cae64faac991c6ed006d2d9150136404a7dbb | |
| parent | 521eda718eb6e629c3bc8ae9bff7fa58251467ad (diff) | |
Glance gateway: fetch AUTH_URLs from Openbook
Closes-Bug: OB-1054
| -rwxr-xr-x | glance-gateway.py | 91 | ||||
| -rw-r--r-- | libs/__init__.py | 2 | ||||
| -rw-r--r-- | libs/openbook_client.py | 56 |
3 files changed, 126 insertions, 23 deletions
diff --git a/glance-gateway.py b/glance-gateway.py index 833e38d..66b1d54 100755 --- a/glance-gateway.py +++ b/glance-gateway.py @@ -4,6 +4,7 @@ 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 @@ -30,30 +31,60 @@ def check_image_exists_up2date(glance, manifest): 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, - {"manifests_path": args.glance_gateway_manifests_path}) - manifests = read_manifests(env) - keystone = Keystone(env) - glance = Glance(keystone, endpoint_type="publicURL") + 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, manifest): + if manifest["vetted"] and not check_image_exists_up2date(glance_src, manifest): # download private image to /tmp - glance.download("%s.%s.unvetted" % (manifest["image_name"], manifest["image_type"]), - "/tmp/%s.%s" % (manifest["image_name"], manifest["image_type"])) - # upload image as public - glance.upload("%s.%s" % (manifest["image_name"], manifest["image_type"]), - manifest["image_type"], - "/tmp/%s.%s" % (manifest["image_name"], manifest["image_type"]), - "private", - manifest["tag"]) + 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.extra_envs["openbook_host"], + port=env.extra_envs["openbook_port"], + username=extra_envs["openbook_user"], + password=extra_envs["openbook_pass"]) + for obj in [url for url in ob_client.get_service_managers() if url not in manifest["regions_to_exclude"]]: + # upload image as public + env_dest = Environment(obj["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") + glance_dest.upload("%s.%s" % (manifest["image_name"], manifest["image_type"]), + manifest["image_type"], + "/tmp/%s.%s" % (manifest["image_name"], manifest["image_type"]), + "private", + manifest["tag"]) if __name__ == "__main__": @@ -98,6 +129,22 @@ if __name__ == "__main__": 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) diff --git a/libs/__init__.py b/libs/__init__.py index 609997c..4d33869 100644 --- a/libs/__init__.py +++ b/libs/__init__.py @@ -1 +1 @@ -__all__ = ["environment", "keystone", "glance"] +__all__ = ["environment", "keystone", "glance", "openbook_client"] diff --git a/libs/openbook_client.py b/libs/openbook_client.py new file mode 100644 index 0000000..d938db1 --- /dev/null +++ b/libs/openbook_client.py @@ -0,0 +1,56 @@ +import requests +from requests.packages.urllib3.exceptions import InsecureRequestWarning +import json + + +class OpenbookClient(object): + def __init__(self, host=None, port=None, username=None, password=None): + requests.packages.urllib3.disable_warnings(InsecureRequestWarning) + self.session = requests.Session() + self.host = host + self.port = port + self.base_url = "https://%s:%s" % (self.host, self.port) + self.username = username + self.password = password + self.token = None + + def store_result(self, resp): + self.status_code = resp.status_code + self.body = resp.text + try: + self.json = resp.json + except Exception: + self.json = None + + def get_token(self): + if self.token is None: + resp = self.session.post(url="%s/api/v4/login/simple" %(self.base_url, + data="username=%s&password=%s" % (self.username, self.password), + headers={"Content-Type": "multipart/form-data"}, + verify=False) + self.token = resp.headers["token"] + return self.token + + def get(self, url=None, params=None, headers={}, timeout=10): + headers["x-openbook-auth"] = self.get_token() + resp = self.session.get(url=url, + params=params, + headers=headers, + timeout=timeout, + verify=False) + self.store_result(resp) + return resp + + def post(self, url=None, data=None, headers={}, timeout=10): + headers["x-openbook-auth"] = self.get_token() + resp = self.session.post(url=url, + data=data, + headers=headers, + timeout=timeout, + verify=False) + self.store_result(resp) + return resp + + def get_service_managers(self): + self.get(url="%s/serviceManagers") + return [obj["conectionUrl"] for obj in self.json |
