Compare commits

..

No commits in common. "master" and "5.0.0" have entirely different histories.

25 changed files with 117 additions and 162 deletions

@ -1,4 +1,4 @@
[gerrit] [gerrit]
host=review.opendev.org host=review.openstack.org
port=29418 port=29418
project=x/python-cloudpulseclient.git project=openstack/python-cloudpulseclient.git

@ -1,7 +0,0 @@
- project:
check:
jobs:
- openstack-tox-pep8
gate:
jobs:
- openstack-tox-pep8

@ -1,13 +1,13 @@
If you would like to contribute to the development of OpenStack, If you would like to contribute to the development of OpenStack,
you must follow the steps in this page: you must follow the steps in this page:
https://docs.openstack.org/infra/manual/developers.html http://docs.openstack.org/infra/manual/developers.html
Once those steps have been completed, changes to OpenStack Once those steps have been completed, changes to OpenStack
should be submitted for review via the Gerrit tool, following should be submitted for review via the Gerrit tool, following
the workflow documented at: the workflow documented at:
https://docs.openstack.org/infra/manual/developers.html#development-workflow http://docs.openstack.org/infra/manual/developers.html#development-workflow
Pull requests submitted through GitHub will be ignored. Pull requests submitted through GitHub will be ignored.

@ -1,4 +1,4 @@
python-cloudpulseclient Style Commandments python-cloudpulseclient Style Commandments
=============================================== ===============================================
Read the OpenStack Style Commandments https://docs.openstack.org/hacking/latest/ Read the OpenStack Style Commandments http://docs.openstack.org/developer/hacking/

6
MANIFEST.in Normal file

@ -0,0 +1,6 @@
include AUTHORS
include ChangeLog
exclude .gitignore
exclude .gitreview
global-exclude *.pyc

@ -5,9 +5,9 @@ python-cloudpulseclient
A Python language binding for OpenStack CloudPulse. A Python language binding for OpenStack CloudPulse.
* Free software: Apache license * Free software: Apache license
* Documentation: https://wiki.openstack.org/wiki/Cloudpulse * Documentation: http://wiki.openstack.org/wiki/Cloudpulse
* Source: http://git.openstack.org/cgit/openstack/python-cloudpulseclient * Source: http://git.openstack.org/cgit/stackforge/python-cloudpulseclient
* Bugs: https://bugs.launchpad.net/python-cloudpulseclient * Bugs: http://bugs.launchpad.net/python-cloudpulseclient
Features Features
-------- --------

@ -1,3 +1,5 @@
# -*- coding: utf-8 -*-
# Licensed under the Apache License, Version 2.0 (the "License"); you may # 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 # not use this file except in compliance with the License. You may obtain
# a copy of the License at # a copy of the License at

@ -1,3 +1,5 @@
# -*- coding: utf-8 -*-
#
# Copyright 2012 OpenStack LLC. # Copyright 2012 OpenStack LLC.
# All Rights Reserved. # All Rights Reserved.
# #

@ -1,3 +1,5 @@
# -*- coding: utf-8 -*-
#
# Copyright 2012 OpenStack LLC. # Copyright 2012 OpenStack LLC.
# All Rights Reserved. # All Rights Reserved.
# #

@ -1,3 +1,5 @@
# -*- coding: utf-8 -*-
#
# Copyright 2012 OpenStack LLC. # Copyright 2012 OpenStack LLC.
# All Rights Reserved. # All Rights Reserved.
# #

@ -1,3 +1,5 @@
# -*- coding: utf-8 -*-
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may # 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 # not use this file except in compliance with the License. You may obtain
# a copy of the License at # a copy of the License at

@ -12,7 +12,7 @@
"""oslo_i18n integration module for cloudpulseclient. """oslo_i18n integration module for cloudpulseclient.
See https://docs.openstack.org/oslo.i18n/latest/user/usage.html. See http://docs.openstack.org/developer/oslo.i18n/usage.html .
""" """
@ -23,3 +23,13 @@ _translators = oslo_i18n.TranslatorFactory(domain='cloudpulseclient')
# The primary translation function using the well-known name "_" # The primary translation function using the well-known name "_"
_ = _translators.primary _ = _translators.primary
# Translators for log levels.
#
# The abbreviated names are meant to reflect the usual use of a short
# name like '_'. The "L" is for "log" and the other letter comes from
# the level.
_LI = _translators.log_info
_LW = _translators.log_warning
_LE = _translators.log_error
_LC = _translators.log_critical

