194 lines
6.5 KiB
Python
194 lines
6.5 KiB
Python
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
|
|
# Copyright (c) 2010 Citrix Systems, Inc.
|
|
#
|
|
# 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.
|
|
|
|
"""Stubouts, mocks and fixtures for the test suite"""
|
|
|
|
from nova.virt import xenapi_conn
|
|
from nova.virt.xenapi import fake
|
|
from nova.virt.xenapi import volume_utils
|
|
from nova.virt.xenapi import vm_utils
|
|
|
|
|
|
def stubout_instance_snapshot(stubs):
|
|
@classmethod
|
|
def fake_fetch_image(cls, session, instance_id, image, user, project,
|
|
type):
|
|
# Stubout wait_for_task
|
|
def fake_wait_for_task(self, id, task):
|
|
class FakeEvent:
|
|
|
|
def send(self, value):
|
|
self.rv = value
|
|
|
|
def wait(self):
|
|
return self.rv
|
|
|
|
done = FakeEvent()
|
|
self._poll_task(id, task, done)
|
|
rv = done.wait()
|
|
return rv
|
|
|
|
def fake_loop(self):
|
|
pass
|
|
|
|
stubs.Set(xenapi_conn.XenAPISession, 'wait_for_task',
|
|
fake_wait_for_task)
|
|
|
|
stubs.Set(xenapi_conn.XenAPISession, '_stop_loop', fake_loop)
|
|
|
|
from nova.virt.xenapi.fake import create_vdi
|
|
name_label = "instance-%s" % instance_id
|
|
#TODO: create fake SR record
|
|
sr_ref = "fakesr"
|
|
vdi_ref = create_vdi(name_label=name_label, read_only=False,
|
|
sr_ref=sr_ref, sharable=False)
|
|
vdi_rec = session.get_xenapi().VDI.get_record(vdi_ref)
|
|
vdi_uuid = vdi_rec['uuid']
|
|
return vdi_uuid
|
|
|
|
stubs.Set(vm_utils.VMHelper, 'fetch_image', fake_fetch_image)
|
|
|
|
def fake_parse_xmlrpc_value(val):
|
|
return val
|
|
|
|
stubs.Set(xenapi_conn, '_parse_xmlrpc_value', fake_parse_xmlrpc_value)
|
|
|
|
def fake_wait_for_vhd_coalesce(session, instance_id, sr_ref, vdi_ref,
|
|
original_parent_uuid):
|
|
from nova.virt.xenapi.fake import create_vdi
|
|
name_label = "instance-%s" % instance_id
|
|
#TODO: create fake SR record
|
|
sr_ref = "fakesr"
|
|
vdi_ref = create_vdi(name_label=name_label, read_only=False,
|
|
sr_ref=sr_ref, sharable=False)
|
|
vdi_rec = session.get_xenapi().VDI.get_record(vdi_ref)
|
|
vdi_uuid = vdi_rec['uuid']
|
|
return vdi_uuid
|
|
|
|
stubs.Set(vm_utils.VMHelper, 'fetch_image', fake_fetch_image)
|
|
|
|
def fake_parse_xmlrpc_value(val):
|
|
return val
|
|
|
|
stubs.Set(xenapi_conn, '_parse_xmlrpc_value', fake_parse_xmlrpc_value)
|
|
|
|
def fake_wait_for_vhd_coalesce(session, instance_id, sr_ref, vdi_ref,
|
|
original_parent_uuid):
|
|
#TODO(sirp): Should we actually fake out the data here
|
|
return "fakeparent"
|
|
|
|
stubs.Set(vm_utils, 'wait_for_vhd_coalesce', fake_wait_for_vhd_coalesce)
|
|
|
|
|
|
def stubout_session(stubs, cls):
|
|
"""Stubs out two methods from XenAPISession"""
|
|
def fake_import(self):
|
|
"""Stubs out get_imported_xenapi of XenAPISession"""
|
|
fake_module = 'nova.virt.xenapi.fake'
|
|
from_list = ['fake']
|
|
return __import__(fake_module, globals(), locals(), from_list, -1)
|
|
|
|
stubs.Set(xenapi_conn.XenAPISession, '_create_session',
|
|
lambda s, url: cls(url))
|
|
stubs.Set(xenapi_conn.XenAPISession, 'get_imported_xenapi',
|
|
fake_import)
|
|
|
|
|
|
def stub_out_get_target(stubs):
|
|
"""Stubs out _get_target in volume_utils"""
|
|
def fake_get_target(volume_id):
|
|
return (None, None)
|
|
|
|
stubs.Set(volume_utils, '_get_target', fake_get_target)
|
|
|
|
|
|
class FakeSessionForVMTests(fake.SessionBase):
|
|
""" Stubs out a XenAPISession for VM tests """
|
|
def __init__(self, uri):
|
|
super(FakeSessionForVMTests, self).__init__(uri)
|
|
|
|
def network_get_all_records_where(self, _1, _2):
|
|
return self.xenapi.network.get_all_records()
|
|
|
|
def host_call_plugin(self, _1, _2, _3, _4, _5):
|
|
return ''
|
|
|
|
def VM_start(self, _1, ref, _2, _3):
|
|
vm = fake.get_record('VM', ref)
|
|
if vm['power_state'] != 'Halted':
|
|
raise fake.Failure(['VM_BAD_POWER_STATE', ref, 'Halted',
|
|
vm['power_state']])
|
|
vm['power_state'] = 'Running'
|
|
vm['is_a_template'] = False
|
|
vm['is_control_domain'] = False
|
|
|
|
def VM_snapshot(self, session_ref, vm_ref, label):
|
|
status = "Running"
|
|
template_vm_ref = fake.create_vm(label, status, is_a_template=True,
|
|
is_control_domain=False)
|
|
|
|
sr_ref = "fakesr"
|
|
template_vdi_ref = fake.create_vdi(label, read_only=True,
|
|
sr_ref=sr_ref, sharable=False)
|
|
|
|
template_vbd_ref = fake.create_vbd(template_vm_ref, template_vdi_ref)
|
|
return template_vm_ref
|
|
|
|
def VDI_destroy(self, session_ref, vdi_ref):
|
|
fake.destroy_vdi(vdi_ref)
|
|
|
|
def VM_destroy(self, session_ref, vm_ref):
|
|
fake.destroy_vm(vm_ref)
|
|
|
|
|
|
class FakeSessionForVolumeTests(fake.SessionBase):
|
|
""" Stubs out a XenAPISession for Volume tests """
|
|
def __init__(self, uri):
|
|
super(FakeSessionForVolumeTests, self).__init__(uri)
|
|
|
|
def VBD_plug(self, _1, ref):
|
|
rec = fake.get_record('VBD', ref)
|
|
rec['currently-attached'] = True
|
|
|
|
def VDI_introduce(self, _1, uuid, _2, _3, _4, _5,
|
|
_6, _7, _8, _9, _10, _11):
|
|
valid_vdi = False
|
|
refs = fake.get_all('VDI')
|
|
for ref in refs:
|
|
rec = fake.get_record('VDI', ref)
|
|
if rec['uuid'] == uuid:
|
|
valid_vdi = True
|
|
if not valid_vdi:
|
|
raise fake.Failure([['INVALID_VDI', 'session', self._session]])
|
|
|
|
|
|
class FakeSessionForVolumeFailedTests(FakeSessionForVolumeTests):
|
|
""" Stubs out a XenAPISession for Volume tests: it injects failures """
|
|
def __init__(self, uri):
|
|
super(FakeSessionForVolumeFailedTests, self).__init__(uri)
|
|
|
|
def VDI_introduce(self, _1, uuid, _2, _3, _4, _5,
|
|
_6, _7, _8, _9, _10, _11):
|
|
# This is for testing failure
|
|
raise fake.Failure([['INVALID_VDI', 'session', self._session]])
|
|
|
|
def PBD_unplug(self, _1, ref):
|
|
rec = fake.get_record('PBD', ref)
|
|
rec['currently-attached'] = False
|
|
|
|
def SR_forget(self, _1, ref):
|
|
pass
|