366 lines
12 KiB
Python
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)
|