@ -12,18 +12,34 @@
"""oslo.i18n integration module. """oslo.i18n integration module.
See https://docs.openstack.org/oslo.i18n/latest/user/usage.html See http://docs.openstack.org/developer/oslo.i18n/usage.html
""" """
import oslo_i18n try:
import oslo_i18n
# NOTE(dhellmann): This reference to o-s-l-o will be replaced by the # NOTE(dhellmann): This reference to o-s-l-o will be replaced by the
# application name when this module is synced into the separate # application name when this module is synced into the separate
# repository. It is OK to have more than one translation function # repository. It is OK to have more than one translation function
# using the same domain, since there will still only be one message # using the same domain, since there will still only be one message
# catalog. # catalog.
_translators = oslo_i18n.TranslatorFactory(domain='cloudpulseclient') _translators = oslo_i18n.TranslatorFactory(domain='cloudpulseclient')
# The primary translation function using the well-known name "_" # The primary translation function using the well-known name "_"
_ = _translators.primary _ = _translators.primary
# Translators for log levels.
#
# The abbreviated names are meant to reflect the usual use of a short
# name like '_'. The "L" is for "log" and the other letter comes from
# the level.
_LI = _translators.log_info
_LW = _translators.log_warning
_LE = _translators.log_error
_LC = _translators.log_critical
except ImportError:
# NOTE(dims): Support for cases where a project wants to use
# code from oslo-incubator, but is not ready to be internationalized
# (like tempest)
_ = _LI = _LW = _LE = _LC = lambda x: x

@ -127,8 +127,6 @@ class BaseAuthPlugin(object):
"tenant_name", "tenant_name",
"token", "token",
"auth_url", "auth_url",
"project_domain_name",
"user_domain_name",
] ]
def __init__(self, auth_system=None, **kwargs): def __init__(self, auth_system=None, **kwargs):

