for volume in volumes:
volume_host = volume_utils.extract_host(volume['host'], 'backend')
backend = self._get_volume_backend(host=volume_host)
- attachments = volume['volume_attachment']
- if attachments:
- if (volume['status'] == 'backing-up' and
- volume['previous_status'] == 'available'):
- LOG.info(_LI('Resetting volume %(vol_id)s to previous '
- 'status %(status)s (was backing-up).'),
- {'vol_id': volume['id'],
- 'status': volume['previous_status']})
- mgr = self._get_manager(backend)
- for attachment in attachments:
- if (attachment['attached_host'] == self.host and
- attachment['instance_uuid'] is None):
- mgr.detach_volume(ctxt, volume['id'],
- attachment['id'])
- elif (volume['status'] == 'backing-up' and
- volume['previous_status'] == 'in-use'):
- LOG.info(_LI('Resetting volume %(vol_id)s to previous '
- 'status %(status)s (was backing-up).'),
- {'vol_id': volume['id'],
- 'status': volume['previous_status']})
- self.db.volume_update(ctxt, volume['id'],
- volume['previous_status'])
- elif volume['status'] == 'restoring-backup':
- LOG.info(_LI('setting volume %s to error_restoring '
- '(was restoring-backup).'), volume['id'])
- mgr = self._get_manager(backend)
- for attachment in attachments:
- if (attachment['attached_host'] == self.host and
- attachment['instance_uuid'] is None):
- mgr.detach_volume(ctxt, volume['id'],
- attachment['id'])
- self.db.volume_update(ctxt, volume['id'],
- {'status': 'error_restoring'})
+ mgr = self._get_manager(backend)
+ if volume['status'] == 'backing-up':
+ self._detach_all_attachments(ctxt, mgr, volume)
+ LOG.info(_LI('Resetting volume %(vol_id)s to previous '
+ 'status %(status)s (was backing-up).'),
+ {'vol_id': volume['id'],
+ 'status': volume['previous_status']})
+ self.db.volume_update(ctxt, volume['id'],
+ {'status': volume['previous_status']})
+ elif volume['status'] == 'restoring-backup':
+ self._detach_all_attachments(ctxt, mgr, volume)
+ LOG.info(_LI('setting volume %s to error_restoring '
+ '(was restoring-backup).'), volume['id'])
+ self.db.volume_update(ctxt, volume['id'],
+ {'status': 'error_restoring'})
# TODO(smulcahy) implement full resume of backup and restore
# operations on restart (rather than simply resetting)
self._cleanup_temp_volumes_snapshots(backups)
+ def _detach_all_attachments(self, ctxt, mgr, volume):
+ attachments = volume['volume_attachment'] or []
+ for attachment in attachments:
+ if (attachment['attached_host'] == self.host and
+ attachment['instance_uuid'] is None):
+ mgr.detach_volume(ctxt, volume['id'],
+ attachment['id'])
+
def _cleanup_temp_volumes_snapshots(self, backups):
# NOTE(xyang): If the service crashes or gets restarted during the
# backup operation, there could be temporary volumes or snapshots
temp_vol_id = self._create_volume_db_entry()
db.volume_update(self.ctxt, temp_vol_id, {'status': 'available'})
vol5_id = self._create_volume_db_entry()
- db.volume_update(self.ctxt, vol4_id, {'status': 'backing-up'})
+ db.volume_update(self.ctxt, vol5_id, {'status': 'backing-up'})
temp_snap = self._create_snapshot_db_entry()
temp_snap.status = 'available'
temp_snap.save()
+ vol6_id = self._create_volume_db_entry()
+ db.volume_update(self.ctxt, vol6_id, {'status': 'restoring-backup'})
+
backup1 = self._create_backup_db_entry(status='creating',
volume_id=vol1_id)
backup2 = self._create_backup_db_entry(status='restoring',
self.assertEqual('available', vol1['status'])
vol2 = db.volume_get(self.ctxt, vol2_id)
self.assertEqual('error_restoring', vol2['status'])
+ vol3 = db.volume_get(self.ctxt, vol3_id)
+ self.assertEqual('available', vol3['status'])
+ vol4 = db.volume_get(self.ctxt, vol4_id)
+ self.assertEqual('available', vol4['status'])
+ vol5 = db.volume_get(self.ctxt, vol5_id)
+ self.assertEqual('available', vol5['status'])
+ vol6 = db.volume_get(self.ctxt, vol6_id)
+ self.assertEqual('error_restoring', vol6['status'])
backup1 = db.backup_get(self.ctxt, backup1.id)
self.assertEqual('error', backup1['status'])