Add an CLI command to reinstall a subcloud

This commit adds a new CLI command to reinstall a subcloud with its
previous install configurations. The reinstall process will reuse
the previous install values and use the same software version as the
system controller.

CLI format:
dcmanager subcloud reinstall <id/name>

Users are required to type "reinstall" to start the reinstall, any
other input will abort the reinstall operation. After the reinstall
and bootstrap tasks complete a subcloud reconfigure command with
deploy_config file is expected to deploy the subcloud and make it
online.

Tests see in https://review.opendev.org/#/c/746615/.

Change-Id: Iecc439ae23cc0f018bcc3d1eebcbf1d0a8b29d45
Story: 2007267
Task: 40731
Depends-On: https://review.opendev.org/#/c/746615/
Signed-off-by: Yuxing Jiang <yuxing.jiang@windriver.com>
This commit is contained in:
Yuxing Jiang 2020-08-17 17:15:00 -04:00
parent f10e0455f0
commit 33d8e1f8d5
4 changed files with 71 additions and 1 deletions

View File

@ -13,7 +13,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Copyright (c) 2017-2019 Wind River Systems, Inc.
# Copyright (c) 2017-2020 Wind River Systems, Inc.
#
# The right to copy, distribute, modify, or otherwise make use
# of this software may be licensed only pursuant to the terms
@ -128,6 +128,18 @@ class subcloud_manager(base.ResourceManager):
resource.append(self.json_to_resource(json_object))
return resource
def subcloud_reinstall(self, url):
fields = dict()
enc = MultipartEncoder(fields=fields)
headers = {'Content-Type': enc.content_type}
resp = self.http_client.patch(url, enc, headers=headers)
if resp.status_code != 200:
self._raise_api_exception(resp)
json_object = get_json(resp)
resource = list()
resource.append(self.json_to_resource(json_object))
return resource
def subcloud_list(self, url):
resp = self.http_client.get(url)
if resp.status_code != 200:
@ -224,3 +236,7 @@ class subcloud_manager(base.ResourceManager):
data = kwargs.get('data')
url = '/subclouds/%s/reconfigure' % subcloud_ref
return self.subcloud_reconfigure(url, files, data)
def reinstall_subcloud(self, subcloud_ref):
url = '/subclouds/%s/reinstall' % subcloud_ref
return self.subcloud_reinstall(url)

View File

@ -22,6 +22,7 @@
import base64
import getpass
import os
import six
from osc_lib.command import command
@ -557,3 +558,39 @@ class ReconfigSubcloud(base.DCManagerShowOne):
except Exception:
error_msg = "Unable to reconfigure subcloud %s" % (subcloud_ref)
raise exceptions.DCManagerClientException(error_msg)
class ReinstallSubcloud(base.DCManagerShowOne):
"""Reinstall a subcloud."""
def _get_format_function(self):
return detail_format
def get_parser(self, prog_name):
parser = super(ReinstallSubcloud, self).get_parser(prog_name)
parser.add_argument(
'subcloud',
help='Name or ID of the subcloud to reinstall.'
)
return parser
def _get_resources(self, parsed_args):
subcloud_ref = parsed_args.subcloud
dcmanager_client = self.app.client_manager.subcloud_manager
# Require user to type reinstall to confirm
print("WARNING: This will reinstall the subcloud. "
"All applications and data on the subcloud will be lost.")
confirm = six.moves.input(
"Please type \"reinstall\" to confirm:").strip().lower()
if confirm == 'reinstall':
try:
return dcmanager_client.subcloud_manager.reinstall_subcloud(
subcloud_ref=subcloud_ref)
except Exception:
error_msg = "Unable to reinstall subcloud %s" % (subcloud_ref)
raise exceptions.DCManagerClientException(error_msg)
else:
msg = "Subcloud %s will not be reinstalled" % (subcloud_ref)
raise exceptions.DCManagerClientException(msg)

View File

@ -490,6 +490,7 @@ class DCManagerShell(app.App):
'subcloud manage': sm.ManageSubcloud,
'subcloud update': sm.UpdateSubcloud,
'subcloud reconfig': sm.ReconfigSubcloud,
'subcloud reinstall': sm.ReinstallSubcloud,
'subcloud-group add': gm.AddSubcloudGroup,
'subcloud-group delete': gm.DeleteSubcloudGroup,
'subcloud-group list': gm.ListSubcloudGroup,

View File

@ -314,3 +314,19 @@ class TestCLISubcloudManagerV1(base.BaseCommandTest):
app_args=[ID, '--deploy-config', file_path])
self.assertTrue('deploy-config file does not exist'
in str(e))
@mock.patch('six.moves.input', return_value='reinstall')
def test_reinstall_subcloud(self, mock_input):
self.client.subcloud_manager.reinstall_subcloud.\
return_value = [SUBCLOUD]
actual_call = self.call(
subcloud_cmd.ReinstallSubcloud, app_args=[ID])
self.assertEqual((ID, NAME,
DESCRIPTION, LOCATION,
SOFTWARE_VERSION, MANAGEMENT_STATE,
AVAILABILITY_STATUS, DEPLOY_STATUS,
MANAGEMENT_SUBNET, MANAGEMENT_START_IP,
MANAGEMENT_END_IP, MANAGEMENT_GATEWAY_IP,
SYSTEMCONTROLLER_GATEWAY_IP,
DEFAULT_SUBCLOUD_GROUP_ID,
TIME_NOW, TIME_NOW), actual_call[1])