Merge "Include storage location in backup status"
This commit is contained in:
@@ -196,7 +196,8 @@ BACKUP_STATE_PREP_FAILED = 'backup-prep-failed'
|
|||||||
BACKUP_STATE_IN_PROGRESS = 'backing-up'
|
BACKUP_STATE_IN_PROGRESS = 'backing-up'
|
||||||
BACKUP_STATE_FAILED = 'failed'
|
BACKUP_STATE_FAILED = 'failed'
|
||||||
BACKUP_STATE_UNKNOWN = 'unknown'
|
BACKUP_STATE_UNKNOWN = 'unknown'
|
||||||
BACKUP_STATE_COMPLETE = 'complete'
|
BACKUP_STATE_COMPLETE_LOCAL = 'complete-local'
|
||||||
|
BACKUP_STATE_COMPLETE_CENTRAL = 'complete-central'
|
||||||
|
|
||||||
# Upgrades States
|
# Upgrades States
|
||||||
UPGRADE_STATE_DATA_MIGRATION = 'data-migration'
|
UPGRADE_STATE_DATA_MIGRATION = 'data-migration'
|
||||||
|
|||||||
@@ -849,8 +849,9 @@ class SubcloudManager(manager.Manager):
|
|||||||
self._fail_subcloud_backup_prep(context, subcloud)
|
self._fail_subcloud_backup_prep(context, subcloud)
|
||||||
return subcloud, False
|
return subcloud, False
|
||||||
|
|
||||||
success = self._run_subcloud_backup_create_playbook(subcloud, backup_command,
|
local_only = payload.get('local_only') or False
|
||||||
context)
|
success = self._run_subcloud_backup_create_playbook(
|
||||||
|
subcloud, backup_command, context, local_only)
|
||||||
|
|
||||||
if success:
|
if success:
|
||||||
utils.delete_subcloud_inventory(overrides_file)
|
utils.delete_subcloud_inventory(overrides_file)
|
||||||
@@ -1058,7 +1059,8 @@ class SubcloudManager(manager.Manager):
|
|||||||
|
|
||||||
return backup_overrides_file
|
return backup_overrides_file
|
||||||
|
|
||||||
def _run_subcloud_backup_create_playbook(self, subcloud, backup_command, context):
|
def _run_subcloud_backup_create_playbook(self, subcloud, backup_command,
|
||||||
|
context, local_only):
|
||||||
log_file = os.path.join(consts.DC_ANSIBLE_LOG_DIR, subcloud.name) + \
|
log_file = os.path.join(consts.DC_ANSIBLE_LOG_DIR, subcloud.name) + \
|
||||||
'_playbook_output.log'
|
'_playbook_output.log'
|
||||||
|
|
||||||
@@ -1070,9 +1072,16 @@ class SubcloudManager(manager.Manager):
|
|||||||
# Run the subcloud backup playbook
|
# Run the subcloud backup playbook
|
||||||
try:
|
try:
|
||||||
run_playbook(log_file, backup_command)
|
run_playbook(log_file, backup_command)
|
||||||
|
|
||||||
|
# Decide between complete-local or complete-central
|
||||||
|
if local_only:
|
||||||
|
backup_status = consts.BACKUP_STATE_COMPLETE_LOCAL
|
||||||
|
else:
|
||||||
|
backup_status = consts.BACKUP_STATE_COMPLETE_CENTRAL
|
||||||
|
|
||||||
db_api.subcloud_update(
|
db_api.subcloud_update(
|
||||||
context, subcloud.id,
|
context, subcloud.id,
|
||||||
backup_status=consts.BACKUP_STATE_COMPLETE,
|
backup_status=backup_status,
|
||||||
backup_datetime=datetime.datetime.utcnow())
|
backup_datetime=datetime.datetime.utcnow())
|
||||||
|
|
||||||
LOG.info("Successfully backed up subcloud %s" % subcloud.name)
|
LOG.info("Successfully backed up subcloud %s" % subcloud.name)
|
||||||
|
|||||||
@@ -618,7 +618,7 @@ class TestSubcloudDelete(testroot.DCManagerApiTest):
|
|||||||
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
||||||
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
||||||
backup_datetime=timeutils.utcnow(),
|
backup_datetime=timeutils.utcnow(),
|
||||||
backup_status=consts.BACKUP_STATE_COMPLETE)
|
backup_status=consts.BACKUP_STATE_COMPLETE_CENTRAL)
|
||||||
|
|
||||||
release_version = '22.12'
|
release_version = '22.12'
|
||||||
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
||||||
@@ -643,7 +643,7 @@ class TestSubcloudDelete(testroot.DCManagerApiTest):
|
|||||||
availability_status=dccommon_consts.AVAILABILITY_OFFLINE,
|
availability_status=dccommon_consts.AVAILABILITY_OFFLINE,
|
||||||
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
||||||
backup_datetime=timeutils.utcnow(),
|
backup_datetime=timeutils.utcnow(),
|
||||||
backup_status=consts.BACKUP_STATE_COMPLETE)
|
backup_status=consts.BACKUP_STATE_COMPLETE_CENTRAL)
|
||||||
|
|
||||||
release_version = '22.12'
|
release_version = '22.12'
|
||||||
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
||||||
@@ -665,7 +665,7 @@ class TestSubcloudDelete(testroot.DCManagerApiTest):
|
|||||||
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
||||||
management_state=dccommon_consts.MANAGEMENT_UNMANAGED,
|
management_state=dccommon_consts.MANAGEMENT_UNMANAGED,
|
||||||
backup_datetime=timeutils.utcnow(),
|
backup_datetime=timeutils.utcnow(),
|
||||||
backup_status=consts.BACKUP_STATE_COMPLETE)
|
backup_status=consts.BACKUP_STATE_COMPLETE_CENTRAL)
|
||||||
|
|
||||||
release_version = '22.12'
|
release_version = '22.12'
|
||||||
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
||||||
@@ -688,7 +688,7 @@ class TestSubcloudDelete(testroot.DCManagerApiTest):
|
|||||||
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
||||||
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
||||||
backup_datetime=timeutils.utcnow(),
|
backup_datetime=timeutils.utcnow(),
|
||||||
backup_status=consts.BACKUP_STATE_COMPLETE)
|
backup_status=consts.BACKUP_STATE_COMPLETE_CENTRAL)
|
||||||
|
|
||||||
release_version = '22.12'
|
release_version = '22.12'
|
||||||
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
||||||
@@ -713,7 +713,7 @@ class TestSubcloudDelete(testroot.DCManagerApiTest):
|
|||||||
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
||||||
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
||||||
backup_datetime=timeutils.utcnow(),
|
backup_datetime=timeutils.utcnow(),
|
||||||
backup_status=consts.BACKUP_STATE_COMPLETE)
|
backup_status=consts.BACKUP_STATE_COMPLETE_CENTRAL)
|
||||||
HEADER = copy.copy(FAKE_HEADERS)
|
HEADER = copy.copy(FAKE_HEADERS)
|
||||||
release_version = '22.12'
|
release_version = '22.12'
|
||||||
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
||||||
@@ -737,7 +737,7 @@ class TestSubcloudDelete(testroot.DCManagerApiTest):
|
|||||||
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
||||||
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
||||||
backup_datetime=timeutils.utcnow(),
|
backup_datetime=timeutils.utcnow(),
|
||||||
backup_status=consts.BACKUP_STATE_COMPLETE)
|
backup_status=consts.BACKUP_STATE_COMPLETE_CENTRAL)
|
||||||
|
|
||||||
release_version = '22.12'
|
release_version = '22.12'
|
||||||
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
||||||
@@ -762,7 +762,7 @@ class TestSubcloudDelete(testroot.DCManagerApiTest):
|
|||||||
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
||||||
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
||||||
backup_datetime=timeutils.utcnow(),
|
backup_datetime=timeutils.utcnow(),
|
||||||
backup_status=consts.BACKUP_STATE_COMPLETE)
|
backup_status=consts.BACKUP_STATE_COMPLETE_CENTRAL)
|
||||||
|
|
||||||
invalid_url = '/v1.0/subcloud-backup/fake/'
|
invalid_url = '/v1.0/subcloud-backup/fake/'
|
||||||
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
||||||
@@ -785,7 +785,7 @@ class TestSubcloudDelete(testroot.DCManagerApiTest):
|
|||||||
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
||||||
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
||||||
backup_datetime=timeutils.utcnow(),
|
backup_datetime=timeutils.utcnow(),
|
||||||
backup_status=consts.BACKUP_STATE_COMPLETE)
|
backup_status=consts.BACKUP_STATE_COMPLETE_CENTRAL)
|
||||||
|
|
||||||
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
||||||
data = {'sysadmin_password': fake_password,
|
data = {'sysadmin_password': fake_password,
|
||||||
@@ -807,7 +807,7 @@ class TestSubcloudDelete(testroot.DCManagerApiTest):
|
|||||||
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
||||||
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
||||||
backup_datetime=timeutils.utcnow(),
|
backup_datetime=timeutils.utcnow(),
|
||||||
backup_status=consts.BACKUP_STATE_COMPLETE)
|
backup_status=consts.BACKUP_STATE_COMPLETE_CENTRAL)
|
||||||
|
|
||||||
release_version = '22.12'
|
release_version = '22.12'
|
||||||
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
||||||
@@ -832,7 +832,7 @@ class TestSubcloudDelete(testroot.DCManagerApiTest):
|
|||||||
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
||||||
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
||||||
backup_datetime=timeutils.utcnow(),
|
backup_datetime=timeutils.utcnow(),
|
||||||
backup_status=consts.BACKUP_STATE_COMPLETE)
|
backup_status=consts.BACKUP_STATE_COMPLETE_CENTRAL)
|
||||||
|
|
||||||
release_version = '22.12'
|
release_version = '22.12'
|
||||||
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
||||||
@@ -855,7 +855,7 @@ class TestSubcloudDelete(testroot.DCManagerApiTest):
|
|||||||
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
||||||
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
||||||
backup_datetime=timeutils.utcnow(),
|
backup_datetime=timeutils.utcnow(),
|
||||||
backup_status=consts.BACKUP_STATE_COMPLETE)
|
backup_status=consts.BACKUP_STATE_COMPLETE_LOCAL)
|
||||||
|
|
||||||
release_version = '22.12'
|
release_version = '22.12'
|
||||||
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
||||||
@@ -872,7 +872,7 @@ class TestSubcloudDelete(testroot.DCManagerApiTest):
|
|||||||
self.assertEqual(response.status_int, 207)
|
self.assertEqual(response.status_int, 207)
|
||||||
|
|
||||||
@mock.patch.object(rpc_client, 'ManagerClient')
|
@mock.patch.object(rpc_client, 'ManagerClient')
|
||||||
def test_backup_delete_no_local_only(self, mock_rpc_client):
|
def test_backup_delete_central(self, mock_rpc_client):
|
||||||
|
|
||||||
subcloud = fake_subcloud.create_fake_subcloud(self.ctx)
|
subcloud = fake_subcloud.create_fake_subcloud(self.ctx)
|
||||||
|
|
||||||
@@ -881,7 +881,7 @@ class TestSubcloudDelete(testroot.DCManagerApiTest):
|
|||||||
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
||||||
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
||||||
backup_datetime=timeutils.utcnow(),
|
backup_datetime=timeutils.utcnow(),
|
||||||
backup_status=consts.BACKUP_STATE_COMPLETE)
|
backup_status=consts.BACKUP_STATE_COMPLETE_CENTRAL)
|
||||||
|
|
||||||
release_version = '22.12'
|
release_version = '22.12'
|
||||||
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
||||||
@@ -898,7 +898,7 @@ class TestSubcloudDelete(testroot.DCManagerApiTest):
|
|||||||
self.assertEqual(response.status_int, 207)
|
self.assertEqual(response.status_int, 207)
|
||||||
|
|
||||||
@mock.patch.object(rpc_client, 'ManagerClient')
|
@mock.patch.object(rpc_client, 'ManagerClient')
|
||||||
def test_backup_delete_unknown_local_only(self, mock_rpc_client):
|
def test_backup_delete_invalid_local_only(self, mock_rpc_client):
|
||||||
|
|
||||||
subcloud = fake_subcloud.create_fake_subcloud(self.ctx)
|
subcloud = fake_subcloud.create_fake_subcloud(self.ctx)
|
||||||
|
|
||||||
@@ -907,7 +907,7 @@ class TestSubcloudDelete(testroot.DCManagerApiTest):
|
|||||||
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
||||||
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
||||||
backup_datetime=timeutils.utcnow(),
|
backup_datetime=timeutils.utcnow(),
|
||||||
backup_status=consts.BACKUP_STATE_COMPLETE)
|
backup_status=consts.BACKUP_STATE_COMPLETE_LOCAL)
|
||||||
|
|
||||||
release_version = '22.12'
|
release_version = '22.12'
|
||||||
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
||||||
@@ -931,7 +931,7 @@ class TestSubcloudDelete(testroot.DCManagerApiTest):
|
|||||||
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
|
||||||
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
management_state=dccommon_consts.MANAGEMENT_MANAGED,
|
||||||
backup_datetime=timeutils.utcnow(),
|
backup_datetime=timeutils.utcnow(),
|
||||||
backup_status=consts.BACKUP_STATE_COMPLETE)
|
backup_status=consts.BACKUP_STATE_COMPLETE_LOCAL)
|
||||||
|
|
||||||
release_version = '22.12'
|
release_version = '22.12'
|
||||||
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode('ascii')
|
||||||
|
|||||||
@@ -1836,7 +1836,7 @@ class TestSubcloudManager(base.DCManagerTestCase):
|
|||||||
mock_delete_subcloud_inventory.assert_called_once_with(override_file)
|
mock_delete_subcloud_inventory.assert_called_once_with(override_file)
|
||||||
|
|
||||||
updated_subcloud = db_api.subcloud_get_by_name(self.ctx, subcloud.name)
|
updated_subcloud = db_api.subcloud_get_by_name(self.ctx, subcloud.name)
|
||||||
self.assertEqual(consts.BACKUP_STATE_COMPLETE,
|
self.assertEqual(consts.BACKUP_STATE_COMPLETE_CENTRAL,
|
||||||
updated_subcloud.backup_status)
|
updated_subcloud.backup_status)
|
||||||
|
|
||||||
@mock.patch.object(subcloud_manager.SubcloudManager,
|
@mock.patch.object(subcloud_manager.SubcloudManager,
|
||||||
@@ -1879,7 +1879,7 @@ class TestSubcloudManager(base.DCManagerTestCase):
|
|||||||
subcloud = self.create_subcloud_static(
|
subcloud = self.create_subcloud_static(
|
||||||
self.ctx,
|
self.ctx,
|
||||||
name='subcloud1',
|
name='subcloud1',
|
||||||
deploy_status=consts.BACKUP_STATE_COMPLETE)
|
deploy_status=consts.BACKUP_STATE_COMPLETE_CENTRAL)
|
||||||
|
|
||||||
values = copy.copy(FAKE_BACKUP_DELETE_LOAD_1)
|
values = copy.copy(FAKE_BACKUP_DELETE_LOAD_1)
|
||||||
RELEASE_VERSION = '22.12'
|
RELEASE_VERSION = '22.12'
|
||||||
|
|||||||
Reference in New Issue
Block a user