You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ml...@apache.org on 2014/05/27 23:49:42 UTC

[3/3] git commit: updated refs/heads/master to 20a31b4

CLOUDSTACK-6784: Expose data types via API so consumers of API can validate data


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/20a31b43
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/20a31b43
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/20a31b43

Branch: refs/heads/master
Commit: 20a31b43d6c0b395c7f2c449ce2f486665a2b55a
Parents: 9605505
Author: Marcus Sorensen <ma...@betterservers.com>
Authored: Tue May 27 11:31:46 2014 -0600
Committer: Marcus Sorensen <ma...@betterservers.com>
Committed: Tue May 27 15:23:23 2014 -0600

----------------------------------------------------------------------
 .../framework/jobs/impl/AsyncJobManagerImpl.java  |  4 ++++
 server/src/com/cloud/api/ApiServer.java           |  6 +++++-
 server/src/com/cloud/api/doc/ApiXmlDocWriter.java |  6 +++++-
 server/src/com/cloud/api/doc/Argument.java        | 14 ++++++++++++++
 tools/marvin/marvin/codegenerator.py              | 18 ++++++++++++++++++
 5 files changed, 46 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/20a31b43/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
index c6dd732..72fc2b4 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
@@ -232,6 +232,10 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
             return;
         }
 
+        if (resultObject != null) {
+            job.setResult(resultObject);
+        }
+
         publishOnEventBus(job, "complete"); // publish before the instance type and ID are wiped out
         List<Long> wakeupList = Transaction.execute(new TransactionCallback<List<Long>>() {
             @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/20a31b43/server/src/com/cloud/api/ApiServer.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiServer.java b/server/src/com/cloud/api/ApiServer.java
index b7444d8..cd1f81a 100755
--- a/server/src/com/cloud/api/ApiServer.java
+++ b/server/src/com/cloud/api/ApiServer.java
@@ -279,15 +279,19 @@ public class ApiServer extends ManagerBase implements HttpRequestHandler, ApiSer
         eventDescription.put("account", jobOwner.getUuid());
         eventDescription.put("processStatus", "" + job.getProcessStatus());
         eventDescription.put("resultCode", "" + job.getResultCode());
-        eventDescription.put("instanceUuid", ApiDBUtils.findJobInstanceUuid(job));
+        eventDescription.put("instanceUuid", (job.getInstanceId() != null ? ApiDBUtils.findJobInstanceUuid(job) : "" ) );
         eventDescription.put("instanceType", (job.getInstanceType() != null ? job.getInstanceType().toString() : "unknown"));
         eventDescription.put("commandEventType", cmdEventType);
         eventDescription.put("jobId", job.getUuid());
+        eventDescription.put("jobResult", job.getResult());
+        eventDescription.put("cmdInfo", job.getCmdInfo());
+        eventDescription.put("status", "" + job.getStatus() );
         // If the event.accountinfo boolean value is set, get the human readable value for the username / domainname
         Map<String, String> configs = _configDao.getConfiguration("management-server", new HashMap<String, String>());
         if (Boolean.valueOf(configs.get("event.accountinfo"))) {
             DomainVO domain = _domainDao.findById(jobOwner.getDomainId());
             eventDescription.put("username", userJobOwner.getUsername());
+            eventDescription.put("accountname", jobOwner.getAccountName());
             eventDescription.put("domainname", domain.getName());
         }
         event.setDescription(eventDescription);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/20a31b43/server/src/com/cloud/api/doc/ApiXmlDocWriter.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/doc/ApiXmlDocWriter.java b/server/src/com/cloud/api/doc/ApiXmlDocWriter.java
index 0194f07..fe07056 100644
--- a/server/src/com/cloud/api/doc/ApiXmlDocWriter.java
+++ b/server/src/com/cloud/api/doc/ApiXmlDocWriter.java
@@ -471,6 +471,8 @@ public class ApiXmlDocWriter {
                     reqArg.setType(parameterAnnotation.type().toString().toLowerCase());
                 }
 
+                reqArg.setDataType(parameterAnnotation.type().toString().toLowerCase());
+
                 if (!parameterAnnotation.since().isEmpty()) {
                     reqArg.setSinceVersion(parameterAnnotation.since());
                 }
@@ -518,6 +520,8 @@ public class ApiXmlDocWriter {
                         respArg.setDescription(description);
                     }
 
+                    respArg.setDataType(responseField.getType().getSimpleName().toLowerCase());
+
                     if (!paramAnnotation.since().isEmpty()) {
                         respArg.setSinceVersion(paramAnnotation.since());
                     }
@@ -648,4 +652,4 @@ public class ApiXmlDocWriter {
         }
     }
 
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/20a31b43/server/src/com/cloud/api/doc/Argument.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/doc/Argument.java b/server/src/com/cloud/api/doc/Argument.java
index 1ca5ace..6889be7 100644
--- a/server/src/com/cloud/api/doc/Argument.java
+++ b/server/src/com/cloud/api/doc/Argument.java
@@ -25,6 +25,7 @@ public class Argument implements Comparable {
     private String type;
     private String sinceVersion = null;
     private List<Argument> arguments;
+    private String dataType;
 
     public Argument(String name) {
         this.name = name;
@@ -49,6 +50,14 @@ public class Argument implements Comparable {
         this.type = type;
     }
 
+    public void setDataType(String dataType) {
+        this.dataType = dataType;
+    }
+
+    public String getDataType() {
+        return this.dataType;
+    }
+
     public String getName() {
         return name;
     }
@@ -100,4 +109,9 @@ public class Argument implements Comparable {
     public boolean hasArguments() {
         return (arguments != null && !arguments.isEmpty());
     }
+
+    @Override
+    public String toString() {
+        return "name=" + this.name + ", description=" + description + ", required=" + required + ", type=" + this.type + ", sinceVersion=" + this.sinceVersion + ", arguments=" + this.arguments + ", dataType=" + this.dataType;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/20a31b43/tools/marvin/marvin/codegenerator.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/codegenerator.py b/tools/marvin/marvin/codegenerator.py
index e5015c6..ba2a325 100644
--- a/tools/marvin/marvin/codegenerator.py
+++ b/tools/marvin/marvin/codegenerator.py
@@ -32,6 +32,7 @@ class cmdParameterProperty(object):
         self.desc = ""
         self.type = "planObject"
         self.subProperties = []
+        self.dataType = ""
 
 
 class cloudStackCmd(object):
@@ -123,6 +124,8 @@ class CodeGenerator(object):
         self.code += 'from baseCmd import *\n'
         self.code += 'from baseResponse import *\n'
         self.code += "class %sCmd (baseCmd):\n" % self.cmd.name
+        self.code += self.space
+        self.code += 'typeInfo = {}\n'
         self.code += self.space + "def __init__(self):\n"
 
         self.code += self.space + self.space
@@ -142,6 +145,8 @@ class CodeGenerator(object):
             self.code += 'self.%s = %s\n' % (req.name, value)
             if req.required == "true":
                 self.required.append(req.name)
+            self.code += self.space + self.space
+            self.code += "self.typeInfo['%s'] = '%s'\n" % ( req.name, req.dataType )
 
         self.code += self.space + self.space + "self.required = ["
         for require in self.required:
@@ -153,6 +158,8 @@ class CodeGenerator(object):
         subItems = {}
         self.code += self.newline
         self.code += 'class %sResponse (baseResponse):\n' % self.cmd.name
+        self.code += self.space
+        self.code += 'typeInfo = {}\n'
         self.code += self.space + "def __init__(self):\n"
         if len(self.cmd.response) == 0:
             self.code += self.space + self.space + "pass"
@@ -169,6 +176,10 @@ class CodeGenerator(object):
                 else:
                     self.code += self.space + self.space
                     self.code += 'self.%s = None\n' % res.name
+                    if res.dataType is not None:
+                        self.code += self.space + self.space
+                        self.code += "self.typeInfo['%s'] = '%s'\n" % ( res.name, res.dataType )
+
         self.code += self.newline
 
         for subclass in self.subclass:
@@ -267,6 +278,9 @@ class CodeGenerator(object):
         paramProperty.name = getText(response.getElementsByTagName('name'))
         paramProperty.desc = getText(response.
                                      getElementsByTagName('description'))
+        dataType = response.getElementsByTagName('dataType')
+        if dataType:
+            paramProperty.dataType = getText(dataType)
         if paramProperty.name.find('(*)') != -1:
             '''This is a list'''
             paramProperty.name = paramProperty.name.split('(*)')[0]
@@ -313,6 +327,10 @@ class CodeGenerator(object):
                 if type:
                     paramProperty.type = getText(type)
 
+                dataType = param.getElementsByTagName('dataType')
+                if dataType:
+                    paramProperty.dataType = getText(dataType)
+
                 csCmd.request.append(paramProperty)
 
             responseEle = cmd.getElementsByTagName("response")[0]