@ -41,27 +41,6 @@ class MissingArgs(Exception):
super(MissingArgs, self).__init__(msg) super(MissingArgs, self).__init__(msg)
class InvalidNumber(Exception):
"""Supplied argument for --number is invalid"""
def __init__(self):
msg = _("Invalid input, expected a number in range 1<=number<=240")
super(InvalidNumber, self).__init__(msg)
def check_int_limit(value):
"""Check that supplied arg is of integer type and in range 1<=value<=240"""
try:
int_value = int(value)
except (ValueError, TypeError):
raise InvalidNumber()
# max_db_entries in cloudpulse is 240, hence this limit
if not 1 <= int_value <= 240:
raise InvalidNumber()
return int_value
def validate_args(fn, *args, **kwargs): def validate_args(fn, *args, **kwargs):
"""Check that the supplied args are sufficient for calling a function. """Check that the supplied args are sufficient for calling a function.
@ -160,7 +139,7 @@ def isunauthenticated(func):
def print_list(objs, fields, formatters=None, sortby_index=0, def print_list(objs, fields, formatters=None, sortby_index=0,
mixed_case_fields=None, field_labels=None, limit_number=25): mixed_case_fields=None, field_labels=None):
"""Print a list or objects as a table, one row per object. """Print a list or objects as a table, one row per object.
:param objs: iterable of :class:`Resource` :param objs: iterable of :class:`Resource`
@ -184,16 +163,10 @@ def print_list(objs, fields, formatters=None, sortby_index=0,
kwargs = {} kwargs = {}
else: else:
kwargs = {'sortby': field_labels[sortby_index]} kwargs = {'sortby': field_labels[sortby_index]}
# Limit the number to 25 (default) or provided number from user
# Show last entries after sorting
kwargs['start'] = 0
kwargs['end'] = limit_number
pt = prettytable.PrettyTable(field_labels) pt = prettytable.PrettyTable(field_labels)
pt.align = 'l' pt.align = 'l'
for o in objs[::-1]: for o in objs:
row = [] row = []
for field in fields: for field in fields:
if field in formatters: if field in formatters:
@ -294,5 +267,5 @@ def pretty_choice_list(l):
def exit(msg=''): def exit(msg=''):
if msg: if msg:
print(msg, file=sys.stderr) print (msg, file=sys.stderr)
sys.exit(1) sys.exit(1)

@ -33,13 +33,6 @@ from oslo_utils import encodeutils
from oslo_utils import strutils from oslo_utils import strutils
import six import six
from cloudpulseclient.openstack.common.apiclient import auth
from cloudpulseclient.openstack.common.apiclient import exceptions as exc
from cloudpulseclient.openstack.common import cliutils
from cloudpulseclient.v1 import client
from cloudpulseclient.v1 import shell as shell_v1
from cloudpulseclient import version
HAS_KEYRING = False HAS_KEYRING = False
all_errors = ValueError all_errors = ValueError
try: try:
@ -56,6 +49,13 @@ try:
except ImportError: except ImportError:
pass pass
from cloudpulseclient.openstack.common.apiclient import auth
from cloudpulseclient.openstack.common.apiclient import exceptions as exc
from cloudpulseclient.openstack.common import cliutils
from cloudpulseclient.v1 import client
from cloudpulseclient.v1 import shell as shell_v1
from cloudpulseclient import version
DEFAULT_API_VERSION = '1' DEFAULT_API_VERSION = '1'
DEFAULT_ENDPOINT_TYPE = 'publicURL' DEFAULT_ENDPOINT_TYPE = 'publicURL'
DEFAULT_SERVICE_TYPE = 'health' DEFAULT_SERVICE_TYPE = 'health'
@ -294,11 +294,9 @@ class OpenStackCloudPulseShell(object):
metavar='<endpoint-type>', metavar='<endpoint-type>',
default=cliutils.env( default=cliutils.env(
'CLOUDPULSE_ENDPOINT_TYPE', 'CLOUDPULSE_ENDPOINT_TYPE',
default=cliutils.env( default=DEFAULT_ENDPOINT_TYPE),
'OS_ENDPOINT_TYPE', help='Defaults to env[CLOUDPULSE_ENDPOINT_TYPE] or'
default=DEFAULT_ENDPOINT_TYPE)), + DEFAULT_ENDPOINT_TYPE + '.')
help='Defaults to env[CLOUDPULSE_ENDPOINT_TYPE] '
'or' + DEFAULT_ENDPOINT_TYPE + '.')
# NOTE(dtroyer): We can't add --endpoint_type here due to argparse # NOTE(dtroyer): We can't add --endpoint_type here due to argparse
# thinking usage-list --end is ambiguous; but it # thinking usage-list --end is ambiguous; but it
# works fine with only --endpoint-type present # works fine with only --endpoint-type present
@ -523,20 +521,16 @@ class OpenStackCloudPulseShell(object):
'--os-password, env[OS_PASSWORD], or ' '--os-password, env[OS_PASSWORD], or '
'prompted response') 'prompted response')
self.cs = client.Client( self.cs = client.Client(username=os_username,
username=os_username, api_key=os_password,
api_key=os_password, project_id=os_tenant_id,
project_id=os_tenant_id, project_name=os_tenant_name,
project_name=os_tenant_name, auth_url=os_auth_url,
auth_url=os_auth_url, service_type=service_type,
service_type=service_type, region_name=args.os_region_name,
region_name=args.os_region_name, cacert=cacert,
project_domain_name=args.os_project_domain_name, insecure=insecure,
user_domain_name=args.os_user_domain_name, cloudpulse_url=bypass_url)
cacert=cacert,
insecure=insecure,
cloudpulse_url=bypass_url,
endpoint_type=endpoint_type)
args.func(self.cs, args) args.func(self.cs, args)

