d7330d0f44
Primary reason for this change was to update the spec and setup files from basic setuptools to use pbr This allows the autogenerated /usr/bin/system file to directly call the main method without using pkg-resources. This will provide a performance improvement of .5 seconds per CLI call, once the other pkg_resources issues are resolved Second reason for this change was to wire in the tox unit tests. This also includes pep8, pylint and coverage. Currently pep8 does not perform the 80 char limit check Currently pylint still reports some issues This should not affect the RPM names being generated or otherwise affect patching or upgrades. Change-Id: I9f14c9216fdcc63930a4b2849102b58442706144
145 lines
4.3 KiB
Python
145 lines
4.3 KiB
Python
#!/usr/bin/env python
|
|
#
|
|
# Copyright (c) 2016-2018 Wind River Systems, Inc.
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
|
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
# All Rights Reserved.
|
|
#
|
|
|
|
from cgtsclient.common import utils
|
|
from cgtsclient import exc
|
|
from cgtsclient.v1 import cluster as cluster_utils
|
|
import os
|
|
|
|
|
|
def _peer_formatter(values):
|
|
result = []
|
|
for value in values:
|
|
name = value.get('name')
|
|
hosts = value.get('hosts')
|
|
hosts = [x.decode('unicode_escape').encode('ascii', 'ignore')
|
|
for x in hosts]
|
|
result.append(str(name) + ":" + str(hosts))
|
|
|
|
return result
|
|
|
|
|
|
def _peer_pool_formatter(pool):
|
|
return _peer_formatter(pool.peers)
|
|
|
|
|
|
def _tier_formatter(values):
|
|
result = []
|
|
for value in values:
|
|
name = value.get('name')
|
|
status = value.get('status')
|
|
result.append("%s (%s)" % (str(name), str(status)))
|
|
|
|
return result
|
|
|
|
|
|
def _print_cluster_show(obj):
|
|
fields = ['uuid', 'cluster_uuid', 'type', 'name', 'peers', 'tiers']
|
|
labels = ['uuid', 'cluster_uuid', 'type', 'name', 'replication_groups',
|
|
'storage_tiers']
|
|
data = [(f, getattr(obj, f, '')) for f in fields]
|
|
utils.print_tuple_list(
|
|
data, labels, formatters={'peers': _peer_formatter,
|
|
'tiers': _tier_formatter})
|
|
|
|
|
|
@utils.arg('cluster_or_uuid',
|
|
metavar='<cluster_or_uuid>',
|
|
help="Cluster name or UUID")
|
|
def do_cluster_show(cc, args):
|
|
"""Show Cluster attributes."""
|
|
cluster = cluster_utils._find_cluster(cc, args.cluster_or_uuid)
|
|
cluster_obj = cc.cluster.get(cluster.uuid)
|
|
_print_cluster_show(cluster_obj)
|
|
|
|
|
|
def do_cluster_list(cc, args):
|
|
"""List Clusters."""
|
|
clusters = cc.cluster.list()
|
|
|
|
fields = ['uuid', 'cluster_uuid', 'type', 'name']
|
|
utils.print_list(clusters, fields, fields, sortby=1)
|
|
|
|
|
|
# The following are for internal testing only.
|
|
if os.path.exists('/var/run/.sysinv_running_in_lab'):
|
|
def _get_peer_tuples(data):
|
|
"""
|
|
Split the peers field from a comma separated list of name-status to a
|
|
real list of (name, status) tuples.
|
|
"""
|
|
peers = []
|
|
for r in data['peers'].split(',') or []:
|
|
name, status = r.split('~')
|
|
peers.append((name, status))
|
|
return peers
|
|
|
|
@utils.arg('name',
|
|
metavar='<name>',
|
|
help='Name of the Cluster [REQUIRED]')
|
|
@utils.arg('--peers',
|
|
metavar='<name~status>,[<name~status],...',
|
|
help='The inclusive range of peers to allocate')
|
|
def do_cluster_add(cc, args):
|
|
"""Add Cluster."""
|
|
|
|
field_list = ['name', 'peers']
|
|
|
|
# Prune input fields down to required/expected values
|
|
data = dict((k, v) for (k, v) in vars(args).items()
|
|
if k in field_list and not (v is None))
|
|
|
|
if 'peers' in data:
|
|
data['peers'] = _get_peer_tuples(data)
|
|
|
|
cluster = cc.cluster.create(**data)
|
|
uuid = getattr(cluster, 'uuid', '')
|
|
try:
|
|
cluster = cc.cluster.get(uuid)
|
|
except exc.HTTPNotFound:
|
|
raise exc.CommandError('Created cluster UUID not found: %s' % uuid)
|
|
_print_cluster_show(cluster)
|
|
|
|
@utils.arg('cluster_uuid',
|
|
metavar='<cluster uuid>',
|
|
help="UUID of the Cluster")
|
|
@utils.arg('--name',
|
|
metavar='<name>',
|
|
help="Name of the Cluster")
|
|
@utils.arg('--peers',
|
|
metavar='<name-status>,[<name-status],...',
|
|
help="The inclusive range of peers to allocate")
|
|
def do_cluster_modify(cc, args):
|
|
"""Modify Cluster attributes."""
|
|
|
|
rwfields = ['name', 'peers']
|
|
|
|
data = dict((k, v) for (k, v) in vars(args).items()
|
|
if k in rwfields and not (v is None))
|
|
|
|
if 'peers' in data:
|
|
data['peers'] = _get_peer_tuples(data)
|
|
|
|
patch = []
|
|
for (k, v) in data.items():
|
|
patch.append({'op': 'replace', 'path': '/' + k, 'value': v})
|
|
|
|
cluster = cc.cluster.update(args.cluster_uuid, patch)
|
|
_print_cluster_show(cluster)
|
|
|
|
@utils.arg('cluster_uuid',
|
|
metavar='<cluster uuid>',
|
|
help="UUID of the Cluster")
|
|
def do_cluster_delete(cc, args):
|
|
"""Delete a Cluster."""
|
|
cc.cluster.delete(args.cluster_uuid)
|
|
print 'Deleted cluster: %s' % args.cluster_uuid
|