Ejemplo n.º 1
0
 def test_power_off_timesout_waiting_for_stopping_state(self):
     mock_get_partition = self.patch(self.hmcz, "_get_partition")
     mock_get_partition.return_value.get_property.return_value = "starting"
     mock_get_partition.return_value.wait_for_status.side_effect = (
         StatusTimeout(None, None, None, None)
     )
     with pytest.raises(PowerError):
         yield self.hmcz.power_off(None, self.make_context())
Ejemplo n.º 2
0
def test_statustimeout_str_def(msg, actual_status, desired_statuses,
                               status_timeout):
    """All tests for StatusTimeout.str_def()."""

    exc = StatusTimeout(msg, actual_status, desired_statuses, status_timeout)

    classname = exc.__class__.__name__

    # Execute the code to be tested
    str_def = exc.str_def()

    str_def = ' ' + str_def
    assert str_def.find(' classname={!r};'.format(classname)) >= 0
    assert str_def.find(' message={!r};'.format(msg)) >= 0
    assert str_def.find(' actual_status={!r};'.format(actual_status)) >= 0
    assert str_def.find(
        ' desired_statuses={!r};'.format(desired_statuses)) >= 0
    assert str_def.find(' status_timeout={!r};'.format(status_timeout)) >= 0
Ejemplo n.º 3
0
def test_statustimeout_str(msg, actual_status, desired_statuses,
                           status_timeout):
    """All tests for StatusTimeout.__str__()."""

    exc = StatusTimeout(msg, actual_status, desired_statuses, status_timeout)

    exp_str = str(exc.args[0])

    # Execute the code to be tested
    str_str = str(exc)

    assert str_str == exp_str
Ejemplo n.º 4
0
def test_statustimeout_repr(msg, actual_status, desired_statuses,
                            status_timeout):
    """All tests for StatusTimeout.__repr__()."""

    exc = StatusTimeout(msg, actual_status, desired_statuses, status_timeout)

    classname = exc.__class__.__name__

    # Execute the code to be tested
    repr_str = repr(exc)

    # We check the one-lined string just roughly
    repr_str = repr_str.replace('\n', '\\n')
    assert re.match(r'^{}\s*\(.*\)$'.format(classname), repr_str)
    def test_statustimeout_initial_attrs(self, arg_names, args):
        """Test initial attributes of StatusTimeout."""

        msg, actual_status, desired_statuses, status_timeout = args
        posargs, kwargs = func_args(args, arg_names)

        # Execute the code to be tested
        exc = StatusTimeout(*posargs, **kwargs)

        assert isinstance(exc, Error)
        assert len(exc.args) == 1
        assert exc.args[0] == msg
        assert exc.actual_status == actual_status
        assert exc.desired_statuses == desired_statuses
        assert exc.status_timeout == status_timeout
