Advertisement
Guest User

Untitled

a guest
Jan 11th, 2017
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.70 KB | None | 0 0
  1. # This is just a sample script. It could use some logging.
  2.  
  3. from os_brick.initiator import connector as brick_connector
  4.  
  5. from cinderclient.v2 import client as cinder_client
  6. from cinderclient import service_catalog
  7.  
  8. DEFAULT_CINDER_CATALOG_INFO = 'volume:cinder:publicURL'
  9.  
  10.  
  11. class CinderVolumeInitiator(object):
  12.     """Used for requesting Cinder to expose/terminate connections."""
  13.     def __init__(self, creds, auth_url):
  14.         self.creds = creds
  15.         self.auth_url = auth_url
  16.  
  17.     def _get_cinderclient(self, http_retries=10,
  18.                           catalog_info=DEFAULT_CINDER_CATALOG_INFO,
  19.                           allow_insecure=True):
  20.         service_type, service_name, endpoint_type = catalog_info.split(':')
  21.  
  22.         c = cinder_client.Client(self.creds['username'],
  23.                                  self.creds['password'],
  24.                                  self.creds['tenant_name'],
  25.                                  auth_url=self.auth_url,
  26.                                  service_type=service_type,
  27.                                  service_name=service_name,
  28.                                  endpoint_type=endpoint_type,
  29.                                  insecure=allow_insecure,
  30.                                  retries=http_retries,
  31.                                  cacert=self.creds.get('cacert'))
  32.         # noauth extracts user_id:project_id from auth_token
  33.         c.client.auth_token = self.creds.get('auth_token',
  34.                                              '%s:%s' % (self.creds['username'],
  35.                                                         self.creds['password']))
  36.         c.client.management_url = self.auth_url
  37.         return c
  38.  
  39.     def initialize_connection(self, volume_id, connector, mode='rw'):
  40.         client = self._get_cinderclient()
  41.  
  42.         client.volumes.reserve(volume_id)
  43.         try:
  44.             connection_info = client.volumes.initialize_connection(volume_id, connector)
  45.             client.volumes.attach(volume_id, instance_uuid=None, mountpoint=None,
  46.                                   mode=mode, host_name=connector['host'])
  47.             return connection_info
  48.         except Exception:
  49.             client.volumes.unreserve(volume_id)
  50.             client.volumes.terminate_connection(volume_id, connector)
  51.             raise
  52.  
  53.     def terminate_connection(self, volume_id, connector):
  54.         client = self._get_cinderclient()
  55.         client.volumes.terminate_connection(volume_id, connector)
  56.         client.volumes.detach(volume_id)
  57.  
  58.  
  59. class CinderVolumeConnector(object):
  60.     # Uses the Cinder initiator to ensure volumes are presented to this host
  61.     # and sets up the actual connections using os-brick. This is platform
  62.     # independent.
  63.  
  64.     def __init__(self, initiator, initiator_ip, hostname,
  65.                  root_helper=None, use_multipath=True,
  66.                  device_scan_attempts=3):
  67.         # The root helper would not be needed on Windows.
  68.         self.initiator = initiator
  69.         self.initiator_ip = initiator_ip
  70.         self.hostname = hostname
  71.         self.root_helper = root_helper
  72.         self.use_multipath = use_multipath
  73.         self.scan_attempts = device_scan_attempts
  74.  
  75.     def _get_brick_connector_info(self):
  76.         conn = brick_connector.get_connector_properties(
  77.             root_helper=None,
  78.             my_ip=self.initiator_ip,
  79.             multipath=self.use_multipath,
  80.             # if multipath is requested, ensure it's honored.
  81.             enforce_multipath=True,
  82.             host=self.hostname)
  83.         return conn
  84.  
  85.     def _get_brick_connector(self, connection_info):
  86.         proto = connection_info.get('driver_volume_type')
  87.         conn = connector.InitiatorConnector.factory(
  88.             protocol=proto,
  89.             root_helper=self.root_helper,
  90.             use_multipath=self.use_multipath,
  91.             device_scan_attempts=self.scan_attempts)
  92.  
  93.     def connect(self, volume_id, mode='rw'):
  94.         connector_info = self._get_brick_connector_info()
  95.  
  96.         conn = None
  97.         try:
  98.             connection_info = self.initiator.initialize_connection(
  99.                 volume_id, connector_info, mode)
  100.             conn = self._get_brick_connector(connection_info)
  101.             # This dict will always contain a path, having the 'path' key.
  102.             device_info = conn.connect_volume(connection_info['data'])
  103.  
  104.             # You may want to store this attachment info.
  105.             attachment = dict(connection_info=connection_info,
  106.                               device_info=device_info,
  107.                               connector_info=connector_info)
  108.             return attachment
  109.         except Exception:
  110.             if conn:
  111.                 conn.disconnect_volume(connection_info['data'])
  112.             self.initiator.terminate_connection(volume_id,
  113.                                                 connector_info)
  114.  
  115.     def disconnect(self, volume_id, connection_info, connector_info=None):
  116.         connector_info = connector_info or self._get_brick_connector_info()
  117.         conn = self._get_brick_connector(connection_info)
  118.  
  119.         conn.disconnect_volume(connection_info)
  120.         self.initiator.terminate_connection(volume_id, connector_info)
  121.  
  122.  
  123. # Usage example:
  124. #
  125. # creds = dict(username='admin',
  126. #              password='Passw0rd',
  127. #              tenant_name='admin')
  128.  
  129. # auth_url = 'http://192.168.42.110:5000/v2.0'
  130.  
  131. # hostname =  'adcontroller'
  132. # initiator_ip = '192.168.42.159'
  133. # volume_id = '8ef424a4-2208-4e35-8d20-922938c6da2b'
  134.  
  135. # initiator = CinderVolumeInitiator(creds, auth_url)
  136.  
  137. # connector = CinderVolumeConnector(initiator, initiator_ip, hostname)
  138. # attachment = connector.connect(volume_id)
  139. # connector.disconnect(volume_id, attachment['connection_info'], attachment['connector_info'])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement