Ejemplo n.º 1
0
    def update_migrated_volume(self, ctxt, volume, new_volume,
                               original_volume_status):
        new_name = huawei_utils.encode_name(volume.id)
        org_metadata = huawei_utils.get_volume_private_data(volume)
        new_metadata = huawei_utils.get_volume_private_data(new_volume)

        try:
            if org_metadata.get('huawei_sn') == new_metadata.get('huawei_sn'):
                self.local_cli.rename_lun(org_metadata['huawei_lun_id'],
                                          new_name[:-4] + '-org')
            self.local_cli.rename_lun(new_metadata['huawei_lun_id'],
                                      new_name,
                                      description=volume.name)
        except Exception:
            LOG.exception('Unable to rename lun %(id)s to %(name)s.', {
                'id': new_metadata['huawei_lun_id'],
                'name': new_name
            })
            return {
                '_name_id': new_volume.name_id,
                'provider_location': huawei_utils.to_string(**new_metadata)
            }

        LOG.info("Successfully rename lun %(id)s to %(name)s.", {
            'id': new_metadata['huawei_lun_id'],
            'name': new_name
        })

        return {
            '_name_id': None,
            'provider_location': huawei_utils.to_string(**new_metadata)
        }
Ejemplo n.º 2
0
    def _create_group_snapshot(self, snapshots):
        snapshots_model_update = []
        created_snapshots = []

        for snapshot in snapshots:
            try:
                snapshot_id, snapshot_wwn = huawei_flow.create_snapshot(
                    snapshot, self.local_cli, self.support_capability)
            except Exception:
                LOG.exception("Failed to create snapshot %s of group.",
                              snapshot.id)
                for snap_id in created_snapshots:
                    self.local_cli.delete_snapshot(snap_id)
                raise

            location = huawei_utils.to_string(huawei_snapshot_id=snapshot_id,
                                              huawei_snapshot_wwn=snapshot_wwn)
            snap_model_update = {
                'id': snapshot.id,
                'status': fields.SnapshotStatus.AVAILABLE,
                'provider_location': location,
            }
            snapshots_model_update.append(snap_model_update)
            created_snapshots.append(snapshot_id)

        try:
            self.local_cli.activate_snapshot(created_snapshots)
        except Exception:
            LOG.exception("Failed to activate group snapshots %s.",
                          created_snapshots)
            for snap_id in created_snapshots:
                self.local_cli.delete_snapshot(snap_id)
            raise

        return snapshots_model_update
Ejemplo n.º 3
0
    def manage_existing_snapshot(self, snapshot, existing_ref):
        snapshot_id, snapshot_wwn = huawei_flow.manage_existing_snapshot(
            snapshot, existing_ref, self.local_cli)

        location = huawei_utils.to_string(huawei_snapshot_id=snapshot_id,
                                          huawei_snapshot_wwn=snapshot_wwn)
        return {'provider_location': location}
Ejemplo n.º 4
0
    def _fail_op(self, volumes, status_check_func, fail_group_func,
                 fail_pair_func):
        (normal_volumes, group_ids, pair_ids,
         volume_pair_infos) = self._pre_fail_check(volumes, status_check_func)

        for group in group_ids:
            fail_group_func(group)

        for pair in pair_ids:
            fail_pair_func(pair)

        volumes_update = []
        for v in volumes:
            if v.id in normal_volumes:
                LOG.warning("Volume %s doesn't have replication.", v.id)
                continue

            rmt_lun_id = volume_pair_infos[v.id]['LOCALRESID']
            rmt_lun_info = self.rmt_client.get_lun_info_by_id(rmt_lun_id)
            location = huawei_utils.to_string(
                huawei_lun_id=rmt_lun_id,
                huawei_lun_wwn=rmt_lun_info['WWN'],
                huawei_sn=self.rmt_client.device_id,
            )

            volume_update = {'volume_id': v.id}
            volume_update['updates'] = {
                'provider_location': location,
            }

            volumes_update.append(volume_update)

        return volumes_update
