From f5db9e98f45a775f17e51ee42c334373ff22a09a Mon Sep 17 00:00:00 2001 From: zhipengl Date: Thu, 20 Jun 2019 23:14:09 +0800 Subject: [PATCH] Add redfishtool package Add redfishtool package to controller nodes It will be used by maintenance processes(mtcAgent and hwmon). Two patches are required. 1. python2 support patch 2. config file support patch Deploy test pass redfishtool can run normally in controller node. Story: 2005861 Task: 34187 Depends-On: https://review.opendev.org/665993/ Change-Id: I69e08cffd8587cb4287394f2b7a2f46fd3d054d9 Signed-off-by: zhipengl --- bmc/Redfishtool/centos/build_srpm.data | 6 + bmc/Redfishtool/centos/redfishtool.spec | 63 ++ .../0001-Adapt-redfishtool-to-python2.patch | 640 ++++++++++++++++++ .../0002-Add-configfile-option-support.patch | 35 + centos_iso_image.inc | 3 + centos_pkg_dirs | 1 + 6 files changed, 748 insertions(+) create mode 100644 bmc/Redfishtool/centos/build_srpm.data create mode 100644 bmc/Redfishtool/centos/redfishtool.spec create mode 100644 bmc/Redfishtool/files/0001-Adapt-redfishtool-to-python2.patch create mode 100644 bmc/Redfishtool/files/0002-Add-configfile-option-support.patch diff --git a/bmc/Redfishtool/centos/build_srpm.data b/bmc/Redfishtool/centos/build_srpm.data new file mode 100644 index 000000000..958ae3bb0 --- /dev/null +++ b/bmc/Redfishtool/centos/build_srpm.data @@ -0,0 +1,6 @@ +COPY_LIST=" \ + $STX_BASE/downloads/Redfishtool-1.0.8.tar.gz \ + $PKG_BASE/files/* \ +" +TIS_PATCH_VER=0 + diff --git a/bmc/Redfishtool/centos/redfishtool.spec b/bmc/Redfishtool/centos/redfishtool.spec new file mode 100644 index 000000000..e8210b420 --- /dev/null +++ b/bmc/Redfishtool/centos/redfishtool.spec @@ -0,0 +1,63 @@ +# +# SPDX-License-Identifier: BSD-3-Clause +# +# Copyright (c) 2016, Contributing Member(s) of Distributed Management +# Task Force, Inc.. All rights reserved. + +Summary: Redfish Tool Package +Name: Redfishtool +Version: 1.0.8 +Release: %{?_tis_dist}.%{tis_patch_ver} +#For full text see link: https://github.com/DMTF/Redfishtool/blob/master/LICENSE.md +License: BSD-3-Clause. +Group: base +Packager: StarlingX +URL: https://github.com/DMTF/Redfishtool + +Source0: %{name}-%{version}.tar.gz + +BuildArch: noarch + +Patch01: 0001-Adapt-redfishtool-to-python2.patch +Patch02: 0002-Add-configfile-option-support.patch + +BuildRequires: python-setuptools + +Requires: python-requests + +%description +Redfish Tool Package + +%define pythonroot /usr/lib64/python2.7/site-packages +%define debug_package %{nil} + +%prep +%setup +%patch01 -p1 +%patch02 -p1 + +# Remove bundled egg-info +rm -rf *.egg-info + +%build +%{__python} setup.py build + +%install +%{__python} setup.py install --root=%{buildroot} \ + --install-lib=%{pythonroot} \ + --prefix=/usr \ + --install-data=/usr/share \ + --single-version-externally-managed + +%post + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%defattr(-,root,root,-) +%doc LICENSE.md +%{pythonroot}/redfishtool/* +%{pythonroot}/redfishtool-%{version}*.egg-info + +%{_bindir}/redfishtool diff --git a/bmc/Redfishtool/files/0001-Adapt-redfishtool-to-python2.patch b/bmc/Redfishtool/files/0001-Adapt-redfishtool-to-python2.patch new file mode 100644 index 000000000..5cad092f5 --- /dev/null +++ b/bmc/Redfishtool/files/0001-Adapt-redfishtool-to-python2.patch @@ -0,0 +1,640 @@ +From ecaf5c44da357e2ee5279a3f84a060f7af2c9dd1 Mon Sep 17 00:00:00 2001 +From: zhipengl +Date: Fri, 21 Jun 2019 01:50:14 +0800 +Subject: [PATCH] Adapt-redfishtool-to-python2 + +Signed-off-by: zhipengl +--- + redfishtool/AccountService.py | 18 +++++++++--------- + redfishtool/Chassis.py | 22 +++++++++++----------- + redfishtool/Managers.py | 29 ++++++++++++++--------------- + redfishtool/ServiceRoot.py | 2 +- + redfishtool/SessionService.py | 10 +++++----- + redfishtool/Systems.py | 36 ++++++++++++++++++------------------ + redfishtool/raw.py | 2 +- + redfishtool/redfishtoolTransport.py | 29 ++++++++++++++--------------- + setup.py | 1 + + 9 files changed, 74 insertions(+), 75 deletions(-) + +diff --git a/redfishtool/AccountService.py b/redfishtool/AccountService.py +index e0ec106..bfb17f8 100644 +--- a/redfishtool/AccountService.py ++++ b/redfishtool/AccountService.py +@@ -34,7 +34,7 @@ import getopt + import re + import sys + from .ServiceRoot import RfServiceRoot +-from urllib.parse import urljoin ++from urlparse import urljoin + + class RfAccountServiceMain(): + def __init__(self): +@@ -259,13 +259,13 @@ class RfAccountServiceOperations(): + #loop through the members and create the list sub-operation response + rc,r,j,d=rft.listCollection(rft, r, d, prop="UserName") + if(rc==0): +- rft.printVerbose(1," list {} Collection member info: Id, URI, UserName".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," list {} Collection member info: Id, URI, UserName".format(collName), skip1=True, printV12=cmdTop) + + # else: check if no account was specified. If not, return the collection + elif(rft.IdLevel2OptnCount==0): + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', r.url, relPath=accountsLink, prop=prop) + if(rc==0): +- rft.printVerbose(1," {} Collection ".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," {} Collection ".format(collName), skip1=True, printV12=cmdTop) + + # else: check if the -a (all) option is set. If not, return the session specific by -i or -m or -l + # search collection to find path using getPath2 +@@ -287,14 +287,14 @@ class RfAccountServiceOperations(): + elif( r is None ): + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', collUrl, relPath=path2, prop=prop) + if(rc==0): +- rft.printVerbose(1," {} Collection Member ".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," {} Collection Member ".format(collName), skip1=True, printV12=cmdTop) + + # else, return ALL of the Accounts members + else: + rft.printVerbose(4,"getting expanded Accounts Collection") + rc,r,j,d=rft.getAllCollectionMembers(rft, r.url, relPath=accountsLink) + if(rc==0): +- rft.printVerbose(1," Get ALL {} Collection Members".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," Get ALL {} Collection Members".format(collName), skip1=True, printV12=cmdTop) + + return(rc,r,j,d) + +@@ -324,13 +324,13 @@ class RfAccountServiceOperations(): + #loop through the members and create the list sub-operation response + rc,r,j,d=rft.listCollection(rft, r, d, prop="IsPredefined") + if(rc==0): +- rft.printVerbose(1," list {} Collection member info: Id, URI, IsPredefined".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," list {} Collection member info: Id, URI, IsPredefined".format(collName), skip1=True, printV12=cmdTop) + + # else: check if no account was specified. If not, return the collection + elif(rft.IdLevel2OptnCount==0): + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', r.url, relPath=rolesLink, prop=prop) + if(rc==0): +- rft.printVerbose(1," {} Collection ".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," {} Collection ".format(collName), skip1=True, printV12=cmdTop) + + # else: check if the -a (all) option is set. If not, return the session specific by -i or -m or -l + # search collection to find path using getPath2 +@@ -352,14 +352,14 @@ class RfAccountServiceOperations(): + elif( r is None ): + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', collUrl, relPath=path2, prop=prop) + if(rc==0): +- rft.printVerbose(1," {} Collection Member ".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," {} Collection Member ".format(collName), skip1=True, printV12=cmdTop) + + # else, return ALL of the Accounts members + else: + rft.printVerbose(4,"getting expanded Roles Collection") + rc,r,j,d=rft.getAllCollectionMembers(rft, r.url, relPath=rolesLink) + if(rc==0): +- rft.printVerbose(1," Get ALL {} Collection Members".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," Get ALL {} Collection Members".format(collName), skip1=True, printV12=cmdTop) + + return(rc,r,j,d) + +diff --git a/redfishtool/Chassis.py b/redfishtool/Chassis.py +index d8f0bf5..0494bd9 100644 +--- a/redfishtool/Chassis.py ++++ b/redfishtool/Chassis.py +@@ -37,7 +37,7 @@ import getopt + import re + import sys + from .ServiceRoot import RfServiceRoot +-from urllib.parse import urljoin ++from urlparse import urljoin + + class RfChassisMain(): + def __init__(self): +@@ -208,7 +208,7 @@ class RfChassisOperations(): + rft.printVerbose(4,"Expand Chassis collection to return ALL Chassis collection members fully expanded in response") + rc,r,j,d=rft.getAllCollectionMembers(rft, r.url, relPath=systemsLink) + if(rc==0): +- rft.printVerbose(1," Get ALL {} Collection Members".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," Get ALL {} Collection Members".format(collName), skip1=True, printV12=cmdTop) + + # otherwise, just return the collection + # now read the /Chassis collection +@@ -217,7 +217,7 @@ class RfChassisOperations(): + if cmdTop is True: prop=rft.prop + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', r.url, relPath=systemsLink, prop=prop) + if(rc==0): +- rft.printVerbose(1," Chassis Collection:",skip1=True, printV12=cmdTop) ++ rft.printVerbose(1," Chassis Collection:", skip1=True, printV12=cmdTop) + + return(rc,r,j,d) + +@@ -262,7 +262,7 @@ class RfChassisOperations(): + #loop through the members and create the list sub-operation response + rc,r,j,d=rft.listCollection(rft, r, d, prop="AssetTag") + if(rc==0): +- rft.printVerbose(1," list {} Collection member info: Id, URI, AssetTag".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," list {} Collection member info: Id, URI, AssetTag".format(collName), skip1=True, printV12=cmdTop) + return(rc,r,j,d) + + +@@ -439,7 +439,7 @@ class RfChassisOperations(): + + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', r.url, relPath=resLink, prop=prop) + if(rc==0): +- rft.printVerbose(1," {} Resource ".format(resName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," {} Resource ".format(resName), skip1=True, printV12=cmdTop) + + return(rc,r,j,d) + +@@ -464,7 +464,7 @@ class RfChassisOperations(): + + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', r.url, relPath=resLink, prop=prop) + if(rc==0): +- rft.printVerbose(1," {} Resource ".format(resName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," {} Resource ".format(resName), skip1=True, printV12=cmdTop) + + return(rc,r,j,d) + +@@ -521,13 +521,13 @@ class RfChassisOperations(): + if( prop in powerControl[indx] ): + respDataVal=powerControl[indx][prop] + respData={prop: respDataVal} +- rft.printVerbose(1," Get Current Power consumption (PowerConsumedWatts) of PowerControl[{}] resource".format(indx,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," Get Current Power consumption (PowerConsumedWatts) of PowerControl[{}] resource".format(indx), skip1=True, printV12=cmdTop) + else: + rft.printErr("Error: Property {} not not returned in PowerControl[{}] resource".format(prop,indx)) + return(4,r,j,d) + else: + respData=powerControl[indx] #return the full powerControl array +- rft.printVerbose(1," Chassis PowerControl[{}] array:".format(indx,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," Chassis PowerControl[{}] array:".format(indx), skip1=True, printV12=cmdTop) + + return(rc,r,j,respData) + +@@ -684,13 +684,13 @@ class RfChassisOperations(): + #loop through the members and create the list sub-operation response + rc,r,j,d=rft.listCollection(rft, r, d, prop="Name") + if(rc==0): +- rft.printVerbose(1," list {} Collection member info: Id, URI, Name".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," list {} Collection member info: Id, URI, Name".format(collName), skip1=True, printV12=cmdTop) + + # else: check if no Log was specified. If not, return the collection + elif(rft.IdLevel2OptnCount==0): + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', r.url, relPath=logLink, prop=prop) + if(rc==0): +- rft.printVerbose(1," {} Collection ".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," {} Collection ".format(collName), skip1=True, printV12=cmdTop) + + # else: check if the -a (all) option is set. If not, return the proc specific by -i or -m + # search collection to find path using getPath2 +@@ -712,7 +712,7 @@ class RfChassisOperations(): + elif( r is None ): + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', collUrl, relPath=path2, prop=prop) + if(rc==0): +- rft.printVerbose(1," {} Collection Member ".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," {} Collection Member ".format(collName), skip1=True, printV12=cmdTop) + + # If '--Entries' specified, get "Entries" nav link and read it + if rc == 0 and rft.gotEntriesOptn: +diff --git a/redfishtool/Managers.py b/redfishtool/Managers.py +index 586a871..400dad7 100644 +--- a/redfishtool/Managers.py ++++ b/redfishtool/Managers.py +@@ -37,7 +37,7 @@ import getopt + import re + import sys + from .ServiceRoot import RfServiceRoot +-from urllib.parse import urljoin ++from urlparse import urljoin + + class RfManagersMain(): + def __init__(self): +@@ -211,7 +211,7 @@ class RfManagersOperations(): + rft.printVerbose(4,"Expand Managers collection to return ALL Managers collection members fully expanded in response") + rc,r,j,d=rft.getAllCollectionMembers(rft, r.url, relPath=systemsLink) + if(rc==0): +- rft.printVerbose(1," Get ALL {} Collection Members".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," Get ALL {} Collection Members".format(collName), skip1=True, printV12=cmdTop) + + # otherwise, just return the collection + # now read the /Managers collection +@@ -467,7 +467,7 @@ class RfManagersOperations(): + + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', r.url, relPath=resLink, prop=prop) + if(rc==0): +- rft.printVerbose(1," {} Resource ".format(resName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," {} Resource ".format(resName), skip1=True, printV12=cmdTop) + + return(rc,r,j,d) + +@@ -503,13 +503,13 @@ class RfManagersOperations(): + #loop through the members and create the list sub-operation response + rc,r,j,d=rft.listCollection(rft, r, d, prop="Name") + if(rc==0): +- rft.printVerbose(1," list {} Collection member info: Id, URI, Name".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," list {} Collection member info: Id, URI, Name".format(collName), skip1=True, printV12=cmdTop) + + # else: check if no NIC was specified. If not, return the collection + elif(rft.IdLevel2OptnCount==0): + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', r.url, relPath=nicLink, prop=prop) + if(rc==0): +- rft.printVerbose(1," {} Collection ".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," {} Collection ".format(collName), skip1=True, printV12=cmdTop) + + # else: check if the -a (all) option is set. If not, return the proc specific by -i or -m + # search collection to find path using getPath2 +@@ -531,14 +531,14 @@ class RfManagersOperations(): + elif( r is None ): + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', collUrl, relPath=path2, prop=prop) + if(rc==0): +- rft.printVerbose(1," {} Collection Member ".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," {} Collection Member ".format(collName), skip1=True, printV12=cmdTop) + + # else, return ALL of the EthernetInterfaces members + else: + rft.printVerbose(4,"getting expanded EthernetInterfaces Collection") + rc,r,j,d=rft.getAllCollectionMembers(rft, r.url, relPath=nicLink) + if(rc==0): +- rft.printVerbose(1," Get ALL {} Collection Members".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," Get ALL {} Collection Members".format(collName), skip1=True, printV12=cmdTop) + + return(rc,r,j,d) + +@@ -568,13 +568,13 @@ class RfManagersOperations(): + #loop through the members and create the list sub-operation response + rc,r,j,d=rft.listCollection(rft, r, d, prop="Name" ) + if(rc==0): +- rft.printVerbose(1," list {} Collection member info: Id, URI, Name".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," list {} Collection member info: Id, URI, Name".format(collName), skip1=True, printV12=cmdTop) + + # else: check if no SerialInterfaces controller was specified. If not, return the collection + elif(rft.IdLevel2OptnCount==0): + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', r.url, relPath=cntlrLink, prop=prop) + if(rc==0): +- rft.printVerbose(1," {} Collection ".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," {} Collection ".format(collName), skip1=True, printV12=cmdTop) + + # else: check if the -a (all) option is set. If not, return the proc specific by -i or -m + # search collection to find path using getPath2 +@@ -596,14 +596,14 @@ class RfManagersOperations(): + elif( r is None ): + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', collUrl, relPath=path2, prop=prop) + if(rc==0): +- rft.printVerbose(1," {} Collection Member ".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," {} Collection Member ".format(collName), skip1=True, printV12=cmdTop) + + # else, return ALL of the SerialInterfaces members + else: + rft.printVerbose(4,"getting expanded SerialInterfaces Collection") + rc,r,j,d=rft.getAllCollectionMembers(rft, r.url, relPath=cntlrLink) + if(rc==0): +- rft.printVerbose(1," Get ALL {} Collection Members".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," Get ALL {} Collection Members".format(collName), skip1=True, printV12=cmdTop) + + return(rc,r,j,d) + +@@ -633,13 +633,12 @@ class RfManagersOperations(): + #loop through the members and create the list sub-operation response + rc,r,j,d=rft.listCollection(rft, r, d, prop="Name") + if(rc==0): +- rft.printVerbose(1," list {} Collection member info: Id, URI, Name".format(collName,skip1=True, printV12=cmdTop)) +- ++ rft.printVerbose(1," list {} Collection member info: Id, URI, Name".format(collName), skip1=True, printV12=cmdTop) + # else: check if no Log was specified. If not, return the collection + elif(rft.IdLevel2OptnCount==0): + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', r.url, relPath=logLink, prop=prop) + if(rc==0): +- rft.printVerbose(1," {} Collection ".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," {} Collection ".format(collName), skip1=True, printV12=cmdTop) + + # else: check if the -a (all) option is set. If not, return the proc specific by -i or -m + # search collection to find path using getPath2 +@@ -661,7 +660,7 @@ class RfManagersOperations(): + elif( r is None ): + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', collUrl, relPath=path2, prop=prop) + if(rc==0): +- rft.printVerbose(1," {} Collection Member ".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," {} Collection Member ".format(collName), skip1=True, printV12=cmdTop) + + # If '--Entries' specified, get "Entries" nav link and read it + if rc == 0 and rft.gotEntriesOptn: +diff --git a/redfishtool/ServiceRoot.py b/redfishtool/ServiceRoot.py +index 5d85b5d..9395b83 100644 +--- a/redfishtool/ServiceRoot.py ++++ b/redfishtool/ServiceRoot.py +@@ -12,7 +12,7 @@ + # + import requests + import json +-from urllib.parse import urljoin, urlparse, urlunparse ++from urlparse import urljoin, urlparse, urlunparse + + class RfServiceRoot: + def __init__(self): +diff --git a/redfishtool/SessionService.py b/redfishtool/SessionService.py +index 7a07811..c7a1624 100644 +--- a/redfishtool/SessionService.py ++++ b/redfishtool/SessionService.py +@@ -30,7 +30,7 @@ import getopt + import re + import sys + from .ServiceRoot import RfServiceRoot +-from urllib.parse import urljoin ++from urlparse import urljoin + + class RfSessionServiceMain(): + def __init__(self): +@@ -267,13 +267,13 @@ class RfSessionServiceOperations(): + #loop through the members and create the list sub-operation response + rc,r,j,d=rft.listCollection(rft, r, d, prop="UserName") + if(rc==0): +- rft.printVerbose(1," list {} Collection member info: Id, URI, Socket".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," list {} Collection member info: Id, URI, Socket".format(collName), skip1=True, printV12=cmdTop) + + # else: check if no session was specified. If not, return the collection + elif(rft.IdLevel2OptnCount==0): + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', r.url, relPath=sessionsLink, prop=prop) + if(rc==0): +- rft.printVerbose(1," {} Collection ".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," {} Collection ".format(collName), skip1=True, printV12=cmdTop) + + # else: check if the -a (all) option is set. If not, return the session specific by -i or -m or -l + # search collection to find path using getPath2 +@@ -295,14 +295,14 @@ class RfSessionServiceOperations(): + elif( r is None ): + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', collUrl, relPath=path2, prop=prop) + if(rc==0): +- rft.printVerbose(1," {} Collection Member ".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," {} Collection Member ".format(collName), skip1=True, printV12=cmdTop) + + # else, return ALL of the Sessions members + else: + rft.printVerbose(4,"getting expanded Sessions Collection") + rc,r,j,d=rft.getAllCollectionMembers(rft, r.url, relPath=sessionsLink) + if(rc==0): +- rft.printVerbose(1," Get ALL {} Collection Members".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," Get ALL {} Collection Members".format(collName), skip1=True, printV12=cmdTop) + + return(rc,r,j,d) + +diff --git a/redfishtool/Systems.py b/redfishtool/Systems.py +index 9a7dfbe..9a9148a 100644 +--- a/redfishtool/Systems.py ++++ b/redfishtool/Systems.py +@@ -39,7 +39,7 @@ import getopt + import re + import sys + from .ServiceRoot import RfServiceRoot +-from urllib.parse import urljoin ++from urlparse import urljoin + + class RfSystemsMain(): + def __init__(self): +@@ -216,7 +216,7 @@ class RfSystemsOperations(): + rft.printVerbose(4,"Expand Systems collection to return ALL Systems collection members fully expanded in response") + rc,r,j,d=rft.getAllCollectionMembers(rft, r.url, relPath=systemsLink) + if(rc==0): +- rft.printVerbose(1," Get ALL {} Collection Members".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," Get ALL {} Collection Members".format(collName), skip1=True, printV12=cmdTop) + + # otherwise, just return the collection + # now read the /Systems collection +@@ -419,7 +419,7 @@ class RfSystemsOperations(): + reqData=reqPostData) + + if(rc==0): +- rft.printVerbose(1," Systems reset: ", resetType, skip1=True, printV12=cmdTop) ++ rft.printVerbose(1,(" Systems reset: {}").format(resetType), skip1=True, printV12=cmdTop) + resetd=None + return(rc,r,False,resetd) + else: return(rc,r,False,None) +@@ -623,13 +623,13 @@ class RfSystemsOperations(): + #loop through the members and create the list sub-operation response + rc,r,j,d=rft.listCollection(rft, r, d, prop="Socket") + if(rc==0): +- rft.printVerbose(1," list {} Collection member info: Id, URI, Socket".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," list {} Collection member info: Id, URI, Socket".format(collName), skip1=True, printV12=cmdTop) + + # else: check if no proc was specified. If not, return the collection + elif(rft.IdLevel2OptnCount==0): + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', r.url, relPath=procsLink, prop=prop) + if(rc==0): +- rft.printVerbose(1," {} Collection ".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," {} Collection ".format(collName), skip1=True, printV12=cmdTop) + + # else: check if the -a (all) option is set. If not, return the proc specific by -i or -m + # search collection to find path using getPath2 +@@ -651,14 +651,14 @@ class RfSystemsOperations(): + elif( r is None ): + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', collUrl, relPath=path2, prop=prop) + if(rc==0): +- rft.printVerbose(1," {} Collection Member ".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," {} Collection Member ".format(collName), skip1=True, printV12=cmdTop) + + # else, return ALL of the processor members + else: + rft.printVerbose(4,"getting expanded Processor Collection") + rc,r,j,d=rft.getAllCollectionMembers(rft, r.url, relPath=procsLink) + if(rc==0): +- rft.printVerbose(1," Get ALL {} Collection Members".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," Get ALL {} Collection Members".format(collName), skip1=True, printV12=cmdTop) + + return(rc,r,j,d) + +@@ -688,13 +688,13 @@ class RfSystemsOperations(): + #loop through the members and create the list sub-operation response + rc,r,j,d=rft.listCollection(rft, r, d, prop="Name") + if(rc==0): +- rft.printVerbose(1," list {} Collection member info: Id, URI, Name".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," list {} Collection member info: Id, URI, Name".format(collName), skip1=True, printV12=cmdTop) + + # else: check if no NIC was specified. If not, return the collection + elif(rft.IdLevel2OptnCount==0): + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', r.url, relPath=nicLink, prop=prop) + if(rc==0): +- rft.printVerbose(1," {} Collection ".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," {} Collection ".format(collName), skip1=True, printV12=cmdTop) + + # else: check if the -a (all) option is set. If not, return the proc specific by -i or -m + # search collection to find path using getPath2 +@@ -716,14 +716,14 @@ class RfSystemsOperations(): + elif( r is None ): + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', collUrl, relPath=path2, prop=prop) + if(rc==0): +- rft.printVerbose(1," {} Collection Member ".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," {} Collection Member ".format(collName), skip1=True, printV12=cmdTop) + + # else, return ALL of the EthernetInterfaces members + else: + rft.printVerbose(4,"getting expanded EthernetInterfaces Collection") + rc,r,j,d=rft.getAllCollectionMembers(rft, r.url, relPath=nicLink) + if(rc==0): +- rft.printVerbose(1," Get ALL {} Collection Members".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," Get ALL {} Collection Members".format(collName), skip1=True, printV12=cmdTop) + + return(rc,r,j,d) + +@@ -753,13 +753,13 @@ class RfSystemsOperations(): + #loop through the members and create the list sub-operation response + rc,r,j,d=rft.listCollection(rft, r, d, prop="Name" ) + if(rc==0): +- rft.printVerbose(1," list {} Collection member info: Id, URI, Name".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," list {} Collection member info: Id, URI, Name".format(collName), skip1=True, printV12=cmdTop) + + # else: check if no SimpleStorage controller was specified. If not, return the collection + elif(rft.IdLevel2OptnCount==0): + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', r.url, relPath=cntlrLink, prop=prop) + if(rc==0): +- rft.printVerbose(1," {} Collection ".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," {} Collection ".format(collName), skip1=True, printV12=cmdTop) + + # else: check if the -a (all) option is set. If not, return the proc specific by -i or -m + # search collection to find path using getPath2 +@@ -781,14 +781,14 @@ class RfSystemsOperations(): + elif( r is None ): + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', collUrl, relPath=path2, prop=prop) + if(rc==0): +- rft.printVerbose(1," {} Collection Member ".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," {} Collection Member ".format(collName), skip1=True, printV12=cmdTop) + + # else, return ALL of the SimpleStorage members + else: + rft.printVerbose(4,"getting expanded SimpleStorage Collection") + rc,r,j,d=rft.getAllCollectionMembers(rft, r.url, relPath=cntlrLink) + if(rc==0): +- rft.printVerbose(1," Get ALL {} Collection Members".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," Get ALL {} Collection Members".format(collName), skip1=True, printV12=cmdTop) + + return(rc,r,j,d) + +@@ -818,13 +818,13 @@ class RfSystemsOperations(): + #loop through the members and create the list sub-operation response + rc,r,j,d=rft.listCollection(rft, r, d, prop="Name") + if(rc==0): +- rft.printVerbose(1," list {} Collection member info: Id, URI, Name".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," list {} Collection member info: Id, URI, Name".format(collName), skip1=True, printV12=cmdTop) + + # else: check if no Log was specified. If not, return the collection + elif(rft.IdLevel2OptnCount==0): + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', r.url, relPath=logLink, prop=prop) + if(rc==0): +- rft.printVerbose(1," {} Collection ".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," {} Collection ".format(collName), skip1=True, printV12=cmdTop) + + # else: check if the -a (all) option is set. If not, return the proc specific by -i or -m + # search collection to find path using getPath2 +@@ -846,7 +846,7 @@ class RfSystemsOperations(): + elif( r is None ): + rc,r,j,d=rft.rftSendRecvRequest(rft.AUTHENTICATED_API, 'GET', collUrl, relPath=path2, prop=prop) + if(rc==0): +- rft.printVerbose(1," {} Collection Member ".format(collName,skip1=True, printV12=cmdTop)) ++ rft.printVerbose(1," {} Collection Member ".format(collName), skip1=True, printV12=cmdTop) + + # If '--Entries' specified, get "Entries" nav link and read it + if rc == 0 and rft.gotEntriesOptn: +diff --git a/redfishtool/raw.py b/redfishtool/raw.py +index bfb617c..1b32d0b 100644 +--- a/redfishtool/raw.py ++++ b/redfishtool/raw.py +@@ -30,7 +30,7 @@ import getopt + import re + import sys + #from .ServiceRoot import RfServiceRoot +-from urllib.parse import urljoin, urlparse, urlunparse ++from urlparse import urljoin, urlparse, urlunparse + + class RfRawMain(): + def __init__(self): +diff --git a/redfishtool/redfishtoolTransport.py b/redfishtool/redfishtoolTransport.py +index 017fa11..f157eff 100644 +--- a/redfishtool/redfishtoolTransport.py ++++ b/redfishtool/redfishtoolTransport.py +@@ -39,7 +39,7 @@ import json + import sys + import socket + import time +-from urllib.parse import urljoin, urlparse, urlunparse ++from urlparse import urljoin, urlparse, urlunparse + from requests.auth import HTTPBasicAuth, AuthBase + from .ServiceRoot import RfServiceRoot + +@@ -730,31 +730,32 @@ class RfTransport(): + return(0) + + +- def printVerbose(self,v,*argv, skip1=False, printV12=True,**kwargs): ++ def printVerbose(self,v, argv, skip1=False, printV12=True): + if(self.quiet): + return(0) + if( (v==1 or v==2) and (printV12 is True) and (self.verbose >= v )): + if(skip1 is True): print("#") +- print("#",*argv, **kwargs) ++ print("#", argv) + elif( (v==1 or v==2) and (self.verbose >4 )): + if(skip1 is True): print("#") +- print("#",*argv, **kwargs) ++ print("#", argv) + elif((v==3 ) and (printV12 is True) and (self.verbose >=v)): + if(skip1 is True): print("#") +- print("#REQUEST:",*argv,file=sys.stdout,**kwargs) ++ sys.stdout.write("#REQUEST:",argv) ++ # print("#REQUEST:",argv,file=sys.stdout) + elif((v==4 or v==5) and (self.verbose >=v)): + if(skip1 is True): print("#") +- print("#DB{}:".format(v),*argv,file=sys.stdout,**kwargs) ++ sys.stdout.write("#DB{}:".format(v),argv) ++ # print("#DB{}:".format(v),argv,file=sys.stdout) + elif( v==0): #print no mater value of verbose, but not if quiet=1 + if(skip1 is True): print("") +- print(*argv, **kwargs) ++ print(argv) + else: + pass + + sys.stdout.flush() + #if you set v= anything except 0,1,2,3,4,5 it is ignored + +- + def printStatus(self, s, r=None, hdrs=None, authMsg=None, addSessionLoginInfo=False): + if(self.quiet): + return(0) +@@ -785,22 +786,20 @@ class RfTransport(): + sys.stdout.flush() + + +- +- +- def printErr(self,*argv,noprog=False,prepend="",**kwargs): ++ def printErr(self,argv,noprog=False,prepend=""): + if( self.quiet == False): + if(noprog is True): +- print(prepend,*argv, file=sys.stderr, **kwargs) ++ sys.stderr.write("{}{}".format(prepend,argv)) + else: +- print(prepend," {}:".format(self.program),*argv, file=sys.stderr, **kwargs) ++ sys.stderr.write("{} {}:{}".format(prepend, self.program, argv)) + else: + pass +- ++ + sys.stderr.flush() + return(0) + + +- def printStatusErr4xx(self, status_code,*argv,noprog=False, prepend="",**kwargs): ++ def printStatusErr4xx(self, status_code): + if(self.quiet): + return(0) + if( status_code < 400 ): +diff --git a/setup.py b/setup.py +index d37d099..481f429 100644 +--- a/setup.py ++++ b/setup.py +@@ -1,5 +1,6 @@ + from setuptools import setup + from os import path ++from io import open + + this_directory = path.abspath(path.dirname(__file__)) + with open(path.join(this_directory, 'README.md'), encoding='utf-8') as f: +-- +2.7.4 + diff --git a/bmc/Redfishtool/files/0002-Add-configfile-option-support.patch b/bmc/Redfishtool/files/0002-Add-configfile-option-support.patch new file mode 100644 index 000000000..03f7457b8 --- /dev/null +++ b/bmc/Redfishtool/files/0002-Add-configfile-option-support.patch @@ -0,0 +1,35 @@ +From d0c3cc759545a82138329e292e99f310ec74047f Mon Sep 17 00:00:00 2001 +From: zhipengl +Date: Sat, 22 Jun 2019 02:06:54 +0800 +Subject: [PATCH] Add configfile option support + +Signed-off-by: zhipengl +--- + redfishtool/redfishtoolMain.py | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/redfishtool/redfishtoolMain.py b/redfishtool/redfishtoolMain.py +index cd3dd6f..ea2e44f 100644 +--- a/redfishtool/redfishtoolMain.py ++++ b/redfishtool/redfishtoolMain.py +@@ -156,6 +156,17 @@ def main(argv): + rft.authToken=rft.token + elif opt in ("-c", "--config"): #read additional options from a file + rft.configFile=arg ++ try: ++ with open(arg, 'r') as f: ++ configdata = json.load(f) ++ if 'username' in configdata and 'password' in configdata: ++ rft.user = configdata['username'] ++ rft.password = configdata['password'] ++ rft.printVerbose(1,"Main: get pw from configfile, usr:{}, pw:{}".format(rft.user, rft.password)) ++ else: ++ rft.printErr("Invalid --config= filedata: {}".format(configdata)) ++ except IOError: ++ rft.printErr("Invalid: Could not open configfile") + elif opt in ("-T", "--Timeout"): #Specify http timeout in seconds + timePattern="^([1-9][0-9]*)$" + timeMatch=re.search(timePattern,arg) +-- +2.7.4 + diff --git a/centos_iso_image.inc b/centos_iso_image.inc index 81ff37af1..72b1b8827 100644 --- a/centos_iso_image.inc +++ b/centos_iso_image.inc @@ -342,3 +342,6 @@ python2-ruamel-yaml # util-linux-config util-linux-config + +# redfish tool +Redfishtool diff --git a/centos_pkg_dirs b/centos_pkg_dirs index 47a5d5ffc..0ad33e60c 100644 --- a/centos_pkg_dirs +++ b/centos_pkg_dirs @@ -140,3 +140,4 @@ grub/grub2 utilities/build-info ceph/ceph ceph/ceph-manager +bmc/Redfishtool