Merge "V3 support for the distil client"

This commit is contained in:
Jenkins
2016-09-22 23:04:43 +00:00
committed by Gerrit Code Review
2 changed files with 210 additions and 62 deletions

View File

@@ -13,46 +13,129 @@
# under the License. # under the License.
import requests import requests
from keystoneclient.v2_0.client import Client as Keystone
from requests.exceptions import ConnectionError from requests.exceptions import ConnectionError
from urlparse import urljoin from urlparse import urljoin
from keystoneauth1 import adapter
from keystoneauth1.identity import generic
from keystoneauth1 import session
class Client(object):
def Client(session=None, endpoint=None, username=None, password=None,
include_pass=None, endpoint_type=None,
auth_url=None, **kwargs):
if session:
kwargs['endpoint_override'] = endpoint
return SessionClient(session, **kwargs)
else:
return HTTPClient(**kwargs)
class SessionClient(object):
"""HTTP client based on Keystone client session."""
def __init__(self, session, service_type='rating',
interface='publicURL', **kwargs):
self.client = adapter.LegacyJsonAdapter(
session, service_type=service_type, interface=interface, **kwargs)
def collect_usage(self):
headers = {"Content-Type": "application/json"}
response, json = self.client.request(
"collect_usage", 'POST', headers=headers)
if response.status_code != 200:
raise AttributeError("Usage cycle failed: %s code: %s" %
(response.text, response.status_code))
else:
return json
def last_collected(self):
headers = {"Content-Type": "application/json"}
response, json = self.client.request(
"last_collected", 'GET', headers=headers)
if response.status_code != 200:
raise AttributeError("Get last collected failed: %s code: %s" %
(response.text, response.status_code))
else:
return json
def get_usage(self, tenant, start, end):
return self._query_usage(tenant, start, end, "get_usage")
def get_rated(self, tenant, start, end):
return self._query_usage(tenant, start, end, "get_rated")
def _query_usage(self, tenant, start, end, url):
params = {"tenant": tenant,
"start": start,
"end": end
}
response, json = self.client.request(
url, 'GET', params=params)
if response.status_code != 200:
raise AttributeError("Get usage failed: %s code: %s" %
(response.text, response.status_code))
else:
return json
class HTTPClient(object):
def __init__(self, distil_url=None, os_auth_token=None, def __init__(self, distil_url=None, os_auth_token=None,
os_username=None, os_password=None, os_username=None, os_password=None,
os_project_id=None, os_project_name=None,
os_tenant_id=None, os_tenant_name=None, os_tenant_id=None, os_tenant_name=None,
os_project_domain_id='default',
os_project_domain_name='Default',
os_auth_url=None, os_region_name=None, os_auth_url=None, os_region_name=None,
os_cacert=None, insecure=False, os_cacert=None, insecure=False,
os_service_type='rating', os_endpoint_type='publicURL'): os_service_type='rating', os_endpoint_type='publicURL'):
project_id = os_project_id or os_tenant_id
project_name = os_project_name or os_tenant_name
self.insecure = insecure self.insecure = insecure
if os_auth_token and distil_url: if os_auth_token and distil_url:
self.auth_token = os_auth_token self.auth_token = os_auth_token
self.endpoint = distil_url self.endpoint = distil_url
else: else:
ks = Keystone(username=os_username, if insecure:
password=os_password, verify = False
tenant_id=os_tenant_id, else:
tenant_name=os_tenant_name, verify = os_cacert or True
auth_url=os_auth_url,
region_name=os_region_name, kwargs = {
cacert=os_cacert, 'username': os_username,
insecure=insecure) 'password': os_password,
'auth_url': os_auth_url,
'project_id': project_id,
'project_name': project_name,
'project_domain_id': os_project_domain_id,
'project_domain_name': os_project_domain_name,
}
auth = generic.Password(**kwargs)
sess = session.Session(auth=auth, verify=verify)
if os_auth_token: if os_auth_token:
self.auth_token = os_auth_token self.auth_token = os_auth_token
else: else:
self.auth_token = ks.auth_token self.auth_token = auth.get_token(sess)
if distil_url: if distil_url:
self.endpoint = distil_url self.endpoint = distil_url
else: else:
self.endpoint = ks.service_catalog.url_for( self.endpoint = auth.get_endpoint(
service_type=os_service_type, sess, service_type=os_service_type,
endpoint_type=os_endpoint_type interface=os_endpoint_type,
) region_name=os_region_name)
def collect_usage(self): def collect_usage(self):
url = urljoin(self.endpoint, "collect_usage") url = urljoin(self.endpoint, "collect_usage")

