summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Konstanski <ckonstanski@pippiandcarlos.com>2017-11-08 12:32:35 -0700
committerCarlos Konstanski <ckonstanski@pippiandcarlos.com>2017-11-08 12:32:35 -0700
commit6847b337f4c821a15aceccb0f01abafbe9c0f042 (patch)
tree683cae64faac991c6ed006d2d9150136404a7dbb
parent521eda718eb6e629c3bc8ae9bff7fa58251467ad (diff)
Glance gateway: fetch AUTH_URLs from Openbook
Closes-Bug: OB-1054
-rwxr-xr-xglance-gateway.py91
-rw-r--r--libs/__init__.py2
-rw-r--r--libs/openbook_client.py56
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