Пример #1
0
    def test_vios_busy_helper(self, mock_sleep, mock_sess):
        # Try with 1 retries
        hlp = functools.partial(vios_busy.vios_busy_retry_helper,
                                max_retries=1)
        error = pvmex.Error('yo', response=self.http_error.response)
        mock_sess.request.side_effect = error
        adpt = adp.Adapter(mock_sess, use_cache=False, helpers=hlp)
        self.assertRaises(pvmex.Error,
                          adpt._request,
                          'method',
                          'path',
                          body='the body')
        # Test that the request method was called twice and sleep was called
        self.assertEqual(mock_sess.request.call_count, 2)
        mock_sleep.assert_called_once_with(5 * 1)

        # Test with more retries and sleep values
        retries = 10
        hlp = functools.partial(vios_busy.vios_busy_retry_helper,
                                max_retries=retries,
                                delay=15)
        mock_sess.reset_mock()
        self.assertRaises(pvmex.Error,
                          adpt._request,
                          'method',
                          'path',
                          body='the body',
                          helpers=hlp)
        # Should have tried 'retries' times plus the initial one
        self.assertEqual(mock_sess.request.call_count, retries + 1)

        # Test with None response
        mock_sess.reset_mock()
        error = pvmex.Error('yo', response=None)
        mock_sess.request.side_effect = error
        hlp = functools.partial(vios_busy.vios_busy_retry_helper,
                                max_retries=1,
                                delay=15)
        self.assertRaises(pvmex.Error,
                          adpt._request,
                          'method',
                          'path',
                          body='the body',
                          helpers=hlp)
        # There should be no retries since the response was None
        self.assertEqual(mock_sess.request.call_count, 1)

        # Test with a Service Unavailable exception
        mock_sess.reset_mock()
        hlp = functools.partial(vios_busy.vios_busy_retry_helper,
                                max_retries=1)
        error = pvmex.Error('yo', response=self.http_error_sa.response)
        mock_sess.request.side_effect = error
        adpt = adp.Adapter(mock_sess, use_cache=False, helpers=hlp)
        self.assertRaises(pvmex.Error,
                          adpt._request,
                          'method',
                          'path',
                          body='the body')
        self.assertEqual(mock_sess.request.call_count, 2)
Пример #2
0
    def test_get_vm_qp(self, mock_loads):
        self.apt.helpers = ['helper1', pvm_log.log_helper, 'helper3']

        # Defaults
        self.assertEqual(mock_loads.return_value,
                         vm.get_vm_qp(self.apt, 'lpar_uuid'))
        self.apt.read.assert_called_once_with('LogicalPartition',
                                              root_id='lpar_uuid',
                                              suffix_type='quick',
                                              suffix_parm=None)
        mock_loads.assert_called_once_with(self.apt.read.return_value.body)

        self.apt.read.reset_mock()
        mock_loads.reset_mock()

        # Specific qprop, no logging errors
        self.assertEqual(
            mock_loads.return_value,
            vm.get_vm_qp(self.apt, 'lpar_uuid', qprop='Prop',
                         log_errors=False))
        self.apt.read.assert_called_once_with('LogicalPartition',
                                              root_id='lpar_uuid',
                                              suffix_type='quick',
                                              suffix_parm='Prop',
                                              helpers=['helper1', 'helper3'])

        resp = mock.MagicMock()
        resp.status = 404
        self.apt.read.side_effect = pvm_exc.HttpError(resp)
        self.assertRaises(exception.InstanceNotFound,
                          vm.get_vm_qp,
                          self.apt,
                          'lpar_uuid',
                          log_errors=False)

        self.apt.read.side_effect = pvm_exc.Error("message", response=None)
        self.assertRaises(pvm_exc.Error,
                          vm.get_vm_qp,
                          self.apt,
                          'lpar_uuid',
                          log_errors=False)

        resp.status = 500
        self.apt.read.side_effect = pvm_exc.Error("message", response=resp)
        self.assertRaises(pvm_exc.Error,
                          vm.get_vm_qp,
                          self.apt,
                          'lpar_uuid',
                          log_errors=False)
