Пример #1
0
    def reboot(self, optype='boot', **kw):

        node = kw['node']
        rf = redfish.RedfishRest(name=node,
                                 nodeinfo=kw['nodeinfo'],
                                 messager=self.callback,
                                 debugmode=self.debugmode,
                                 verbose=self.verbose)
        resettype = 'boot'

        try:
            rf.login()
            chassis_state = rf.get_chassis_power_state()
            if chassis_state == 'Off':
                status = chassis_state
            else:
                status = rf.get_systems_power_state()

            if status == 'Off':
                if optype == 'reset':
                    return self.callback.info('%s: %s' %
                                              (node, status.lower()))
                else:
                    resettype = 'on'

            rf.set_power_state(resettype)
            new_status = POWER_STATE_DB.get(optype, '')
            self.callback.info('%s: %s' % (node, optype))
            if new_status:
                self.callback.update_node_attributes('status', node,
                                                     new_status)
        except (SelfServerException, SelfClientException) as e:
            self.callback.error(e.message, node)
Пример #2
0
def test_init_no_bmcip():
    nodeinfo_dict = {
        'bmc': 'testbmc',
        'username': '******',
        'password': '******'
    }
    rf_rest_new = rf.RedfishRest(name='testnode',
                                 nodeinfo=nodeinfo_dict,
                                 messager=Messager(),
                                 debugmode=True,
                                 verbose=False)

    assert rf_rest_new.bmcip == 'testnode'
Пример #3
0
    def get_state(self, **kw):

        node = kw['node']
        rf = redfish.RedfishRest(name=node, nodeinfo=kw['nodeinfo'], messager=self.callback,
                                 debugmode=self.debugmode, verbose=self.verbose)

        state = 'Unknown'
        try:
            rf.login()
            self.callback.info('%s: %s' % (node, state))
        except (SelfServerException, SelfClientException) as e:
            self.callback.error(e.message, node)

        return state
Пример #4
0
    def set_state(self, setboot_state, persistant, **kw):

        node = kw['node']
        rf = redfish.RedfishRest(name=node,
                                 nodeinfo=kw['nodeinfo'],
                                 messager=self.callback,
                                 debugmode=self.debugmode,
                                 verbose=self.verbose)

        try:
            rf.login()
            rf.set_boot_state(persistant, setboot_state)
            state = rf.get_boot_state()
            self.callback.info('%s: %s' % (node, state))

        except (SelfServerException, SelfClientException) as e:
            self.callback.error(e.message, node)
Пример #5
0
    def set_state(self, state, **kw):

        node = kw['node']
        rf = redfish.RedfishRest(name=node,
                                 nodeinfo=kw['nodeinfo'],
                                 messager=self.callback,
                                 debugmode=self.debugmode,
                                 verbose=self.verbose)

        try:
            rf.login()
            rf.set_power_state(state)
            new_status = POWER_STATE_DB.get(state, '')
            self.callback.info('%s: %s' % (node, state))
            if new_status:
                self.callback.update_node_attributes('status', node,
                                                     new_status)
        except (SelfServerException, SelfClientException) as e:
            self.callback.error(e.message, node)
Пример #6
0
    def reboot_bmc(self, optype='warm', **kw):

        node = kw['node']
        rf = redfish.RedfishRest(name=node,
                                 nodeinfo=kw['nodeinfo'],
                                 messager=self.callback,
                                 debugmode=self.debugmode,
                                 verbose=self.verbose)

        try:
            rf.login()
        except (SelfServerException, SelfClientException) as e:
            return self.callback.error(e.message, node)

        try:
            rf.reboot_bmc(optype)
        except (SelfServerException, SelfClientException) as e:
            self.callback.error(e.message, node)
        else:
            self.callback.info('%s: %s' % (node, 'bmcreboot'))
