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

Reply via email to