Exemplo n.º 1
0
 def handle_errors(self, response, key, object_type):
     if response.status_code == 400:
         error = response.json()
         err_msg = error.get('message')
         if err_msg.endswith(OBJ_NOT_FOUND_ERR):
             logging.warning(
                 "object %(key)s of type %(typ)s not found, "
                 "%(err_msg)s", {
                     'key': key,
                     'typ': object_type,
                     'err_msg': err_msg
                 })
             raise NotFound()
         elif err_msg == VOL_NOT_UNIQUE_ERR:
             logging.error("can't create 2 volumes with the same name, %s",
                           err_msg)
             msg = 'Volume by this name already exists'
             raise quarry_common.VolumeBackendAPIException(msg)
         elif err_msg == VOL_OBJ_NOT_FOUND_ERR:
             logging.error("Can't find volume to map %(key)s, %(msg)s", {
                 'key': key,
                 'msg': err_msg,
             })
             raise quarry_common.VolumeNotFound(key)
         elif ALREADY_MAPPED_ERR in err_msg:
             raise XtremIOAlreadyMappedError()
         elif err_msg == SYSTEM_BUSY:
             raise XtremIOArrayBusy()
         elif err_msg in (TOO_MANY_OBJECTS, TOO_MANY_SNAPSHOTS_PER_VOL):
             raise XtremIOSnapshotsLimitExceeded()
     msg = 'Bad response from XMS, %s' % response.text
     logging.error(msg)
     raise quarry_common.VolumeBackendAPIException(msg)
Exemplo n.º 2
0
 def _create_ig(self, name):
     # create an initiator group to hold the initiator
     data = {'ig-name': name}
     self.client.req('initiator-groups', 'POST', data)
     try:
         return self.client.req('initiator-groups', name=name)['content']
     except NotFound:
         raise quarry_common.VolumeBackendAPIException(
             "Failed to create IG, %s" % name)
Exemplo n.º 3
0
 def check_for_setup_error(self):
     try:
         name = self.client.req('clusters')['clusters'][0]['name']
         cluster = self.client.req('clusters', name=name)['content']
         version_text = cluster['sys-sw-version']
     except NotFound:
         msg = "XtremIO not initialized correctly, no clusters found"
         raise quarry_common.VolumeBackendAPIException(msg)
     ver = [int(n) for n in version_text.split('-')[0].split('.')]
     if ver < self.MIN_XMS_VERSION:
         msg = ('Invalid XtremIO version %(cur)s, version %(min)s or up '
                'is required') % {
                    'min': self.MIN_XMS_VERSION,
                    'cur': ver
                }
         logging.error(msg)
         raise quarry_common.VolumeBackendAPIException(msg)
     else:
         logging.info('XtremIO SW version %s', version_text)
     if ver[0] >= 4:
         self.client = XtremIOClient4(self.configuration, self.cluster_id)
Exemplo n.º 4
0
    def initialize_connection(self, volume, connector):
        try:
            sys = self.client.get_cluster()
        except NotFound:
            msg = "XtremIO not initialized correctly, no clusters found"
            raise quarry_common.VolumeBackendAPIException(msg)
        login_chap = (sys.get('chap-authentication-mode', 'disabled') !=
                      'disabled')
        discovery_chap = (sys.get('chap-discovery-mode', 'disabled') !=
                          'disabled')
        initiator_name = self._get_initiator_names(connector)[0]
        initiator = self.client.get_initiator(initiator_name)
        if initiator:
            login_passwd = initiator['chap-authentication-initiator-password']
            discovery_passwd = initiator['chap-discovery-initiator-password']
            ig = self._get_ig(initiator['ig-id'][XTREMIO_OID_NAME])
        else:
            ig = self._get_ig(self._get_ig_name(connector))
            if not ig:
                ig = self._create_ig(self._get_ig_name(connector))
            (login_passwd, discovery_passwd) = self._create_initiator(
                connector, login_chap, discovery_chap)
        # if CHAP was enabled after the initiator was created
        if login_chap and not login_passwd:
            logging.info('initiator has no password while using chap, '
                         'adding it')
            data = {}
            (login_passwd, d_passwd) = self._add_auth(
                data, login_chap, discovery_chap and not discovery_passwd)
            discovery_passwd = (discovery_passwd
                                if discovery_passwd else d_passwd)
            self.client.req('initiators', 'PUT', data, idx=initiator['index'])

        # lun mappping
        lunmap = self.create_lun_map(volume, ig['ig-id'][XTREMIO_OID_NAME])

        properties = self._get_iscsi_properties(lunmap)

        if login_chap:
            properties['auth_method'] = 'CHAP'
            properties['auth_username'] = '******'
            properties['auth_password'] = login_passwd
        if discovery_chap:
            properties['discovery_auth_method'] = 'CHAP'
            properties['discovery_auth_username'] = '******'
            properties['discovery_auth_password'] = discovery_passwd
        logging.debug('init conn params:\n%s', properties)
        return {'driver_volume_type': 'iscsi', 'data': properties}
Exemplo n.º 5
0
    def get_iscsi_portals(self):
        if self._portals:
            return self._portals

        iscsi_portals = [
            t['name'] for t in self.req('iscsi-portals')['iscsi-portals']
        ]
        for portal_name in iscsi_portals:
            try:
                self._portals.append(
                    self.req('iscsi-portals', name=portal_name)['content'])
            except NotFound:
                raise (quarry_common.VolumeBackendAPIException(
                    "iscsi portal, %s, not found") % portal_name)

        return self._portals
Exemplo n.º 6
0
 def get_targets(self):
     if not self._targets:
         try:
             target_list = self.client.req('targets')["targets"]
             targets = [
                 self.client.req('targets', name=target['name'])['content']
                 for target in target_list if '-fc' in target['name']
             ]
             self._targets = [
                 target['port-address'].replace(':', '')
                 for target in targets if target['port-state'] == 'up'
             ]
         except NotFound:
             raise quarry_common.VolumeBackendAPIException(
                 "Failed to get targets")
     return self._targets