Ejemplo n.º 5
0
    def failover(self, volumes):
        """Failover volumes back to secondary array.

        Split the replication pairs and make the secondary LUNs R&W.
        """
        volumes_update = []
        cgid_list = set()
        replicacg = ReplicaCG(self.local_client, self.rmt_client, self.conf)
        for v in volumes:
            v_update = {}
            v_update['volume_id'] = v.id
            drv_data = get_replication_driver_data(v)
            pair_id = drv_data.get('pair_id')
            if not pair_id:
                LOG.warning(_LW("No pair id in volume %s."), v.id)
                v_update['updates'] = {'replication_status': 'error'}
                volumes_update.append(v_update)
                continue

            rmt_lun_id = drv_data.get('rmt_lun_id')
            if not rmt_lun_id:
                LOG.warning(_LW("No remote lun id in volume %s."), v.id)
                v_update['updates'] = {'replication_status': 'error'}
                volumes_update.append(v_update)
                continue

            replica_info = self.rmt_op.get_replica_info(pair_id)
            consisgroup_id = replica_info.get('CGID')
            if consisgroup_id:
                if consisgroup_id not in cgid_list:
                    replicacg.failover(consisgroup_id)
                    cgid_list.add(consisgroup_id)
            else:
                self.rmt_driver.failover(pair_id)

            local_metadata = huawei_utils.get_lun_metadata(v)
            new_drv_data = to_string({
                'pair_id':
                pair_id,
                'huawei_sn':
                local_metadata.get('huawei_sn'),
                'rmt_lun_id':
                local_metadata.get('huawei_lun_id'),
                'rmt_lun_wwn':
                local_metadata.get('huawei_lun_wwn')
            })
            location = huawei_utils.to_string(
                huawei_lun_id=rmt_lun_id,
                huawei_sn=drv_data.get('huawei_sn'),
                huawei_lun_wwn=drv_data.get('rmt_lun_wwn'))

            v_update['updates'] = {
                'provider_location': location,
                'replication_status': 'failed-over',
                'replication_driver_data': new_drv_data
            }
            volumes_update.append(v_update)

        return volumes_update
Ejemplo n.º 6
0
    def create_snapshot(self, snapshot):
        snapshot_id, snapshot_wwn = huawei_flow.create_snapshot(
            snapshot, self.local_cli, self.support_capability)
        self.local_cli.activate_snapshot(snapshot_id)

        location = huawei_utils.to_string(huawei_snapshot_id=snapshot_id,
                                          huawei_snapshot_wwn=snapshot_wwn)
        return {'provider_location': location}
Ejemplo n.º 7
0
    def failback(self, volumes):
        """Failover volumes back to primary backend.

        The main steps:
        1. Switch the role of replication pairs.
        2. Copy the second LUN data back to primary LUN.
        3. Split replication pairs.
        4. Switch the role of replication pairs.
        5. Enable replications.
        """
        volumes_update = []
        for v in volumes:
            v_update = {}
            v_update['volume_id'] = v.id
            drv_data = get_replication_driver_data(v)
            pair_id = drv_data.get('pair_id')
            if not pair_id:
                LOG.warning("No pair id in volume %s.", v.id)
                v_update['updates'] = {'replication_status': 'error'}
                volumes_update.append(v_update)
                continue

            rmt_lun_id = drv_data.get('rmt_lun_id')
            if not rmt_lun_id:
                LOG.warning("No remote lun id in volume %s.", v.id)
                v_update['updates'] = {'replication_status': 'error'}
                volumes_update.append(v_update)
                continue

            # Switch replication pair role, and start synchronize.
            self.local_driver.enable(pair_id)

            # Wait for synchronize complete.
            self.local_driver.wait_replica_ready(pair_id)

            # Split replication pair again
            self.rmt_driver.failover(pair_id)

            # Switch replication pair role, and start synchronize.
            self.rmt_driver.enable(pair_id)

            local_metadata = huawei_utils.get_volume_private_data(v)
            new_drv_data = to_string(
                {'pair_id': pair_id,
                 'rmt_lun_id': local_metadata.get('huawei_lun_id'),
                 'rmt_lun_wwn': local_metadata.get('huawei_lun_wwn')})
            location = huawei_utils.to_string(
                huawei_lun_id=rmt_lun_id,
                huawei_lun_wwn=drv_data.get('rmt_lun_wwn'))

            v_update['updates'] = {'provider_location': location,
                                   'replication_status': 'available',
                                   'replication_driver_data': new_drv_data}
            volumes_update.append(v_update)

        return volumes_update
