cloudpss 3.5.0a1__tar.gz → 4.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/PKG-INFO +1 -1
  2. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/__init__.py +4 -4
  3. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/function/functionExecution.py +1 -1
  4. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/ieslab/DataManageModel.py +5 -5
  5. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/ieslab/EvaluationModel.py +12 -6
  6. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/ieslab/IESLabPlan.py +19 -6
  7. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/ieslab/IESLabSimulation.py +2 -0
  8. cloudpss-4.0.0/cloudpss/ieslab/PlanModel.py +143 -0
  9. cloudpss-4.0.0/cloudpss/ieslab/__init__.py +4 -0
  10. cloudpss-4.0.0/cloudpss/job/__init__.py +5 -0
  11. cloudpss-4.0.0/cloudpss/job/job.py +277 -0
  12. cloudpss-4.0.0/cloudpss/job/jobMachine.py +11 -0
  13. cloudpss-4.0.0/cloudpss/job/jobPolicy.py +129 -0
  14. cloudpss-4.0.0/cloudpss/job/jobQueue.py +14 -0
  15. cloudpss-4.0.0/cloudpss/job/jobReceiver.py +33 -0
  16. cloudpss-4.0.0/cloudpss/job/jobTres.py +6 -0
  17. cloudpss-4.0.0/cloudpss/job/messageStreamReceiver.py +120 -0
  18. cloudpss-4.0.0/cloudpss/job/messageStreamSender.py +74 -0
  19. cloudpss-4.0.0/cloudpss/job/view/EMTView.py +216 -0
  20. cloudpss-4.0.0/cloudpss/job/view/IESLabSimulationView.py +5 -0
  21. cloudpss-4.0.0/cloudpss/job/view/IESLabTypicalDayView.py +27 -0
  22. cloudpss-4.0.0/cloudpss/job/view/IESView.py +103 -0
  23. cloudpss-4.0.0/cloudpss/job/view/PowerFlowView.py +80 -0
  24. cloudpss-4.0.0/cloudpss/job/view/__init__.py +42 -0
  25. cloudpss-4.0.0/cloudpss/job/view/view.py +122 -0
  26. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/model/jobDefinitions.py +34 -0
  27. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/model/model.py +114 -22
  28. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/model/revision.py +2 -4
  29. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/runner/IESLabEvaluationResult.py +27 -22
  30. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/runner/IESLabPlanResult.py +57 -10
  31. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/runner/IESLabTypicalDayResult.py +12 -9
  32. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/runner/result.py +1 -1
  33. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/runner/runner.py +20 -15
  34. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/utils/IO.py +18 -7
  35. cloudpss-4.0.0/cloudpss/utils/httprequests.py +44 -0
  36. cloudpss-4.0.0/cloudpss/verify.py +57 -0
  37. cloudpss-4.0.0/cloudpss/version.py +1 -0
  38. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss.egg-info/PKG-INFO +1 -1
  39. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss.egg-info/SOURCES.txt +25 -1
  40. cloudpss-4.0.0/test/test.py +29 -0
  41. cloudpss-4.0.0/test/testAsync.py +33 -0
  42. cloudpss-4.0.0/test/testEvent.py +46 -0
  43. cloudpss-4.0.0/test/testRt copy.py +107 -0
  44. cloudpss-4.0.0/test/testRt.py +150 -0
  45. cloudpss-4.0.0/test/testSend.py +39 -0
  46. cloudpss-4.0.0/test/test_in_new_web_1.py +118 -0
  47. cloudpss-4.0.0/test/testb.py +18 -0
  48. cloudpss-3.5.0a1/cloudpss/ieslab/PlanModel.py +0 -94
  49. cloudpss-3.5.0a1/cloudpss/ieslab/__init__.py +0 -3
  50. cloudpss-3.5.0a1/cloudpss/utils/httprequests.py +0 -40
  51. cloudpss-3.5.0a1/cloudpss/verify.py +0 -43
  52. cloudpss-3.5.0a1/test/test.py +0 -74
  53. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/README.md +0 -0
  54. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/function/__init__.py +0 -0
  55. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/function/function.py +0 -0
  56. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/function/job.py +0 -0
  57. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/model/__init__.py +0 -0
  58. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/model/implements/__init__.py +0 -0
  59. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/model/implements/component.py +0 -0
  60. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/model/implements/diagram.py +0 -0
  61. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/model/implements/implement.py +0 -0
  62. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/model/topology.py +0 -0
  63. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/project/__init__.py +0 -0
  64. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/project/project.py +0 -0
  65. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/runner/MessageStreamReceiver.py +0 -0
  66. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/runner/__init__.py +0 -0
  67. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/runner/receiver.py +0 -0
  68. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/runner/storage.py +0 -0
  69. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/runner/transform.py +0 -0
  70. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/utils/__init__.py +0 -0
  71. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/utils/dataEncoder.py +0 -0
  72. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/utils/graphqlUtil.py +0 -0
  73. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/utils/matlab.py +0 -0
  74. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/utils/yamlLoader.py +0 -0
  75. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss.egg-info/dependency_links.txt +0 -0
  76. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss.egg-info/requires.txt +0 -0
  77. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss.egg-info/top_level.txt +0 -0
  78. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/setup.cfg +0 -0
  79. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/setup.py +0 -0
  80. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/test/test-sdk.py +0 -0
  81. {cloudpss-3.5.0a1 → cloudpss-4.0.0}/test/test-snapshot.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cloudpss
