freezer/freezer/openstack/backup.py

108 lines
4.1 KiB
Python

# (c) Copyright 2014,2015 Hewlett-Packard Development Company, L.P.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Freezer Backup modes related functions
"""
from oslo_config import cfg
from oslo_log import log
from freezer.utils import utils
CONF = cfg.CONF
LOG = log.getLogger(__name__)
class BackupOs(object):
def __init__(self, client_manager, container, storage):
"""
:param client_manager:
:param container:
:param storage:
:type storage: freezer.swift.SwiftStorage
:return:
"""
self.client_manager = client_manager
self.container = container
self.storage = storage
def backup_cinder_by_glance(self, volume_id):
"""
Implements cinder backup:
1) Gets a stream of the image from glance
2) Stores resulted image to the swift as multipart object
:param volume_id: id of volume for backup
"""
client_manager = self.client_manager
cinder = client_manager.get_cinder()
volume = cinder.volumes.get(volume_id)
LOG.debug("Creation temporary snapshot")
snapshot = client_manager.provide_snapshot(
volume, "backup_snapshot_for_volume_%s" % volume_id)
LOG.debug("Creation temporary volume")
copied_volume = client_manager.do_copy_volume(snapshot)
LOG.debug("Creation temporary glance image")
image = client_manager.make_glance_image(copied_volume.id,
copied_volume)
LOG.debug("Download temporary glance image {0}".format(image.id))
stream = client_manager.download_image(image)
package = "{0}/{1}".format(volume_id, utils.DateTime.now().timestamp)
LOG.debug("Saving image to {0}".format(self.storage.type))
if volume.name is None:
name = volume_id
else:
name = volume.name
headers = {'x-object-meta-length': str(len(stream)),
'volume_name': name,
'availability_zone': volume.availability_zone
}
attachments = volume._info['attachments']
if attachments:
headers['server'] = attachments[0]['server_id']
self.storage.add_stream(stream, package, headers=headers)
LOG.debug("Deleting temporary snapshot")
client_manager.clean_snapshot(snapshot)
LOG.debug("Deleting temporary volume")
cinder.volumes.delete(copied_volume)
LOG.debug("Deleting temporary image")
client_manager.get_glance().images.delete(image.id)
def backup_cinder(self, volume_id, name=None, description=None,
incremental=False):
client_manager = self.client_manager
cinder = client_manager.get_cinder()
container = "{0}/{1}/{2}".format(self.container, volume_id,
utils.DateTime.now().timestamp)
if incremental:
search_opts = {
'volume_id': volume_id,
'status': 'available'
}
backups = cinder.backups.list(search_opts=search_opts)
if len(backups) <= 0:
cinder.backups.create(volume_id, container, name, description,
incremental=False, force=True)
else:
cinder.backups.create(volume_id, container, name, description,
incremental=incremental, force=True)
else:
cinder.backups.create(volume_id, container, name, description,
incremental=incremental, force=True)