distcloud-client/distributedcloud-client/dcmanagerclient/commands/v1/subcloud_peer_group_manager.py

366 lines
12 KiB
Python

# Copyright (c) 2023 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
import base64
from osc_lib.command import command
from dcmanagerclient.commands.v1 import base
from dcmanagerclient import exceptions
from dcmanagerclient import utils
def group_format(subcloud_peer_group=None):
columns = (
'id',
'peer_group_name',
'group_priority',
'group_state',
'system_leader_id',
'system_leader_name',
'max_subcloud_rehoming',
'created_at',
'updated_at',
)
if subcloud_peer_group:
data = (
subcloud_peer_group.id,
subcloud_peer_group.peer_group_name,
subcloud_peer_group.group_priority,
subcloud_peer_group.group_state,
subcloud_peer_group.system_leader_id,
subcloud_peer_group.system_leader_name,
subcloud_peer_group.max_subcloud_rehoming,
subcloud_peer_group.created_at,
subcloud_peer_group.updated_at
)
else:
data = (('<none>',) * len(columns),)
return columns, data
class MigrateSubcloudPeerGroup(base.DCManagerLister):
"""Migrate subclouds in this peer group."""
def _get_format_function(self):
return utils.subcloud_detail_format
def get_parser(self, prog_name):
parser = super(MigrateSubcloudPeerGroup, self).get_parser(prog_name)
parser.add_argument(
'group',
help='Name or ID of the subcloud peer group to migrate.'
)
parser.add_argument(
'--sysadmin-password',
required=False,
help='Sysadmin password of the subclouds to be configured, '
'if not provided you will be prompted.'
)
return parser
def _get_resources(self, parsed_args):
subcloud_peer_group_ref = parsed_args.group
dcmanager_client = self.app.client_manager.subcloud_peer_group_manager
kwargs = dict()
if parsed_args.sysadmin_password is not None:
kwargs['sysadmin_password'] = base64.b64encode(
parsed_args.sysadmin_password.encode("utf-8")).decode("utf-8")
else:
password = utils.prompt_for_password()
kwargs["sysadmin_password"] = base64.b64encode(
password.encode("utf-8")).decode("utf-8")
try:
return dcmanager_client. \
subcloud_peer_group_manager.migrate_subcloud_peer_group(
subcloud_peer_group_ref, **kwargs)
except Exception as e:
print(e)
msg = "Unable to migrate subcloud peer group %s" % (
subcloud_peer_group_ref)
raise exceptions.DCManagerClientException(msg)
class AddSubcloudPeerGroup(base.DCManagerShowOne):
"""Add a new subcloud peer group."""
def _get_format_function(self):
return group_format
def get_parser(self, prog_name):
parser = super(AddSubcloudPeerGroup, self).get_parser(prog_name)
parser.add_argument(
'--peer-group-name',
required=True,
help='Name for the new subcloud peer group.'
)
parser.add_argument(
'--group-priority',
required=False,
type=int,
default=0,
help='Assigned priority for the group.'
)
parser.add_argument(
'--group-state',
required=False,
choices=['enabled', 'disabled'],
default='enabled',
help='Administrative control of subcloud group.'
)
parser.add_argument(
'--max-subcloud-rehoming',
required=False,
type=int,
default=10,
help='Maximum number of subclouds to migrate in parallel'
)
return parser
def _get_resources(self, parsed_args):
dcmanager_client = self.app.client_manager.subcloud_peer_group_manager
kwargs = dict()
kwargs['peer-group-name'] = parsed_args.peer_group_name
if parsed_args.group_priority is not None:
kwargs['group-priority'] = parsed_args.group_priority
if parsed_args.group_state is not None:
kwargs['group-state'] = parsed_args.group_state
if parsed_args.max_subcloud_rehoming is not None:
kwargs['max-subcloud-rehoming'] = \
parsed_args.max_subcloud_rehoming
return dcmanager_client.subcloud_peer_group_manager.\
add_subcloud_peer_group(**kwargs)
class DeleteSubcloudPeerGroup(command.Command):
"""Delete subcloud peer group details from the database."""
def get_parser(self, prog_name):
parser = super(DeleteSubcloudPeerGroup, self).get_parser(prog_name)
parser.add_argument(
'group',
help='Name or ID of the subcloud peer group to delete.'
)
return parser
def take_action(self, parsed_args):
subcloud_peer_group_ref = parsed_args.group
dcmanager_client = self.app.client_manager.subcloud_peer_group_manager
try:
dcmanager_client.subcloud_peer_group_manager.\
delete_subcloud_peer_group(subcloud_peer_group_ref)
except Exception as e:
print(e)
msg = "Unable to delete subcloud peer group %s" % (
subcloud_peer_group_ref)
raise exceptions.DCManagerClientException(msg)
class ShowSubcloudPeerGroup(base.DCManagerShowOne):
"""Show the details of a subcloud peer group."""
def _get_format_function(self):
return group_format
def get_parser(self, prog_name):
parser = super(ShowSubcloudPeerGroup, self).get_parser(prog_name)
parser.add_argument(
'group',
help='Name or ID of subcloud peer group to view the details.'
)
return parser
def _get_resources(self, parsed_args):
subcloud_peer_group_ref = parsed_args.group
dcmanager_client = self.app.client_manager.subcloud_peer_group_manager
return dcmanager_client.subcloud_peer_group_manager.\
subcloud_peer_group_detail(subcloud_peer_group_ref)
class ListSubcloudPeerGroup(base.DCManagerLister):
"""List subcloud peer groups."""
def _get_format_function(self):
return group_format
def get_parser(self, prog_name):
parser = super(ListSubcloudPeerGroup, self).get_parser(prog_name)
return parser
def _get_resources(self, parsed_args):
dcmanager_client = self.app.client_manager.subcloud_peer_group_manager
return dcmanager_client.subcloud_peer_group_manager.\
list_subcloud_peer_groups()
class ListSubcloudPeerGroupSubclouds(base.DCManagerLister):
"""List subclouds referencing a subcloud peer group."""
def _get_format_function(self):
return utils.subcloud_detail_format
def get_parser(self, prog_name):
parser = super(ListSubcloudPeerGroupSubclouds,
self).get_parser(prog_name)
parser.add_argument(
'group',
help="Name or ID of subcloud peer group to list "
"associated subclouds."
)
return parser
def _get_resources(self, parsed_args):
subcloud_peer_group_ref = parsed_args.group
dcmanager_client = self.app.client_manager.subcloud_peer_group_manager
return dcmanager_client.subcloud_peer_group_manager. \
subcloud_peer_group_list_subclouds(subcloud_peer_group_ref)
class UpdateSubcloudPeerGroup(base.DCManagerShowOne):
"""Update attributes of a subcloud peer group."""
def _get_format_function(self):
return group_format
def get_parser(self, prog_name):
parser = super(UpdateSubcloudPeerGroup, self).get_parser(prog_name)
parser.add_argument(
'group',
help='Name or ID of the subcloud peer group to update.'
)
parser.add_argument(
'--peer-group-name',
required=False,
help='Name for the new subcloud peer group.'
)
parser.add_argument(
'--group-priority',
required=False,
type=int,
help='Assigned priority for the peer group.'
)
parser.add_argument(
'--group-state',
required=False,
choices=['enabled', 'disabled'],
help='Administrative control of subcloud peer group.'
)
parser.add_argument(
'--max-subcloud-rehoming',
required=False,
type=int,
help='Maximum number of subclouds to migrate in parallel'
)
return parser
def _get_resources(self, parsed_args):
subcloud_peer_group_ref = parsed_args.group
dcmanager_client = self.app.client_manager.subcloud_peer_group_manager
kwargs = dict()
if parsed_args.peer_group_name is not None:
kwargs['peer-group-name'] = parsed_args.peer_group_name
if parsed_args.group_priority is not None:
kwargs['group-priority'] = parsed_args.group_priority
if parsed_args.group_state is not None:
kwargs['group-state'] = parsed_args.group_state
if parsed_args.max_subcloud_rehoming is not None:
kwargs['max-subcloud-rehoming'] = \
parsed_args.max_subcloud_rehoming
if len(kwargs) == 0:
error_msg = "Nothing to update"
raise exceptions.DCManagerClientException(error_msg)
try:
return dcmanager_client. \
subcloud_peer_group_manager.update_subcloud_peer_group(
subcloud_peer_group_ref, **kwargs)
except Exception as e:
print(e)
msg = "Unable to update subcloud peer group %s" % (
subcloud_peer_group_ref)
raise exceptions.DCManagerClientException(msg)
def detail_status_format(subcloud_peer_group_status=None):
# Include all the fields in peer_group_format
# plus some additional fields
columns = (
'peer_group_id',
'peer_group_name',
'total_subclouds',
'complete',
'waiting_for_migrate',
'rehoming',
'rehome_failed',
'managed',
'unmanaged',
)
if subcloud_peer_group_status:
data = (
subcloud_peer_group_status['peer_group_id'],
subcloud_peer_group_status['peer_group_name'],
subcloud_peer_group_status['total_subclouds'],
subcloud_peer_group_status['complete'],
subcloud_peer_group_status['waiting_for_migrate'],
subcloud_peer_group_status['rehoming'],
subcloud_peer_group_status['rehome_failed'],
subcloud_peer_group_status['managed'],
subcloud_peer_group_status['unmanaged'],
)
else:
data = (tuple('<none>' for _ in range(len(columns))),)
return columns, data
class StatusSubcloudPeerGroup(base.DCManagerShowOne):
"""Show a summary of subcloud statuses within a peer group."""
def _get_format_function(self):
return detail_status_format
def get_parser(self, prog_name):
parser = super(StatusSubcloudPeerGroup, self).get_parser(prog_name)
parser.add_argument(
'group',
help='Name or ID of subcloud peer group to view the status.'
)
return parser
def _get_resources(self, parsed_args):
subcloud_peer_group_ref = parsed_args.group
dcmanager_client = self.app.client_manager.subcloud_peer_group_manager
return dcmanager_client.subcloud_peer_group_manager.\
subcloud_peer_group_status(subcloud_peer_group_ref)