3
- Version: 3.5.0a1
3
+ Version: 4.0.0
4
4
  Summary: cloudpss sdk
5
5
  Home-page: https://www.cloudpss.net
6
6
  Author: cloudpss
@@ -6,18 +6,18 @@ from .model import Model, ModelRevision, ModelTopology
6
6
  from .project import Project
7
7
  from .utils import MatlabDataEncoder, DateTimeEncode
8
8
  from . import function
9
+ from .job import Job
9
10
  from .function import FunctionExecution
10
-
11
+ from .version import __version__
11
12
  __all__ = [
12
13
  'setToken', 'Model', 'ModelRevision', 'ModelTopology', 'Runner', 'Result',
13
14
  'PowerFlowResult', 'EMTResult', 'MatlabDataEncoder', 'DateTimeEncode',
14
- 'function', 'Project', 'currentJob', 'IESLabSimulation', 'IESLabPlan'
15
+ 'function', 'Project', 'currentJob', 'IESLabSimulation', 'IESLabPlan','__version__','Job'
15
16
  ]
16
- __version__ = '3.5.0-alpha.1'
17
17
 
18
18
 
19
19
  def currentJob():
20
20
  """
21
21
  获取当前的 currentExecution 实例
22
22
  """
23
- return FunctionExecution.current()
23
+ return FunctionExecution.current()
@@ -163,7 +163,7 @@ class FunctionExecution(object):
163
163
  sys.exit(code)
164
164
 
165
165
  def print(self, data):
166
- print(json.dumps(data, cls=MatlabDataEncoder), flush=True)
166
+ print(json.dumps(data, cls=MatlabDataEncoder)+'\n', flush=True)
167
167
 
168
168
  def log(self, content, level='info', html=False, key=None):
169
169
  '''
@@ -146,19 +146,19 @@ class DataManageModel(object):
146
146
  if r['timeid'] is not None:
147
147
  del r['timeid']
148
148
  try:
149
- ret = self._saveItemData(self._kindUrlMap[kind], r)
149
+ self._saveItemData(self._kindUrlMap[kind], r)
150
150
  self._kindIdMap[str(data['timeid'])]=kind
151
151
  self._kindIdMap[str(data['id'])]=kind
152
152
  self._itemDataMap[str(data['timeid'])]=data
153
153
  self._itemDataMap[str(data['id'])]=data
154
154
  if kind in ['thermalLoads', 'electricLoads', 'fuels']:
155
155
  dataList = self._fetchItemData(self._kindUrlMap[kind], None)
156
- self._kindItemDataMap[kind].append(dataList)
157
- return dataList[len(dataList) - 1]['id']
156
+ self._kindItemDataMap[kind] = dataList
157
+ return dataList[-1]['id']
158
158
  else:
159
159
  dataList = self._fetchItemData(self._kindUrlMap[kind], kind)
160
- self._kindItemDataMap[kind].append(dataList)
161
- return dataList[len(dataList) - 1]['id']
160
+ self._kindItemDataMap[kind] = dataList
161
+ return dataList[-1]['id']
162
162
  except Exception as e:
163
163
  raise Exception(str(e))
164
164
 
@@ -5,7 +5,6 @@ from ..utils import request
5
5
  import json
6
6
  from enum import IntEnum, unique
7
7
 
8
-
9
8
  class IESLabEvaluationModel(object):
10
9
  _baseUri = 'api/ieslab-plan/rest/'
11
10
  _taskUri = 'api/ieslab-plan/taskmanager/getSimuLastTasks'
@@ -58,6 +57,12 @@ class IESLabEvaluationModel(object):
58
57
  }
59
58
  }
60
59
 
60
+ # 评价基础参数接口默认值
61
+ _evaluationType = {
62
+ "环保评价": "environmentalEvaluation",
63
+ "能效评价": "energyEvaluation"
64
+ }
65
+
61
66
  def __init__(self, simulationId):
62
67
  '''
