
Adding the baclient code to Drydock requires a refactor of the build automation to support multiple languages and multiple artifacts included in a single Docker image NOTE: the go source here is a placeholder 'hello world' sample Change-Id: I1b4883f018b33b3d4fcd7cbcb6cba660fcdc93de
121 lines
4.4 KiB
Python
121 lines
4.4 KiB
Python
# Copyright 2017 AT&T Intellectual Property. All other rights reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
"""The entry point for the cli commands."""
|
|
import os
|
|
import logging
|
|
from urllib.parse import urlparse
|
|
|
|
import click
|
|
from drydock_provisioner.drydock_client.session import DrydockSession
|
|
from drydock_provisioner.drydock_client.session import KeystoneClient
|
|
from drydock_provisioner.drydock_client.client import DrydockClient
|
|
from .task import commands as task
|
|
from .node import commands as node
|
|
|
|
|
|
@click.group()
|
|
@click.option(
|
|
'--debug/--no-debug', help='Enable or disable debugging', default=False)
|
|
# Supported Environment Variables
|
|
@click.option(
|
|
'--os_project_domain_name',
|
|
envvar='OS_PROJECT_DOMAIN_NAME',
|
|
required=False)
|
|
@click.option(
|
|
'--os_user_domain_name', envvar='OS_USER_DOMAIN_NAME', required=False)
|
|
@click.option('--os_project_name', envvar='OS_PROJECT_NAME', required=False)
|
|
@click.option('--os_username', envvar='OS_USERNAME', required=False)
|
|
@click.option('--os_password', envvar='OS_PASSWORD', required=False)
|
|
@click.option('--os_auth_url', envvar='OS_AUTH_URL', required=False)
|
|
@click.option(
|
|
'--os_token',
|
|
help='The Keystone token to be used',
|
|
default=lambda: os.environ.get('OS_TOKEN', ''))
|
|
@click.option(
|
|
'--url',
|
|
'-u',
|
|
help='The url of the running drydock instance',
|
|
default=lambda: os.environ.get('DD_URL', ''))
|
|
@click.pass_context
|
|
def drydock(ctx, debug, url, os_project_domain_name, os_user_domain_name,
|
|
os_project_name, os_username, os_password, os_auth_url, os_token):
|
|
"""Drydock CLI to invoke the running instance of the drydock API."""
|
|
if not ctx.obj:
|
|
ctx.obj = {}
|
|
|
|
ctx.obj['DEBUG'] = debug
|
|
|
|
keystone_env = {
|
|
'project_domain_name': os_project_domain_name,
|
|
'user_domain_name': os_user_domain_name,
|
|
'project_name': os_project_name,
|
|
'username': os_username,
|
|
'password': os_password,
|
|
'auth_url': os_auth_url,
|
|
}
|
|
|
|
# setup logging for the CLI
|
|
# Setup root logger
|
|
logger = logging.getLogger('drydock_cli')
|
|
|
|
logger.setLevel(logging.DEBUG if debug else logging.INFO)
|
|
logging_handler = logging.StreamHandler()
|
|
formatter = logging.Formatter('%(asctime)s - %(levelname)s - '
|
|
'%(filename)s:%(funcName)s - %(message)s')
|
|
logging_handler.setFormatter(formatter)
|
|
logger.addHandler(logging_handler)
|
|
logger.debug('logging for cli initialized')
|
|
|
|
try:
|
|
if not os_token:
|
|
logger.debug("Generating Keystone session by env vars: %s" %
|
|
str(keystone_env))
|
|
ks_sess = KeystoneClient.get_ks_session(**keystone_env)
|
|
else:
|
|
logger.debug(
|
|
"Generating Keystone session by explicit token: %s" % os_token)
|
|
ks_sess = KeystoneClient.get_ks_session(token=os_token)
|
|
KeystoneClient.get_token(ks_sess=ks_sess)
|
|
except Exception as ex:
|
|
logger.debug("Exception getting Keystone session.", exc_info=ex)
|
|
ctx.fail('Error: Unable to authenticate with Keystone')
|
|
return
|
|
|
|
try:
|
|
if not url:
|
|
url = KeystoneClient.get_endpoint(
|
|
'physicalprovisioner', ks_sess=ks_sess)
|
|
except Exception as ex:
|
|
logger.debug("Exception getting Drydock endpoint.", exc_info=ex)
|
|
ctx.fail('Error: Unable to discover Drydock API URL')
|
|
|
|
# setup the drydock client using the passed parameters.
|
|
url_parse_result = urlparse(url)
|
|
|
|
def auth_gen():
|
|
return list(ks_sess.get_auth_headers().items())
|
|
|
|
if not url_parse_result.scheme:
|
|
ctx.fail('URL must specify a scheme and hostname, optionally a port')
|
|
ctx.obj['CLIENT'] = DrydockClient(
|
|
DrydockSession(
|
|
scheme=url_parse_result.scheme,
|
|
host=url_parse_result.hostname,
|
|
port=url_parse_result.port,
|
|
auth_gen=auth_gen))
|
|
|
|
|
|
drydock.add_command(task.task)
|
|
drydock.add_command(node.node)
|