Пример #3
0
    def test_upload_new_vdisk_failure(self, mock_create_file):
        """Tests the failure path for uploading of the virtual disks."""

        # First need to load in the various test responses.
        vg_orig = tju.load_file(UPLOAD_VOL_GRP_ORIG, self.adpt)
        vg_post_crt = tju.load_file(UPLOAD_VOL_GRP_NEW_VDISK, self.adpt)

        self.adpt.read.return_value = vg_orig
        self.adpt.update_by_path.return_value = vg_post_crt
        mock_create_file.return_value = self._fake_meta()

        self.assertRaises(exc.Error, ts.upload_new_vdisk, self.adpt,
                          self.v_uuid, self.vg_uuid, None, 'test3', 50)

        # Test cleanup failure
        self.adpt.delete.side_effect = exc.Error('Something bad')
        f_wrap = ts.upload_new_vdisk(self.adpt,
                                     self.v_uuid,
                                     self.vg_uuid,
                                     None,
                                     'test2',
                                     50,
                                     sha_chksum='abc123')

        self.adpt.delete.assert_called_once_with(
            'File',
            service='web',
            root_id='6233b070-31cc-4b57-99bd-37f80e845de9')
        self.assertIsNotNone(f_wrap)
Пример #4
0
 def test_Error(self):
     e = pvmex.Error("test")
     self.assertRaises(pvmex.Error, self.raise_helper, e)
     try:
         raise e
     except pvmex.Error as e1:
         self.assertEqual(e1.args[0], "test")
Пример #5
0
 def test_get_instance_wrapper(self, mock_get):
     resp = mock.Mock(status=404)
     mock_get.side_effect = pvm_exc.Error('message', response=resp)
     instance = objects.Instance(**powervm.TEST_INSTANCE)
     # vm.get_instance_wrapper(self.apt, instance, 'lpar_uuid')
     self.assertRaises(exception.InstanceNotFound, vm.get_instance_wrapper,
                       self.apt, instance, 'lpar_uuid')
Пример #6
0
    def test_create_and_connect_cfg_drive(self):
        # With a specified FeedTask
        task = tf_stg.CreateAndConnectCfgDrive(
            self.adapter, self.instance, 'injected_files',
            'network_info', 'stg_ftsk', admin_pass='******')
        task.execute('mgmt_cna')
        self.mock_cfg_drv.assert_called_once_with(self.adapter)
        self.mock_mb.create_cfg_drv_vopt.assert_called_once_with(
            self.instance, 'injected_files', 'network_info', 'stg_ftsk',
            admin_pass='******', mgmt_cna='mgmt_cna')

        # Normal revert
        task.revert('mgmt_cna', 'result', 'flow_failures')
        self.mock_mb.dlt_vopt.assert_called_once_with(self.instance,
                                                      'stg_ftsk')

        self.mock_mb.reset_mock()

        # Revert when dlt_vopt fails
        self.mock_mb.dlt_vopt.side_effect = pvm_exc.Error('fake-exc')
        task.revert('mgmt_cna', 'result', 'flow_failures')
        self.mock_mb.dlt_vopt.assert_called_once()

        self.mock_mb.reset_mock()

        # Revert when media builder not created
        task.mb = None
        task.revert('mgmt_cna', 'result', 'flow_failures')
        self.mock_mb.assert_not_called()
Пример #7
0
def _find_free_vlan(adapter, vswitch_w):
    """Finds a free VLAN on the vswitch specified."""

    # A Virtual Network (VNet) will exist for every PowerVM vSwitch / VLAN
    # combination in the system.  Getting the feed is a quick way to determine
    # which VLANs are in use.
    vnets = pvm_net.VNet.get(adapter,
                             parent_type=pvm_ms.System.schema_type,
                             parent_uuid=adapter.sys_uuid)
    # Use that feed to get the VLANs in use, but only get the ones in use for
    # the vSwitch passed in.
    used_vids = [
        x.vlan for x in vnets
        if x.associated_switch_uri == vswitch_w.related_href
    ]

    # Walk through the VLAN range, and as soon as one is found that is not in
    # use, return it to the user.
    for x in range(1, 4094):
        if x not in used_vids:
            return x

    raise exc.Error(
        _('Unable to find a valid VLAN for Virtual Switch %s.') %
        vswitch_w.name)