Ejemplo n.º 8
0
    def failover(self, volumes):
        """Failover volumes back to secondary array.

        Split the replication pairs and make the secondary LUNs R&W.
        """
        volumes_update = []
        for v in volumes:
            v_update = {}
            v_update['volume_id'] = v.id
            drv_data = get_replication_driver_data(v)
            pair_id = drv_data.get('pair_id')
            if not pair_id:
                LOG.warning("No pair id in volume %s.", v.id)
                v_update['updates'] = {'replication_status': 'error'}
                volumes_update.append(v_update)
                continue

            rmt_lun_id = drv_data.get('rmt_lun_id')
            if not rmt_lun_id:
                LOG.warning("No remote lun id in volume %s.", v.id)
                v_update['updates'] = {'replication_status': 'error'}
                volumes_update.append(v_update)
                continue

            self.rmt_driver.failover(pair_id)

            local_metadata = huawei_utils.get_lun_metadata(v)
            new_drv_data = to_string({
                'pair_id':
                pair_id,
                'rmt_lun_id':
                local_metadata.get('huawei_lun_id'),
                'rmt_lun_wwn':
                local_metadata.get('huawei_lun_wwn')
            })
            location = huawei_utils.to_string(
                huawei_lun_id=rmt_lun_id,
                huawei_lun_wwn=drv_data.get('rmt_lun_wwn'))

            v_update['updates'] = {
                'provider_location': location,
                'replication_status': 'failed-over',
                'replication_driver_data': new_drv_data
            }
            volumes_update.append(v_update)

        return volumes_update
Ejemplo n.º 9
0
    def failover(self, volumes):
        """Failover volumes back to secondary array.

        Split the replication pairs and make the secondary LUNs R&W.
        """
        volumes_update = []
        for v in volumes:
            v_update = {}
            v_update['volume_id'] = v.id
            drv_data = get_replication_driver_data(v)
            pair_id = drv_data.get('pair_id')
            if not pair_id:
                LOG.warning("No pair id in volume %s.", v.id)
                v_update['updates'] = {'replication_status': 'error'}
                volumes_update.append(v_update)
                continue

            rmt_lun_id = drv_data.get('rmt_lun_id')
            if not rmt_lun_id:
                LOG.warning("No remote lun id in volume %s.", v.id)
                v_update['updates'] = {'replication_status': 'error'}
                volumes_update.append(v_update)
                continue

            self.rmt_driver.failover(pair_id)

            local_metadata = huawei_utils.get_volume_private_data(v)
            new_drv_data = to_string(
                {'pair_id': pair_id,
                 'rmt_lun_id': local_metadata.get('huawei_lun_id'),
                 'rmt_lun_wwn': local_metadata.get('huawei_lun_wwn')})
            location = huawei_utils.to_string(
                huawei_lun_id=rmt_lun_id,
                huawei_lun_wwn=drv_data.get('rmt_lun_wwn'))

            v_update['updates'] = {'provider_location': location,
                                   'replication_status': 'failed-over',
                                   'replication_driver_data': new_drv_data}
            volumes_update.append(v_update)

        return volumes_update
