diff options
| author | Jenkins <jenkins@review.openstack.org> | 2012-02-06 17:29:45 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2012-02-06 17:29:45 +0000 |
| commit | f6d09254bbf67c38d64c3e622d914e1cea152668 (patch) | |
| tree | a7a66f2eb48c0ac7291047c9a8dc84af0bcaeb89 /nova/virt | |
| parent | a86f921d49b49d722fb7220b8fee8a1218d74959 (diff) | |
| parent | 94d8553201e50e3e9e25992bfe4735addae4ffda (diff) | |
Merge "Add initiator to initialize_connection"
Diffstat (limited to 'nova/virt')
| -rw-r--r-- | nova/virt/driver.py | 14 | ||||
| -rw-r--r-- | nova/virt/fake.py | 3 | ||||
| -rw-r--r-- | nova/virt/libvirt/connection.py | 16 | ||||
| -rw-r--r-- | nova/virt/libvirt/utils.py | 10 | ||||
| -rw-r--r-- | nova/virt/vmwareapi_conn.py | 9 | ||||
| -rw-r--r-- | nova/virt/xenapi_conn.py | 15 |
6 files changed, 65 insertions, 2 deletions
diff --git a/nova/virt/driver.py b/nova/virt/driver.py index e726f7933..d87a7286a 100644 --- a/nova/virt/driver.py +++ b/nova/virt/driver.py @@ -623,3 +623,17 @@ class ComputeDriver(object): the cache and remove images which are no longer of interest. """ raise NotImplementedError() + + def get_volume_connector(self, instance): + """ + Get connector information for the instance for attaching to volumes. + + Connector information is a dictionary representing the ip of the + machine that will be making the connection and and the name of the + iscsi initiator as follows: + { + 'ip': ip, + 'initiator': initiator, + } + """ + raise NotImplementedError() diff --git a/nova/virt/fake.py b/nova/virt/fake.py index 780d644eb..ff8da4724 100644 --- a/nova/virt/fake.py +++ b/nova/virt/fake.py @@ -301,3 +301,6 @@ class FakeConnection(driver.ComputeDriver): def get_disk_available_least(self): """ """ pass + + def get_volume_connector(self, instance): + return {'ip': '127.0.0.1', 'initiator': 'fake'} diff --git a/nova/virt/libvirt/connection.py b/nova/virt/libvirt/connection.py index f56e45df4..37ad07736 100644 --- a/nova/virt/libvirt/connection.py +++ b/nova/virt/libvirt/connection.py @@ -188,6 +188,7 @@ class LibvirtConnection(driver.ComputeDriver): super(LibvirtConnection, self).__init__() self._host_state = None + self._initiator = None self._wrapped_conn = None self.container = None self.read_only = read_only @@ -425,6 +426,16 @@ class LibvirtConnection(driver.ComputeDriver): if os.path.exists(target): shutil.rmtree(target) + def get_volume_connector(self, _instance): + if not self._initiator: + self._initiator = libvirt_utils.get_iscsi_initiator() + if not self._initiator: + LOG.warn(_('Could not determine iscsi initiator name')) + return { + 'ip': FLAGS.my_ip, + 'initiator': self._initiator, + } + def volume_driver_method(self, method_name, connection_info, *args, **kwargs): driver_type = connection_info.get('driver_volume_type') @@ -724,7 +735,7 @@ class LibvirtConnection(driver.ComputeDriver): if virsh_output.startswith('/dev/'): LOG.info(_("cool, it's a device")) out, err = utils.execute('dd', - "if=%s" % virsh_output, + 'if=%s' % virsh_output, 'iflag=nonblock', run_as_root=True, check_exit_code=False) @@ -753,7 +764,8 @@ class LibvirtConnection(driver.ComputeDriver): if FLAGS.libvirt_type == 'xen': # Xen is special - virsh_output = utils.execute('virsh', 'ttyconsole', + virsh_output = utils.execute('virsh', + 'ttyconsole', instance['name']) data = self._flush_xen_console(virsh_output) fpath = self._append_to_file(data, console_log) diff --git a/nova/virt/libvirt/utils.py b/nova/virt/libvirt/utils.py index 4409e6aa6..f96128124 100644 --- a/nova/virt/libvirt/utils.py +++ b/nova/virt/libvirt/utils.py @@ -44,6 +44,16 @@ def execute(*args, **kwargs): return utils.execute(*args, **kwargs) +def get_iscsi_initiator(): + """Get iscsi initiator name for this machine""" + # NOTE(vish) openiscsi stores initiator name in a file that + # needs root permission to read. + contents = utils.read_file_as_root('/etc/iscsi/initiatorname.iscsi') + for l in contents.split('\n'): + if l.startswith('InitiatorName='): + return l[l.index('=') + 1:].strip() + + def create_image(disk_format, path, size): """Create a disk image diff --git a/nova/virt/vmwareapi_conn.py b/nova/virt/vmwareapi_conn.py index c63f1e9d5..909969fac 100644 --- a/nova/virt/vmwareapi_conn.py +++ b/nova/virt/vmwareapi_conn.py @@ -178,6 +178,15 @@ class VMWareESXConnection(driver.ComputeDriver): """Return link to instance's ajax console.""" return self._vmops.get_ajax_console(instance) + def get_volume_connector(self, _instance): + """Return volume connector information""" + # TODO(vish): When volume attaching is supported, return the + # proper initiator iqn. + return { + 'ip': FLAGS.vmwareapi_host_ip, + 'initiator': None + } + def attach_volume(self, connection_info, instance_name, mountpoint): """Attach volume storage to VM instance.""" pass diff --git a/nova/virt/xenapi_conn.py b/nova/virt/xenapi_conn.py index 236bd4762..26e36b911 100644 --- a/nova/virt/xenapi_conn.py +++ b/nova/virt/xenapi_conn.py @@ -179,6 +179,7 @@ class XenAPIConnection(driver.ComputeDriver): self._host_state = None self._product_version = self._session.get_product_version() self._vmops = VMOps(self._session, self._product_version) + self._initiator = None @property def host_state(self): @@ -348,6 +349,20 @@ class XenAPIConnection(driver.ComputeDriver): """Return link to instance's ajax console""" return self._vmops.get_vnc_console(instance) + def get_volume_connector(self, _instance): + """Return volume connector information""" + if not self._initiator: + stats = self.get_host_stats(update=True) + try: + self._initiator = stats['host_other-config']['iscsi_iqn'] + except (TypeError, KeyError): + LOG.warn(_('Could not determine iscsi initiator name')) + self._initiator = None + return { + 'ip': self.get_host_ip_addr(), + 'initiator': self._initiator + } + @staticmethod def get_host_ip_addr(): xs_url = urlparse.urlparse(FLAGS.xenapi_connection_url) |