63
68
  初始化
@@ -91,7 +96,7 @@ class IESLabEvaluationModel(object):
91
96
  data = json.loads(r.text)
92
97
  return data
93
98
 
94
- def GetFinancialParas(self, planID):
99
+ def GetFinancialParams(self, planID):
95
100
  '''
96
101
  获取planID对应的优化方案下财务评估模块的基础信息
97
102
  :param planID int类型,表示优化方案的ID,数值位于0~优化方案数量之间
@@ -128,6 +133,7 @@ class IESLabEvaluationModel(object):
128
133
  :return: Runner[IESLabEvaluationResult]
129
134
  '''
130
135
  url = 'api/ieslab-plan/taskmanager/saveDataToclickhouse'
136
+ CMD_TYPE = type if type is None else self._evaluationType[type]
131
137
  try:
132
138
  timeId = int(time.time() * 1000)
133
139
  r = request('GET',
@@ -135,20 +141,20 @@ class IESLabEvaluationModel(object):
135
141
  params={
136
142
  "simuid": self.simulationId,
137
143
  "planId": planID,
138
- "CMD_TYPE": type
144
+ "CMD_TYPE": CMD_TYPE
139
145
  })
140
146
  data = json.loads(r.text)
141
147
  return HttpRunner({'rid': 'function/ieslab/evaluation'},
142
148
  self.simulationId,
143
149
  timeId=timeId,
144
150
  planId=planID,
145
- cmdType=type)
151
+ cmdType=CMD_TYPE)
146
152
  except:
147
153
  raise Exception('方案评估开始计算失败')
148
154
 
149
155
  def EnvironmentalEvaluationRun(self, planID):
150
156
  '''
151
- 运行方案评估
157
+ 运行环保评价方案评估
152
158
 
153
159
  :param planID int类型,表示优化方案的ID,数值位于0~优化方案数量之间
154
160
 
@@ -158,7 +164,7 @@ class IESLabEvaluationModel(object):
158
164
 
159
165
  def EnergyEvaluationRun(self, planID):
160
166
  '''
161
- 运行方案评估
167
+ 运行能效评价方案评估
162
168
 
163
169
  :param planID int类型,表示优化方案的ID,数值位于0~优化方案数量之间
164
170
 
@@ -7,6 +7,8 @@ from cloudpss.runner.IESLabTypicalDayResult import IESLabTypicalDayResult
7
7
  from ..utils import request
8
8
  from ..model.model import Model
9
9
  from cloudpss.runner.runner import Runner
10
+ from cloudpss.runner.IESLabPlanResult import IESLabPlanResult
11
+ from cloudpss.runner.IESLabEvaluationResult import IESLabEvaluationResult
10
12
 
11
13
  class IESLabPlan(object):
12
14
  def __init__(self, project={}):
@@ -22,6 +24,8 @@ class IESLabPlan(object):
22
24
  self.dataManageModel = IESPlanDataManageModel(self.id)
23
25
  self.planModel = IESLabPlanModel(self.id)
24
26
  self.evaluationModel = IESLabEvaluationModel(self.id)
27
+ self.currentPlanResult = IESLabPlanResult(self.id)
28
+ self.currentEvaluationResult = IESLabEvaluationResult(self.id)
25
29
 
26
30
  @staticmethod
27
31
  def fetch(simulationId):
@@ -52,7 +56,6 @@ class IESLabPlan(object):
52
56
  if job is None:
53
57
  currentJob = self.model.context['currentJob']
54
58
  job = self.model.jobs[currentJob]
55
-
56
59
  job['args']['simulationId'] = self.id
