Add client access to enquiry API

Add drydock client access to the enquiry API
endpoint and CLI commands to access this endpoit.
Use PrettyTable to output the data.

Add a tox job for creating the frozen dependency list

Change-Id: Ie1724052eb9ae9500e6b0df8f0c78e25ae0617f4
This commit is contained in:
Scott Hussey 2017-10-18 13:59:37 -05:00
parent da84af2d0f
commit 27d54b3c46
10 changed files with 134 additions and 40 deletions

View File

@ -11,8 +11,7 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
""" The entry point for the cli commands """The entry point for the cli commands."""
"""
import os import os
import logging import logging
from urllib.parse import urlparse from urllib.parse import urlparse
@ -23,7 +22,7 @@ from drydock_provisioner.drydock_client.client import DrydockClient
from .design import commands as design from .design import commands as design
from .part import commands as part from .part import commands as part
from .task import commands as task from .task import commands as task
from .node import commands as node
@click.group() @click.group()
@click.option( @click.option(
@ -82,3 +81,4 @@ def drydock(ctx, debug, token, url):
drydock.add_command(design.design) drydock.add_command(design.design)
drydock.add_command(part.part) drydock.add_command(part.part)
drydock.add_command(task.task) drydock.add_command(task.task)
drydock.add_command(node.node)

Binary file not shown.

View File

View File

@ -0,0 +1,32 @@
# 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.
""" Actions related to task commands
"""
from drydock_provisioner.cli.action import CliAction
class NodeList(CliAction): # pylint: disable=too-few-public-methods
""" Action to list tasks
"""
def __init__(self, api_client):
"""
:param DrydockClient api_client: The api client used for invocation.
"""
super().__init__(api_client)
self.logger.debug('NodeList action initialized')
def invoke(self):
return self.api_client.get_nodes()

View File

@ -0,0 +1,47 @@
# 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.
""" cli.task.commands
Contains commands related to tasks against designs
"""
import click
import json
from prettytable import PrettyTable
from drydock_provisioner.cli.node.actions import NodeList
@click.group()
def node():
""" Drydock node commands
"""
@node.command(name='list')
@click.option('--output', '-o', help='Output format: table|json', default='table')
@click.pass_context
def node_list(ctx, output='table'):
"""List nodes."""
nodelist = NodeList(ctx.obj['CLIENT']).invoke()
if output == 'table':
pt = PrettyTable()
pt.field_names = ['Node Name', 'Status', 'CPUs', 'Memory', 'PXE MAC']
for n in nodelist:
pt.add_row([n['hostname'], n['status_name'], n['cpu_count'], n['memory'], n['boot_mac']])
click.echo(pt)
elif output == 'json':
click.echo(json.dumps(nodelist))

View File

@ -29,6 +29,16 @@ class DrydockClient(object):
self.session = session self.session = session
self.logger = logging.getLogger(__name__) self.logger = logging.getLogger(__name__)
def get_nodes(self):
"""Get list of nodes in MaaS and their status."""
endpoint = 'v1.0/nodes'
resp = self.session.get(endpoint)
self._check_response(resp)
return resp.json()
def get_design_ids(self): def get_design_ids(self):
""" """
Get list of Drydock design_ids Get list of Drydock design_ids

View File

@ -14,3 +14,4 @@ keystonemiddleware===4.9.1
oslo.policy===1.22.1 oslo.policy===1.22.1
iso8601===0.1.11 iso8601===0.1.11
keystoneauth1===2.13.0 keystoneauth1===2.13.0
PTable==0.9.2

View File

@ -1,22 +1,22 @@
amqp==2.2.1 amqp==2.2.2
Babel==2.3.4 Babel==2.5.1
bson==0.4.7 bson==0.4.7
cachetools==2.0.0 cachetools==2.0.1
certifi==2017.7.27.1 certifi==2017.7.27.1
chardet==3.0.4 chardet==3.0.4
click==6.7 click==6.7
contextlib2==0.5.5 contextlib2==0.5.5
debtcollector==1.17.0 debtcollector==1.18.0
enum-compat==0.0.2 enum-compat==0.0.2
eventlet==0.20.0 eventlet==0.20.0
falcon==1.2.0 falcon==1.3.0
fasteners==0.14.1 fasteners==0.14.1
futurist==1.3.0 futurist==1.4.0
greenlet==0.4.12 greenlet==0.4.12
idna==2.5 idna==2.6
iso8601==0.1.11 iso8601==0.1.11
Jinja2==2.9.6 Jinja2==2.9.6
keystoneauth1===2.13.0 keystoneauth1==2.13.0
keystonemiddleware==4.9.1 keystonemiddleware==4.9.1
kombu==4.1.0 kombu==4.1.0
MarkupSafe==1.0 MarkupSafe==1.0
@ -24,26 +24,28 @@ monotonic==1.3
msgpack-python==0.4.8 msgpack-python==0.4.8
netaddr==0.7.19 netaddr==0.7.19
netifaces==0.10.6 netifaces==0.10.6
oauthlib==2.0.2 oauthlib==2.0.4
oslo.concurrency==3.21.0 oslo.concurrency==3.23.0
oslo.config==4.11.0 oslo.config==3.16.0
oslo.context==2.17.0 oslo.context==2.19.1
oslo.i18n==3.17.0 oslo.i18n==3.18.0
oslo.log==3.30.0 oslo.log==3.31.0
oslo.messaging==5.30.0 oslo.messaging==5.33.0
oslo.middleware==3.30.0 oslo.middleware==3.32.1
oslo.policy==1.22.1 oslo.policy==1.22.1
oslo.serialization==2.20.0 oslo.serialization==2.21.1
oslo.service==1.25.0 oslo.service==1.26.0
oslo.utils==3.28.0 oslo.utils==3.30.0
oslo.versionedobjects==1.23.0 oslo.versionedobjects==1.23.0
Paste==2.0.3 Paste==2.0.3
PasteDeploy==1.5.2 PasteDeploy==1.5.2
pbr==3.1.1 pbr==3.1.1
pika==0.10.0 pika==0.11.0
pika-pool==0.1.3 pika-pool==0.1.3
positional==1.1.2 pip==9.0.1
positional==1.2.1
prettytable==0.7.2 prettytable==0.7.2
PTable==0.9.2
pycadf==2.6.0 pycadf==2.6.0
pycrypto==2.6.1 pycrypto==2.6.1
pyghmi==1.0.18 pyghmi==1.0.18
@ -54,16 +56,18 @@ python-keystoneclient==3.13.0
python-mimeparse==1.6.0 python-mimeparse==1.6.0
pytz==2017.2 pytz==2017.2
PyYAML==3.12 PyYAML==3.12
repoze.lru==0.6 repoze.lru==0.7
requests==2.18.2 requests==2.18.4
rfc3986==1.1.0 rfc3986==1.1.0
Routes==2.4.1 Routes==2.4.1
six==1.10.0 setuptools==36.6.0
six==1.11.0
statsd==3.2.1 statsd==3.2.1
stevedore==1.25.0 stevedore==1.27.1
tenacity==4.4.0 tenacity==4.4.0
urllib3==1.22 urllib3==1.22
uWSGI==2.0.15 uWSGI==2.0.15
vine==1.1.4 vine==1.1.4
WebOb==1.7.3 WebOb==1.7.3
wrapt==1.10.10 wheel==0.30.0
wrapt==1.10.11

View File

@ -17,9 +17,7 @@
# scripts # scripts
from setuptools import setup from setuptools import setup
from sphinx.setup_command import BuildDoc
cmdclass = {'build_sphinx': BuildDoc}
setup( setup(
@ -43,7 +41,8 @@ setup(
'drydock_provisioner.drivers.node.maasdriver.models', 'drydock_provisioner.drivers.node.maasdriver.models',
'drydock_provisioner.control', 'drydock_provisioner.cli', 'drydock_provisioner.control', 'drydock_provisioner.cli',
'drydock_provisioner.cli.design', 'drydock_provisioner.cli.part', 'drydock_provisioner.cli.design', 'drydock_provisioner.cli.part',
'drydock_provisioner.cli.task', 'drydock_provisioner.drydock_client' 'drydock_provisioner.cli.task', 'drydock_provisioner.cli.node',
'drydock_provisioner.drydock_client'
], ],
entry_points={ entry_points={
'oslo.config.opts': 'oslo.config.opts':
@ -53,11 +52,4 @@ setup(
'console_scripts': 'console_scripts':
'drydock = drydock_provisioner.cli.commands:drydock' 'drydock = drydock_provisioner.cli.commands:drydock'
}, },
cmdclass=cmdclass, )
command_options={
'build_sphinx': {
'source_dir': ('setup.py', 'docs/source'),
'build_dir': ('setup.py', 'docs/build'),
'all_files': ('setup.py', 1),
}
})

View File

@ -7,6 +7,14 @@ deps=
-rrequirements-direct.txt -rrequirements-direct.txt
-rrequirements-test.txt -rrequirements-test.txt
[testenv:freeze]
whitelist_externals=rm
deps=
-rrequirements-direct.txt
commands=
rm requirements-lock.txt
sh -c "pip freeze --all | grep -v 'drydock-provisioner' > requirements-lock.txt"
[testenv:yapf] [testenv:yapf]
whitelist_externals=find whitelist_externals=find
commands= commands=