View File

@@ -12,24 +12,21 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
#!/usr/bin/env python
import os import os
import json import json
import sys import sys
from client import Client from client import Client
import exc import exc
from keystoneauth1.identity import generic
if __name__ == '__main__': from keystoneauth1 import session
main(sys.argv[1:])
def main(): def main():
import argparse import argparse
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
#main args: # main args:
parser.add_argument('-k', '--insecure', parser.add_argument('-k', '--insecure',
default=False, default=False,
action='store_true', action='store_true',
@@ -56,13 +53,33 @@ def main():
default=os.environ.get('OS_PASSWORD'), default=os.environ.get('OS_PASSWORD'),
help='Defaults to env[OS_PASSWORD]') help='Defaults to env[OS_PASSWORD]')
parser.add_argument('--os-tenant-id', parser.add_argument('--os-project-id',
default=os.environ.get('OS_TENANT_ID'), default=os.environ.get(
help='Defaults to env[OS_TENANT_ID]') 'OS_PROJECT_ID', os.environ.get(
'OS_TENANT_ID')),
help='Defaults to env[OS_PROJECT_ID]')
parser.add_argument('--os-tenant-name', parser.add_argument('--os-project-name',
default=os.environ.get('OS_TENANT_NAME'), default=os.environ.get(
help='Defaults to env[OS_TENANT_NAME]') 'OS_PROJECT_NAME', os.environ.get(
'OS_TENANT_NAME')),
help='Defaults to env[OS_PROJECT_NAME]')
parser.add_argument('--os-project-domain-id',
default=os.environ.get('OS_PROJECT_DOMAIN_ID'),
help='Defaults to env[OS_PROJECT_DOMAIN_ID]')
parser.add_argument('--os-project-domain-name',
default=os.environ.get('OS_PROJECT_DOMAIN_NAME'),
help='Defaults to env[OS_PROJECT_DOMAIN_NAME]')
parser.add_argument('--os-user-domain-id',
default=os.environ.get('OS_USER_DOMAIN_ID'),
help='Defaults to env[OS_USER_DOMAIN_ID]')
parser.add_argument('--os-user-domain-name',
default=os.environ.get('OS_USER_DOMAIN_NAME'),
help='Defaults to env[OS_USER_DOMAIN_NAME]')
parser.add_argument('--os-auth-url', parser.add_argument('--os-auth-url',
default=os.environ.get('OS_AUTH_URL'), default=os.environ.get('OS_AUTH_URL'),
@@ -72,9 +89,9 @@ def main():
default=os.environ.get('OS_REGION_NAME'), default=os.environ.get('OS_REGION_NAME'),
help='Defaults to env[OS_REGION_NAME]') help='Defaults to env[OS_REGION_NAME]')
parser.add_argument('--os-auth-token', parser.add_argument('--os-token',
default=os.environ.get('OS_AUTH_TOKEN'), default=os.environ.get('OS_TOKEN'),
help='Defaults to env[OS_AUTH_TOKEN]') help='Defaults to env[OS_TOKEN]')
parser.add_argument('--os-service-type', parser.add_argument('--os-service-type',
help='Defaults to env[OS_SERVICE_TYPE].', help='Defaults to env[OS_SERVICE_TYPE].',
@@ -91,17 +108,17 @@ def main():
# commands: # commands:
subparsers = parser.add_subparsers(help='commands', dest='command') subparsers = parser.add_subparsers(help='commands', dest='command')
usage_parser = subparsers.add_parser( subparsers.add_parser(
'collect-usage', help=('process usage for all tenants')) 'collect-usage', help=('process usage for all tenants'))
last_collected_parser = subparsers.add_parser( subparsers.add_parser(
'last-collected', help=('get last collected time')) 'last-collected', help=('get last collected time'))
get_usage_parser = subparsers.add_parser( get_usage_parser = subparsers.add_parser(
'get-usage', help=('get raw aggregated usage')) 'get-usage', help=('get raw aggregated usage'))
get_usage_parser.add_argument( get_usage_parser.add_argument(
"-t", "--tenant", dest="tenant", "-p", "--project", dest="project",
help='Tenant to get usage for', help='Tenant to get usage for',
required=True) required=True)
@@ -119,7 +136,7 @@ def main():
'get-rated', help=('get rated usage')) 'get-rated', help=('get rated usage'))
get_rated_parser.add_argument( get_rated_parser.add_argument(
"-t", "--tenant", dest="tenant", "-p", "--project", dest="project",
help='Tenant to get usage for', help='Tenant to get usage for',
required=True) required=True)
@@ -134,41 +151,85 @@ def main():
args = parser.parse_args() args = parser.parse_args()
if not (args.os_auth_token and args.distil_url): if not (args.os_token and args.distil_url):
if not args.os_username: if not args.os_username:
raise exc.CommandError("You must provide a username via " raise exc.CommandError("You must provide a username via "
"either --os-username or via " "either --os-username or via "
"env[OS_USERNAME]") "env[OS_USERNAME]")
if not args.os_password: if not (args.os_project_id or args.os_project_name):
raise exc.CommandError("You must provide a password via " raise exc.CommandError(
"either --os-password or via " "You must provide a a project id via either --os-project-id "
"env[OS_PASSWORD]") "or env[OS_PROJECT_ID] or a project name via "
"either --os-project-name or env[OS_PROJECT_NAME]")
if not (args.os_tenant_id or args.os_tenant_name):
raise exc.CommandError("You must provide a tenant_id via "
"either --os-tenant-id or via "
"env[OS_TENANT_ID]")
if not args.os_auth_url: if not args.os_auth_url:
raise exc.CommandError("You must provide an auth url via " raise exc.CommandError(
"either --os-auth-url or via " "You must provide an auth url via "
"env[OS_AUTH_URL]") "either --os-auth-url or via "
"env[OS_AUTH_URL]")
kwargs = vars(args) if not args.os_password and not args.os_token:
raise exc.CommandError(
"You must provide a password via "
"either --os-password or via "
"env[OS_PASSWORD] or an auth token "
"via --os-token or env[OS_TOKEN]")
client = Client(kwargs.get('distil_url', None), if args.insecure:
kwargs.get('os_auth_token', None), verify = False
kwargs.get('os_username', None), else:
kwargs.get('os_password', None), verify = args.os_cacert or True
kwargs.get('os_tenant_id', None),
kwargs.get('os_tenant_name', None), if args.os_token and args.distil_url:
kwargs.get('os_auth_url', None), client = Client(
kwargs.get('os_region_name', None), endpoint=args.distil_url,
kwargs.get('os_cacert', None), token=args.os_token)
kwargs.get('insecure', None), else:
kwargs.get('os_service_type', None), if args.os_token:
kwargs.get('os_endpoint_type', None)) kwargs = {
'token': args.os_token,
'auth_url': args.os_auth_url,
'username': args.os_username,
'project_id': args.os_project_id,
'project_name': args.os_project_name,
'project_domain_id': args.os_project_domain_id,
'project_domain_name': args.os_project_domain_name,
}
auth = generic.Token(**kwargs)
sess = session.Session(auth=auth, verify=verify)
else:
kwargs = {
'username': args.os_username,
'password': args.os_password,
'auth_url': args.os_auth_url,
'project_id': args.os_project_id,
'project_name': args.os_project_name,
'project_domain_id': args.os_project_domain_id,
'project_domain_name': args.os_project_domain_name,
'user_domain_id': args.os_user_domain_id,
'user_domain_name': args.os_user_domain_name,
}
auth = generic.Password(**kwargs)
sess = session.Session(auth=auth, verify=verify)
endpoint = auth.get_endpoint(
sess, service_type=args.os_service_type,
interface=args.os_endpoint_type, region_name=args.os_region_name)
kwargs = {
'endpoint': endpoint,
'auth_url': args.os_auth_url,
'session': sess,
'auth': auth,
'service_type': args.os_service_type,
'endpoint_type': args.os_endpoint_type,
'region_name': args.os_region_name,
'username': args.os_username,
'password': args.os_password,
}
client = Client(**kwargs)
if args.command == 'collect-usage': if args.command == 'collect-usage':
response = client.collect_usage() response = client.collect_usage()
@@ -179,9 +240,13 @@ def main():
print json.dumps(response, indent=2) print json.dumps(response, indent=2)
if args.command == 'get-usage': if args.command == 'get-usage':
response = client.get_usage(args.tenant, args.start, args.end) response = client.get_usage(args.project, args.start, args.end)
print json.dumps(response, indent=2) print json.dumps(response, indent=2)
if args.command == 'get-rated': if args.command == 'get-rated':
response = client.get_rated(args.tenant, args.start, args.end) response = client.get_rated(args.project, args.start, args.end)
print json.dumps(response, indent=2) print json.dumps(response, indent=2)
if __name__ == '__main__':
main(sys.argv[1:])