Пример #8
0
def _find_or_create_vswitch(adapter, vs_name, crt_vswitch):
    """Finds (or creates) the appropriate virtual switch.

    :param adapter: The pypowervm adapter to perform the update through.
    :param vs_name: The name of the virtual switch that this CNA will be
                    attached to.
    :param crt_vswitch: A boolean to indicate that if the vSwitch can not be
                        found, the system should attempt to create one (with
                        the default parameters - ex: Veb mode).
    """
    vswitch_w = pvm_net.VSwitch.search(adapter,
                                       parent_type=pvm_ms.System,
                                       parent_uuid=adapter.sys_uuid,
                                       one_result=True,
                                       name=vs_name)

    if vswitch_w is None:
        if crt_vswitch:
            vswitch_w = pvm_net.VSwitch.bld(adapter, vs_name)
            vswitch_w = vswitch_w.create(parent_type=pvm_ms.System,
                                         parent_uuid=adapter.sys_uuid)
        else:
            raise exc.Error(
                _('Unable to find the Virtual Switch %s on the '
                  'system.') % vs_name)
    return vswitch_w
Пример #9
0
    def test_sample_helper(self, mock_sleep):

        helpers = smpl_hlp.sample_retry_helper
        fake_resp1 = adp.Response('GET',
                                  '/some/path',
                                  200,
                                  'OK', ['headers'],
                                  body='Some Text HSCL3205 More Text')
        self.sess.request.side_effect = pvmex.Error('yo', response=fake_resp1)
        adpt = adp.Adapter(self.sess, helpers=helpers)
        self.assertRaises(pvmex.Error,
                          adpt._request,
                          'method',
                          'path',
                          body='the body')

        # Test that the request method was called twice and sleep was called
        self.assertEqual(self.sess.request.call_count, 2)
        mock_sleep.assert_called_once_with(5 * 1)

        hlp = functools.partial(smpl_hlp.sample_retry_helper, max_retries=5)
        self.sess.reset_mock()
        try:
            adpt._request('method', 'path', body='the body', helpers=hlp)
        except Exception:
            # Should have tried 6 times total
            self.assertEqual(self.sess.request.call_count, 6)
Пример #10
0
    def test_get_lpars(self):
        self.apt.read.return_value = self.resp
        lpars = vm.get_lpars(self.apt)
        # One of the LPARs is a management partition, so one less than the
        # total length should be returned.
        self.assertEqual(len(self.resp.feed.entries) - 1, len(lpars))

        exc = pvm_exc.Error('Not found', response=FakeAdapterResponse(404))
        self.apt.read.side_effect = exc
        self.assertRaises(pvm_exc.Error, vm.get_lpars, self.apt)
Пример #11
0
 def test_delete_job(self, mock_status):
     wrapper = self._ok_wrapper
     mock_status.__get__ = mock.Mock(return_value=jwrap.JobStatus.RUNNING)
     with self.assertLogs(jwrap.__name__, 'ERROR'):
         self.assertRaises(ex.Error, wrapper.delete_job)
     mock_status.__get__.return_value = jwrap.JobStatus.COMPLETED_OK
     wrapper.delete_job()
     self.adpt.delete.assert_called_with('jobs', wrapper.job_id)
     self.adpt.delete.reset_mock()
     self.adpt.delete.side_effect = ex.Error('foo')
     with self.assertLogs(jwrap.__name__, 'ERROR'):
         wrapper.delete_job()
     self.adpt.delete.assert_called_with('jobs', wrapper.job_id)
Пример #12
0
    def delete_job(self):
        """Cleans this Job off of the REST server, if it is completed.

        :raise JobRequestFailed: if the Job is detected to be running.
        """
        if self.job_status == JobStatus.RUNNING:
            error = (_("Job %s not deleted. Job is in running state.") %
                     self.job_id)
            LOG.error(error)
            raise pvmex.Error(error)
        try:
            self.adapter.delete(_JOBS, self.job_id)
        except pvmex.Error as exc:
            LOG.exception(exc)
