HCE Project Python language Distributed Tasks Manager Application, Distributed Crawler Application and client API bindings.  2.0.0-chaika
Hierarchical Cluster Engine Python language binding
CommandConvertor.py
Go to the documentation of this file.
1 '''
2 Created on Feb 5, 2014
3 
4 @author: igor, bgv
5 '''
6 
7 import json
8 import base64
9 
10 from Commands import ResponseItem
11 from Commands import Session, Limits
12 from Commands import TaskExecuteRequest
13 from Commands import TaskResponse, DRCECover
14 
15 import app.Utils as Utils # pylint: disable=F0401
16 
17 
18 
20 class CommandConvertorError(Exception):
21 
22  def __init__(self, msg):
23  Exception.__init__(self, msg)
24 
25 
26 
27 
29 class TaskExecuteStructEncoder(json.JSONEncoder):
30 # pylint: disable=E0202
31  def default(self, obj):
32 
33  if isinstance(obj, DRCECover):
34  return obj.__dict__
35 
36  return obj.__dict__
37 
38 
39 
40 
42 class TaskExecuteRequestEncoder(json.JSONEncoder):
43 # pylint: disable=E0202
44  def default(self, obj):
45 
46  if isinstance(obj, TaskExecuteRequest):
47  return obj.__dict__
48 
49  if isinstance(obj, Session):
50  return obj.__dict__
51 
52  if isinstance(obj, Limits):
53  return obj.__dict__
54 
55  return obj.__dict__
56 
57 
58 
59 
61 class TaskResponseDecoder(json.JSONDecoder):
62 
63 
67  def decode(self, json_string, _w=json.decoder.WHITESPACE.match):
68  default_obj = super(TaskResponseDecoder, self).decode(json_string, _w)
69  items = list()
70 
71  for response_item in default_obj:
72  response = ResponseItem()
73  response.error_code = response_item["error_code"]
74  response.error_message = response_item["error_message"]
75  response.id = response_item["id"]
76  response.type = response_item["type"]
77  response.host = response_item["host"]
78  response.port = response_item["port"]
79  response.state = response_item["state"]
80  response.pid = response_item["pid"]
81  response.stdout = response_item["stdout"]
82  response.stderror = response_item["stderror"]
83  response.exit_status = response_item["exit_status"]
84  response.files = self.__process_files(response_item["files"])
85  response.node = response_item["node"]
86  response.time = response_item["time"]
87  response.fields = response_item["fields"]
88 
89  items.append(response)
90 
91  task_response = TaskResponse(items)
92  return task_response
93 
94 
95 
96 
99  def __process_files(self, files_list):
100  files = []
101  for item in files_list:
102  files.append({"name":item["name"],
103  "data":item["data"],
104  "action":item["action"]})
105  return files
106 
107 
108 
109 
112 class CommandConvertor_old(object):
113  '''
114  Convert Request to json and restore Response from json
115  '''
116 
117 
121  def to_json(self, command):
122  try:
123  cmd_json = None
124  if isinstance(command, TaskExecuteRequest):
125  cmd_json = json.loads(json.dumps(command, cls=TaskExecuteRequestEncoder)) #return
126  else:
127  cmd_json = json.loads(json.dumps(command.__dict__)) #return
128 
129  data = cmd_json["data"]
130  data_json = json.dumps(data)
131 
132  cmd_json["data"] = base64.b64encode(data_json)
133  cmd_json = json.dumps(cmd_json)
134 
135  return cmd_json
136 
137  except (TypeError, ValueError) as err:
138  raise CommandConvertorError("convert to json " + err.message)
139 
140 
141 
145  def from_json(self, json_string):
146  try:
147  drceResponseObj = json.loads(json_string, cls=TaskResponseDecoder)
148  for item in drceResponseObj.items:
149  #For each item in DRCE response base64decode encoded fields
150  item.stderror = base64.b64decode(item.stderror)
151  item.stdout = base64.b64decode(item.stdout)
152  return drceResponseObj
153  except (ValueError, KeyError, TypeError) as err:
154  raise CommandConvertorError("convert from json " + err.message)
155 
156 
157 
158 
161 class CommandConvertor(object):
162  '''
163  Convert Request to json and restore Response from json
164  '''
165 
166 
170  def to_json(self, taskRequestObj, log=None):
171  cmd_json = None
172  try:
173  cmd_json = taskRequestObj.toJSON()
174  if log is not None:
175  log.debug("!!! cmd_json: %s", cmd_json)
176 
177  cmd_json = json.loads(cmd_json)
178 
179  if "data" in cmd_json:
180  data_json = json.dumps(cmd_json["data"])
181  else:
182  raise CommandConvertorError("convert to json error, \"data\" field not found!")
183 
184  cmd_json["data"] = base64.b64encode(data_json)
185  cmd_json = json.dumps(cmd_json)
186 
187  return cmd_json
188 
189  except (TypeError, ValueError) as err:
190  raise CommandConvertorError("convert to json error : " + str(err) + "\n" + Utils.varDump(taskRequestObj) + '\n' + Utils.getTracebackInfo() + \
191  "\ncmd_json: " + Utils.varDump(cmd_json) + "\ntaskRequestObj: " + Utils.varDump(taskRequestObj))
192 
193 
194 
198  def from_json(self, json_string):
199  try:
200  drceResponseObj = json.loads(json_string, cls=TaskResponseDecoder)
201  for item in drceResponseObj.items:
202  #For each item in DRCE response base64decode encoded fields
203  item.stderror = base64.b64decode(item.stderror)
204  item.stdout = base64.b64decode(item.stdout)
205  return drceResponseObj
206  except (ValueError, KeyError, TypeError) as err:
207  raise CommandConvertorError("convert from json " + err.message)
208 
wrapper for task response item
Definition: Commands.py:110
def __process_files(self, files_list)
parse result_item files files
def decode(self, json_string, _w=json.decoder.WHITESPACE.match)
decoding function
def from_json(self, json_string)
convert from json string to TaskResponse
def default(self, obj)
Helper class is used for correct encoding in json format from TaskExecuteStruct object.
Helper class is used for correct encoding in json format from Task*Request object.
Convertor which used to convert Task*Reques to json and TaskResponse from json.
Exception which inform about errors which appeared during parsing procedure of drce message protocol...
Helper class is used for correct decoding data from json format in TaskResponse.
wrapper for task response
Definition: Commands.py:135
def to_json(self, taskRequestObj, log=None)
convert from Task*Reques object to json string
def from_json(self, json_string)
convert from json string to TaskResponse
Convertor which used to convert Task*Reques to json and TaskResponse from json.
def to_json(self, command)
convert from Task*Reques object to json string