Working with Hosts, Clusters and Mappings¶
InfiniSDK provides an easy interface to query and manipulate volume mappings to hosts.
Creating Hosts¶
Creating hosts is the same like creating any other management object through InfiniSDK. Hosts are represented by the Host
class:
>>> host = system.hosts.create(name='production01')
>>> host
<...:Host id=...>
>>> print(host.get_name())
production01
Adding/Removing FC Ports¶
Adding and removing FC ports can be done with infinisdk.infinibox.host.Host.add_port()
and infinisdk.infinibox.host.Host.remove_port()
. The address should be an instance of the infi.dtypes.wwn.WWN
class to denote an FC address:
>>> from infi.dtypes.wwn import WWN
>>> address = WWN('00:01:02:03:04:05:06:07')
>>> host.add_port(address)
>>> host.remove_port(address)
Adding/Removing iSCSI IQNs¶
Adding and removing iSCSI IQNs is done in a fashion similar to FC ports, only that the address in this case should be an instance of the infi.dtypes.iqn.iSCSIName class
:
>>> from infi.dtypes.iqn import make_iscsi_name
>>> address = make_iscsi_name('iqn.1994-05.com.redhat:8f8dcc647276')
>>> host.add_port(address)
>>> host.remove_port(address)
Querying Host by a Defined Port¶
You can quickly check if a system has a host system.hosts.get_host_id_by_initiator_address
, system.hosts.get_host_by_initiator_address
and system.hosts.has_registered_initiator_address
:
>>> system.hosts.has_registered_initiator_address(address)
False
>>> host.add_port(address)
>>> system.hosts.get_host_by_initiator_address(address) == host
True
Mapping and Unmapping Volumes and Snapshots¶
Given a volume object, we can easily map it to a host:
>>> lu = host.map_volume(volume)
The returned lu object
represents the volume mapping to the specific host, and it can be used to retrieve information about the mapping:
>>> print(int(lu))
1
Unmapping can be done in several ways. The easiest would be to call Host.unmap_volume()
:
>>> host.unmap_volume(volume)
Which can also receive a specific LUN to unmap:
>>> lu = host.map_volume(volume, lun=2)
>>> host.unmap_volume(lun=2)
The LUN can also be deleted directly through its accessor object:
>>> lu = host.map_volume(volume)
>>> lu.unmap()
Querying Volume Mappings¶
Iterating over available mappings of a host is fairly simple:
>>> lu = host.map_volume(volume, lun=5)
>>> host.get_luns()
<LogicalUnitsContainer: [<LUN 5: <...:Host id=...>-><...:Volume id=...>>]>
>>> for lun in host.get_luns():
... print("{} is mapped to {}".format(lun, lun.volume))
<LUN 5: <...:Host id=...>-><...:Volume id=...>> is mapped to <...:Volume id=...>
There is also a shortcut to iterate over all mappings in the entire system:
>>> for lun in system.luns:
... print("{} belongs to {} and is mapped to {}".format(lun, lun.mapping_object, lun.volume))
<LUN 5: <...:Host id=...>-><...:Volume id=...>> belongs to <...:Host id=...> and is mapped to <...:Volume id=...>
Here is a code snippet to unmap all volumes in the system that contain ‘to remove’ in their names:
>>> import itertools
>>> volume.update_name('this is a volume to remove')
>>> for mapping_object in itertools.chain(system.host_clusters, system.hosts):
... for lun in mapping_object.get_luns():
... if 'to remove' in lun.volume.get_name():
... print("Unmapping", lun.volume)
... lun.unmap()
Unmapping <...:Volume id=...>
Of course there is a much more convenient shortcut for unmapping a volume from all hosts, using the Volume.unmap()
shortcut:
>>> lu = host.map_volume(volume)
>>> host.is_volume_mapped(volume)
True
>>> volume.unmap()
>>> host.invalidate_cache()
>>> host.is_volume_mapped(volume)
False
Clusters and Hosts¶
Manipulating clusters is done with the infinisdk.infinibox.host_cluster.HostCluster
class:
>>> cluster = system.host_clusters.create()
>>> cluster.add_host(host)
>>> lu = cluster.map_volume(volume)
>>> host.invalidate_cache()
>>> [host_lu] = host.get_luns()
>>> host_lu
<LUN 11: <...:Host id=...>-><...:Volume id=...>>
>>> host_lu.is_clustered()
True