57
60
  return self.model.run(job, name=name)
58
61
 
@@ -68,26 +71,28 @@ class IESLabPlan(object):
68
71
  if job is None:
69
72
  currentJob = self.model.context['currentJob']
70
73
  job = self.model.jobs[currentJob]
71
- if job['rid'] != 'job-definition/ies/ies-gmm' or job['rid'] != 'job-definition/cloudpss/ieslab-gmm':
74
+ if job['rid'] != 'function/CloudPSS/ieslab-gmm':
72
75
  for j in self.model.jobs:
73
- if j['rid'] == 'job-definition/ies/ies-gmm' or job['rid'] == 'job-definition/cloudpss/ieslab-gmm':
76
+ if j['rid'] == 'job-definition/ies/ies-gmm' or j['rid'] == 'job-definition/cloudpss/ieslab-gmm':
77
+ j['rid'] = 'function/CloudPSS/ieslab-gmm'
74
78
  job = j
75
79
  if job is None:
76
80
  raise Exception("找不到默认的综合能源系统规划典型日生成算法的计算方案")
77
- if job['rid'] != 'job-definition/ies/ies-gmm'or job['rid'] != 'job-definition/cloudpss/ieslab-gmm':
81
+ if job['rid'] != 'function/CloudPSS/ieslab-gmm':
78
82
  raise Exception("不是综合能源系统规划典型日生成算法的计算方案")
79
83
  return self.__run(job=job, name=name)
80
84
 
81
- def iesLabEvaluationRun(self, planId):
85
+ def iesLabEvaluationRun(self, planId, type=None):
82
86
  '''
83
87
  运行方案评估
84
88
 
85
89
  :param planID int类型,表示优化方案的ID,数值位于0~优化方案数量之间
90
+ :param type string类型,表示评估类型,可选值为:能效评价、环保评价
86
91
 
87
92
  :return: 方案评估运行实例
88
93
 
89
94
  '''
90
- return self.evaluationModel.run(planId)
95
+ return self.evaluationModel.run(planId, type)
91
96
 
92
97
  def iesLabEnergyEvaluationRun(self, planId):
93
98
  '''
@@ -117,3 +122,11 @@ class IESLabPlan(object):
117
122
  :return: 方案优选运行实例
118
123
  '''
119
124
  return self.planModel.run()
125
+
126
+ def iesLabPlanKill(self):
127
+ '''
128
+ 停止并删除方案优选算例
129
+
130
+ :return: Boolean
131
+ '''
132
+ return self.planModel.kill()
@@ -30,6 +30,7 @@ class IESLabSimulation(object):
30
30
  r = request(
31
31
  'GET', 'api/ieslab-simulation/rest/simu/{0}/'.format(simulationId))
32
32
  project = json.loads(r.text)
33
+ print(project)
33
34
  return IESLabSimulation(project)
34
35
  except:
35
36
  raise Exception('未查询到当前算例')
@@ -48,5 +49,6 @@ class IESLabSimulation(object):
48
49
  job = self.model.jobs[currentJob]
49
50
 
50
51
  job['args']['simulationId'] = self.id
52
+ print(job)
51
53
  return self.model.run(job, name=name)
52
54
 