Пример #13
0
    def test_upload_new_vopt(self, mock_create_file):
        """Tests the uploads of the virtual disks."""

        mock_create_file.return_value = self._fake_meta()

        v_opt, f_wrap = ts.upload_vopt(self.adpt,
                                       self.v_uuid,
                                       None,
                                       'test2',
                                       f_size=50)

        # Test that vopt was 'uploaded'
        self.adpt.upload_file.assert_called_with(mock.ANY, None)
        self.assertIsNone(f_wrap)
        self.assertIsNotNone(v_opt)
        self.assertIsInstance(v_opt, stor.VOptMedia)
        self.assertEqual('test2', v_opt.media_name)

        # Ensure cleanup was called
        self.adpt.delete.assert_called_once_with(
            'File',
            service='web',
            root_id='6233b070-31cc-4b57-99bd-37f80e845de9')

        # Test cleanup failure
        self.adpt.reset_mock()
        self.adpt.delete.side_effect = exc.Error('Something bad')

        vopt, f_wrap = ts.upload_vopt(self.adpt,
                                      self.v_uuid,
                                      None,
                                      'test2',
                                      f_size=50)

        self.adpt.delete.assert_called_once_with(
            'File',
            service='web',
            root_id='6233b070-31cc-4b57-99bd-37f80e845de9')
        self.assertIsNotNone(f_wrap)
        self.assertIsNotNone(vopt)
        self.assertIsInstance(vopt, stor.VOptMedia)
        self.assertEqual('test2', v_opt.media_name)
Пример #14
0
    def test_dlt_lpar(self, mock_vterm):
        """Performs a delete LPAR test."""
        vm.dlt_lpar(self.apt, '12345')
        self.assertEqual(1, self.apt.delete.call_count)
        self.assertEqual(1, mock_vterm.call_count)

        # Test Failure Path
        # build a mock response body with the expected HSCL msg
        resp = mock.Mock()
        resp.body = 'error msg: HSCL151B more text'
        self.apt.delete.side_effect = pvm_exc.Error('Mock Error Message',
                                                    response=resp)

        # Reset counters
        self.apt.reset_mock()
        mock_vterm.reset_mock()

        self.assertRaises(pvm_exc.Error, vm.dlt_lpar, self.apt, '12345')
        self.assertEqual(1, mock_vterm.call_count)
        self.assertEqual(1, self.apt.delete.call_count)
Пример #15
0
 def test_cancel_job(self, mock_monitor, mock_delete, mock_start):
     wrapper = self._ok_wrapper
     self.adpt.update.side_effect = ex.Error('error')
     mock_monitor.return_value = False
     wrapper.cancel_job()
     self.adpt.update.assert_called_with(None,
                                         None,
                                         root_type='jobs',
                                         root_id=wrapper.job_id,
                                         suffix_type='cancel')
     self.assertEqual(0, mock_delete.call_count)
     self.adpt.update.reset_mock()
     self.adpt.update.side_effect = None
     mock_start.reset_mock()
     mock_monitor.return_value = False
     wrapper.cancel_job()
     self.adpt.update.assert_called_with(None,
                                         None,
                                         root_type='jobs',
                                         root_id=wrapper.job_id,
                                         suffix_type='cancel')
     self.assertEqual(1, mock_start.call_count)
Пример #16
0
    def test_instance_info(self):

        # Test at least one state translation
        self.assertEqual(vm._translate_vm_state('running'),
                         power_state.RUNNING)

        inst_info = vm.InstanceInfo(self.apt, 'inst_name', '1234')
        # Test the static properties
        self.assertEqual(inst_info.id, '1234')
        self.assertEqual(inst_info.cpu_time_ns, 0)

        # Check that we raise an exception if the instance is gone.
        exc = pvm_exc.Error('Not found', response=FakeAdapterResponse(404))
        self.apt.read.side_effect = exc
        self.assertRaises(exception.InstanceNotFound,
                          inst_info.__getattribute__, 'state')

        # Reset the test inst_info
        inst_info = vm.InstanceInfo(self.apt, 'inst_name', '1234')

        class FakeResp2(object):
            def __init__(self, body):
                self.body = '"%s"' % body

        resp = FakeResp2('running')

        def return_resp(*args, **kwds):
            return resp

        self.apt.read.side_effect = return_resp
        self.assertEqual(inst_info.state, power_state.RUNNING)

        # Check the __eq__ method
        inst_info1 = vm.InstanceInfo(self.apt, 'inst_name', '1234')
        inst_info2 = vm.InstanceInfo(self.apt, 'inst_name', '1234')
        self.assertEqual(inst_info1, inst_info2)
        inst_info2 = vm.InstanceInfo(self.apt, 'name', '4321')
        self.assertNotEqual(inst_info1, inst_info2)