Пример #7
0
class TestRedfishClient(object):

    nodeinfo_dict = {
        'bmc': 'testbmc',
        'bmcip': '10.0.0.1',
        'username': '******',
        'password': '******'
    }
    log = logging.getLogger('TestRedfishClient')
    rf_rest = rf.RedfishRest(name='testnode',
                             nodeinfo=nodeinfo_dict,
                             messager=Messager(),
                             debugmode=True,
                             verbose=False)
    headers = {'Content-Type': 'application/json'}
    with open("%s/redfish_v1_rsp.json" % DATA_DIR, 'r') as load_f:
        rf_v1 = json.load(load_f)
    chassis_url = rf_v1['Chassis']['@odata.id']
    manager_url = rf_v1['Managers']['@odata.id']
    systems_url = rf_v1['Systems']['@odata.id']
    session_url = rf_v1['Links']['Sessions']['@odata.id']

    def test__init__(self):
        assert self.rf_rest.name == 'testnode'
        assert self.rf_rest.bmc == 'testbmc'
        assert self.rf_rest.bmcip == '10.0.0.1'
        assert self.rf_rest.username == 'username'
        assert self.rf_rest.password == 'password'
        assert isinstance(self.rf_rest.messager, Messager)
        assert self.rf_rest.verbose == True
        assert self.rf_rest.root_url == 'https://10.0.0.1'

    def test__print_record_log(self):
        self.rf_rest._print_record_log("test__print_record_log", "test")
        assert self.rf_rest.messager.info
        assert time.asctime

    def test__print_error_log(self):
        self.rf_rest._print_record_log("test__print_error_log", "test")
        assert self.rf_rest._print_record_log

    def test__log_request(self):
        self.rf_rest._print_record_log = mock.Mock(return_value=True)
        login_data = json.dumps({
            "UserName": self.rf_rest.username,
            "Password": self.rf_rest.password
        })
        msg_data = login_data.replace(
            '"Password": "******"' % self.rf_rest.password, '"Password": "******"')
        test_data = json.dumps({"Test": True})
        login_msg = 'curl -k -X POST -H "Content-Type: application/json" https://10.0.0.1%s -d \'%s\' -v' % (
            self.session_url, msg_data)
        test_data_msg = 'curl -k -X POST -H "Content-Type: application/json" -H "X-Auth-Token: xxxxxx" https://10.0.0.1/redfish/v1/Managers -d \'%s\' -v' % test_data
        get_msg = 'curl -k -X GET -H "Content-Type: application/json" -H "X-Auth-Token: xxxxxx" https://10.0.0.1/redfish/v1/Managers'
        assert self.rf_rest._log_request('POST',
                                         self.rf_rest.root_url +
                                         self.session_url,
                                         self.headers,
                                         data=login_data,
                                         cmd='login') == login_msg
        assert self.rf_rest._log_request(
            'POST',
            self.rf_rest.root_url + self.manager_url,
            self.headers,
            data=test_data,
            cmd='test__log_request') == test_data_msg
        assert self.rf_rest._log_request('GET',
                                         self.rf_rest.root_url +
                                         self.manager_url,
                                         self.headers,
                                         cmd='test__log_request') == get_msg

    def test_handle_response_not_ok(self):
        test_rsp = requests.Response()
        test_rsp.status_code = 401
        with open("%s/login_no_auth_rsp.json" % DATA_DIR, 'r') as load_f:
            test_rsp._content = json.dumps(json.load(load_f))
        with pytest.raises(SelfClientException) as excinfo:
            data = self.rf_rest.handle_response(
                test_rsp, cmd='test_handle_response_not_ok')
        assert excinfo.type == SelfClientException
        assert 'the service received an authorization error unauthorized' in str(
            excinfo.value)

    def test_handle_response_no_auth(self):
        test_rsp = requests.Response()
        test_rsp.status_code = 201
        test_rsp.headers = {}
        with open("%s/login_rsp.json" % DATA_DIR, 'r') as load_f:
            test_rsp._content = json.dumps(json.load(load_f))
        with pytest.raises(SelfServerException) as excinfo:
            data = self.rf_rest.handle_response(test_rsp, cmd='login')
        assert excinfo.type == SelfServerException
        assert 'Login Failed: Did not get Session Token from response' in str(
            excinfo.value)

    def test_handle_response_name(self):
        test_rsp = requests.Response()
        test_rsp.status_code = 200
        test_rsp.headers = {'X-Auth-Token': 'abcdefghijklmn'}
        with open("%s/login_rsp.json" % DATA_DIR, 'r') as load_f:
            file_data = json.load(load_f)
            test_rsp._content = json.dumps(file_data)
        data = self.rf_rest.handle_response(test_rsp, cmd='get_information')
        assert data == file_data

    def test_handle_response_error(self):
        test_rsp = requests.Response()
        test_rsp.status_code = 200
        test_rsp.headers = {'X-Auth-Token': 'abcdefghijklmn'}
        with open("%s/with_error_rsp.json" % DATA_DIR, 'r') as load_f:
            file_data = json.load(load_f)
            test_rsp._content = json.dumps(file_data)
        data = self.rf_rest.handle_response(test_rsp, cmd='get_information')
        assert data == file_data

    def test_request_login_connect_failed(self):
        login_data = {
            "UserName": self.rf_rest.username,
            "Password": self.rf_rest.password
        }
        self.rf_rest.session.request = mock.Mock(
            side_effect=SelfServerException(
                'Login to BMC failed: Can\'t connect to'))
        with pytest.raises(SelfServerException) as excinfo:
            self.rf_rest.request('POST',
                                 self.session_url,
                                 headers=self.headers,
                                 payload=login_data,
                                 cmd='login')
        assert excinfo.type == SelfServerException
        assert 'Login to BMC failed: Can\'t connect to' in str(excinfo.value)

    def test_request_connect_failed(self):
        self.rf_rest.session.request = mock.Mock(side_effect=SelfServerException(
            'BMC did not respond. Validate BMC configuration and retry the command.'
        ))
        with pytest.raises(SelfServerException) as excinfo:
            self.rf_rest.request('GET', self.manager_url, headers=self.headers)
        assert excinfo.type == SelfServerException
        assert 'BMC did not respond. Validate BMC configuration and retry the command.' in str(
            excinfo.value)

    def test_request_value_error(self):
        self.rf_rest.session.request = mock.Mock(
            return_value='Mock return value for value error')
        self.rf_rest.handle_response = mock.Mock(side_effect=ValueError())
        with pytest.raises(SelfServerException) as excinfo:
            self.rf_rest.request('GET', self.manager_url, headers=self.headers)
        assert excinfo.type == SelfServerException
        assert 'Received wrong format response:' in str(excinfo.value)

    def test_request_login_success(self):
        login_data = json.dumps({
            "UserName": self.rf_rest.username,
            "Password": self.rf_rest.password
        })
        with open("%s/login_rsp.json" % DATA_DIR, 'r') as load_f:
            response = json.load(load_f)
        self.rf_rest.session.request = mock.Mock(return_value=None)
        self.rf_rest.handle_response = mock.Mock(return_value=response)
        data = self.rf_rest.request('POST',
                                    self.session_url,
                                    headers=self.headers,
                                    payload=login_data,
                                    cmd='login')
        assert self.rf_rest.session.request
        assert data == response

    def test_login_success(self):
        with open("%s/login_rsp.json" % DATA_DIR, 'r') as load_f:
            login_rsp = json.load(load_f)
        self.rf_rest.request = mock.Mock(return_value=login_rsp)
        assert self.rf_rest.login() == None

    def test_login_not_respond(self):
        self.rf_rest.request = mock.Mock(side_effect=SelfServerException(
            'BMC did not respond. Validate BMC configuration and retry the command.'
        ))
        with pytest.raises(SelfServerException) as excinfo:
            self.rf_rest.login()
        assert excinfo.type == SelfServerException
        assert 'BMC did not respond. Validate BMC configuration and retry the command.' in str(
            excinfo.value)

    def test_login_value_error(self):
        self.rf_rest.request = mock.Mock(side_effect=SelfServerException(
            'Received wrong format response: xxxxxx'))
        with pytest.raises(SelfServerException) as excinfo:
            self.rf_rest.login()
        assert excinfo.type == SelfServerException
        assert 'Received wrong format response:' in str(excinfo.value)

    def test__get_members(self):
        resp_data = {"Members": [{"@odata.id": self.manager_url + "/BMC"}]}
        self.rf_rest.request = mock.Mock(return_value=resp_data)
        members = self.rf_rest._get_members(self.manager_url)
        assert members == [{"@odata.id": self.manager_url + "/BMC"}]

    def test__get_members_keyerror(self):
        self.rf_rest.request = mock.Mock(return_value={"key": "value"})
        with pytest.raises(SelfServerException) as excinfo:
            members = self.rf_rest._get_members(self.manager_url)
        assert excinfo.type == SelfServerException
        assert 'Get KeyError' in str(excinfo.value)

    def test_get_bmc_state(self):
        self.rf_rest._get_members = mock.Mock(
            return_value=[{
                "@odata.id": self.manager_url + "/BMC"
            }])
        with open("%s/manager_rsp.json" % DATA_DIR, 'r') as load_f:
            rsp = json.load(load_f)
        self.rf_rest.request = mock.Mock(return_value=rsp)
        assert self.rf_rest.get_bmc_state() == "On"

    def test_get_bmc_state_keyerror(self):
        self.rf_rest._get_members = mock.Mock(
            return_value=[{
                "@odata.id": self.manager_url + "/BMC"
            }])
        self.rf_rest.request = mock.Mock(return_value={"powerState": "Off"})
        with pytest.raises(SelfServerException) as excinfo:
            resp_data = self.rf_rest.get_bmc_state()
        assert excinfo.type == SelfServerException
        assert 'Get KeyError' in str(excinfo.value)

    def test_get_chassis_power_state(self):
        self.rf_rest._get_members = mock.Mock(
            return_value=[{
                "@odata.id": self.chassis_url + '/MotherBoard'
            }])
        with open("%s/chassis_rsp.json" % DATA_DIR, 'r') as load_f:
            rsp = json.load(load_f)
        self.rf_rest.request = mock.Mock(return_value=rsp)
        assert self.rf_rest.get_chassis_power_state() == 'On'

    def test_get_chassis_power_state_keyerror(self):
        self.rf_rest._get_members = mock.Mock(
            return_value=[{
                "@odata.id": self.chassis_url + '/MotherBoard'
            }])
        self.rf_rest.request = mock.Mock(return_value={"Powerstate": "On"})
        with pytest.raises(SelfServerException) as excinfo:
            resp_data = self.rf_rest.get_chassis_power_state()
        assert excinfo.type == SelfServerException
        assert 'Get KeyError' in str(excinfo.value)

    def test_get_systems_power_state(self):
        self.rf_rest._get_members = mock.Mock(
            return_value=[{
                "@odata.id": self.systems_url + '/Computer'
            }])
        with open("%s/systems_rsp.json" % DATA_DIR, 'r') as load_f:
            rsp = json.load(load_f)
        self.rf_rest.request = mock.Mock(return_value=rsp)
        assert self.rf_rest.get_systems_power_state() == 'On'

    def test_get_systems_power_state_keyerror(self):
        self.rf_rest._get_members = mock.Mock(
            return_value=[{
                "@odata.id": self.systems_url + '/Computer'
            }])
        self.rf_rest.request = mock.Mock(return_value={"powerstate": "On"})
        with pytest.raises(SelfServerException) as excinfo:
            self.rf_rest.get_systems_power_state()
        assert excinfo.type == SelfServerException
        assert 'Get KeyError' in str(excinfo.value)

    def test__get_bmc_actions(self):
        self.rf_rest._get_members = mock.Mock(
            return_value=[{
                "@odata.id": self.manager_url + '/BMC'
            }])
        with open("%s/manager_rsp.json" % DATA_DIR, 'r') as load_f:
            rsp = json.load(load_f)
        with open("%s/bmc_action_rsp.json" % DATA_DIR, 'r') as load_f:
            actioninfo = json.load(load_f)
        self.rf_rest.request = mock.Mock(side_effect=[rsp, actioninfo])
        reset_string = '#Manager.Reset'
        assert self.rf_rest._get_bmc_actions() == (
            rsp['Actions'][reset_string]['target'],
            actioninfo['Parameters'][0]['AllowableValues'])

    def test__get_bmc_actions_v123(self):
        self.rf_rest._get_members = mock.Mock(
            return_value=[{
                "@odata.id": self.manager_url + '/BMC'
            }])
        with open("%s/manager_rsp_v123.json" % DATA_DIR, 'r') as load_f:
            rsp = json.load(load_f)
        self.rf_rest.request = mock.Mock(return_value=rsp)
        reset_string = '#Manager.Reset'
        assert self.rf_rest._get_bmc_actions() == (
            rsp['Actions'][reset_string]['target'],
            rsp['Actions'][reset_string]['*****@*****.**'])

    def test__get_bmc_actions_keyerror(self):
        self.rf_rest._get_members = mock.Mock(
            return_value=[{
                "@odata.id": self.manager_url + '/BMC'
            }])
        with open("%s/manager_rsp.json" % DATA_DIR, 'r') as load_f:
            rsp = json.load(load_f)
        self.rf_rest.request = mock.Mock(return_value=rsp)
        with pytest.raises(SelfServerException) as excinfo:
            self.rf_rest._get_bmc_actions()
        assert excinfo.type == SelfServerException
        assert 'Get KeyError' in str(excinfo.value)

    def test_reboot_bmc(self):
        with open("%s/manager_rsp.json" % DATA_DIR, 'r') as load_f:
            rsp = json.load(load_f)
        self.rf_rest._get_bmc_actions = mock.Mock(
            return_value=(rsp['Actions']['#Manager.Reset']['target'],
                          ['ForceRestart']))
        self.rf_rest.request = mock.Mock(return_value=None)
        assert self.rf_rest.reboot_bmc() == None
        assert self.rf_rest.request

    def test_reboot_bmc_unsupported(self):
        self.rf_rest._get_bmc_actions = mock.Mock(
            return_value=(self.manager_url + '/BMC/Reset', ['forcerestart']))
        with pytest.raises(SelfClientException) as excinfo:
            self.rf_rest.reboot_bmc()
        assert excinfo.type == SelfClientException
        assert 'Unsupported option:' in str(excinfo.value)

    def test__get_power_actions(self):
        self.rf_rest._get_members = mock.Mock(
            return_value=[{
                "@odata.id": self.systems_url + '/Computer'
            }])
        with open("%s/systems_rsp.json" % DATA_DIR, 'r') as load_f:
            rsp = json.load(load_f)
        with open("%s/system_action_rsp.json" % DATA_DIR, 'r') as load_f:
            actioninfo = json.load(load_f)
        self.rf_rest.request = mock.Mock(side_effect=[rsp, actioninfo])
        reset_string = '#ComputerSystem.Reset'
        assert self.rf_rest._get_power_actions() == (
            rsp['Actions'][reset_string]['target'],
            actioninfo['Parameters'][0]['AllowableValues'])

    def test__get_power_actions_v123(self):
        self.rf_rest._get_members = mock.Mock(
            return_value=[{
                "@odata.id": self.systems_url + '/Computer'
            }])
        with open("%s/systems_rsp_v123.json" % DATA_DIR, 'r') as load_f:
            rsp = json.load(load_f)
        self.rf_rest.request = mock.Mock(return_value=rsp)
        reset_string = '#ComputerSystem.Reset'
        assert self.rf_rest._get_power_actions() == (
            rsp['Actions'][reset_string]['target'],
            rsp['Actions'][reset_string]['*****@*****.**'])

    def test__get_power_actions_keyerror(self):
        self.rf_rest._get_members = mock.Mock(
            return_value=[{
                "@odata.id": self.systems_url + '/Computer'
            }])
        with open("%s/systems_rsp.json" % DATA_DIR, 'r') as load_f:
            rsp = json.load(load_f)
        self.rf_rest.request = mock.Mock(return_value=rsp)
        with pytest.raises(SelfServerException) as excinfo:
            self.rf_rest._get_power_actions()
        assert excinfo.type == SelfServerException
        assert 'Get KeyError' in str(excinfo.value)

    def test_set_power_state(self):
        with open("%s/systems_rsp.json" % DATA_DIR, 'r') as load_f:
            rsp = json.load(load_f)
        with open("%s/system_action_rsp.json" % DATA_DIR, 'r') as load_f:
            actioninfo = json.load(load_f)
        reset_string = '#ComputerSystem.Reset'
        self.rf_rest._get_power_actions = mock.Mock(
            return_value=(rsp['Actions'][reset_string]['target'],
                          actioninfo['Parameters'][0]['AllowableValues']))
        self.rf_rest.request = mock.Mock(return_value=None)
        assert self.rf_rest.set_power_state('on') == None
        assert self.rf_rest.request

    def test_set_power_state_unsupported(self):
        self.rf_rest._get_power_actions = mock.Mock(
            return_value=(self.systems_url + '/Computer/Reset',
                          ['ForceRestart', 'ForceOff']))
        with pytest.raises(SelfClientException) as excinfo:
            self.rf_rest.set_power_state('on')
        assert excinfo.type == SelfClientException
        assert 'Unsupported option:' in str(excinfo.value)

    def test_get_boot_state(self):
        self.rf_rest._get_members = mock.Mock(
            return_value=[{
                "@odata.id": self.systems_url + '/Computer'
            }])
        with open("%s/systems_rsp.json" % DATA_DIR, 'r') as load_f:
            rsp = json.load(load_f)
        self.rf_rest.request = mock.Mock(return_value=rsp)
        assert self.rf_rest.get_boot_state() == "boot override inactive"
        rsp['Boot']['BootSourceOverrideTarget'] = 'Pxe'
        self.rf_rest.request = mock.Mock(return_value=rsp)
        assert self.rf_rest.get_boot_state() == 'Network'
        rsp['Boot']['BootSourceOverrideEnabled'] = 'Disabled'
        self.rf_rest.request = mock.Mock(return_value=rsp)
        assert self.rf_rest.get_boot_state() == "boot override inactive"

    def test_get_boot_state_keyerror(self):
        self.rf_rest._get_members = mock.Mock(
            return_value=[{
                "@odata.id": self.systems_url + '/Computer'
            }])
        with open("%s/systems_rsp.json" % DATA_DIR, 'r') as load_f:
            rsp = json.load(load_f)
        del rsp['Boot']['BootSourceOverrideEnabled']
        self.rf_rest.request = mock.Mock(return_value=rsp)
        with pytest.raises(SelfServerException) as excinfo:
            self.rf_rest.get_boot_state()
        assert excinfo.type == SelfServerException
        assert 'Get KeyError' in str(excinfo.value)

    def test__get_boot_actions(self):
        self.rf_rest._get_members = mock.Mock(
            return_value=[{
                "@odata.id": self.systems_url + '/Computer'
            }])
        with open("%s/systems_rsp.json" % DATA_DIR, 'r') as load_f:
            rsp = json.load(load_f)
        self.rf_rest.request = mock.Mock(return_value=rsp)
        assert self.rf_rest._get_boot_actions() == (
            self.systems_url + '/Computer',
            rsp['Boot']['*****@*****.**'])

    def test__get_boot_actions_keyerror(self):
        self.rf_rest._get_members = mock.Mock(
            return_value=[{
                "@odata.id": self.systems_url + '/Computer'
            }])
        with open("%s/systems_rsp.json" % DATA_DIR, 'r') as load_f:
            rsp = json.load(load_f)
        del rsp['Boot']['*****@*****.**']
        self.rf_rest.request = mock.Mock(return_value=rsp)
        with pytest.raises(SelfServerException) as excinfo:
            self.rf_rest._get_boot_actions()
        assert excinfo.type == SelfServerException
        assert 'Get KeyError' in str(excinfo.value)

    def test_set_boot_state(self):
        with open("%s/systems_rsp.json" % DATA_DIR, 'r') as load_f:
            rsp = json.load(load_f)
        self.rf_rest._get_boot_actions = mock.Mock(return_value=(
            self.systems_url + '/Computer',
            rsp['Boot']['*****@*****.**']))
        self.rf_rest.request = mock.Mock(return_value=None)
        assert self.rf_rest.set_boot_state(False, 'def') == None
        assert self.rf_rest.request
        assert self.rf_rest.set_boot_state(True, 'cd') == None
        assert self.rf_rest.request

    def test_set_boot_state_unsupported(self):
        allow_values = ['cd', 'def']
        self.rf_rest._get_boot_actions = mock.Mock(
            return_value=(self.systems_url + '/Computer', allow_values))
        with pytest.raises(SelfClientException) as excinfo:
            self.rf_rest.set_boot_state(False, 'hd')
        assert excinfo.type == SelfClientException
        assert 'Unsupported option:' in str(excinfo.value)