.. image:: /images/hpe_logo2.png
   :width: 150pt
   
   
|

.. toctree::
   :maxdepth: 1

====================
System Compatibility
====================

Compatibility can be hard to maintain if you have many different systems with different firmware versions and system generations on each of them.
`Gen_compat <Reference.html#redfish-ris-gen-compat>`_ tries to help alleviate the headaches associated with this. It can automatically detect
what type of system you are using and provide useful string values of key property keys, paths, types, and booleans to check what the system type is.

A compatibility class is automatically created as part of an RmcApp class.

.. note::  While currently gen_compat only specifically supports HPE iLO systems, the `Definevalstenplus <Reference.html#redfish.ris.gen_compat.Definevalstenplus>`_ class defines are mostly Redfish standard values. Gen_compat can also easily be extended to provide strings for any system type.

Creating a Compatibility Class
==============================

To create a compatibility class we first need to import the relevant module and create an empty class.

>>> from redfish.ris.gen_compat import Typesandpathdefines
>>> COMPAT_OBJ = Typesandpathdefines()

Using a Compatibility Class
===========================

Now if you try to read any defines you will find the values are all empty. We need to point the compatibility class
to a system in order to detect its API type, iLO version, and generation if necessary. This is done with the `getgen` function.
If any other connection requirements are needed they can also be added now.

>>> COMPAT_OBJ.getgen(url=iLO_host, username=login_account, password=login_password)

After running the `getgen` function, if no connection errors occurred, you should be able to see information on the system
as well as a list of string defines you can use in place of direct strings. That way you guarantee no matter the system
you will have the correct key, type, or path value.

.. note:: The following example defines are from an iLO 5 system.

>>> COMPAT_OBJ.ilogen
5
>>> COMPAT_OBJ.defs.hrefstring
'@odata.id'
>>> COMPAT_OBJ.defs.collectionstring
'Members'
>>> COMPAT_OBJ.defs.biostype
'Bios.'

Here is the compatibility class in action on a RedfishClient. The following code would work the same for LegacyRest
due to the use of the compatibility class instead of hard coding paths and keys.

>>> REST_OBJ = RestClient(base_url=iLO_host, username=login_account, password=login_password)
>>> resp = REST_OBJ.get(COMPAT_OBJ.defs.startpath)
>>> resp.path
'/redfish/v1/'
>>> resp.obj.Chassis[COMPAT_OBJ.defs.hrefstring]
u'/redfish/v1/Chassis/'

Updating a Compatibility Class
==============================

On some iLO 4 systems both Redfish and LegacyRest are available for use for backwards compatibility. The compatibility
class will automatically assume LegacyRest in this instance. In order to use Redfish on these systems you will need to
update the defines.

First create a new object with the redfish flag added.

>>> COMPAT_OBJ = Typesandpathdefines()
>>> COMPAT_OBJ.getgen(url=iLO_host, username=login_account, password=login_password, isredfish=True)

The initial isredfish flag will ensure we load redfish paths when performing the initial detection. We still need
to call `updatedefinesflag` to update our defines to Redfish.

>>> COMPAT_OBJ.defs.startpath
'/rest/v1'
>>> COMPAT_OBJ.updatedefinesflag(redfishflag=True)
True
>>> COMPAT_OBJ.defs.startpath
'/redfish/v1/'

.. note:: This will not do anything on Redfish only systems, so it is safe to use in all cases to ensure Redfish is used if that is desired.