trunk merge
This commit is contained in:
@@ -96,6 +96,7 @@ flags.DECLARE('network_size', 'nova.network.manager')
|
|||||||
flags.DECLARE('vlan_start', 'nova.network.manager')
|
flags.DECLARE('vlan_start', 'nova.network.manager')
|
||||||
flags.DECLARE('vpn_start', 'nova.network.manager')
|
flags.DECLARE('vpn_start', 'nova.network.manager')
|
||||||
flags.DECLARE('fixed_range_v6', 'nova.network.manager')
|
flags.DECLARE('fixed_range_v6', 'nova.network.manager')
|
||||||
|
flags.DECLARE('gateway_v6', 'nova.network.manager')
|
||||||
flags.DECLARE('images_path', 'nova.image.local')
|
flags.DECLARE('images_path', 'nova.image.local')
|
||||||
flags.DECLARE('libvirt_type', 'nova.virt.libvirt.connection')
|
flags.DECLARE('libvirt_type', 'nova.virt.libvirt.connection')
|
||||||
flags.DEFINE_flag(flags.HelpFlag())
|
flags.DEFINE_flag(flags.HelpFlag())
|
||||||
@@ -545,13 +546,10 @@ class FloatingIpCommands(object):
|
|||||||
class NetworkCommands(object):
|
class NetworkCommands(object):
|
||||||
"""Class for managing networks."""
|
"""Class for managing networks."""
|
||||||
|
|
||||||
def create(self, fixed_range=None, num_networks=None,
|
def create(self, fixed_range=None, num_networks=None, network_size=None,
|
||||||
network_size=None, vlan_start=None,
|
vlan_start=None, vpn_start=None, fixed_range_v6=None,
|
||||||
vpn_start=None, fixed_range_v6=None, label='public'):
|
gateway_v6=None, label='public'):
|
||||||
"""Creates fixed ips for host by range
|
"""Creates fixed ips for host by range"""
|
||||||
arguments: fixed_range=FLAG, [num_networks=FLAG],
|
|
||||||
[network_size=FLAG], [vlan_start=FLAG],
|
|
||||||
[vpn_start=FLAG], [fixed_range_v6=FLAG]"""
|
|
||||||
if not fixed_range:
|
if not fixed_range:
|
||||||
msg = _('Fixed range in the form of 10.0.0.0/8 is '
|
msg = _('Fixed range in the form of 10.0.0.0/8 is '
|
||||||
'required to create networks.')
|
'required to create networks.')
|
||||||
@@ -567,6 +565,8 @@ class NetworkCommands(object):
|
|||||||
vpn_start = FLAGS.vpn_start
|
vpn_start = FLAGS.vpn_start
|
||||||
if not fixed_range_v6:
|
if not fixed_range_v6:
|
||||||
fixed_range_v6 = FLAGS.fixed_range_v6
|
fixed_range_v6 = FLAGS.fixed_range_v6
|
||||||
|
if not gateway_v6:
|
||||||
|
gateway_v6 = FLAGS.gateway_v6
|
||||||
net_manager = utils.import_object(FLAGS.network_manager)
|
net_manager = utils.import_object(FLAGS.network_manager)
|
||||||
try:
|
try:
|
||||||
net_manager.create_networks(context.get_admin_context(),
|
net_manager.create_networks(context.get_admin_context(),
|
||||||
@@ -576,6 +576,7 @@ class NetworkCommands(object):
|
|||||||
vlan_start=int(vlan_start),
|
vlan_start=int(vlan_start),
|
||||||
vpn_start=int(vpn_start),
|
vpn_start=int(vpn_start),
|
||||||
cidr_v6=fixed_range_v6,
|
cidr_v6=fixed_range_v6,
|
||||||
|
gateway_v6=gateway_v6,
|
||||||
label=label)
|
label=label)
|
||||||
except ValueError, e:
|
except ValueError, e:
|
||||||
print e
|
print e
|
||||||
@@ -1081,24 +1082,35 @@ class ImageCommands(object):
|
|||||||
self._convert_images(machine_images)
|
self._convert_images(machine_images)
|
||||||
|
|
||||||
|
|
||||||
|
class ConfigCommands(object):
|
||||||
|
"""Class for exposing the flags defined by flag_file(s)."""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def list(self):
|
||||||
|
print FLAGS.FlagsIntoString()
|
||||||
|
|
||||||
|
|
||||||
CATEGORIES = [
|
CATEGORIES = [
|
||||||
('user', UserCommands),
|
|
||||||
('account', AccountCommands),
|
('account', AccountCommands),
|
||||||
('project', ProjectCommands),
|
('config', ConfigCommands),
|
||||||
('role', RoleCommands),
|
|
||||||
('shell', ShellCommands),
|
|
||||||
('vpn', VpnCommands),
|
|
||||||
('fixed', FixedIpCommands),
|
|
||||||
('floating', FloatingIpCommands),
|
|
||||||
('network', NetworkCommands),
|
|
||||||
('vm', VmCommands),
|
|
||||||
('service', ServiceCommands),
|
|
||||||
('db', DbCommands),
|
('db', DbCommands),
|
||||||
('volume', VolumeCommands),
|
('fixed', FixedIpCommands),
|
||||||
|
('flavor', InstanceTypeCommands),
|
||||||
|
('floating', FloatingIpCommands),
|
||||||
('instance_type', InstanceTypeCommands),
|
('instance_type', InstanceTypeCommands),
|
||||||
('image', ImageCommands),
|
('image', ImageCommands),
|
||||||
('flavor', InstanceTypeCommands),
|
('network', NetworkCommands),
|
||||||
('version', VersionCommands)]
|
('project', ProjectCommands),
|
||||||
|
('role', RoleCommands),
|
||||||
|
('service', ServiceCommands),
|
||||||
|
('shell', ShellCommands),
|
||||||
|
('user', UserCommands),
|
||||||
|
('version', VersionCommands),
|
||||||
|
('vm', VmCommands),
|
||||||
|
('volume', VolumeCommands),
|
||||||
|
('vpn', VpnCommands)]
|
||||||
|
|
||||||
|
|
||||||
def lazy_match(name, key_value_tuples):
|
def lazy_match(name, key_value_tuples):
|
||||||
|
|||||||
@@ -26,17 +26,16 @@ from eventlet import greenthread
|
|||||||
from nova import context
|
from nova import context
|
||||||
from nova import crypto
|
from nova import crypto
|
||||||
from nova import db
|
from nova import db
|
||||||
|
from nova import exception
|
||||||
from nova import flags
|
from nova import flags
|
||||||
from nova import log as logging
|
from nova import log as logging
|
||||||
from nova import rpc
|
from nova import rpc
|
||||||
from nova import test
|
from nova import test
|
||||||
from nova import utils
|
from nova import utils
|
||||||
from nova import exception
|
|
||||||
from nova.auth import manager
|
from nova.auth import manager
|
||||||
from nova.api.ec2 import cloud
|
from nova.api.ec2 import cloud
|
||||||
from nova.api.ec2 import ec2utils
|
from nova.api.ec2 import ec2utils
|
||||||
from nova.image import local
|
from nova.image import local
|
||||||
from nova.exception import NotFound
|
|
||||||
|
|
||||||
|
|
||||||
FLAGS = flags.FLAGS
|
FLAGS = flags.FLAGS
|
||||||
@@ -68,7 +67,7 @@ class CloudTestCase(test.TestCase):
|
|||||||
|
|
||||||
def fake_show(meh, context, id):
|
def fake_show(meh, context, id):
|
||||||
return {'id': 1, 'properties': {'kernel_id': 1, 'ramdisk_id': 1,
|
return {'id': 1, 'properties': {'kernel_id': 1, 'ramdisk_id': 1,
|
||||||
'type': 'machine'}}
|
'type': 'machine', 'image_state': 'available'}}
|
||||||
|
|
||||||
self.stubs.Set(local.LocalImageService, 'show', fake_show)
|
self.stubs.Set(local.LocalImageService, 'show', fake_show)
|
||||||
self.stubs.Set(local.LocalImageService, 'show_by_name', fake_show)
|
self.stubs.Set(local.LocalImageService, 'show_by_name', fake_show)
|
||||||
@@ -290,7 +289,7 @@ class CloudTestCase(test.TestCase):
|
|||||||
'type': 'machine'}}]
|
'type': 'machine'}}]
|
||||||
|
|
||||||
def fake_show_none(meh, context, id):
|
def fake_show_none(meh, context, id):
|
||||||
raise NotFound
|
raise exception.ImageNotFound(image_id='bad_image_id')
|
||||||
|
|
||||||
self.stubs.Set(local.LocalImageService, 'detail', fake_detail)
|
self.stubs.Set(local.LocalImageService, 'detail', fake_detail)
|
||||||
# list all
|
# list all
|
||||||
@@ -308,7 +307,7 @@ class CloudTestCase(test.TestCase):
|
|||||||
self.stubs.UnsetAll()
|
self.stubs.UnsetAll()
|
||||||
self.stubs.Set(local.LocalImageService, 'show', fake_show_none)
|
self.stubs.Set(local.LocalImageService, 'show', fake_show_none)
|
||||||
self.stubs.Set(local.LocalImageService, 'show_by_name', fake_show_none)
|
self.stubs.Set(local.LocalImageService, 'show_by_name', fake_show_none)
|
||||||
self.assertRaises(NotFound, describe_images,
|
self.assertRaises(exception.ImageNotFound, describe_images,
|
||||||
self.context, ['ami-fake'])
|
self.context, ['ami-fake'])
|
||||||
|
|
||||||
def test_describe_image_attribute(self):
|
def test_describe_image_attribute(self):
|
||||||
@@ -445,6 +444,64 @@ class CloudTestCase(test.TestCase):
|
|||||||
self._create_key('test')
|
self._create_key('test')
|
||||||
self.cloud.delete_key_pair(self.context, 'test')
|
self.cloud.delete_key_pair(self.context, 'test')
|
||||||
|
|
||||||
|
def test_run_instances(self):
|
||||||
|
kwargs = {'image_id': FLAGS.default_image,
|
||||||
|
'instance_type': FLAGS.default_instance_type,
|
||||||
|
'max_count': 1}
|
||||||
|
run_instances = self.cloud.run_instances
|
||||||
|
result = run_instances(self.context, **kwargs)
|
||||||
|
instance = result['instancesSet'][0]
|
||||||
|
self.assertEqual(instance['imageId'], 'ami-00000001')
|
||||||
|
self.assertEqual(instance['displayName'], 'Server 1')
|
||||||
|
self.assertEqual(instance['instanceId'], 'i-00000001')
|
||||||
|
self.assertEqual(instance['instanceState']['name'], 'networking')
|
||||||
|
self.assertEqual(instance['instanceType'], 'm1.small')
|
||||||
|
|
||||||
|
def test_run_instances_image_state_none(self):
|
||||||
|
kwargs = {'image_id': FLAGS.default_image,
|
||||||
|
'instance_type': FLAGS.default_instance_type,
|
||||||
|
'max_count': 1}
|
||||||
|
run_instances = self.cloud.run_instances
|
||||||
|
|
||||||
|
def fake_show_no_state(self, context, id):
|
||||||
|
return {'id': 1, 'properties': {'kernel_id': 1, 'ramdisk_id': 1,
|
||||||
|
'type': 'machine'}}
|
||||||
|
|
||||||
|
self.stubs.UnsetAll()
|
||||||
|
self.stubs.Set(local.LocalImageService, 'show', fake_show_no_state)
|
||||||
|
self.assertRaises(exception.ApiError, run_instances,
|
||||||
|
self.context, **kwargs)
|
||||||
|
|
||||||
|
def test_run_instances_image_state_invalid(self):
|
||||||
|
kwargs = {'image_id': FLAGS.default_image,
|
||||||
|
'instance_type': FLAGS.default_instance_type,
|
||||||
|
'max_count': 1}
|
||||||
|
run_instances = self.cloud.run_instances
|
||||||
|
|
||||||
|
def fake_show_decrypt(self, context, id):
|
||||||
|
return {'id': 1, 'properties': {'kernel_id': 1, 'ramdisk_id': 1,
|
||||||
|
'type': 'machine', 'image_state': 'decrypting'}}
|
||||||
|
|
||||||
|
self.stubs.UnsetAll()
|
||||||
|
self.stubs.Set(local.LocalImageService, 'show', fake_show_decrypt)
|
||||||
|
self.assertRaises(exception.ApiError, run_instances,
|
||||||
|
self.context, **kwargs)
|
||||||
|
|
||||||
|
def test_run_instances_image_status_active(self):
|
||||||
|
kwargs = {'image_id': FLAGS.default_image,
|
||||||
|
'instance_type': FLAGS.default_instance_type,
|
||||||
|
'max_count': 1}
|
||||||
|
run_instances = self.cloud.run_instances
|
||||||
|
|
||||||
|
def fake_show_stat_active(self, context, id):
|
||||||
|
return {'id': 1, 'properties': {'kernel_id': 1, 'ramdisk_id': 1,
|
||||||
|
'type': 'machine'}, 'status': 'active'}
|
||||||
|
|
||||||
|
self.stubs.Set(local.LocalImageService, 'show', fake_show_stat_active)
|
||||||
|
|
||||||
|
result = run_instances(self.context, **kwargs)
|
||||||
|
self.assertEqual(len(result['instancesSet']), 1)
|
||||||
|
|
||||||
def test_terminate_instances(self):
|
def test_terminate_instances(self):
|
||||||
inst1 = db.instance_create(self.context, {'reservation_id': 'a',
|
inst1 = db.instance_create(self.context, {'reservation_id': 'a',
|
||||||
'image_ref': 1,
|
'image_ref': 1,
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
import copy
|
||||||
import eventlet
|
import eventlet
|
||||||
import mox
|
import mox
|
||||||
import os
|
import os
|
||||||
@@ -125,6 +126,7 @@ class CacheConcurrencyTestCase(test.TestCase):
|
|||||||
|
|
||||||
|
|
||||||
class LibvirtConnTestCase(test.TestCase):
|
class LibvirtConnTestCase(test.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(LibvirtConnTestCase, self).setUp()
|
super(LibvirtConnTestCase, self).setUp()
|
||||||
connection._late_load_cheetah()
|
connection._late_load_cheetah()
|
||||||
@@ -207,6 +209,29 @@ class LibvirtConnTestCase(test.TestCase):
|
|||||||
self.mox.StubOutWithMock(connection.LibvirtConnection, '_conn')
|
self.mox.StubOutWithMock(connection.LibvirtConnection, '_conn')
|
||||||
connection.LibvirtConnection._conn = fake
|
connection.LibvirtConnection._conn = fake
|
||||||
|
|
||||||
|
def fake_lookup(self, instance_name):
|
||||||
|
|
||||||
|
class FakeVirtDomain(object):
|
||||||
|
|
||||||
|
def snapshotCreateXML(self, *args):
|
||||||
|
return None
|
||||||
|
|
||||||
|
def XMLDesc(self, *args):
|
||||||
|
return """
|
||||||
|
<domain type='kvm'>
|
||||||
|
<devices>
|
||||||
|
<disk type='file'>
|
||||||
|
<source file='filename'/>
|
||||||
|
</disk>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
||||||
|
"""
|
||||||
|
|
||||||
|
return FakeVirtDomain()
|
||||||
|
|
||||||
|
def fake_execute(self, *args):
|
||||||
|
open(args[-1], "a").close()
|
||||||
|
|
||||||
def create_service(self, **kwargs):
|
def create_service(self, **kwargs):
|
||||||
service_ref = {'host': kwargs.get('host', 'dummy'),
|
service_ref = {'host': kwargs.get('host', 'dummy'),
|
||||||
'binary': 'nova-compute',
|
'binary': 'nova-compute',
|
||||||
@@ -283,38 +308,11 @@ class LibvirtConnTestCase(test.TestCase):
|
|||||||
self._check_xml_and_container(instance_data)
|
self._check_xml_and_container(instance_data)
|
||||||
|
|
||||||
def test_snapshot(self):
|
def test_snapshot(self):
|
||||||
|
if not self.lazy_load_library_exists():
|
||||||
|
return
|
||||||
|
|
||||||
FLAGS.image_service = 'nova.image.fake.FakeImageService'
|
FLAGS.image_service = 'nova.image.fake.FakeImageService'
|
||||||
|
|
||||||
# Only file-based instance storages are supported at the moment
|
|
||||||
test_xml = """
|
|
||||||
<domain type='kvm'>
|
|
||||||
<devices>
|
|
||||||
<disk type='file'>
|
|
||||||
<source file='filename'/>
|
|
||||||
</disk>
|
|
||||||
</devices>
|
|
||||||
</domain>
|
|
||||||
"""
|
|
||||||
|
|
||||||
class FakeVirtDomain(object):
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def snapshotCreateXML(self, *args):
|
|
||||||
return None
|
|
||||||
|
|
||||||
def XMLDesc(self, *args):
|
|
||||||
return test_xml
|
|
||||||
|
|
||||||
def fake_lookup(instance_name):
|
|
||||||
if instance_name == instance_ref.name:
|
|
||||||
return FakeVirtDomain()
|
|
||||||
|
|
||||||
def fake_execute(*args):
|
|
||||||
# Touch filename to pass 'with open(out_path)'
|
|
||||||
open(args[-1], "a").close()
|
|
||||||
|
|
||||||
# Start test
|
# Start test
|
||||||
image_service = utils.import_object(FLAGS.image_service)
|
image_service = utils.import_object(FLAGS.image_service)
|
||||||
|
|
||||||
@@ -330,9 +328,49 @@ class LibvirtConnTestCase(test.TestCase):
|
|||||||
recv_meta = image_service.create(context, sent_meta)
|
recv_meta = image_service.create(context, sent_meta)
|
||||||
|
|
||||||
self.mox.StubOutWithMock(connection.LibvirtConnection, '_conn')
|
self.mox.StubOutWithMock(connection.LibvirtConnection, '_conn')
|
||||||
connection.LibvirtConnection._conn.lookupByName = fake_lookup
|
connection.LibvirtConnection._conn.lookupByName = self.fake_lookup
|
||||||
self.mox.StubOutWithMock(connection.utils, 'execute')
|
self.mox.StubOutWithMock(connection.utils, 'execute')
|
||||||
connection.utils.execute = fake_execute
|
connection.utils.execute = self.fake_execute
|
||||||
|
|
||||||
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
|
conn = connection.LibvirtConnection(False)
|
||||||
|
conn.snapshot(instance_ref, recv_meta['id'])
|
||||||
|
|
||||||
|
snapshot = image_service.show(context, recv_meta['id'])
|
||||||
|
self.assertEquals(snapshot['properties']['image_state'], 'available')
|
||||||
|
self.assertEquals(snapshot['status'], 'active')
|
||||||
|
self.assertEquals(snapshot['name'], snapshot_name)
|
||||||
|
|
||||||
|
def test_snapshot_no_image_architecture(self):
|
||||||
|
if not self.lazy_load_library_exists():
|
||||||
|
return
|
||||||
|
|
||||||
|
FLAGS.image_service = 'nova.image.fake.FakeImageService'
|
||||||
|
|
||||||
|
# Start test
|
||||||
|
image_service = utils.import_object(FLAGS.image_service)
|
||||||
|
|
||||||
|
# Assign image_ref = 2 from nova/images/fakes for testing different
|
||||||
|
# base image
|
||||||
|
test_instance = copy.deepcopy(self.test_instance)
|
||||||
|
test_instance["image_ref"] = "2"
|
||||||
|
|
||||||
|
# Assuming that base image already exists in image_service
|
||||||
|
instance_ref = db.instance_create(self.context, test_instance)
|
||||||
|
properties = {'instance_id': instance_ref['id'],
|
||||||
|
'user_id': str(self.context.user_id)}
|
||||||
|
snapshot_name = 'test-snap'
|
||||||
|
sent_meta = {'name': snapshot_name, 'is_public': False,
|
||||||
|
'status': 'creating', 'properties': properties}
|
||||||
|
# Create new image. It will be updated in snapshot method
|
||||||
|
# To work with it from snapshot, the single image_service is needed
|
||||||
|
recv_meta = image_service.create(context, sent_meta)
|
||||||
|
|
||||||
|
self.mox.StubOutWithMock(connection.LibvirtConnection, '_conn')
|
||||||
|
connection.LibvirtConnection._conn.lookupByName = self.fake_lookup
|
||||||
|
self.mox.StubOutWithMock(connection.utils, 'execute')
|
||||||
|
connection.utils.execute = self.fake_execute
|
||||||
|
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
@@ -724,6 +762,31 @@ class LibvirtConnTestCase(test.TestCase):
|
|||||||
super(LibvirtConnTestCase, self).tearDown()
|
super(LibvirtConnTestCase, self).tearDown()
|
||||||
|
|
||||||
|
|
||||||
|
class NWFilterFakes:
|
||||||
|
def __init__(self):
|
||||||
|
self.filters = {}
|
||||||
|
|
||||||
|
def nwfilterLookupByName(self, name):
|
||||||
|
if name in self.filters:
|
||||||
|
return self.filters[name]
|
||||||
|
raise libvirt.libvirtError('Filter Not Found')
|
||||||
|
|
||||||
|
def filterDefineXMLMock(self, xml):
|
||||||
|
class FakeNWFilterInternal:
|
||||||
|
def __init__(self, parent, name):
|
||||||
|
self.name = name
|
||||||
|
self.parent = parent
|
||||||
|
|
||||||
|
def undefine(self):
|
||||||
|
del self.parent.filters[self.name]
|
||||||
|
pass
|
||||||
|
tree = xml_to_tree(xml)
|
||||||
|
name = tree.get('name')
|
||||||
|
if name not in self.filters:
|
||||||
|
self.filters[name] = FakeNWFilterInternal(self, name)
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
class IptablesFirewallTestCase(test.TestCase):
|
class IptablesFirewallTestCase(test.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(IptablesFirewallTestCase, self).setUp()
|
super(IptablesFirewallTestCase, self).setUp()
|
||||||
@@ -741,6 +804,20 @@ class IptablesFirewallTestCase(test.TestCase):
|
|||||||
self.fw = firewall.IptablesFirewallDriver(
|
self.fw = firewall.IptablesFirewallDriver(
|
||||||
get_connection=lambda: self.fake_libvirt_connection)
|
get_connection=lambda: self.fake_libvirt_connection)
|
||||||
|
|
||||||
|
def lazy_load_library_exists(self):
|
||||||
|
"""check if libvirt is available."""
|
||||||
|
# try to connect libvirt. if fail, skip test.
|
||||||
|
try:
|
||||||
|
import libvirt
|
||||||
|
import libxml2
|
||||||
|
except ImportError:
|
||||||
|
return False
|
||||||
|
global libvirt
|
||||||
|
libvirt = __import__('libvirt')
|
||||||
|
connection.libvirt = __import__('libvirt')
|
||||||
|
connection.libxml2 = __import__('libxml2')
|
||||||
|
return True
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
self.manager.delete_project(self.project)
|
self.manager.delete_project(self.project)
|
||||||
self.manager.delete_user(self.user)
|
self.manager.delete_user(self.user)
|
||||||
@@ -946,6 +1023,40 @@ class IptablesFirewallTestCase(test.TestCase):
|
|||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
self.fw.do_refresh_security_group_rules("fake")
|
self.fw.do_refresh_security_group_rules("fake")
|
||||||
|
|
||||||
|
def test_unfilter_instance_undefines_nwfilter(self):
|
||||||
|
# Skip if non-libvirt environment
|
||||||
|
if not self.lazy_load_library_exists():
|
||||||
|
return
|
||||||
|
|
||||||
|
admin_ctxt = context.get_admin_context()
|
||||||
|
|
||||||
|
fakefilter = NWFilterFakes()
|
||||||
|
self.fw.nwfilter._conn.nwfilterDefineXML =\
|
||||||
|
fakefilter.filterDefineXMLMock
|
||||||
|
self.fw.nwfilter._conn.nwfilterLookupByName =\
|
||||||
|
fakefilter.nwfilterLookupByName
|
||||||
|
|
||||||
|
instance_ref = self._create_instance_ref()
|
||||||
|
inst_id = instance_ref['id']
|
||||||
|
instance = db.instance_get(self.context, inst_id)
|
||||||
|
|
||||||
|
ip = '10.11.12.13'
|
||||||
|
network_ref = db.project_get_network(self.context, 'fake')
|
||||||
|
fixed_ip = {'address': ip, 'network_id': network_ref['id']}
|
||||||
|
db.fixed_ip_create(admin_ctxt, fixed_ip)
|
||||||
|
db.fixed_ip_update(admin_ctxt, ip, {'allocated': True,
|
||||||
|
'instance_id': inst_id})
|
||||||
|
self.fw.setup_basic_filtering(instance)
|
||||||
|
self.fw.prepare_instance_filter(instance)
|
||||||
|
self.fw.apply_instance_filter(instance)
|
||||||
|
original_filter_count = len(fakefilter.filters)
|
||||||
|
self.fw.unfilter_instance(instance)
|
||||||
|
|
||||||
|
# should undefine just the instance filter
|
||||||
|
self.assertEqual(original_filter_count - len(fakefilter.filters), 1)
|
||||||
|
|
||||||
|
db.instance_destroy(admin_ctxt, instance_ref['id'])
|
||||||
|
|
||||||
|
|
||||||
class NWFilterTestCase(test.TestCase):
|
class NWFilterTestCase(test.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
@@ -1122,3 +1233,37 @@ class NWFilterTestCase(test.TestCase):
|
|||||||
network_info,
|
network_info,
|
||||||
"fake")
|
"fake")
|
||||||
self.assertEquals(len(result), 3)
|
self.assertEquals(len(result), 3)
|
||||||
|
|
||||||
|
def test_unfilter_instance_undefines_nwfilters(self):
|
||||||
|
admin_ctxt = context.get_admin_context()
|
||||||
|
|
||||||
|
fakefilter = NWFilterFakes()
|
||||||
|
self.fw._conn.nwfilterDefineXML = fakefilter.filterDefineXMLMock
|
||||||
|
self.fw._conn.nwfilterLookupByName = fakefilter.nwfilterLookupByName
|
||||||
|
|
||||||
|
instance_ref = self._create_instance()
|
||||||
|
inst_id = instance_ref['id']
|
||||||
|
|
||||||
|
self.security_group = self.setup_and_return_security_group()
|
||||||
|
|
||||||
|
db.instance_add_security_group(self.context, inst_id,
|
||||||
|
self.security_group.id)
|
||||||
|
|
||||||
|
instance = db.instance_get(self.context, inst_id)
|
||||||
|
|
||||||
|
ip = '10.11.12.13'
|
||||||
|
network_ref = db.project_get_network(self.context, 'fake')
|
||||||
|
fixed_ip = {'address': ip, 'network_id': network_ref['id']}
|
||||||
|
db.fixed_ip_create(admin_ctxt, fixed_ip)
|
||||||
|
db.fixed_ip_update(admin_ctxt, ip, {'allocated': True,
|
||||||
|
'instance_id': inst_id})
|
||||||
|
self.fw.setup_basic_filtering(instance)
|
||||||
|
self.fw.prepare_instance_filter(instance)
|
||||||
|
self.fw.apply_instance_filter(instance)
|
||||||
|
original_filter_count = len(fakefilter.filters)
|
||||||
|
self.fw.unfilter_instance(instance)
|
||||||
|
|
||||||
|
# should undefine 2 filters: instance and instance-secgroup
|
||||||
|
self.assertEqual(original_filter_count - len(fakefilter.filters), 2)
|
||||||
|
|
||||||
|
db.instance_destroy(admin_ctxt, instance_ref['id'])
|
||||||
|
|||||||
@@ -42,20 +42,6 @@ def stubout_instance_snapshot(stubs):
|
|||||||
|
|
||||||
stubs.Set(vm_utils.VMHelper, 'fetch_image', fake_fetch_image)
|
stubs.Set(vm_utils.VMHelper, 'fetch_image', fake_fetch_image)
|
||||||
|
|
||||||
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):
|
def fake_parse_xmlrpc_value(val):
|
||||||
return val
|
return val
|
||||||
|
|
||||||
@@ -251,10 +237,10 @@ class FakeSessionForMigrationTests(fake.SessionBase):
|
|||||||
def __init__(self, uri):
|
def __init__(self, uri):
|
||||||
super(FakeSessionForMigrationTests, self).__init__(uri)
|
super(FakeSessionForMigrationTests, self).__init__(uri)
|
||||||
|
|
||||||
def VDI_get_by_uuid(*args):
|
def VDI_get_by_uuid(self, *args):
|
||||||
return 'hurr'
|
return 'hurr'
|
||||||
|
|
||||||
def VDI_resize_online(*args):
|
def VDI_resize_online(self, *args):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def VM_start(self, _1, ref, _2, _3):
|
def VM_start(self, _1, ref, _2, _3):
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ def WrapTwistedOptions(wrapped):
|
|||||||
self._absorbParameters()
|
self._absorbParameters()
|
||||||
self._absorbHandlers()
|
self._absorbHandlers()
|
||||||
|
|
||||||
super(TwistedOptionsToFlags, self).__init__()
|
wrapped.__init__(self)
|
||||||
|
|
||||||
def _absorbFlags(self):
|
def _absorbFlags(self):
|
||||||
twistd_flags = []
|
twistd_flags = []
|
||||||
@@ -163,12 +163,12 @@ def WrapTwistedOptions(wrapped):
|
|||||||
def parseArgs(self, *args):
|
def parseArgs(self, *args):
|
||||||
# TODO(termie): figure out a decent way of dealing with args
|
# TODO(termie): figure out a decent way of dealing with args
|
||||||
#return
|
#return
|
||||||
super(TwistedOptionsToFlags, self).parseArgs(*args)
|
wrapped.parseArgs(self, *args)
|
||||||
|
|
||||||
def postOptions(self):
|
def postOptions(self):
|
||||||
self._doHandlers()
|
self._doHandlers()
|
||||||
|
|
||||||
super(TwistedOptionsToFlags, self).postOptions()
|
wrapped.postOptions(self)
|
||||||
|
|
||||||
def __getitem__(self, key):
|
def __getitem__(self, key):
|
||||||
key = key.replace('-', '_')
|
key = key.replace('-', '_')
|
||||||
|
|||||||
Reference in New Issue
Block a user