Hey folks, I had a fun day trying to follow
https://cwiki.apache.org/confluence/display/CLOUDSTACK/Marvin+-+Testing+wit h+Python I¹m on the master branch. I believe that the recent change https://github.com/apache/cloudstack/commit/20a31b43d6c0b395c7f2c449ce2f486 665a2b55a#diff-09eb6591c1adb5cadc5ccfa9de8ffa6bR128 Causes that marvin-from-scratch process to fail, resulting in the server complaining with messages like INFO ... User signature: iuEkBp/8gHlaZjZflOr/gNLvly0= is not equaled to computed signature: 7V3jl71SYNDHIbx4VTZDds7mQaA= Which causes all marvin tests to fail. The reason is that the python message digest calculation is using the whole typeInfo hash, i.e. In python https://github.com/apache/cloudstack/blob/master/tools/marvin/marvin/clouds tackConnection.py#L132 it considers the unencoded request to be (for example) apikey=sb5gzz5autjcrxosf52ryvtvv6fsxwkmqtsjewvaiagq_p_ekxenr7ehjvc8s0j1ojcx _nlyoqnukzzl4xlr9w &command=listdomains &response=json &typeinfo=%7b%27name%27%3a%20%27string%27%2c%20%27 keyword%27%3a%20%27string%27%2c%20%27level%27%3a%20%27 integer%27%2c%20%27id%27%3a%20%27 uuid%27%2c%20%27pagesize%27%3a%20%27integer%27%2c%20%27 page%27%3a%20%27 integer%27%2c%20%27listall%27%3a%20%27boolean%27%7d whereas on the java side https://github.com/apache/cloudstack/blob/master/server/src/com/cloud/api/A piServer.java#L815 somehow the typeInfo is collapsed, so it¹s unencoded request looks something like apikey=sb5gzz5autjcrxosf52ryvtvv6fsxwkmqtsjewvaiagq_p_ekxenr7ehjvc8s0j1ojcx _nlyoqnukzzl4xlr9w &command=listdomains &response=json &typeinfo=listall And so the digests don¹t match. With the patch below to filter out type info from digest calculation, marvin tests work for me, though with many warnings like WARN Š Received unknown parameters for command addRegion. Unknown parameters : typeinfo Obviously that's a pretty horrible patch and it should not be appliedŠI don¹t know enough about the codebase yet to suggest what the right fix would be. (My best guess for why this problem wasn¹t caught earlier/yet is that it requires re-generating the api code and then re-installing the marvin package before it becomes a problem.) SoŠmy best suggestion for now (based on pretty limited understanding) would be to move the typeInfo support to a feature branch until it¹s also fully implemented server-side? Cheers, Leo ----- diff --git a/server/src/com/cloud/api/ApiServer.java b/server/src/com/cloud/api/ApiServer.java index cd1f81a..2a888ad 100755 --- a/server/src/com/cloud/api/ApiServer.java +++ b/server/src/com/cloud/api/ApiServer.java @@ -827,6 +827,10 @@ public class ApiServer extends ManagerBase implements HttpRequestHandler, ApiSer expires = paramValue; } + if ("typeInfo".equals(paramName)) { + continue; + } + if (unsignedRequest == null) { unsignedRequest = paramName + "=" + URLEncoder.encode(paramValue, UTF_8).replaceAll("\\+", "%20"); } else { diff --git a/tools/marvin/marvin/cloudstackConnection.py b/tools/marvin/marvin/cloudstackConnection.py index c49edf3..aa044b5 100644 --- a/tools/marvin/marvin/cloudstackConnection.py +++ b/tools/marvin/marvin/cloudstackConnection.py @@ -145,8 +145,10 @@ class CSConnection(object): str.lower( urllib.quote_plus(str(r[1])) ).replace("+", "%20")] - ) for r in params] + ) for r in params if r[0] != "typeInfo"] ) signature = base64.encodestring(hmac.new( self.securityKey, hash_str, hashlib.sha1).digest()).strip() return signature