Пример #17
0
def crt_vdisk(adapter, v_uuid, vol_grp_uuid, d_name, d_size_gb):
    """Creates a new Virtual Disk in the specified volume group.

    :param adapter: The pypowervm.adapter.Adapter through which to request the
                    change.
    :param v_uuid: The UUID of the Virtual I/O Server that will host the disk.
    :param vol_grp_uuid: The volume group that will host the new Virtual Disk.
    :param d_name: The name that should be given to the disk on the Virtual
                   I/O Server that will contain the file.
    :param d_size_gb: The size of the disk in GB.
    :return: VDisk ElementWrapper representing the new VirtualDisk from the
             server response (i.e. UDID will be populated).
    :raise exc.Error: If the server response from attempting to add the VDisk
                      does not contain the new VDisk.
    """
    # Get the existing volume group
    vol_grp_data = adapter.read(vios.VIOS.schema_type, v_uuid,
                                stor.VG.schema_type, vol_grp_uuid)
    vol_grp = stor.VG.wrap(vol_grp_data.entry)

    new_vdisk = stor.VDisk.bld(adapter, d_name, d_size_gb)

    # Append it to the list.
    vol_grp.virtual_disks.append(new_vdisk)

    # Now perform an update on the adapter.
    vol_grp = vol_grp.update()

    # The new Virtual Disk should be created.  Find the one we created.
    for vdisk in vol_grp.virtual_disks:
        if vdisk.name == d_name:
            return vdisk
    # This should never occur since the update went through without error,
    # but adding just in case as we don't want to create the file meta
    # without a backing disk.
    raise exc.Error(_("Unable to locate new vDisk on file upload."))
Пример #18
0
    def test_dlt_lpar(self, mock_vterm):
        """Performs a delete LPAR test."""
        vm.dlt_lpar(self.apt, '12345')
        self.assertEqual(1, self.apt.delete.call_count)
        self.assertEqual(1, mock_vterm.call_count)

        # Test Failure Path
        # build a mock response body with the expected HSCL msg
        resp = mock.Mock()
        resp.body = 'error msg: HSCL151B more text'
        self.apt.delete.side_effect = pvm_exc.Error(
            'Mock Error Message', response=resp)

        # Reset counters
        self.apt.reset_mock()
        mock_vterm.reset_mock()

        self.assertRaises(pvm_exc.Error,
                          vm.dlt_lpar, self.apt, '12345')
        self.assertEqual(1, mock_vterm.call_count)
        self.assertEqual(1, self.apt.delete.call_count)

        # Test HttpError 404
        self.apt.reset_mock()
        mock_vterm.reset_mock()

        resp.status = 404
        self.apt.delete.side_effect = pvm_exc.HttpError(resp=resp)
        vm.dlt_lpar(self.apt, '54321')
        self.assertEqual(1, mock_vterm.call_count)
        self.assertEqual(1, self.apt.delete.call_count)

        # Test Other HttpError
        self.apt.reset_mock()
        mock_vterm.reset_mock()

        resp.status = 111
        self.apt.delete.side_effect = pvm_exc.HttpError(resp=resp)
        self.assertRaises(pvm_exc.HttpError, vm.dlt_lpar, self.apt, '11111')
        self.assertEqual(1, mock_vterm.call_count)
        self.assertEqual(1, self.apt.delete.call_count)

        # Test HttpError 404 closing vterm
        self.apt.reset_mock()
        mock_vterm.reset_mock()

        resp.status = 404
        mock_vterm.side_effect = pvm_exc.HttpError(resp=resp)
        vm.dlt_lpar(self.apt, '55555')
        self.assertEqual(1, mock_vterm.call_count)
        self.assertEqual(0, self.apt.delete.call_count)

        # Test Other HttpError closing vterm
        self.apt.reset_mock()
        mock_vterm.reset_mock()

        resp.status = 111
        mock_vterm.side_effect = pvm_exc.HttpError(resp=resp)
        self.assertRaises(pvm_exc.HttpError, vm.dlt_lpar, self.apt, '33333')
        self.assertEqual(1, mock_vterm.call_count)
        self.assertEqual(0, self.apt.delete.call_count)
Пример #19
0
 def test_get_instance_wrapper(self, mock_lpar):
     resp = mock.Mock(status=404)
     mock_lpar.get.side_effect = pvm_exc.Error('message', response=resp)
     # vm.get_instance_wrapper(self.apt, instance, 'lpar_uuid')
     self.assertRaises(exception.InstanceNotFound, vm.get_instance_wrapper,
                       self.apt, self.inst)