Ejemplo n.º 10
0
    def failback(self, volumes):
        """Failover volumes back to primary backend.

        The main steps:
        1. Switch the role of replication pairs.
        2. Copy the second LUN data back to primary LUN.
        3. Split replication pairs.
        4. Switch the role of replication pairs.
        5. Enable replications.
        """
        volumes_update = []
        for v in volumes:
            v_update = {}
            v_update['volume_id'] = v.id
            drv_data = get_replication_driver_data(v)
            pair_id = drv_data.get('pair_id')
            if not pair_id:
                LOG.warning("No pair id in volume %s.", v.id)
                v_update['updates'] = {'replication_status': 'error'}
                volumes_update.append(v_update)
                continue

            rmt_lun_id = drv_data.get('rmt_lun_id')
            if not rmt_lun_id:
                LOG.warning("No remote lun id in volume %s.", v.id)
                v_update['updates'] = {'replication_status': 'error'}
                volumes_update.append(v_update)
                continue

            # Switch replication pair role, and start synchronize.
            self.local_driver.enable(pair_id)

            # Wait for synchronize complete.
            self.local_driver.wait_replica_ready(pair_id)

            # Split replication pair again
            self.rmt_driver.failover(pair_id)

            # Switch replication pair role, and start synchronize.
            self.rmt_driver.enable(pair_id)

            local_metadata = huawei_utils.get_lun_metadata(v)
            new_drv_data = to_string({
                'pair_id':
                pair_id,
                'rmt_lun_id':
                local_metadata.get('huawei_lun_id'),
                'rmt_lun_wwn':
                local_metadata.get('huawei_lun_wwn')
            })
            location = huawei_utils.to_string(
                huawei_lun_id=rmt_lun_id,
                huawei_lun_wwn=drv_data.get('rmt_lun_wwn'))

            v_update['updates'] = {
                'provider_location': location,
                'replication_status': 'available',
                'replication_driver_data': new_drv_data
            }
            volumes_update.append(v_update)

        return volumes_update
Ejemplo n.º 11
0
    def failback(self, volumes):
        """Failover volumes back to primary backend.

        The main steps:
        1. Switch the role of replication pairs.
        2. Copy the second LUN data back to primary LUN.
        3. Split replication pairs.
        4. Switch the role of replication pairs.
        5. Enable replications.
        """
        running_status_set = (constants.REPLICA_RUNNING_STATUS_NORMAL,
                              constants.REPLICA_RUNNING_STATUS_SPLIT,
                              constants.REPLICA_RUNNING_STATUS_ERRUPTED)

        volumes_update = []
        cgid_list = set()
        replicacg = ReplicaCG(self.local_client, self.rmt_client, self.conf)
        for v in volumes:
            drv_data = get_replication_driver_data(v)
            pair_id = drv_data.get('pair_id')
            if not pair_id:
                self._pre_fail_check(v, running_status_set)

        for v in volumes:
            v_update = {}
            v_update['volume_id'] = v.id
            drv_data = get_replication_driver_data(v)
            pair_id = drv_data.get('pair_id')
            if not pair_id:
                # Failback check running status only.
                LOG.warning("No pair id in volume %s.", v.id)
                v_update['updates'] = {'replication_status': 'error'}
                volumes_update.append(v_update)
                continue

            rmt_lun_id = drv_data.get('rmt_lun_id')
            if not rmt_lun_id:
                LOG.warning("No remote lun id in volume %s.", v.id)
                v_update['updates'] = {'replication_status': 'error'}
                volumes_update.append(v_update)
                continue

            replica_info = self.local_op.get_replica_info(pair_id)
            consisgroup_id = replica_info.get('CGID')
            if consisgroup_id:
                if consisgroup_id not in cgid_list:
                    replicacg.failback(consisgroup_id)
                    cgid_list.add(consisgroup_id)
            else:
                # Switch replication pair role, and start synchronize.
                self.local_driver.enable(pair_id)

                # Wait for synchronize complete.
                self.local_driver.wait_replica_ready(pair_id)

                # Split replication pair again
                self.rmt_driver.failover(pair_id)

                # Switch replication pair role, and start synchronize.
                self.rmt_driver.enable(pair_id)

            local_metadata = huawei_utils.get_lun_metadata(v)
            new_drv_data = to_string({
                'pair_id':
                pair_id,
                'huawei_sn':
                local_metadata.get('huawei_sn'),
                'rmt_lun_id':
                local_metadata.get('huawei_lun_id'),
                'rmt_lun_wwn':
                local_metadata.get('huawei_lun_wwn')
            })
            location = huawei_utils.to_string(
                huawei_lun_id=rmt_lun_id,
                huawei_sn=drv_data.get('huawei_sn'),
                huawei_lun_wwn=drv_data.get('rmt_lun_wwn'))

            v_update['updates'] = {
                'provider_location': location,
                'replication_status': 'available',
                'replication_driver_data': new_drv_data
            }
            volumes_update.append(v_update)

        return volumes_update