Add update_host for backup in cinder-manager

As scaling backup is imported, if users sepecify backup_use_same_host,
they have to manually update backups' host.

Change-Id: Ic031cae16f4c58fa06d92e979fe2b83d244832fc
This commit is contained in:
LisaLi
2016-02-19 16:39:38 +08:00
committed by Tom Barron
parent 207f8d332c
commit ea89376494
2 changed files with 43 additions and 0 deletions

View File

@@ -414,6 +414,20 @@ class BackupCommands(object):
backup['size'], backup['size'],
object_count)) object_count))
@args('--currenthost', required=True, help='Existing backup host name')
@args('--newhost', required=True, help='New backup host name')
def update_backup_host(self, currenthost, newhost):
"""Modify the host name associated with a backup.
Particularly to recover from cases where one has moved
their Cinder Backup node, and not set backup_use_same_backend.
"""
ctxt = context.get_admin_context()
backups = objects.BackupList.get_all_by_host(ctxt, currenthost)
for bk in backups:
bk.host = newhost
bk.save()
class ServiceCommands(object): class ServiceCommands(object):
"""Methods for managing services.""" """Methods for managing services."""

View File

@@ -39,6 +39,7 @@ from cinder import context
from cinder import exception from cinder import exception
from cinder.objects import fields from cinder.objects import fields
from cinder import test from cinder import test
from cinder.tests.unit import fake_constants
from cinder.tests.unit import fake_volume from cinder.tests.unit import fake_volume
from cinder import version from cinder import version
@@ -665,6 +666,34 @@ class TestCinderManageCmd(test.TestCase):
None, None, None) None, None, None)
self.assertEqual(expected_out, fake_out.getvalue()) self.assertEqual(expected_out, fake_out.getvalue())
@mock.patch('cinder.db.backup_update')
@mock.patch('cinder.db.backup_get_all_by_host')
@mock.patch('cinder.context.get_admin_context')
def test_update_backup_host(self, get_admin_context,
backup_get_by_host,
backup_update):
ctxt = context.RequestContext('fake-user', 'fake-project')
get_admin_context.return_value = ctxt
backup = {'id': fake_constants.backup_id,
'user_id': 'fake-user-id',
'project_id': 'fake-project-id',
'host': 'fake-host',
'display_name': 'fake-display-name',
'container': 'fake-container',
'status': fields.BackupStatus.AVAILABLE,
'size': 123,
'object_count': 1,
'volume_id': 'fake-volume-id',
}
backup_get_by_host.return_value = [backup]
backup_cmds = cinder_manage.BackupCommands()
backup_cmds.update_backup_host('fake_host', 'fake_host2')
get_admin_context.assert_called_once_with()
backup_get_by_host.assert_called_once_with(ctxt, 'fake_host')
backup_update.assert_called_once_with(ctxt, fake_constants.backup_id,
{'host': 'fake_host2'})
@mock.patch('cinder.utils.service_is_up') @mock.patch('cinder.utils.service_is_up')
@mock.patch('cinder.db.service_get_all') @mock.patch('cinder.db.service_get_all')
@mock.patch('cinder.context.get_admin_context') @mock.patch('cinder.context.get_admin_context')