Пример #20
0
    def test_dlt_lpar(self, mock_vterm):
        """Performs a delete LPAR test."""
        vm.delete_lpar(self.apt, 'inst')
        self.get_pvm_uuid.assert_called_once_with('inst')
        self.apt.delete.assert_called_once_with(
            pvm_lpar.LPAR.schema_type, root_id=self.get_pvm_uuid.return_value)
        self.assertEqual(1, mock_vterm.call_count)

        # Test Failure Path
        # build a mock response body with the expected HSCL msg
        resp = mock.Mock()
        resp.body = 'error msg: HSCL151B more text'
        self.apt.delete.side_effect = pvm_exc.Error('Mock Error Message',
                                                    response=resp)

        # Reset counters
        self.apt.reset_mock()
        mock_vterm.reset_mock()

        self.assertRaises(pvm_exc.Error, vm.delete_lpar, self.apt, 'inst')
        self.assertEqual(1, mock_vterm.call_count)
        self.assertEqual(1, self.apt.delete.call_count)

        self.apt.reset_mock()
        mock_vterm.reset_mock()

        # Test HttpError 404
        resp.status = 404
        self.apt.delete.side_effect = pvm_exc.HttpError(resp=resp)
        vm.delete_lpar(self.apt, 'inst')
        self.assertEqual(1, mock_vterm.call_count)
        self.assertEqual(1, self.apt.delete.call_count)

        self.apt.reset_mock()
        mock_vterm.reset_mock()

        # Test Other HttpError
        resp.status = 111
        self.apt.delete.side_effect = pvm_exc.HttpError(resp=resp)
        self.assertRaises(pvm_exc.HttpError, vm.delete_lpar, self.apt, 'inst')
        self.assertEqual(1, mock_vterm.call_count)
        self.assertEqual(1, self.apt.delete.call_count)

        self.apt.reset_mock()
        mock_vterm.reset_mock()

        # Test HttpError 404 closing vterm
        resp.status = 404
        mock_vterm.side_effect = pvm_exc.HttpError(resp=resp)
        vm.delete_lpar(self.apt, 'inst')
        self.assertEqual(1, mock_vterm.call_count)
        self.assertEqual(0, self.apt.delete.call_count)

        self.apt.reset_mock()
        mock_vterm.reset_mock()

        # Test Other HttpError closing vterm
        resp.status = 111
        mock_vterm.side_effect = pvm_exc.HttpError(resp=resp)
        self.assertRaises(pvm_exc.HttpError, vm.delete_lpar, self.apt, 'inst')
        self.assertEqual(1, mock_vterm.call_count)
        self.assertEqual(0, self.apt.delete.call_count)
Пример #21
0
def crt_cna(adapter,
            host_uuid,
            lpar_uuid,
            pvid,
            vswitch=network.VSW_DEFAULT_VSWITCH,
            crt_vswitch=False,
            slot_num=None,
            mac_addr=None,
            addl_vlans=None):
    """Puts a new ClientNetworkAdapter on a given LPAR.

    This will update the LPAR and put a new CNA on it.  If the LPAR is active
    can only perform if there is an active RMC connection.  If the LPAR is
    powered off, then it will update it offline.

    :param adapter: The pypowervm adapter to perform the update through.
    :param host_uuid: The host UUID that the CNA will be put on.
    :param lpar_uuid: The lpar UUID to update.
    :param pvid: The primary VLAN ID.
    :param vswitch: The name of the virtual switch that this CNA will be
                    attached to.
    :param crt_vswitch: A boolean to indicate that if the vSwitch can not be
                        found, the system should attempt to create one (with
                        the default parameters - ex: Veb mode).
    :param slot_num: Optional slot number to use for the CNA.  If not
                     specified, will utilize the next available slot on the
                     LPAR.
    :param mac_addr: The optional mac address.  If not specified, one will be
                     auto generated.
    :param addl_vlans: Optional list of (up to 18) additional VLANs.  Can be
                       a list of Ints or Strings (that parse down to ints).
    :return: The CNA Wrapper that was created.
    """
    # Join the additional VLANs
    addl_tagged_vlans = None
    if addl_vlans is not None:
        addl_tagged_vlans = " ".join(addl_vlans)

    # Sanitize the pvid
    pvid = str(pvid)

    # Find the appropriate virtual switch.
    vswitch_w = None
    vswitch_resp = adapter.read(ms.System.schema_type,
                                root_id=host_uuid,
                                child_type=network.VSwitch.schema_type)
    vswitch_wraps = network.VSwitch.wrap(vswitch_resp)
    for vs_w in vswitch_wraps:
        if vs_w.name == vswitch:
            vswitch_w = vs_w
            break

    if vswitch_w is None:
        if crt_vswitch:
            vswitch_w = network.VSwitch.bld(adapter, vswitch)
            vswitch_w = vswitch_w.create(parent_type=ms.System,
                                         parent_uuid=host_uuid)
        else:
            raise exc.Error(
                _('Unable to find the Virtual Switch %s on the '
                  'system.') % vswitch)

    # Find the virtual network.  Ensures that the system is ready for this.
    if adapter.traits.vnet_aware:
        _find_or_create_vnet(adapter, host_uuid, pvid, vswitch_w)

    # Build and create the CNA
    net_adpt = network.CNA.bld(adapter,
                               pvid,
                               vswitch_w.related_href,
                               slot_num=slot_num,
                               mac_addr=mac_addr,
                               addl_tagged_vlans=addl_tagged_vlans)
    return net_adpt.create(parent_type=lpar.LPAR, parent_uuid=lpar_uuid)