@ -1,3 +1,5 @@
# -*- coding: utf-8 -*-
# Copyright 2010-2011 OpenStack Foundation # Copyright 2010-2011 OpenStack Foundation
# Copyright (c) 2013 Hewlett-Packard Development Company, L.P. # Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
# #

@ -1,3 +1,5 @@
# -*- coding: utf-8 -*-
# Licensed under the Apache License, Version 2.0 (the "License"); you may # 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 # not use this file except in compliance with the License. You may obtain
# a copy of the License at # a copy of the License at

@ -25,22 +25,18 @@ class Client(object):
def __init__(self, username=None, api_key=None, project_id=None, def __init__(self, username=None, api_key=None, project_id=None,
project_name=None, auth_url=None, cloudpulse_url=None, project_name=None, auth_url=None, cloudpulse_url=None,
endpoint_type='publicURL', service_type='container', endpoint_type='publicURL', service_type='container',
project_domain_name=None, user_domain_name=None,
region_name=None, input_auth_token=None, insecure=False, region_name=None, input_auth_token=None, insecure=False,
cacert=None): cacert=None):
keystone = None keystone = None
if not input_auth_token: if not input_auth_token:
keystone = self.get_keystone_client( keystone = self.get_keystone_client(username=username,
username=username, api_key=api_key,
api_key=api_key, auth_url=auth_url,
auth_url=auth_url, project_id=project_id,
project_id=project_id, project_name=project_name,
project_name=project_name, insecure=insecure,
project_domain_name=project_domain_name, cacert=cacert)
user_domain_name=user_domain_name,
insecure=insecure,
cacert=cacert)
input_auth_token = keystone.auth_token input_auth_token = keystone.auth_token
if not input_auth_token: if not input_auth_token:
@ -84,7 +80,6 @@ class Client(object):
@staticmethod @staticmethod
def get_keystone_client(username=None, api_key=None, auth_url=None, def get_keystone_client(username=None, api_key=None, auth_url=None,
insecure=False, cacert=None, token=None, insecure=False, cacert=None, token=None,
project_domain_name=None, user_domain_name=None,
project_id=None, project_name=None): project_id=None, project_name=None):
if not auth_url: if not auth_url:
raise RuntimeError("No auth url specified") raise RuntimeError("No auth url specified")
@ -99,8 +94,6 @@ class Client(object):
cacert=cacert, cacert=cacert,
tenant_id=project_id, tenant_id=project_id,
tenant_name=project_name, tenant_name=project_name,
project_domain_name=project_domain_name,
user_domain_name=user_domain_name,
auth_url=auth_url, auth_url=auth_url,
endpoint=auth_url) endpoint=auth_url)
client.authenticate() client.authenticate()

