Howdy folks, Since this mail is related with both BZ#743407 and BZ#741476, I decided to create this new mail thread.
During the investigation related with the both bugs reported in $subject, we found some interesting points described below into two topics. Topics: ------------------------ 1) BZ#743407 and regression tests related with BZ#452956 As first test we removed the from the code the fix provided into bug 452956 to check if will introduce a regression condition (see 0001-741476-fixed-system.getDmi.patch). - if (dmi.getSystem() == null) { - return; - } - Afterwards, we built a test package and looking the tests below, we can verify that even the SYSTEM field set to null into database, the StringUtils method returns a empty String. In other words, removing the fix provided on BZ#452956 does not introduces a regression. rhn_web_api.log ---------------------- [2011-10-06 18:18:26,692] INFO - REQUESTED FROM: *callerIp* CALL: auth.login(mmello, ********) CALLER: (mmello) TIME: 0.0070 seconds [2011-10-06 18:18:26,916] INFO - REQUESTED FROM: *callerIp* CALL: system.listSystems(118031x2bee9bd8f75ec857264e6c491353a3d4) CALLER: (mmello) TIME: 0.013 seconds [2011-10-06 18:18:27,139] INFO - REQUESTED FROM: *callerIp* CALL: system.getDmi(118031x2bee9bd8f75ec857264e6c491353a3d4, 1000010118) CALLER: (mmello) TIME: 0.02 seconds [2011-10-06 18:18:27,362] INFO - REQUESTED FROM: *callerIp* CALL: system.getDmi(118031x2bee9bd8f75ec857264e6c491353a3d4, 1000010115) CALLER: (mmello) TIME: 0.021 seconds [2011-10-06 18:18:27,590] INFO - REQUESTED FROM: *callerIp* CALL: system.getDmi(118031x2bee9bd8f75ec857264e6c491353a3d4, 1000010000) CALLER: (mmello) TIME: 0.026 seconds [2011-10-06 18:18:27,814] INFO - REQUESTED FROM: *callerIp* CALL: system.getDmi(118031x2bee9bd8f75ec857264e6c491353a3d4, 1000010003) CALLER: (mmello) TIME: 0.021 seconds [2011-10-06 18:18:28,033] INFO - REQUESTED FROM: *callerIp* CALL: auth.logout(118031x2bee9bd8f75ec857264e6c491353a3d4) CALLER: (mmello) TIME: 0.017 seconds stheo $> python api-dmi.py { SNIP } ******************** 1000010000 {'product': 'SUN BLADE X6240 SERVER MODULE', 'vendor': 'SUN MICROSYSTEMS', 'bios_vendor': 'American Megatrends Inc.', 'system': 'SUN BLADE X6240 SERVER MODULE 0.00.01', 'bios_release': '06/05/2009', 'board': 'SUN MICROSYSTEMS', 'bios_version': '1.17', 'asset': '(chassis: 0000000000) (chassis: Null) (board: 0328MSL-081450009E) (system: 0000000000)'} ******************** 1000010003 {'product': 'SUN BLADE X8440 SERVER MODULE', 'vendor': 'American Megatrends Inc.', 'bios_vendor': 'American Megatrends Inc.', 'system': '', 'bios_release': '08/06/2008', 'board': 'Sun Microsystems', 'bios_version': '', 'asset': '(chassis: 0735AY0038) (chassis: NULL) (board: 0060HSV-0735000226) (system: 0735AY0038)'} Investigating further the issue reported at bug 452956, we were able to hit exactly the same issue when the BIOS fields (BIOS_VERSION,BIOS_RELEASE,BIOS_VENDOR) are null into database. Look below: Database ============ SQL> select ID, BIOS_VENDOR, BIOS_VERSION, BIOS_RELEASE from rhnserverdmi where SERVER_ID = 1000010003; ID BIOS_VENDOR BIOS_VERSION BIOS_RELEASE ---------- ------------------------------ -------------------- --------------- 195 SQL> select ID, SERVER_ID, VENDOR, SYSTEM, PRODUCT from rhnserverdmi where SERVER_ID = 1000010003; ID SERVER_ID VENDOR SYSTEM PRODUCT ---------- ---------- ------------------------------ ---------------------------------------- -------------------------------------------------- 195 1000010003 American Megatrends Inc. SUN BLADE X8440 SERVER MODULE rhn_web_api.log ============================== [2011-10-06 18:24:20,203] INFO - REQUESTED FROM: *callerIp* CALL: auth.login(mmello, ********) CALLER: (mmello) TIME: 0.0080 seconds [2011-10-06 18:24:20,446] INFO - REQUESTED FROM: *callerIp* CALL: system.listSystems(118032x00c519c232a0680caaf4808de661f77b) CALLER: (mmello) TIME: 0.014 seconds [2011-10-06 18:24:20,657] INFO - REQUESTED FROM: *callerIp* CALL: system.getDmi(118032x00c519c232a0680caaf4808de661f77b, 1000010118) CALLER: (mmello) TIME: 0.021 seconds [2011-10-06 18:24:20,868] INFO - REQUESTED FROM: *callerIp* CALL: system.getDmi(118032x00c519c232a0680caaf4808de661f77b, 1000010115) CALLER: (mmello) TIME: 0.022 seconds [2011-10-06 18:24:21,078] INFO - REQUESTED FROM: *callerIp* CALL: system.getDmi(118032x00c519c232a0680caaf4808de661f77b, 1000010000) CALLER: (mmello) TIME: 0.023 seconds [2011-10-06 18:24:21,293] INFO - REQUESTED FROM: *callerIp* CALL: system.getDmi(118032x00c519c232a0680caaf4808de661f77b, 1000010003) CALLER: (mmello) TIME: 0.024 seconds [2011-10-06 18:24:21,293] ERROR - postProcess error java.lang.IllegalStateException: Stopwatch is not running. at org.apache.commons.lang.time.StopWatch.stop(StopWatch.java:140) at com.redhat.rhn.frontend.xmlrpc.LoggingInvocationProcessor.onException(LoggingInvocationProcessor.java:133) at redstone.xmlrpc.XmlRpcDispatcher.processException(XmlRpcDispatcher.java:268) at redstone.xmlrpc.XmlRpcDispatcher.dispatch(XmlRpcDispatcher.java:137) at com.redhat.rhn.frontend.xmlrpc.RhnXmlRpcServer.execute(RhnXmlRpcServer.java:53) at com.redhat.rhn.frontend.xmlrpc.XmlRpcServlet.doPost(XmlRpcServlet.java:162) at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129) at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at com.redhat.rhn.frontend.servlets.LocalizedEnvironmentFilter.doFilter(LocalizedEnvironmentFilter.java:67) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at com.redhat.rhn.frontend.servlets.EnvironmentFilter.doFilter(EnvironmentFilter.java:108) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at com.redhat.rhn.frontend.servlets.SessionFilter.doFilter(SessionFilter.java:55) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at com.redhat.rhn.frontend.servlets.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:97) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190) at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291) at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:769) at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:698) at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:891) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690) at java.lang.Thread.run(Thread.java:736) stheo $> python api-dmi.py { SNIP } ******************** 1000010000 {'product': 'SUN BLADE X6240 SERVER MODULE', 'vendor': 'SUN MICROSYSTEMS', 'bios_vendor': 'American Megatrends Inc.', 'system': 'SUN BLADE X6240 SERVER MODULE 0.00.01', 'bios_release': '06/05/2009', 'board': 'SUN MICROSYSTEMS', 'bios_version': '1.17', 'asset': '(chassis: 0000000000) (chassis: Null) (board: 0328MSL-081450009E) (system: 0000000000)'} ******************** Traceback (most recent call last): File "api-dmi.py", line 12, in <module> sys_dmi = server.system.getDmi(token,int(system['id'])) File "/usr/lib64/python2.7/xmlrpclib.py", line 1224, in __call__ return self.__send(self.__name, args) File "/usr/lib64/python2.7/xmlrpclib.py", line 1570, in __request verbose=self.__verbose File "/usr/lib64/python2.7/xmlrpclib.py", line 1264, in request return self.single_request(host, handler, request_body, verbose) File "/usr/lib64/python2.7/xmlrpclib.py", line 1297, in single_request return self.parse_response(response) File "/usr/lib64/python2.7/xmlrpclib.py", line 1462, in parse_response p.feed(data) File "/usr/lib64/python2.7/xmlrpclib.py", line 557, in feed self._parser.Parse(data, 0) xml.parsers.expat.ExpatError: XML or text declaration not at start of entity: line 1, column 76 -------- I guessing that the BZ#452956 was hitting a issue related with BIOS when having null entries into the database. To verify this, after filling the database with a value into anyone BIOS fields, the API works as expected (SYSTEM filed is NULL into database). database ================ SQL> update rhnserverdmi set BIOS_VENDOR='1' where SERVER_ID = 1000010003; 1 row updated. SQL> select ID, BIOS_VENDOR, BIOS_VERSION, BIOS_RELEASE from rhnserverdmi where SERVER_ID = 1000010003; ID BIOS_VENDOR BIOS_VERSION BIOS_RELEASE ---------- ------------------------------ -------------------- --------------- 195 1 SQL> select ID, SERVER_ID, VENDOR, SYSTEM, PRODUCT from rhnserverdmi where SERVER_ID = 1000010003; ID SERVER_ID VENDOR SYSTEM PRODUCT ---------- ---------- ------------------------------ ---------------------------------------- -------------------------------------------------- 195 1000010003 American Megatrends Inc. SUN BLADE X8440 SERVER MODULE rhn_web_api.log --------------------------------- [2011-10-06 18:31:07,213] INFO - REQUESTED FROM: *callerIp* CALL: auth.login(mmello, ********) CALLER: (mmello) TIME: 0.0060 seconds [2011-10-06 18:31:07,441] INFO - REQUESTED FROM: *callerIp* CALL: system.listSystems(118033x3bdffb2021a3ca4659a14eab05d10550) CALLER: (mmello) TIME: 0.011 seconds [2011-10-06 18:31:07,663] INFO - REQUESTED FROM: *callerIp* CALL: system.getDmi(118033x3bdffb2021a3ca4659a14eab05d10550, 1000010118) CALLER: (mmello) TIME: 0.019 seconds [2011-10-06 18:31:07,886] INFO - REQUESTED FROM: *callerIp* CALL: system.getDmi(118033x3bdffb2021a3ca4659a14eab05d10550, 1000010115) CALLER: (mmello) TIME: 0.019 seconds [2011-10-06 18:31:08,110] INFO - REQUESTED FROM: *callerIp* CALL: system.getDmi(118033x3bdffb2021a3ca4659a14eab05d10550, 1000010000) CALLER: (mmello) TIME: 0.022 seconds [2011-10-06 18:31:08,336] INFO - REQUESTED FROM: *callerIp* CALL: system.getDmi(118033x3bdffb2021a3ca4659a14eab05d10550, 1000010003) CALLER: (mmello) TIME: 0.02 seconds [2011-10-06 18:31:08,546] INFO - REQUESTED FROM: *callerIp* CALL: auth.logout(118033x3bdffb2021a3ca4659a14eab05d10550) CALLER: (mmello) TIME: 0.0060 seconds stheo $> python api-dmi.py { SNIP } 1000010003 {'product': 'SUN BLADE X8440 SERVER MODULE', 'vendor': 'American Megatrends Inc.', 'bios_vendor': '1', 'system': '', 'bios_release': '', 'board': 'Sun Microsystems', 'bios_version': '', 'asset': '(chassis: 0735AY0038) (chassis: NULL) (board: 0060HSV-0735000226) (system: 0735AY0038)'} ******************** BZ#452956 seems to be located at BIOS and not at SYSTEM and the patch above does not include a regression. Second Topic: ---------------------- 2) BZ#743407 - Checking the BIOS when NULL into database In order to debug it, we created the patch below which isolates the problem from Bios creating a new variable and forcing the constructor to be called when database is NULL (see 0002-743407-fixed-system.getDmi-BIOS.patch). We built another package fixing the BIOS component and look the results below: database --> All BIOS fields and SYSTEM is null into the database. =================== SQL> select ID, SERVER_ID, VENDOR, SYSTEM, PRODUCT from rhnserverdmi where SERVER_ID = 1000010003; ID SERVER_ID VENDOR SYSTEM PRODUCT ---------- ---------- ------------------------------ ---------------------------------------- -------------------------------------------------- 195 1000010003 SQL> select ID, BIOS_VENDOR, BIOS_VERSION, BIOS_RELEASE from rhnserverdmi where SERVER_ID = 1000010003; ID BIOS_VENDOR BIOS_VERSION BIOS_RELEASE ---------- ------------------------------ -------------------- --------------- 195 rhn_web_api.log ==================== [2011-10-06 19:39:08,245] INFO - REQUESTED FROM: *callerIp* CALL: auth.login(mmello, ********) CALLER: (mmello) TIME: 0.0090 seconds [2011-10-06 19:39:08,493] INFO - REQUESTED FROM: *callerIp* CALL: system.listSystems(118036x129f9fc11c63458eb3f08b3b73fc0199) CALLER: (mmello) TIME: 0.016 seconds [2011-10-06 19:39:08,728] INFO - REQUESTED FROM: *callerIp* CALL: system.getDmi(118036x129f9fc11c63458eb3f08b3b73fc0199, 1000010118) CALLER: (mmello) TIME: 0.028 seconds [2011-10-06 19:39:08,956] INFO - REQUESTED FROM: *callerIp* CALL: system.getDmi(118036x129f9fc11c63458eb3f08b3b73fc0199, 1000010115) CALLER: (mmello) TIME: 0.03 seconds [2011-10-06 19:39:09,185] INFO - REQUESTED FROM: *callerIp* CALL: system.getDmi(118036x129f9fc11c63458eb3f08b3b73fc0199, 1000010000) CALLER: (mmello) TIME: 0.029 seconds [2011-10-06 19:39:09,423] INFO - REQUESTED FROM: *callerIp* CALL: system.getDmi(118036x129f9fc11c63458eb3f08b3b73fc0199, 1000010003) CALLER: (mmello) TIME: 0.033 seconds [2011-10-06 19:39:09,640] INFO - REQUESTED FROM: *callerIp* CALL: auth.logout(118036x129f9fc11c63458eb3f08b3b73fc0199) CALLER: (mmello) TIME: 0.0080 seconds stheo $> python api-dmi.py { SNIP } 1000010000 {'product': 'SUN BLADE X6240 SERVER MODULE', 'vendor': 'SUN MICROSYSTEMS', 'bios_vendor': 'American Megatrends Inc.', 'system': 'SUN BLADE X6240 SERVER MODULE 0.00.01', 'bios_release': '06/05/2009', 'board': 'SUN MICROSYSTEMS', 'bios_version': '1.17', 'asset': '(chassis: 0000000000) (chassis: Null) (board: 0328MSL-081450009E) (system: 0000000000)'} ******************** 1000010003 {'product': '', 'vendor': '', 'bios_vendor': '', 'system': '', 'bios_release': '', 'board': '', 'bios_version': '', 'asset': ''} ******************** As we can see the patch above addressed the issue related with the BIOS component and also does not provide an regression regarding the bug 452956. Thank you in advance. Best Regards, mmello -- Marcelo Moreira de Mello RHCA RHCSS RHCVA Senior Software Maintenance Engineer/SEG
From: Marcelo Moreira de Mello <mme...@redhat.com> Date: Thu, 6 Oct 2011 19:51:02 -0300 Subject: [PATCH 1/2] 741476 - fixed system.getDmi() method does not return data when SYSTEM field at RHNSERVERDMI table is null --- .../frontend/xmlrpc/serializer/DmiSerializer.java | 4 ---- 1 files changed, 0 insertions(+), 4 deletions(-) diff --git a/java/code/src/com/redhat/rhn/frontend/xmlrpc/serializer/DmiSerializer.java b/java/code/src/com/redhat/rhn/frontend/xmlrpc/serializer/DmiSerializer.java index 7fb29ad..9f5b712 100644 --- a/java/code/src/com/redhat/rhn/frontend/xmlrpc/serializer/DmiSerializer.java +++ b/java/code/src/com/redhat/rhn/frontend/xmlrpc/serializer/DmiSerializer.java @@ -59,10 +59,6 @@ public class DmiSerializer implements XmlRpcCustomSerializer { SerializerHelper bean = new SerializerHelper(builtInSerializer); Dmi dmi = (Dmi) value; - if (dmi.getSystem() == null) { - return; - } - bean.add("vendor", StringUtils.defaultString(dmi.getVendor())); bean.add("system", StringUtils.defaultString(dmi.getSystem())); bean.add("product", StringUtils.defaultString(dmi.getProduct())); -- 1.7.6.4
From: Marcelo Moreira de Mello <mme...@redhat.com> Date: Thu, 6 Oct 2011 20:08:10 -0300 Subject: [PATCH 2/2] 743407 - API system.getDmi() returns a traceback when BIOS field is null into database Traceback (most recent call last): File "api-dmi.py", line 12, in <module> sys_dmi = server.system.getDmi(token,int(system['id'])) File "/usr/lib64/python2.7/xmlrpclib.py", line 1224, in __call__ return self.__send(self.__name, args) File "/usr/lib64/python2.7/xmlrpclib.py", line 1570, in __request verbose=self.__verbose File "/usr/lib64/python2.7/xmlrpclib.py", line 1264, in request return self.single_request(host, handler, request_body, verbose) File "/usr/lib64/python2.7/xmlrpclib.py", line 1297, in single_request return self.parse_response(response) File "/usr/lib64/python2.7/xmlrpclib.py", line 1462, in parse_response p.feed(data) File "/usr/lib64/python2.7/xmlrpclib.py", line 557, in feed self._parser.Parse(data, 0) xml.parsers.expat.ExpatError: XML or text declaration not at start of entity: line 1, column 76 --- .../frontend/xmlrpc/serializer/DmiSerializer.java | 14 +++++++++++--- 1 files changed, 11 insertions(+), 3 deletions(-) diff --git a/java/code/src/com/redhat/rhn/frontend/xmlrpc/serializer/DmiSerializer.java b/java/code/src/com/redhat/rhn/frontend/xmlrpc/serializer/DmiSerializer.java index 9f5b712..5f5ebc1 100644 --- a/java/code/src/com/redhat/rhn/frontend/xmlrpc/serializer/DmiSerializer.java +++ b/java/code/src/com/redhat/rhn/frontend/xmlrpc/serializer/DmiSerializer.java @@ -16,6 +16,7 @@ package com.redhat.rhn.frontend.xmlrpc.serializer; import com.redhat.rhn.domain.server.Dmi; +import com.redhat.rhn.domain.server.Dmi.Bios; import com.redhat.rhn.frontend.xmlrpc.serializer.util.SerializerHelper; import org.apache.commons.lang.StringUtils; @@ -58,15 +59,22 @@ public class DmiSerializer implements XmlRpcCustomSerializer { throws XmlRpcException, IOException { SerializerHelper bean = new SerializerHelper(builtInSerializer); Dmi dmi = (Dmi) value; + Bios bios = null; + + if (dmi.getBios() == null) { + bios = new Bios(); + } else { + bios = dmi.getBios(); + } bean.add("vendor", StringUtils.defaultString(dmi.getVendor())); bean.add("system", StringUtils.defaultString(dmi.getSystem())); bean.add("product", StringUtils.defaultString(dmi.getProduct())); bean.add("asset", StringUtils.defaultString(dmi.getAsset())); bean.add("board", StringUtils.defaultString(dmi.getBoard())); - bean.add("bios_release", StringUtils.defaultString(dmi.getBios().getRelease())); - bean.add("bios_vendor", StringUtils.defaultString(dmi.getBios().getVendor())); - bean.add("bios_version", StringUtils.defaultString(dmi.getBios().getVersion())); + bean.add("bios_release", StringUtils.defaultString(bios.getRelease())); + bean.add("bios_vendor", StringUtils.defaultString(bios.getVendor())); + bean.add("bios_version", StringUtils.defaultString(bios.getVersion())); bean.writeTo(output); } -- 1.7.6.4
_______________________________________________ Spacewalk-devel mailing list Spacewalk-devel@redhat.com https://www.redhat.com/mailman/listinfo/spacewalk-devel