Пример #22
0
    def test_dlt_lpar(self, mock_vterm, mock_pvm_uuid):
        """Performs a delete LPAR test."""
        mock_pvm_uuid.return_value = 'pvm_uuid'

        vm.delete_lpar(self.apt, 'inst')
        mock_pvm_uuid.assert_called_once_with('inst')
        mock_vterm.assert_called_once_with(self.apt, 'pvm_uuid')
        self.apt.delete.assert_called_once_with('LogicalPartition',
                                                root_id='pvm_uuid')

        # Test Failure Path
        # build a mock response body with the expected HSCL msg
        resp = mock.Mock(body='error msg: HSCL151B more text')
        self.apt.delete.side_effect = pvm_exc.Error('Mock Error Message',
                                                    response=resp)

        # Reset counters
        mock_pvm_uuid.reset_mock()
        self.apt.reset_mock()
        mock_vterm.reset_mock()

        self.assertRaises(pvm_exc.Error, vm.delete_lpar, self.apt, 'inst')
        mock_pvm_uuid.assert_called_once_with('inst')
        mock_vterm.assert_called_once_with(self.apt, 'pvm_uuid')
        self.apt.delete.assert_called_once_with('LogicalPartition',
                                                root_id='pvm_uuid')

        # Test HttpNotFound - exception not raised
        mock_pvm_uuid.reset_mock()
        self.apt.reset_mock()
        mock_vterm.reset_mock()

        resp.status = 404
        self.apt.delete.side_effect = pvm_exc.HttpNotFound(resp=resp)
        vm.delete_lpar(self.apt, 'inst')
        mock_pvm_uuid.assert_called_once_with('inst')
        mock_vterm.assert_called_once_with(self.apt, 'pvm_uuid')
        self.apt.delete.assert_called_once_with('LogicalPartition',
                                                root_id='pvm_uuid')

        # Test Other HttpError
        mock_pvm_uuid.reset_mock()
        self.apt.reset_mock()
        mock_vterm.reset_mock()

        resp.status = 111
        self.apt.delete.side_effect = pvm_exc.HttpError(resp=resp)
        self.assertRaises(pvm_exc.HttpError, vm.delete_lpar, self.apt, 'inst')
        mock_pvm_uuid.assert_called_once_with('inst')
        mock_vterm.assert_called_once_with(self.apt, 'pvm_uuid')
        self.apt.delete.assert_called_once_with('LogicalPartition',
                                                root_id='pvm_uuid')

        # Test HttpNotFound closing vterm
        mock_pvm_uuid.reset_mock()
        self.apt.reset_mock()
        mock_vterm.reset_mock()

        resp.status = 404
        mock_vterm.side_effect = pvm_exc.HttpNotFound(resp=resp)
        vm.delete_lpar(self.apt, 'inst')
        mock_pvm_uuid.assert_called_once_with('inst')
        mock_vterm.assert_called_once_with(self.apt, 'pvm_uuid')
        self.apt.delete.assert_not_called()

        # Test Other HttpError closing vterm
        mock_pvm_uuid.reset_mock()
        self.apt.reset_mock()
        mock_vterm.reset_mock()

        resp.status = 111
        mock_vterm.side_effect = pvm_exc.HttpError(resp=resp)
        self.assertRaises(pvm_exc.HttpError, vm.delete_lpar, self.apt, 'inst')
        mock_pvm_uuid.assert_called_once_with('inst')
        mock_vterm.assert_called_once_with(self.apt, 'pvm_uuid')
        self.apt.delete.assert_not_called()
