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('vpn_start', '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('libvirt_type', 'nova.virt.libvirt.connection') | ||||
| flags.DEFINE_flag(flags.HelpFlag()) | ||||
| @@ -545,13 +546,10 @@ class FloatingIpCommands(object): | ||||
| class NetworkCommands(object): | ||||
|     """Class for managing networks.""" | ||||
|  | ||||
|     def create(self, fixed_range=None, num_networks=None, | ||||
|                network_size=None, vlan_start=None, | ||||
|                vpn_start=None, fixed_range_v6=None, label='public'): | ||||
|         """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]""" | ||||
|     def create(self, fixed_range=None, num_networks=None, network_size=None, | ||||
|             vlan_start=None, vpn_start=None, fixed_range_v6=None, | ||||
|             gateway_v6=None, label='public'): | ||||
|         """Creates fixed ips for host by range""" | ||||
|         if not fixed_range: | ||||
|             msg = _('Fixed range in the form of 10.0.0.0/8 is ' | ||||
|                     'required to create networks.') | ||||
| @@ -567,6 +565,8 @@ class NetworkCommands(object): | ||||
|             vpn_start = FLAGS.vpn_start | ||||
|         if not 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) | ||||
|         try: | ||||
|             net_manager.create_networks(context.get_admin_context(), | ||||
| @@ -576,6 +576,7 @@ class NetworkCommands(object): | ||||
|                                         vlan_start=int(vlan_start), | ||||
|                                         vpn_start=int(vpn_start), | ||||
|                                         cidr_v6=fixed_range_v6, | ||||
|                                         gateway_v6=gateway_v6, | ||||
|                                         label=label) | ||||
|         except ValueError, e: | ||||
|             print e | ||||
| @@ -1081,24 +1082,35 @@ class ImageCommands(object): | ||||
|         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 = [ | ||||
|     ('user', UserCommands), | ||||
|     ('account', AccountCommands), | ||||
|     ('project', ProjectCommands), | ||||
|     ('role', RoleCommands), | ||||
|     ('shell', ShellCommands), | ||||
|     ('vpn', VpnCommands), | ||||
|     ('fixed', FixedIpCommands), | ||||
|     ('floating', FloatingIpCommands), | ||||
|     ('network', NetworkCommands), | ||||
|     ('vm', VmCommands), | ||||
|     ('service', ServiceCommands), | ||||
|     ('config', ConfigCommands), | ||||
|     ('db', DbCommands), | ||||
|     ('volume', VolumeCommands), | ||||
|     ('fixed', FixedIpCommands), | ||||
|     ('flavor', InstanceTypeCommands), | ||||
|     ('floating', FloatingIpCommands), | ||||
|     ('instance_type', InstanceTypeCommands), | ||||
|     ('image', ImageCommands), | ||||
|     ('flavor', InstanceTypeCommands), | ||||
|     ('version', VersionCommands)] | ||||
|     ('network', NetworkCommands), | ||||
|     ('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): | ||||
|   | ||||
| @@ -26,17 +26,16 @@ from eventlet import greenthread | ||||
| from nova import context | ||||
| from nova import crypto | ||||
| from nova import db | ||||
| from nova import exception | ||||
| from nova import flags | ||||
| from nova import log as logging | ||||
| from nova import rpc | ||||
| from nova import test | ||||
| from nova import utils | ||||
| from nova import exception | ||||
| from nova.auth import manager | ||||
| from nova.api.ec2 import cloud | ||||
| from nova.api.ec2 import ec2utils | ||||
| from nova.image import local | ||||
| from nova.exception import NotFound | ||||
|  | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| @@ -68,7 +67,7 @@ class CloudTestCase(test.TestCase): | ||||
|  | ||||
|         def fake_show(meh, context, id): | ||||
|             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_by_name', fake_show) | ||||
| @@ -290,7 +289,7 @@ class CloudTestCase(test.TestCase): | ||||
|                     'type': 'machine'}}] | ||||
|  | ||||
|         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) | ||||
|         # list all | ||||
| @@ -308,7 +307,7 @@ class CloudTestCase(test.TestCase): | ||||
|         self.stubs.UnsetAll() | ||||
|         self.stubs.Set(local.LocalImageService, 'show', 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']) | ||||
|  | ||||
|     def test_describe_image_attribute(self): | ||||
| @@ -445,6 +444,64 @@ class CloudTestCase(test.TestCase): | ||||
|         self._create_key('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): | ||||
|         inst1 = db.instance_create(self.context, {'reservation_id': 'a', | ||||
|                                                   'image_ref': 1, | ||||
|   | ||||
| @@ -14,6 +14,7 @@ | ||||
| #    License for the specific language governing permissions and limitations | ||||
| #    under the License. | ||||
|  | ||||
| import copy | ||||
| import eventlet | ||||
| import mox | ||||
| import os | ||||
| @@ -125,6 +126,7 @@ class CacheConcurrencyTestCase(test.TestCase): | ||||
|  | ||||
|  | ||||
| class LibvirtConnTestCase(test.TestCase): | ||||
|  | ||||
|     def setUp(self): | ||||
|         super(LibvirtConnTestCase, self).setUp() | ||||
|         connection._late_load_cheetah() | ||||
| @@ -207,6 +209,29 @@ class LibvirtConnTestCase(test.TestCase): | ||||
|         self.mox.StubOutWithMock(connection.LibvirtConnection, '_conn') | ||||
|         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): | ||||
|         service_ref = {'host': kwargs.get('host', 'dummy'), | ||||
|                        'binary': 'nova-compute', | ||||
| @@ -283,38 +308,11 @@ class LibvirtConnTestCase(test.TestCase): | ||||
|         self._check_xml_and_container(instance_data) | ||||
|  | ||||
|     def test_snapshot(self): | ||||
|         if not self.lazy_load_library_exists(): | ||||
|             return | ||||
|  | ||||
|         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 | ||||
|         image_service = utils.import_object(FLAGS.image_service) | ||||
|  | ||||
| @@ -330,9 +328,49 @@ class LibvirtConnTestCase(test.TestCase): | ||||
|         recv_meta = image_service.create(context, sent_meta) | ||||
|  | ||||
|         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') | ||||
|         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() | ||||
|  | ||||
| @@ -724,6 +762,31 @@ class LibvirtConnTestCase(test.TestCase): | ||||
|         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): | ||||
|     def setUp(self): | ||||
|         super(IptablesFirewallTestCase, self).setUp() | ||||
| @@ -741,6 +804,20 @@ class IptablesFirewallTestCase(test.TestCase): | ||||
|         self.fw = firewall.IptablesFirewallDriver( | ||||
|                       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): | ||||
|         self.manager.delete_project(self.project) | ||||
|         self.manager.delete_user(self.user) | ||||
| @@ -946,6 +1023,40 @@ class IptablesFirewallTestCase(test.TestCase): | ||||
|         self.mox.ReplayAll() | ||||
|         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): | ||||
|     def setUp(self): | ||||
| @@ -1122,3 +1233,37 @@ class NWFilterTestCase(test.TestCase): | ||||
|                                                  network_info, | ||||
|                                                  "fake") | ||||
|         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) | ||||
|  | ||||
|     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 | ||||
|  | ||||
| @@ -251,10 +237,10 @@ class FakeSessionForMigrationTests(fake.SessionBase): | ||||
|     def __init__(self, uri): | ||||
|         super(FakeSessionForMigrationTests, self).__init__(uri) | ||||
|  | ||||
|     def VDI_get_by_uuid(*args): | ||||
|     def VDI_get_by_uuid(self, *args): | ||||
|         return 'hurr' | ||||
|  | ||||
|     def VDI_resize_online(*args): | ||||
|     def VDI_resize_online(self, *args): | ||||
|         pass | ||||
|  | ||||
|     def VM_start(self, _1, ref, _2, _3): | ||||
|   | ||||
| @@ -78,7 +78,7 @@ def WrapTwistedOptions(wrapped): | ||||
|             self._absorbParameters() | ||||
|             self._absorbHandlers() | ||||
|  | ||||
|             super(TwistedOptionsToFlags, self).__init__() | ||||
|             wrapped.__init__(self) | ||||
|  | ||||
|         def _absorbFlags(self): | ||||
|             twistd_flags = [] | ||||
| @@ -163,12 +163,12 @@ def WrapTwistedOptions(wrapped): | ||||
|         def parseArgs(self, *args): | ||||
|             # TODO(termie): figure out a decent way of dealing with args | ||||
|             #return | ||||
|             super(TwistedOptionsToFlags, self).parseArgs(*args) | ||||
|             wrapped.parseArgs(self, *args) | ||||
|  | ||||
|         def postOptions(self): | ||||
|             self._doHandlers() | ||||
|  | ||||
|             super(TwistedOptionsToFlags, self).postOptions() | ||||
|             wrapped.postOptions(self) | ||||
|  | ||||
|         def __getitem__(self, key): | ||||
|             key = key.replace('-', '_') | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Sandy Walsh
					Sandy Walsh