Ejemplo n.º 6
0
class TestLpar(object):
    """All tests for Lpar and LparManager classes."""
    def setup_method(self):
        """
        Set up a faked session, and add a faked CPC in classic mode without any
        child resources.
        """

        self.session = FakedSession('fake-host', 'fake-hmc', '2.13.1', '1.8')
        self.session.retry_timeout_config.status_timeout = 1
        self.client = Client(self.session)

        self.faked_cpc = self.session.hmc.cpcs.add({
            'object-id': 'fake-cpc1-oid',
            # object-uri is set up automatically
            'parent': None,
            'class': 'cpc',
            'name': 'fake-cpc1-name',
            'description': 'CPC #1 (classic mode)',
            'status': 'active',
            'dpm-enabled': False,
            'is-ensemble-member': False,
            'iml-mode': 'lpar',
        })
        self.cpc = self.client.cpcs.find(name='fake-cpc1-name')

    def add_lpar1(self):
        """Add lpar 1 (type linux)."""

        faked_lpar = self.faked_cpc.lpars.add({
            'object-id': LPAR1_OID,
            # object-uri will be automatically set
            'parent': self.faked_cpc.uri,
            'class': 'logical-partition',
            'name': LPAR1_NAME,
            'description': 'LPAR #1 (Linux)',
            'status': 'operating',
            'activation-mode': 'linux',
        })
        return faked_lpar

    def add_lpar2(self):
        """Add lpar 2 (type ssc)."""

        faked_lpar = self.faked_cpc.lpars.add({
            'object-id': LPAR2_OID,
            # object-uri will be automatically set
            'parent': self.faked_cpc.uri,
            'class': 'logical-partition',
            'name': LPAR2_NAME,
            'description': 'LPAR #2 (SSC)',
            'status': 'operating',
            'activation-mode': 'ssc',
        })
        return faked_lpar

    def test_lparmanager_initial_attrs(self):
        """Test initial attributes of LparManager."""

        lpar_mgr = self.cpc.lpars

        # Verify all public properties of the manager object
        assert lpar_mgr.resource_class == Lpar
        assert lpar_mgr.session == self.session
        assert lpar_mgr.parent == self.cpc
        assert lpar_mgr.cpc == self.cpc

    # TODO: Test for LparManager.__repr__()

    @pytest.mark.parametrize("full_properties_kwargs, prop_names", [
        (dict(), ['object-uri', 'name', 'status']),
        (dict(full_properties=False), ['object-uri', 'name', 'status']),
        (dict(full_properties=True), None),
    ])
    def test_lparmanager_list_full_properties(self, full_properties_kwargs,
                                              prop_names):
        """Test LparManager.list() with full_properties."""

        # Add two faked LPARs
        faked_lpar1 = self.add_lpar1()
        faked_lpar2 = self.add_lpar2()

        exp_faked_lpars = [faked_lpar1, faked_lpar2]
        lpar_mgr = self.cpc.lpars

        # Execute the code to be tested
        lpars = lpar_mgr.list(**full_properties_kwargs)

        assert_resources(lpars, exp_faked_lpars, prop_names)

    @pytest.mark.parametrize("filter_args, exp_names", [
        ({
            'object-id': LPAR1_OID
        }, [LPAR1_NAME]),
        ({
            'object-id': LPAR2_OID
        }, [LPAR2_NAME]),
        ({
            'object-id': [LPAR1_OID, LPAR2_OID]
        }, [LPAR1_NAME, LPAR2_NAME]),
        ({
            'object-id': [LPAR1_OID, LPAR1_OID]
        }, [LPAR1_NAME]),
        ({
            'object-id': LPAR1_OID + 'foo'
        }, []),
        ({
            'object-id': [LPAR1_OID, LPAR2_OID + 'foo']
        }, [LPAR1_NAME]),
        ({
            'object-id': [LPAR2_OID + 'foo', LPAR1_OID]
        }, [LPAR1_NAME]),
        ({
            'name': LPAR1_NAME
        }, [LPAR1_NAME]),
        ({
            'name': LPAR2_NAME
        }, [LPAR2_NAME]),
        ({
            'name': [LPAR1_NAME, LPAR2_NAME]
        }, [LPAR1_NAME, LPAR2_NAME]),
        ({
            'name': LPAR1_NAME + 'foo'
        }, []),
        ({
            'name': [LPAR1_NAME, LPAR2_NAME + 'foo']
        }, [LPAR1_NAME]),
        ({
            'name': [LPAR2_NAME + 'foo', LPAR1_NAME]
        }, [LPAR1_NAME]),
        ({
            'name': [LPAR1_NAME, LPAR1_NAME]
        }, [LPAR1_NAME]),
        ({
            'name': '.*lpar 1'
        }, [LPAR1_NAME]),
        ({
            'name': 'lpar 1.*'
        }, [LPAR1_NAME]),
        ({
            'name': 'lpar .'
        }, [LPAR1_NAME, LPAR2_NAME]),
        ({
            'name': '.par 1'
        }, [LPAR1_NAME]),
        ({
            'name': '.+'
        }, [LPAR1_NAME, LPAR2_NAME]),
        ({
            'name': 'lpar 1.+'
        }, []),
        ({
            'name': '.+lpar 1'
        }, []),
        ({
            'name': LPAR1_NAME,
            'object-id': LPAR1_OID
        }, [LPAR1_NAME]),
        ({
            'name': LPAR1_NAME,
            'object-id': LPAR1_OID + 'foo'
        }, []),
        ({
            'name': LPAR1_NAME + 'foo',
            'object-id': LPAR1_OID
        }, []),
        ({
            'name': LPAR1_NAME + 'foo',
            'object-id': LPAR1_OID + 'foo'
        }, []),
    ])
    def test_lparmanager_list_filter_args(self, filter_args, exp_names):
        """Test LparManager.list() with filter_args."""

        # Add two faked LPARs
        self.add_lpar1()
        self.add_lpar2()

        lpar_mgr = self.cpc.lpars

        # Execute the code to be tested
        lpars = lpar_mgr.list(filter_args=filter_args)

        assert len(lpars) == len(exp_names)
        if exp_names:
            names = [p.properties['name'] for p in lpars]
            assert set(names) == set(exp_names)

    def test_lpar_repr(self):
        """Test Lpar.__repr__()."""

        # Add a faked LPAR
        faked_lpar = self.add_lpar1()

        lpar_mgr = self.cpc.lpars
        lpar = lpar_mgr.find(name=faked_lpar.name)

        # Execute the code to be tested
        repr_str = repr(lpar)

        repr_str = repr_str.replace('\n', '\\n')
        # We check just the begin of the string:
        assert re.match(
            r'^{classname}\s+at\s+0x{id:08x}\s+\(\\n.*'.format(
                classname=lpar.__class__.__name__, id=id(lpar)), repr_str)

    @pytest.mark.parametrize("lpar_name", [
        LPAR1_NAME,
        LPAR2_NAME,
    ])
    @pytest.mark.parametrize("input_props", [
        {},
        {
            'description': 'New lpar description'
        },
        {
            'acceptable-status': ['operating', 'not-operating'],
            'description': 'New lpar description'
        },
        {
            'ssc-master-userid': None,
            'ssc-master-pw': None
        },
    ])
    def test_lpar_update_properties(self, input_props, lpar_name):
        """Test Lpar.update_properties()."""

        # Add faked lpars
        self.add_lpar1()
        self.add_lpar2()

        lpar_mgr = self.cpc.lpars
        lpar = lpar_mgr.find(name=lpar_name)

        lpar.pull_full_properties()
        saved_properties = copy.deepcopy(lpar.properties)

        # Execute the code to be tested
        lpar.update_properties(properties=input_props)

        # Verify that the resource object already reflects the property
        # updates.
        for prop_name in saved_properties:
            if prop_name in input_props:
                exp_prop_value = input_props[prop_name]
            else:
                exp_prop_value = saved_properties[prop_name]
            assert prop_name in lpar.properties
            prop_value = lpar.properties[prop_name]
            assert prop_value == exp_prop_value

        # Refresh the resource object and verify that the resource object
        # still reflects the property updates.
        lpar.pull_full_properties()
        for prop_name in saved_properties:
            if prop_name in input_props:
                exp_prop_value = input_props[prop_name]
            else:
                exp_prop_value = saved_properties[prop_name]
            assert prop_name in lpar.properties
            prop_value = lpar.properties[prop_name]
            assert prop_value == exp_prop_value

    @pytest.mark.parametrize(
        "initial_profile, profile_kwargs, exp_profile, exp_profile_exc", [
            ('', dict(), None, HTTPError({
                'http-status': 500,
                'reason': 263
            })),
            (LPAR1_NAME, dict(), LPAR1_NAME, None),
            (LPAR2_NAME, dict(), None,
             HTTPError({
                 'http-status': 500,
                 'reason': 263
             })),
            ('', dict(activation_profile_name=LPAR1_NAME), LPAR1_NAME, None),
            (LPAR1_NAME, dict(activation_profile_name=LPAR1_NAME), LPAR1_NAME,
             None),
            (LPAR2_NAME, dict(activation_profile_name=LPAR1_NAME), LPAR1_NAME,
             None),
            ('', dict(activation_profile_name=LPAR2_NAME), None,
             HTTPError({
                 'http-status': 500,
                 'reason': 263
             })),
            (LPAR1_NAME, dict(activation_profile_name=LPAR2_NAME), None,
             HTTPError({
                 'http-status': 500,
                 'reason': 263
             })),
            (LPAR2_NAME, dict(activation_profile_name=LPAR2_NAME), None,
             HTTPError({
                 'http-status': 500,
                 'reason': 263
             })),
        ])
    @pytest.mark.parametrize(
        "initial_status, status_kwargs, act_exp_status, exp_status_exc",
        [
            (
                'not-activated',
                dict(),  # Verify that force has a default
                'not-operating',
                None),
            ('not-activated', dict(force=False), 'not-operating', None),
            ('not-activated', dict(force=True), 'not-operating', None),
            ('not-operating', dict(force=False), 'not-operating', None),
            ('not-operating', dict(force=True), 'not-operating', None),
            (
                'operating',
                dict(),  # Verify that force default is False
                'not-operating',
                HTTPError({
                    'http-status': 500,
                    'reason': 263
                })),
            ('operating', dict(force=False), 'not-operating',
             HTTPError({
                 'http-status': 500,
                 'reason': 263
             })),
            ('operating', dict(force=True), 'not-operating', None),
            ('exceptions', dict(force=False), 'not-operating', None),
            ('exceptions', dict(force=True), 'not-operating', None),
            ('not-activated', dict(), 'exceptions',
             StatusTimeout(None, None, None, None)),
            ('not-activated', dict(allow_status_exceptions=False),
             'exceptions', StatusTimeout(None, None, None, None)),
            ('not-activated', dict(allow_status_exceptions=True), 'exceptions',
             None),
        ])
    @mock.patch.object(LparActivateHandler, 'get_status')
    def test_lpar_activate(self, get_status_mock, initial_status,
                           status_kwargs, act_exp_status, exp_status_exc,
                           initial_profile, profile_kwargs, exp_profile,
                           exp_profile_exc):
        """Test Lpar.activate()."""

        # Add a faked LPAR
        faked_lpar = self.add_lpar1()
        faked_lpar.properties['status'] = initial_status
        faked_lpar.properties['next-activation-profile-name'] = initial_profile

        lpar_mgr = self.cpc.lpars
        lpar = lpar_mgr.find(name=faked_lpar.name)

        input_kwargs = dict(status_kwargs, **profile_kwargs)

        exp_excs = []
        if exp_status_exc:
            exp_excs.append(exp_status_exc)
        if exp_profile_exc:
            exp_excs.append(exp_profile_exc)

        get_status_mock.return_value = act_exp_status

        if exp_excs:

            with pytest.raises(Exception) as exc_info:

                # Execute the code to be tested
                lpar.activate(**input_kwargs)

            exc = exc_info.value

            exp_exc_classes = [e.__class__ for e in exp_excs]
            assert isinstance(exc, tuple(exp_exc_classes))

            if isinstance(exc, HTTPError):
                exp_httperror = [
                    e for e in exp_excs if isinstance(e, HTTPError)
                ][0]
                assert exc.http_status == exp_httperror.http_status
                assert exc.reason == exp_httperror.reason

        else:

            # Execute the code to be tested.
            ret = lpar.activate(**input_kwargs)

            assert ret is None

            lpar.pull_full_properties()

            status = lpar.get_property('status')
            assert status == act_exp_status

            last_profile_name = lpar.get_property(
                'last-used-activation-profile')
            assert last_profile_name == exp_profile

    @pytest.mark.parametrize(
        "initial_status, input_kwargs, act_exp_status, exp_status_exc",
        [
            (
                'not-activated',
                dict(),  # Verify that force has a default
                'not-activated',
                HTTPError({
                    'http-status': 500,
                    'reason': 263
                })),
            ('not-activated', dict(force=False), 'not-activated',
             HTTPError({
                 'http-status': 500,
                 'reason': 263
             })),
            ('not-activated', dict(force=True), 'not-activated', None),
            ('not-operating', dict(force=False), 'not-activated', None),
            ('not-operating', dict(force=True), 'not-activated', None),
            (
                'operating',
                dict(),  # Verify that force default is False
                'not-activated',
                HTTPError({
                    'http-status': 500,
                    'reason': 263
                })),
            ('operating', dict(force=False), 'not-activated',
             HTTPError({
                 'http-status': 500,
                 'reason': 263
             })),
            ('operating', dict(force=True), 'not-activated', None),
            ('exceptions', dict(force=False), 'not-activated', None),
            ('exceptions', dict(force=True), 'not-activated', None),
            ('not-operating', dict(), 'exceptions',
             StatusTimeout(None, None, None, None)),
            ('not-operating', dict(allow_status_exceptions=False),
             'exceptions', StatusTimeout(None, None, None, None)),
            ('not-operating', dict(allow_status_exceptions=True), 'exceptions',
             None),
        ])
    @mock.patch.object(LparDeactivateHandler, 'get_status')
    def test_lpar_deactivate(self, get_status_mock, initial_status,
                             input_kwargs, act_exp_status, exp_status_exc):
        """Test Lpar.deactivate()."""

        # Add a faked LPAR
        faked_lpar = self.add_lpar1()
        faked_lpar.properties['status'] = initial_status

        lpar_mgr = self.cpc.lpars
        lpar = lpar_mgr.find(name=faked_lpar.name)

        get_status_mock.return_value = act_exp_status

        exp_excs = []
        if exp_status_exc:
            exp_excs.append(exp_status_exc)

        if exp_excs:

            with pytest.raises(Exception) as exc_info:

                # Execute the code to be tested
                lpar.deactivate(**input_kwargs)

            exc = exc_info.value

            exp_exc_classes = [e.__class__ for e in exp_excs]
            assert isinstance(exc, tuple(exp_exc_classes))

            if isinstance(exc, HTTPError):
                exp_httperror = [
                    e for e in exp_excs if isinstance(e, HTTPError)
                ][0]
                assert exc.http_status == exp_httperror.http_status
                assert exc.reason == exp_httperror.reason

        else:

            # Execute the code to be tested.
            ret = lpar.deactivate(**input_kwargs)

            assert ret is None

            lpar.pull_full_properties()

            status = lpar.get_property('status')
            assert status == act_exp_status

    @pytest.mark.parametrize(
        "initial_loadparm, loadparm_kwargs, exp_loadparm, exp_loadparm_exc", [
            (None, dict(), '', None),
            (None, dict(load_parameter='abcd'), 'abcd', None),
            ('abcd', dict(), 'abcd', None),
            ('fooo', dict(load_parameter='abcd'), 'abcd', None),
        ])
    @pytest.mark.parametrize(
        "initial_loadaddr, loadaddr_kwargs, exp_loadaddr, exp_loadaddr_exc", [
            (None, dict(), None, HTTPError({
                'http-status': 400,
                'reason': 5
            })),
            (None, dict(load_address='5176'), '5176', None),
            ('5176', dict(), '5176', None),
            ('1234', dict(load_address='5176'), '5176', None),
        ])
    @pytest.mark.parametrize(
        "initial_status, status_kwargs, act_exp_status, exp_status_exc"
        ", initial_stored_status, exp_stored_status, exp_store_status_exc", [
            ('not-activated', dict(), 'operating',
             HTTPError({
                 'http-status': 409,
                 'reason': 0
             }), None, None, None),
            ('not-activated', dict(force=False), 'operating',
             HTTPError({
                 'http-status': 409,
                 'reason': 0
             }), None, None, None),
            ('not-activated', dict(force=True), 'operating',
             HTTPError({
                 'http-status': 409,
                 'reason': 0
             }), None, None, None),
            ('not-operating', dict(force=False), 'operating', None, None, None,
             None),
            ('not-operating', dict(force=True), 'operating', None, None, None,
             None),
            ('operating', dict(), 'operating',
             HTTPError({
                 'http-status': 500,
                 'reason': 263
             }), None, None, None),
            ('operating', dict(force=False), 'operating',
             HTTPError({
                 'http-status': 500,
                 'reason': 263
             }), None, None, None),
            ('operating', dict(force=True), 'operating', None, None, None,
             None),
            ('exceptions', dict(force=False), 'operating', None, None, None,
             None),
            ('exceptions', dict(force=True), 'operating', None, None, None,
             None),
            ('not-operating', dict(), 'exceptions',
             StatusTimeout(None, None, None, None), None, None, None),
            ('not-operating', dict(allow_status_exceptions=False),
             'exceptions', StatusTimeout(None, None, None,
                                         None), None, None, None),
            ('not-operating', dict(allow_status_exceptions=True), 'exceptions',
             None, None, None, None),
            ('not-operating', dict(store_status_indicator=False), 'operating',
             None, None, None, None),
            ('not-operating', dict(store_status_indicator=True), 'operating',
             None, None, 'not-operating', None),
        ])
    @pytest.mark.parametrize(
        "initial_memory, memory_kwargs, exp_memory, exp_memory_exc", [
            ('foobar', dict(), '', None),
            ('foobar', dict(clear_indicator=False), 'foobar', None),
            ('foobar', dict(clear_indicator=True), '', None),
        ])
    @mock.patch.object(LparLoadHandler, 'get_status')
    def test_lpar_load(self, get_status_mock, initial_status, status_kwargs,
                       act_exp_status, exp_status_exc, initial_loadaddr,
                       loadaddr_kwargs, exp_loadaddr, exp_loadaddr_exc,
                       initial_loadparm, loadparm_kwargs, exp_loadparm,
                       exp_loadparm_exc, initial_memory, memory_kwargs,
                       exp_memory, exp_memory_exc, initial_stored_status,
                       exp_stored_status, exp_store_status_exc):
        """Test Lpar.load()."""

        # Add a faked LPAR
        faked_lpar = self.add_lpar1()
        faked_lpar.properties['status'] = initial_status
        faked_lpar.properties['last-used-load-address'] = initial_loadaddr
        faked_lpar.properties['last-used-load-parameter'] = initial_loadparm
        faked_lpar.properties['memory'] = initial_memory

        lpar_mgr = self.cpc.lpars
        lpar = lpar_mgr.find(name=faked_lpar.name)

        input_kwargs = dict(status_kwargs, **loadaddr_kwargs)
        input_kwargs.update(**loadparm_kwargs)
        input_kwargs.update(**memory_kwargs)

        exp_excs = []
        if exp_status_exc:
            exp_excs.append(exp_status_exc)
        if exp_loadaddr_exc:
            exp_excs.append(exp_loadaddr_exc)
        if exp_loadparm_exc:
            exp_excs.append(exp_loadparm_exc)
        if exp_memory_exc:
            exp_excs.append(exp_memory_exc)
        if exp_store_status_exc:
            exp_excs.append(exp_store_status_exc)

        get_status_mock.return_value = act_exp_status

        if exp_excs:

            with pytest.raises(Exception) as exc_info:

                # Execute the code to be tested
                lpar.load(**input_kwargs)

            exc = exc_info.value

            exp_exc_classes = [e.__class__ for e in exp_excs]
            assert isinstance(exc, tuple(exp_exc_classes))

            if isinstance(exc, HTTPError):
                exp_httperror = [
                    e for e in exp_excs if isinstance(e, HTTPError)
                ][0]
                assert exc.http_status == exp_httperror.http_status
                assert exc.reason == exp_httperror.reason

        else:

            # Execute the code to be tested.
            ret = lpar.load(**input_kwargs)

            assert ret is None

            lpar.pull_full_properties()

            status = lpar.get_property('status')
            assert status == act_exp_status

            last_loadaddr = lpar.get_property('last-used-load-address')
            assert last_loadaddr == exp_loadaddr

            last_loadparm = lpar.get_property('last-used-load-parameter')
            assert last_loadparm == exp_loadparm

            last_memory = lpar.get_property('memory')
            assert last_memory == exp_memory

            stored_status = lpar.get_property('stored-status')
            assert stored_status == exp_stored_status