Пример #23
0
    def test_get_vm_qp(self):
        def adapter_read(root_type,
                         root_id=None,
                         suffix_type=None,
                         suffix_parm=None,
                         helpers=None):
            json_str = (u'{"IsVirtualServiceAttentionLEDOn":"false","Migration'
                        u'State":"Not_Migrating","CurrentProcessingUnits":0.1,'
                        u'"ProgressState":null,"PartitionType":"AIX/Linux","Pa'
                        u'rtitionID":1,"AllocatedVirtualProcessors":1,"Partiti'
                        u'onState":"not activated","RemoteRestartState":"Inval'
                        u'id","OperatingSystemVersion":"Unknown","AssociatedMa'
                        u'nagedSystem":"https://9.1.2.3:12443/rest/api/uom/Man'
                        u'agedSystem/98498bed-c78a-3a4f-b90a-4b715418fcb6","RM'
                        u'CState":"inactive","PowerManagementMode":null,"Parti'
                        u'tionName":"lpar-1-06674231-lpar","HasDedicatedProces'
                        u'sors":"false","ResourceMonitoringIPAddress":null,"Re'
                        u'ferenceCode":"00000000","CurrentProcessors":null,"Cu'
                        u'rrentMemory":512,"SharingMode":"uncapped"}')
            self.assertEqual('LogicalPartition', root_type)
            self.assertEqual('lpar_uuid', root_id)
            self.assertEqual('quick', suffix_type)
            resp = mock.MagicMock()
            if suffix_parm is None:
                resp.body = json_str
            elif suffix_parm == 'PartitionID':
                resp.body = '1'
            elif suffix_parm == 'CurrentProcessingUnits':
                resp.body = '0.1'
            elif suffix_parm == 'AssociatedManagedSystem':
                # The double quotes are important
                resp.body = ('"https://9.1.2.3:12443/rest/api/uom/ManagedSyste'
                             'm/98498bed-c78a-3a4f-b90a-4b715418fcb6"')
            else:
                self.fail('Unhandled quick property key %s' % suffix_parm)
            return resp

        def adpt_read_no_log(*args, **kwds):
            helpers = kwds['helpers']
            try:
                helpers.index(pvm_log.log_helper)
            except ValueError:
                # Successful path since the logger shouldn't be there
                return adapter_read(*args, **kwds)

            self.fail('Log helper was found when it should not be')

        ms_href = ('https://9.1.2.3:12443/rest/api/uom/ManagedSystem/98498bed-'
                   'c78a-3a4f-b90a-4b715418fcb6')
        self.apt.read.side_effect = adapter_read
        self.assertEqual(1, vm.get_vm_id(self.apt, 'lpar_uuid'))
        self.assertEqual(
            ms_href,
            vm.get_vm_qp(self.apt, 'lpar_uuid', 'AssociatedManagedSystem'))
        self.apt.read.side_effect = adpt_read_no_log
        self.assertEqual(
            0.1,
            vm.get_vm_qp(self.apt,
                         'lpar_uuid',
                         'CurrentProcessingUnits',
                         log_errors=False))
        qp_dict = vm.get_vm_qp(self.apt, 'lpar_uuid', log_errors=False)
        self.assertEqual(ms_href, qp_dict['AssociatedManagedSystem'])
        self.assertEqual(1, qp_dict['PartitionID'])
        self.assertEqual(0.1, qp_dict['CurrentProcessingUnits'])

        resp = mock.MagicMock()
        resp.status = 404
        self.apt.read.side_effect = pvm_exc.HttpNotFound(resp)
        self.assertRaises(exception.InstanceNotFound,
                          vm.get_vm_qp,
                          self.apt,
                          'lpar_uuid',
                          log_errors=False)

        self.apt.read.side_effect = pvm_exc.Error("message", response=None)
        self.assertRaises(pvm_exc.Error,
                          vm.get_vm_qp,
                          self.apt,
                          'lpar_uuid',
                          log_errors=False)

        resp.status = 500
        self.apt.read.side_effect = pvm_exc.Error("message", response=resp)
        self.assertRaises(pvm_exc.Error,
                          vm.get_vm_qp,
                          self.apt,
                          'lpar_uuid',
                          log_errors=False)