@ -29,22 +29,17 @@ def _print_list_field(field):
@utils.arg('--period', @utils.arg('--period',
metavar='<period>', metavar='<period>',
help='List tests results that have been run in the last x minutes.') help='List tests results that have been run in the last x minutes.')
@utils.arg('--number',
metavar='<number>',
default=25,
type=utils.check_int_limit,
help='List x number of tests (Max 240).')
def do_result(cs, args): def do_result(cs, args):
"""List all the test results""" """List all the test results"""
search_opts = { search_opts = {
'failed': args.failed, 'failed': args.failed,
'period': args.period 'period': args.period,
} }
healtchecks = cs.healthcheck.list(search_opts=search_opts) healtchecks = cs.healthcheck.list(search_opts=search_opts)
columns = ('uuid', 'id', 'name', 'testtype', 'state') columns = ('uuid', 'id', 'name', 'testtype', 'state')
utils.print_list(healtchecks, columns, utils.print_list(healtchecks, columns,
{'versions': _print_list_field('versions')}, {'versions': _print_list_field('versions')},
sortby_index=1, limit_number=args.number) sortby_index=1)
@utils.arg('--name', @utils.arg('--name',

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
# You may obtain a copy of the License at # You may obtain a copy of the License at

@ -2,13 +2,13 @@
# of appearance. Changing the order has an impact on the overall integration # of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later. # process, which may cause wedges in the gate later.
pbr>=1.6 pbr>=1.6
Babel>=2.3.4 # BSD Babel>=1.3
oslo.config>=3.14.0 # Apache-2.0 oslo.config>=2.3.0 # Apache-2.0
oslo.i18n>=2.1.0 # Apache-2.0 oslo.i18n>=1.5.0 # Apache-2.0`
oslo.utils>=3.16.0 # Apache-2.0 oslo.utils>=2.0.0,!=2.6.0 # Apache-2.0
iso8601>=0.1.11 # MIT iso8601>=0.1.9
requests>=2.10.0 # Apache-2.0 requests>=2.5.2,!=2.8.0,!=2.9.0
python-keystoneclient>=2.0.0,!=2.1.0 # Apache-2.0 python-keystoneclient>=1.6.0,!=1.8.0
PyYAML>=3.1.0 # MIT PyYAML>=3.1.0
stevedore>=1.16.0 # Apache-2.0 stevedore>=1.5.0 # Apache-2.0
six>=1.9.0 # MIT six>=1.9.0

@ -4,7 +4,7 @@ summary = A Python language binding for OpenStack CloudPulse.
description-file = description-file =
README.rst README.rst
author = OpenStack author = OpenStack
author-email = openstack-discuss@lists.openstack.org author-email = openstack-dev@lists.openstack.org
home-page = http://www.openstack.org/ home-page = http://www.openstack.org/
classifier = classifier =
Environment :: OpenStack Environment :: OpenStack
@ -18,8 +18,6 @@ classifier =
Programming Language :: Python :: 3 Programming Language :: Python :: 3
Programming Language :: Python :: 3.3 Programming Language :: Python :: 3.3
Programming Language :: Python :: 3.4 Programming Language :: Python :: 3.4
Programming Language :: Python :: 3.5
Programming Language :: Python :: 3.6
[files] [files]
packages = packages =

@ -1,20 +0,0 @@
#!/bin/sh
#
# A simple wrapper around flake8 which makes it possible
# to ask it to only verify files changed in the current
# git HEAD patch.
#
# Intended to be invoked via tox:
#
# tox -epep8 -- -HEAD
#
if test "x$1" = "x-HEAD" ; then
shift
files=$(git diff --name-only HEAD~1 | tr '\n' ' ')
echo "Running flake8 on ${files}"
diff -u --from-file /dev/null ${files} | flake8 --diff "$@"
else
echo "Running flake8 on all files"
exec flake8 "$@"
fi

32
tox.ini

@ -1,46 +1,30 @@
[tox] [tox]
minversion = 2.0 minversion = 1.6
envlist = py36,pep8 envlist = py34,py27,pep8
skipsdist = True skipsdist = True
[testenv] [testenv]
basepython = python3
usedevelop = True usedevelop = True
install_command = pip install -U {opts} {packages} install_command = pip install {opts} {packages}
setenv = setenv =
VIRTUAL_ENV={envdir} VIRTUAL_ENV={envdir}
PYTHONWARNINGS=default::DeprecationWarning deps = -r{toxinidir}/requirements.txt
OS_STDOUT_CAPTURE=1 -r{toxinidir}/test-requirements.txt
OS_STDERR_CAPTURE=1 commands = python setup.py test --slowest --testr-args='{posargs}'
deps =
-c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
-r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt
passenv = TEMPEST_* OS_TEST_*
commands =
find . -type f -name "*.py[c|o]" -delete
stestr run {posargs}
[testenv:pep8] [testenv:pep8]
commands = commands = flake8
bash tools/flake8wrap.sh {posargs}
[testenv:venv] [testenv:venv]
basepython = python3
commands = {posargs} commands = {posargs}
[testenv:cover] [testenv:cover]
basepython = python3 commands = python setup.py test --coverage --testr-args='{posargs}'
commands =
python setup.py test --coverage --testr-args='{posargs}'
coverage report
[testenv:docs] [testenv:docs]
basepython = python3
commands = python setup.py build_sphinx commands = python setup.py build_sphinx
[testenv:debug] [testenv:debug]
basepython = python3
commands = oslo_debug_helper {posargs} commands = oslo_debug_helper {posargs}
[flake8] [flake8]