2b97fb50c1
This is to support streaming VHD tgz files to/from XAPI. In this way, it will avoid the restriction that SRs must be file system based SR (e.g. ext and nfs) for XenServer OpenStack. So that we can support other types of SRs e.g. lvm, iscsi and etc. Change-Id: I2cfe7340d48071bf96bc7ba0ad19f5a0b12b5378
93 lines
3.1 KiB
Python
93 lines
3.1 KiB
Python
# Copyright 2017 Citrix Systems.
|
|
# All Rights Reserved.
|
|
#
|
|
# 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.
|
|
|
|
from eventlet import greenio
|
|
import os
|
|
|
|
from oslo_log import log as logging
|
|
|
|
from os_xenapi.client import exception
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
|
|
def get_default_sr(session):
|
|
pool_ref = session.pool.get_all()[0]
|
|
sr_ref = session.pool.get_default_SR(pool_ref)
|
|
if sr_ref:
|
|
return sr_ref
|
|
else:
|
|
raise exception.NotFound('Cannot find default SR')
|
|
|
|
|
|
def create_vdi(session, sr_ref, instance, name_label, disk_type, virtual_size,
|
|
read_only=False):
|
|
"""Create a VDI record and returns its reference."""
|
|
vdi_ref = session.VDI.create(
|
|
{'name_label': name_label,
|
|
'name_description': '',
|
|
'SR': sr_ref,
|
|
'virtual_size': str(virtual_size),
|
|
'type': 'User',
|
|
'sharable': False,
|
|
'read_only': read_only,
|
|
'xenstore_data': {},
|
|
'other_config': _get_vdi_other_config(disk_type, instance=instance),
|
|
'sm_config': {},
|
|
'tags': []}
|
|
)
|
|
LOG.debug('Created VDI %(vdi_ref)s (%(name_label)s,'
|
|
' %(virtual_size)s, %(read_only)s) on %(sr_ref)s.',
|
|
{'vdi_ref': vdi_ref, 'name_label': name_label,
|
|
'virtual_size': virtual_size, 'read_only': read_only,
|
|
'sr_ref': sr_ref})
|
|
return vdi_ref
|
|
|
|
|
|
def _get_vdi_other_config(disk_type, instance=None):
|
|
"""Return metadata to store in VDI's other_config attribute.
|
|
|
|
`nova_instance_uuid` is used to associate a VDI with a particular instance
|
|
so that, if it becomes orphaned from an unclean shutdown of a
|
|
compute-worker, we can safely detach it.
|
|
"""
|
|
other_config = {'nova_disk_type': disk_type}
|
|
|
|
# create_vdi may be called simply while creating a volume
|
|
# hence information about instance may or may not be present
|
|
if instance:
|
|
other_config['nova_instance_uuid'] = instance['uuid']
|
|
|
|
return other_config
|
|
|
|
|
|
def create_pipe():
|
|
rpipe, wpipe = os.pipe()
|
|
rfile = greenio.GreenPipe(rpipe, 'rb', 0)
|
|
wfile = greenio.GreenPipe(wpipe, 'wb', 0)
|
|
return rfile, wfile
|
|
|
|
|
|
def get_vdi_import_path(session, task_ref, vdi_ref):
|
|
session_id = session.get_session_id()
|
|
str_fmt = '/import_raw_vdi?session_id={}&task_id={}&vdi={}&format=vhd'
|
|
return str_fmt.format(session_id, task_ref, vdi_ref)
|
|
|
|
|
|
def get_vdi_export_path(session, task_ref, vdi_ref):
|
|
session_id = session.get_session_id()
|
|
str_fmt = '/export_raw_vdi?session_id={}&task_id={}&vdi={}&format=vhd'
|
|
return str_fmt.format(session_id, task_ref, vdi_ref)
|