Merge "Add 'subcloud deploy bootstrap' command to dcmanager"
This commit is contained in:
commit
532898f369
|
@ -42,3 +42,9 @@ class phased_subcloud_deploy_manager(base.ResourceManager):
|
||||||
data = kwargs.get('data')
|
data = kwargs.get('data')
|
||||||
files = kwargs.get('files')
|
files = kwargs.get('files')
|
||||||
return self._deploy_operation(BASE_URL, files, data)
|
return self._deploy_operation(BASE_URL, files, data)
|
||||||
|
|
||||||
|
def subcloud_deploy_bootstrap(self, subcloud_ref, **kwargs):
|
||||||
|
data = kwargs.get('data')
|
||||||
|
files = kwargs.get('files')
|
||||||
|
url = BASE_URL + "%s/bootstrap" % subcloud_ref
|
||||||
|
return self._deploy_operation(url, files, data, "patch")
|
||||||
|
|
|
@ -118,3 +118,71 @@ class CreatePhasedSubcloudDeploy(base.DCManagerShowOne):
|
||||||
|
|
||||||
return dcmanager_client.subcloud_deploy_create(
|
return dcmanager_client.subcloud_deploy_create(
|
||||||
files=files, data=data)
|
files=files, data=data)
|
||||||
|
|
||||||
|
|
||||||
|
class BootstrapPhasedSubcloudDeploy(base.DCManagerShowOne):
|
||||||
|
"""Bootstrap a subcloud."""
|
||||||
|
|
||||||
|
def _get_format_function(self):
|
||||||
|
return utils.subcloud_detail_format
|
||||||
|
|
||||||
|
def get_parser(self, prog_name):
|
||||||
|
parser = super().get_parser(prog_name)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'subcloud',
|
||||||
|
help='Name or ID of the subcloud to bootstrap.'
|
||||||
|
)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'--bootstrap-address',
|
||||||
|
required=False,
|
||||||
|
help='IP address for initial subcloud controller.'
|
||||||
|
)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'--bootstrap-values',
|
||||||
|
required=False,
|
||||||
|
help='YAML file containing subcloud configuration settings. '
|
||||||
|
'Can be either a local file path or a URL.'
|
||||||
|
)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'--sysadmin-password',
|
||||||
|
required=False,
|
||||||
|
help='sysadmin password of the subcloud to be configured, '
|
||||||
|
'if not provided you will be prompted.'
|
||||||
|
)
|
||||||
|
|
||||||
|
return parser
|
||||||
|
|
||||||
|
def _get_resources(self, parsed_args):
|
||||||
|
dcmanager_client = self.app.client_manager.\
|
||||||
|
phased_subcloud_deploy_manager.phased_subcloud_deploy_manager
|
||||||
|
files = dict()
|
||||||
|
data = dict()
|
||||||
|
|
||||||
|
if parsed_args.bootstrap_address:
|
||||||
|
data['bootstrap-address'] = parsed_args.bootstrap_address
|
||||||
|
|
||||||
|
# Get the bootstrap values yaml file
|
||||||
|
if parsed_args.bootstrap_values:
|
||||||
|
if not os.path.isfile(parsed_args.bootstrap_values):
|
||||||
|
error_msg = "bootstrap-values does not exist: %s" % \
|
||||||
|
parsed_args.bootstrap_values
|
||||||
|
raise exceptions.DCManagerClientException(error_msg)
|
||||||
|
files['bootstrap_values'] = parsed_args.bootstrap_values
|
||||||
|
|
||||||
|
# Prompt the user for the subcloud's password if it isn't provided
|
||||||
|
if parsed_args.sysadmin_password:
|
||||||
|
data['sysadmin_password'] = base64.b64encode(
|
||||||
|
parsed_args.sysadmin_password.encode("utf-8"))
|
||||||
|
else:
|
||||||
|
password = utils.prompt_for_password()
|
||||||
|
data["sysadmin_password"] = base64.b64encode(
|
||||||
|
password.encode("utf-8"))
|
||||||
|
|
||||||
|
subcloud_ref = parsed_args.subcloud
|
||||||
|
|
||||||
|
return dcmanager_client.subcloud_deploy_bootstrap(
|
||||||
|
subcloud_ref, files=files, data=data)
|
||||||
|
|
|
@ -545,6 +545,7 @@ class DCManagerShell(app.App):
|
||||||
'subcloud-group show': gm.ShowSubcloudGroup,
|
'subcloud-group show': gm.ShowSubcloudGroup,
|
||||||
'subcloud-group update': gm.UpdateSubcloudGroup,
|
'subcloud-group update': gm.UpdateSubcloudGroup,
|
||||||
'subcloud deploy create': psdm.CreatePhasedSubcloudDeploy,
|
'subcloud deploy create': psdm.CreatePhasedSubcloudDeploy,
|
||||||
|
'subcloud deploy bootstrap': psdm.BootstrapPhasedSubcloudDeploy,
|
||||||
'subcloud-deploy upload': sdm.SubcloudDeployUpload,
|
'subcloud-deploy upload': sdm.SubcloudDeployUpload,
|
||||||
'subcloud-deploy show': sdm.SubcloudDeployShow,
|
'subcloud-deploy show': sdm.SubcloudDeployShow,
|
||||||
'alarm summary': am.ListAlarmSummary,
|
'alarm summary': am.ListAlarmSummary,
|
||||||
|
|
|
@ -12,6 +12,7 @@ from dcmanagerclient.commands.v1 import phased_subcloud_deploy_manager as cmd
|
||||||
from dcmanagerclient.tests import base
|
from dcmanagerclient.tests import base
|
||||||
|
|
||||||
|
|
||||||
|
@mock.patch('getpass.getpass', new=mock.Mock(return_value='testpassword'))
|
||||||
class TestCLIPhasedSubcloudDeployManagerV1(base.BaseCommandTest):
|
class TestCLIPhasedSubcloudDeployManagerV1(base.BaseCommandTest):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
@ -20,8 +21,7 @@ class TestCLIPhasedSubcloudDeployManagerV1(base.BaseCommandTest):
|
||||||
self.client = self.app.client_manager.phased_subcloud_deploy_manager.\
|
self.client = self.app.client_manager.phased_subcloud_deploy_manager.\
|
||||||
phased_subcloud_deploy_manager
|
phased_subcloud_deploy_manager
|
||||||
|
|
||||||
@mock.patch('getpass.getpass', return_value='testpassword')
|
def test_subcloud_deploy_create(self):
|
||||||
def test_subcloud_deploy_create(self, getpass):
|
|
||||||
self.client.subcloud_deploy_create.return_value = [
|
self.client.subcloud_deploy_create.return_value = [
|
||||||
base.SUBCLOUD_RESOURCE]
|
base.SUBCLOUD_RESOURCE]
|
||||||
|
|
||||||
|
@ -42,3 +42,18 @@ class TestCLIPhasedSubcloudDeployManagerV1(base.BaseCommandTest):
|
||||||
'--release', base.SOFTWARE_VERSION,
|
'--release', base.SOFTWARE_VERSION,
|
||||||
])
|
])
|
||||||
self.assertEqual(base.SUBCLOUD_FIELD_RESULT_LIST, actual_call[1])
|
self.assertEqual(base.SUBCLOUD_FIELD_RESULT_LIST, actual_call[1])
|
||||||
|
|
||||||
|
def test_subcloud_deploy_bootstrap(self):
|
||||||
|
self.client.subcloud_deploy_bootstrap.return_value = [
|
||||||
|
base.SUBCLOUD_RESOURCE]
|
||||||
|
|
||||||
|
with tempfile.NamedTemporaryFile(mode='w') as bootstrap_file:
|
||||||
|
bootstrap_file_path = os.path.abspath(bootstrap_file.name)
|
||||||
|
|
||||||
|
actual_call = self.call(
|
||||||
|
cmd.BootstrapPhasedSubcloudDeploy, app_args=[
|
||||||
|
base.ID,
|
||||||
|
'--bootstrap-address', base.BOOTSTRAP_ADDRESS,
|
||||||
|
'--bootstrap-values', bootstrap_file_path,
|
||||||
|
])
|
||||||
|
self.assertEqual(base.SUBCLOUD_FIELD_RESULT_LIST, actual_call[1])
|
||||||
|
|
Loading…
Reference in New Issue