예제 #1
0
    def live_migration(self, context, migrate_data):
        """Start the live migration.

        :param context: security context
        :param migrate_data: migration data from src and dest host.
        """
        LOG.debug("Starting migration.", instance=self.instance)
        LOG.debug("Migrate data: %s" % migrate_data)

        # Get the vFC and vSCSI live migration mappings
        dest_pre_lm_data = migrate_data.get('pre_live_migration_result', {})
        vfc_mappings = dest_pre_lm_data.get('vfc_lpm_mappings')
        vscsi_mappings = dest_pre_lm_data.get('vscsi_lpm_mappings')

        try:
            # Migrate the LPAR!
            mig.migrate_lpar(self.lpar_w, self.dest_data['dest_sys_name'],
                             validate_only=False,
                             tgt_mgmt_svr=self.dest_data['dest_ip'],
                             tgt_mgmt_usr=self.dest_data.get('dest_user_id'),
                             virtual_fc_mappings=vfc_mappings,
                             virtual_scsi_mappings=vscsi_mappings)

        except Exception:
            LOG.error(_LE("Live migration failed."), instance=self.instance)
            raise
        finally:
            LOG.debug("Finished migration.", instance=self.instance)
예제 #2
0
    def live_migration(self, context, migrate_data):
        """Start the live migration.

        :param context: security context
        :param migrate_data: a PowerVMLiveMigrateData object
        """
        LOG.debug("Starting migration.", instance=self.instance)
        LOG.debug("Migrate data: %s" % migrate_data)

        # The passed in mig data has more info (dest data added), so replace
        self.mig_data = migrate_data
        # Get the vFC and vSCSI live migration mappings
        vol_data = migrate_data.vol_data
        vfc_mappings = vol_data.get('vfc_lpm_mappings')
        if vfc_mappings is not None:
            vfc_mappings = jsonutils.loads(vfc_mappings)
        vscsi_mappings = vol_data.get('vscsi_lpm_mappings')
        if vscsi_mappings is not None:
            vscsi_mappings = jsonutils.loads(vscsi_mappings)

        try:
            # Migrate the LPAR!
            mig.migrate_lpar(
                self.lpar_w, self.mig_data.dest_sys_name,
                validate_only=False, tgt_mgmt_svr=self.mig_data.dest_ip,
                tgt_mgmt_usr=self.mig_data.dest_user_id,
                virtual_fc_mappings=vfc_mappings,
                virtual_scsi_mappings=vscsi_mappings,
                sdn_override=True, vlan_check_override=True)

        except Exception:
            LOG.error(_LE("Live migration failed."), instance=self.instance)
            raise
        finally:
            LOG.debug("Finished migration.", instance=self.instance)
예제 #3
0
    def live_migration(self, context, migrate_data):
        """Start the live migration.

        :param context: security context
        :param migrate_data: a PowerVMLiveMigrateData object
        """
        LOG.debug("Starting migration. Migrate data: %s",
                  migrate_data,
                  instance=self.instance)

        # The passed in mig data has more info (dest data added), so replace
        self.mig_data = migrate_data

        # Get the vFC and vSCSI live migration mappings
        vol_data = migrate_data.vol_data
        vfc_mappings = vol_data.get('vfc_lpm_mappings')
        if vfc_mappings is not None:
            vfc_mappings = jsonutils.loads(vfc_mappings)
        vscsi_mappings = vol_data.get('vscsi_lpm_mappings')
        if vscsi_mappings is not None:
            vscsi_mappings = jsonutils.loads(vscsi_mappings)

        # Run the pre-live migration on the network objects
        network_infos = self.instance.info_cache.network_info
        trunks_to_del = []
        for network_info in network_infos:
            trunks_to_del.extend(
                vif.pre_live_migrate_at_source(self.drvr.adapter,
                                               self.drvr.host_uuid,
                                               self.instance, network_info))

        # Convert the network mappings into something the API can understand.
        vlan_mappings = self._convert_nl_io_mappings(
            migrate_data.vea_vlan_mappings)

        try:
            # Migrate the LPAR!
            mig.migrate_lpar(self.lpar_w,
                             self.mig_data.dest_sys_name,
                             validate_only=False,
                             tgt_mgmt_svr=self.mig_data.dest_ip,
                             tgt_mgmt_usr=self.mig_data.dest_user_id,
                             virtual_fc_mappings=vfc_mappings,
                             virtual_scsi_mappings=vscsi_mappings,
                             vlan_mappings=vlan_mappings,
                             sdn_override=True,
                             vlan_check_override=True)

            # Delete the source side network trunk adapters
            for trunk_to_del in trunks_to_del:
                trunk_to_del.delete()
        except Exception:
            with excutils.save_and_reraise_exception(logger=LOG):
                LOG.exception("Live migration failed.", instance=self.instance)
        finally:
            LOG.debug("Finished migration.", instance=self.instance)