@@ -0,0 +1,143 @@
1
+ from cloudpss.runner.IESLabPlanResult import IESLabPlanResult
2
+ from cloudpss.runner.runner import HttpRunner, Runner
3
+ from ..utils import request, fileLoad
4
+ import json
5
+ from enum import IntEnum, unique
6
+
7
+
8
+ class IESLabPlanModel(object):
9
+ _baseUri = 'api/ieslab-plan/taskmanager/getSimuLastTasks'
10
+
11
+ def __init__(self, simulationId):
12
+ '''
13
+ 初始化
14
+ '''
15
+ self.simulationId = simulationId
16
+ self.optimizationInfo = self.GetOptimizationInfo()
17
+ self.OptimizationMode = OptimizationMode
18
+
19
+ def _fetchItemData(self, url):
20
+ '''
21
+ 获取当前算例的优化目标设置信息
22
+
23
+ :return: enum 类型,代表经济性优化和环保性优化的类型
24
+ '''
25
+ r = request('GET', url, params={"simuid": self.simulationId})
26
+ data = json.loads(r.text)
27
+ return data
28
+
29
+ def GetOptimizationInfo(self):
30
+ '''
31
+ 获取当前算例的优化目标设置信息
32
+
33
+ :return: enum 类型,代表经济性优化和环保性优化的类型
34
+ '''
35
+ try:
36
+ data = self._fetchItemData(self._baseUri)
37
+ for e in OptimizationMode:
38
+ if (e.value == data['data']['optimizationpara']
39
+ ['OptimizationMode']):
40
+ return e
41
+ except:
42
+ return OptimizationMode['经济性']
43
+
44
+ def SetOptimizationInfo(self, optType):
45
+ '''
46
+ 无对应接口
47
+ 设置当前算例的优化目标
48
+
49
+ :param optType: enum 类型,代表经济性优化和环保性优化的类型
50
+ '''
51
+ self.optimizationInfo = optType
52
+ return True
53
+
54
+ def run(self) -> Runner[IESLabPlanResult]:
55
+ '''
56
+ 生成方案优选算例
57
+
58
+ :return: Runner[IESLabPlanResult]
59
+ '''
60
+ isRunning = self.GetLastTaskResult()
61
+ if isRunning:
62
+ raise Exception('该算例正在运行!请从浏览器算例页面点击结束运行或者调用IESPlan对象的kill接口终止计算后重试!')
63
+ else:
64
+ url = 'api/ieslab-plan/taskmanager/runOptimization'
65
+ if self.optimizationInfo is None:
66
+ self.optimizationInfo = OptimizationMode['经济性']
67
+ optType = self.optimizationInfo.value or 0
68
+ try:
69
+ r = request('GET',
70
+ url,
71
+ params={
72
+ "simuid":
73
+ self.simulationId,
74
+ "optPara":
75
+ json.dumps({
76
+ "OptimizationMode": optType,
77
+ "ProjectPeriod": "20"
78
+ })
79
+ })
80
+ data = json.loads(r.text)
81
+ return HttpRunner({}, self.simulationId)
82
+ except:
83
+ raise Exception('生成方案优选算例失败')
84
+
85
+ def GetRunner(self) -> Runner[IESLabPlanResult]:
86
+ '''
87
+ 获得运行实例
88
+
89
+ :return: Runner[IESLabPlanResult]
90
+ '''
91
+ return HttpRunner({}, self.simulationId)
92
+
93
+ def kill(self) -> bool:
94
+ '''
95
+ 停止并删除当前运行的优化算例
96
+ '''
97
+ res = IESLabPlanResult(self.simulationId).getLastTaskResult()
98
+ error = res.get('error', 0)
99
+ if error == 0:
100
+ data = res.get('data', {})
101
+ if data is not None:
102
+ taskID = data.get('task_id', '')
103
+ url = f'api/ieslab-plan/taskmanager/removeOptimizationTask'
104
+ try:
105
+ r = request('GET',
106
+ url,
107
+ params={
108
+ "taskid": taskID,
109
+ "stopFlag": '2'
110
+ })
111
+ json.loads(r.text)
112
+ return True
113
+ except:
114
+ return False
115
+
116
+ def GetLastTaskResult(self)-> bool:
117
+ '''
118
+ 获取最后一次运行的taskID的运行结果与日志
119
+
120
+ :return: boolean 类型
121
+ '''
122
+ isRunning = True
123
+ res = IESLabPlanResult(self.simulationId).getLastTaskResult()
124
+ error = res.get('error', 0)
125
+ if error == 0:
126
+ data = res.get('data', {})
127
+ if data is not None:
128
+ status = data.get('status', '')
129
+ if status == 'stop':
130
+ isRunning = False
131
+ logs = IESLabPlanResult(self.simulationId).GetLogs()
132
+ if logs is not None:
133
+ for log in logs:
134
+ if(log.get('data', '') == 'run ends'):
135
+ isRunning = False
136
+ break
137
+ return isRunning
138
+
139
+
140
+ # @unique
141
+ class OptimizationMode(IntEnum):
142
+ 经济性 = 0
143
+ 环保性 = 1
@@ -0,0 +1,4 @@
1
+ from .IESLabSimulation import IESLabSimulation
2
+ from .IESLabPlan import IESLabPlan
3
+ from .PlanModel import OptimizationMode
4
+ __all__ = ['IESLabSimulation','IESLabPlan', 'OptimizationMode']
@@ -0,0 +1,5 @@
1
+ from .job import Job
2
+
3
+ __all__ = [
4
+ 'Job'
5
+ ]
@@ -0,0 +1,277 @@
1
+ import random
2
+ import re
3
+ import time
4
+ from .view import getViewClass
5
+
6
+ from cloudpss.utils.IO import IO
7
+ from .messageStreamReceiver import MessageStreamReceiver
8
+
9
+ from cloudpss.utils.graphqlUtil import graphql_request
10
+ from .jobPolicy import JobPolicy
11
+ from .jobMachine import JobMachine
12
+ from .messageStreamSender import MessageStreamSender
13
+
14
+
15
+
16
+ class Job(object):
17
+ """docstring for Job"""
18
+
19
+ def __init__(self, id, args, createTime, startTime, endTime, status,
20
+ context, user, priority, policy, machine, input, output,
21
+ position):
22
+ super(Job, self).__init__()
23
+ self.id = id
24
+ self.args = args
25
+ self.createTime = createTime
26
+ self.startTime = startTime
27
+ self.endTime = endTime
28
+ self.status = status
29
+ self.context = context
30
+ self.user = user
31
+ self.priority = priority
32
+ self.policy = policy # type: ignore
33
+ self.machine = JobMachine(**machine) # type: ignore
34
+ self.input = input
35
+ self.output = output
36
+ self.position = position
37
+ self.__receiver = None
38
+ self.__sender = None
39
+
40
+ @staticmethod
41
+ def fetch(id):
42
+ """
43
+ 获取job信息
44
+ """
45
+ if id is None:
46
+ raise Exception('id is None')
47
+ query = '''query($_a:JobInput!){
48
+ job(input:$_a){
49
+ id
50
+ args
51
+ createTime
52
+ startTime
53
+ endTime
54
+ status
55
+ context
56
+ user
57
+ priority
58
+ policy {
59
+ name
60
+ queue
61
+ tres {
62
+ cpu
63
+ ecpu
64
+ mem
65
+ }
66
+ priority
67
+ maxDuration
68
+ }
69
+ machine {
70
+ id
71
+ name
72
+ tres {
73
+ cpu
74
+ ecpu
75
+ mem
76
+ }
77
+ }
78
+ input
79
+ output
80
+ position
81
+ }
82
+ }'''
83
+ variables = {"_a": {"id": id}}
84
+ r = graphql_request(query, variables)
85
+ if 'errors' in r:
86
+ raise Exception(r['errors'])
87
+ return Job(**r['data']['job'])
88
+
89
+ @staticmethod
90
+ def fetchMany(input):
91
+ """
92
+ 批量获取任务信息
93
+ """
94
+ if input is None:
95
+ raise Exception('input is None')
96
+ query = '''query($_a:JobsInput!){
97
+ jobs(input:$_a){
98
+ item {
99
+ id
100
+ args
101
+ createTime
102
+ startTime
103
+ endTime
104
+ status
105
+ context
106
+ user
107
+ priority
108
+ policy {
109
+ id
110
+ name
111
+ users
112
+ functions
113
+ tres {
114
+ cpu
115
+ ecpu
116
+ mem
117
+ }
118
+ minPriority
119
+ maxPriority
120
+ maxDuration
121
+ createTime
122
+ updateTime
123
+ visibility
124
+ queue
125
+ }
126
+ machine {
127
+ id
128
+ name
129
+ tres {
130
+ cpu
131
+ ecpu
132
+ mem
133
+ }
134
+ valid
135
+ }
136
+ input
137
+ output
138
+ position
139
+ }
140
+ cursor
141
+ count
142
+ total
143
+ }
144
+ }'''
145
+ variables = {"_a": input}
146
+ r = graphql_request(query, variables)
147
+ if 'errors' in r:
148
+ raise Exception(r['errors'])
149
+ jobs = []
150
+ for job in r['data']['jobs']['item']:
151
+ jobs.append(Job(**job))
152
+ return jobs
153
+
154
+ @staticmethod
155
+ def create(revisionHash,
156
+ job,
157
+ config,
158
+ name=None,
159
+ rid='',
160
+ policy=None,
161
+ **kwargs):
162
+ '''
163
+ 创建一个运行任务
164
+
165
+ :params: revision 项目版本号
166
+ :params: job 调用仿真时使用的计算方案,为空时使用项目的第一个计算方案
167
+ :params: config 调用仿真时使用的参数方案,为空时使用项目的第一个参数方案
168
+ :params: name 任务名称,为空时使用项目的参数方案名称和计算方案名称
169
+ :params: rid 项目rid,可为空
170
+
171
+ :return: 返回一个运行实例
172
+
173
+ >>> runner = Runner.runRevision(revision,job,config,'')
174
+ '''
175
+
176
+ #处理policy字段
177
+ if policy is None:
178
+ policy = {}
179
+ if policy.get('tres', None) is None:
180
+ policy['tres'] = {}
181
+ policy['queue'] = job['args'].get('@queue', 1)
182
+ policy['priority'] = job['args'].get('@priority', 0)
183
+ tres = {'cpu': 1, 'ecpu': 0, 'mem': 0}
184
+ tresStr = job['args'].get('@tres', '')
185
+ for t in re.split('\s+', tresStr):
186
+ if t == '':
187
+ continue
188
+ k, v = t.split('=')
189
+ tres[k] = float(v) #type: ignore
190
+ policy['tres'] = tres
191
+
192
+ query = '''mutation($input:CreateJobInput!){job:createJob(input:$input){id input output status position}}'''
193
+ function = job['rid'].replace('job-definition/cloudpss/',
194
+ 'function/CloudPSS/')
195
+ variables = {
196
+ 'input': {
197
+ "args": {
198
+ **job['args'], '_ModelRevision': revisionHash,
199
+ '_ModelArgs': config['args']
200
+ },
201
+ "context": [
202
+ function,
203
+ rid,
204
+ f"model/@sdk/{str(int(time.time() * random.random()))}"
205
+ ],
206
+ "policy":
207
+ policy,
208
+ }
209
+ }
210
+ r = graphql_request(query, variables)
211
+ if 'errors' in r:
212
+ raise Exception(r['errors'])
213
+ id = r['data']['job']['id']
214
+ return Job.fetch(id)
215
+
216
+ @staticmethod
217
+ def abort(id, timeout):
218
+ """
219
+ 结束当前运行的算例
220
+
221
+ """
222
+ query = '''mutation ($input: AbortJobInput!) {
223
+ job: abortJob(input: $input) {
224
+ id
225
+ status
226
+ }
227
+ }
228
+ '''
229
+ variables = {'input': {'id': id, 'timeout': timeout}}
230
+ graphql_request(query, variables)
231
+
232
+ @staticmethod
233
+ def load(file, format='yaml'):
234
+ return IO.load(file, format)
235
+
236
+ @staticmethod
237
+ def dump(job, file, format='yaml', compress='gzip'):
238
+ return IO.dump(job, file, format, compress)
239
+
240
+ def read(self, receiver=None, dev=False, **kwargs):
241
+ """
242
+ 使用接收器获取当前运行实例的输出
243
+ """
244
+ if receiver is not None:
245
+ self.__sender = receiver
246
+ if self.__receiver is None:
247
+ self.__receiver = MessageStreamReceiver(self, dev)
248
+ self.__receiver.connect(**kwargs)
249
+ return self.__receiver
250
+
251
+ def write(self,sender=None, dev=False, **kwargs)->MessageStreamSender:
252
+ """
253
+ 使用发送器为当前运行实例输入
254
+ """
255
+
256
+ if sender is not None:
257
+ self.__sender = sender
258
+ if self.__sender is None:
259
+ self.__sender =MessageStreamSender(self,dev)
260
+ self.__sender.connect(**kwargs)
261
+ return self.__sender
262
+
263
+ @property
264
+ def result(self):
265
+ """
266
+ 获取当前运行实例的输出
267
+ """
268
+ viewType = getViewClass(self.context[0])
269
+ return self.view(viewType)
270
+
271
+ def view(self, viewType):
272
+ """
273
+ 获取当前运行实例的输出
274
+ """
275
+ receiver = self.read()
276
+ sender=self.write()
277
+ return viewType(receiver,sender)
@@ -0,0 +1,11 @@
1
+ from cloudpss.job.jobTres import JobTres
2
+
3
+
4
+ class JobMachine(object):
5
+ '''job machine'''
6
+
7
+ def __init__(self, id, name, tres, valid=None):
8
+ self.id = id
9
+ self.name = name
10
+ self.tres = JobTres(**tres) # type: ignore
11
+ self.valid = valid