1#!/usr/bin/env python
2
3r"""
4Using python based redfish library.
5Refer: https://github.com/DMTF/python-redfish-library
6"""
7
8import redfish
9from robot.libraries.BuiltIn import BuiltIn
10
11
12class HTTPSBadRequestError(Exception):
13    r"""
14    BMC redfish generic raised method for error(s).
15    """
16    pass
17
18
19class bmc_redfish(object):
20
21    ROBOT_LIBRARY_SCOPE = "TEST SUITE"
22    ROBOT_EXIT_ON_FAILURE = True
23
24    def __init__(self, hostname, username, password, *args, **kwargs):
25        r"""
26        Establish session connection to host.
27
28        Description of argument(s):
29        hostname       The host name or IP address of the server.
30        username       The username to be used to connect to the server.
31        password       The password to be used to connect to the server.
32        args/kwargs    Additional parms which are passed directly
33                       to the redfish_client function.
34        """
35        self._base_url_ = "https://" + hostname
36        self._username_ = username
37        self._password_ = password
38        self._default_prefix_ = "/redfish/v1"
39
40    def __enter__(self):
41        return self
42
43    def __del__(self):
44        del self
45
46    def login(self, *args, **kwargs):
47        r"""
48        Call the corresponding RestClientBase method and return the result.
49
50        Description of argument(s):
51        args/kwargs     These are passed directly to the corresponding
52                        RestClientBase method.
53        """
54
55        for arg in args:
56            hostname = self._base_url_.strip("https://")
57            # Class object constructor reinitialized.
58            self.__init__(hostname=hostname,
59                          username=arg['username'],
60                          password=arg['password'])
61
62        self._robj_ = redfish.redfish_client(base_url=self._base_url_,
63                                             username=self._username_,
64                                             password=self._password_,
65                                             default_prefix=self._default_prefix_)
66        self._robj_.login(auth=redfish.AuthMethod.SESSION)
67        self._session_location_ = self._robj_.get_session_location()
68
69    def get(self, resource_path, *args, **kwargs):
70        r"""
71        Perform a GET request and return response.
72
73        Description of argument(s):
74        resource_path    URI resource absolute path (e.g. "/redfish/v1/Systems/1").
75        args/kwargs      These are passed directly to the corresponding
76                         RestClientBase method.
77        """
78        self._rest_response_ = self._robj_.get(resource_path, *args, **kwargs)
79        return self._rest_response_
80
81    def post(self, resource_path, *args, **kwargs):
82        r"""
83        Perform a POST request.
84
85        Description of argument(s):
86        resource_path    URI resource relative path
87                         (e.g. "Systems/1/Actions/ComputerSystem.Reset").
88        args/kwargs      These are passed directly to the corresponding
89                         RestClientBase method.
90        """
91        self._rest_response_ = self._robj_.post('/redfish/v1/' + resource_path,
92                                                *args, **kwargs)
93        return self._rest_response_
94
95    def patch(self, resource_path, *args, **kwargs):
96        r"""
97        Perform a POST request.
98
99        Description of argument(s):
100        resource_path    URI resource relative path
101        args/kwargs      These are passed directly to the corresponding
102                         RestClientBase method.
103        """
104        self._rest_response_ = self._robj_.patch('/redfish/v1/' + resource_path,
105                                                 *args, **kwargs)
106        return self._rest_response_
107
108    def put(self, resource_path, actions, attr_data):
109        r"""
110        Perform a PUT request.
111
112        Description of argument(s):
113        resource_path    URI resource relative path.
114        args/kwargs      These are passed directly to the corresponding
115                         RestClientBase method.
116        """
117        self._rest_response_ = self._robj_.put('/redfish/v1/' + resource_path,
118                                               *args, **kwargs)
119        return self._rest_response_
120
121    def delete(self, resource_path):
122        r"""
123        Perform a DELETE request.
124
125        Description of argument(s):
126        resource_path  URI resource absolute path
127                       (e.g. "/redfish/v1/SessionService/Sessions/8d1a9wiiNL").
128        """
129        self._rest_response_ = self._robj_.delete(resource_path)
130        return self._rest_response_
131
132    def logout(self):
133        r"""
134        Logout redfish connection session.
135        """
136        self._robj_.logout()
137