예제 #4
0
    def test_migration(self, mock_run_job):

        # Test simple call
        mock_run_job.side_effect = u.get_parm_checker(
            self, '1234', [(mig.TGT_MGD_SYS, 'abc')], exp_timeout=1800 * 4)
        mig.migrate_lpar(self.lpar_w, 'abc')
        self.adpt.read.assert_called_once_with('LogicalPartition',
                                               '1234',
                                               suffix_parm='Migrate',
                                               suffix_type='do')
        # Test all parms
        self.adpt.read.reset_mock()
        parm_list = [(mig.TGT_MGD_SYS, 'abc'), (mig.TGT_RMT_HMC, 'host'),
                     (mig.TGT_RMT_HMC_USR, 'usr'), (mig.DEST_MSP, 'vios1'),
                     (mig.SRC_MSP, 'vios2'), (mig.SPP_ID, '5'),
                     (mig.OVS_OVERRIDE, '2'), (mig.VLAN_BRIDGE_OVERRIDE, '2')]
        mapping_list = [(mig.VFC_MAPPINGS, ['1/1/1', '3/3/3//3']),
                        (mig.VSCSI_MAPPINGS, ['2/2/2']),
                        (mig.VLAN_MAPPINGS,
                         ['001122334455/4', '001122334466/5/6 7'])]
        mock_run_job.side_effect = u.get_parm_checker(
            self,
            '1234',
            parm_list,
            exp_job_mappings=mapping_list,
            exp_timeout=1800 * 4)

        mig.migrate_lpar(
            self.lpar_w,
            'abc',
            tgt_mgmt_svr='host',
            tgt_mgmt_usr='******',
            virtual_fc_mappings=['1/1/1', '3/3/3//3'],
            virtual_scsi_mappings=['2/2/2'],
            vlan_mappings=['001122334455/4', '001122334466/5/6 7'],
            dest_msp_name='vios1',
            source_msp_name='vios2',
            spp_id='5',
            sdn_override=True,
            vlan_check_override=True)
        self.adpt.read.assert_called_once_with('LogicalPartition',
                                               '1234',
                                               suffix_parm='Migrate',
                                               suffix_type='do')
        # Test simple validation call
        self.adpt.read.reset_mock()
        mock_run_job.side_effect = u.get_parm_checker(
            self, '1234', [(mig.TGT_MGD_SYS, 'abc')], exp_timeout=1800 * 4)
        mock_run_job.reset_mock()
        mig.migrate_lpar(self.lpar_w, 'abc', validate_only=True)
        self.adpt.read.assert_called_once_with('LogicalPartition',
                                               '1234',
                                               suffix_parm='MigrateValidate',
                                               suffix_type='do')
예제 #5
0
    def test_migration(self, mock_run_job):

        # Test simple call
        mock_run_job.side_effect = u.get_parm_checker(
            self, '1234', [(mig.TGT_MGD_SYS, 'abc')], exp_timeout=1800)
        mig.migrate_lpar(self.lpar_w, 'abc')
        self.adpt.read.assert_called_once_with('LogicalPartition', '1234',
                                               suffix_parm='Migrate',
                                               suffix_type='do')
        # Test all parms
        self.adpt.read.reset_mock()
        parm_list = [(mig.TGT_MGD_SYS, 'abc'),
                     (mig.TGT_RMT_HMC, 'host'),
                     (mig.TGT_RMT_HMC_USR, 'usr'),
                     (mig.DEST_MSP, 'vios1'),
                     (mig.SRC_MSP, 'vios2')]
        mapping_list = [(mig.VFC_MAPPINGS, ['1/1/1', '3/3/3//3']),
                        (mig.VSCSI_MAPPINGS, ['2/2/2'])]
        mock_run_job.side_effect = u.get_parm_checker(
            self, '1234', parm_list, exp_job_mappings=mapping_list,
            exp_timeout=1800)

        mig.migrate_lpar(self.lpar_w, 'abc',
                         tgt_mgmt_svr='host', tgt_mgmt_usr='******',
                         virtual_fc_mappings=['1/1/1', '3/3/3//3'],
                         virtual_scsi_mappings=['2/2/2'],
                         dest_msp_name='vios1', source_msp_name='vios2')
        self.adpt.read.assert_called_once_with('LogicalPartition', '1234',
                                               suffix_parm='Migrate',
                                               suffix_type='do')
        # Test simple validation call
        self.adpt.read.reset_mock()
        mock_run_job.side_effect = u.get_parm_checker(
            self, '1234', [(mig.TGT_MGD_SYS, 'abc')], exp_timeout=1800)
        mock_run_job.reset_mock()
        mig.migrate_lpar(self.lpar_w, 'abc', validate_only=True)
        self.adpt.read.assert_called_once_with('LogicalPartition', '1234',
                                               suffix_parm='MigrateValidate',
                                               suffix_type='do')