cloudpss 4.0.2a1__tar.gz → 4.1.1a1__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 (86) hide show
  1. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/PKG-INFO +1 -1
  2. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/__init__.py +2 -2
  3. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/function/functionExecution.py +1 -1
  4. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/ieslab/IESLabPlan.py +0 -87
  5. cloudpss-4.1.1a1/cloudpss/ieslab/IESLabSimulation.py +54 -0
  6. cloudpss-4.1.1a1/cloudpss/job/__init__.py +5 -0
  7. cloudpss-4.1.1a1/cloudpss/job/job.py +240 -0
  8. cloudpss-4.1.1a1/cloudpss/job/jobMachine.py +11 -0
  9. cloudpss-4.1.1a1/cloudpss/job/jobPolicy.py +129 -0
  10. cloudpss-4.1.1a1/cloudpss/job/jobQueue.py +14 -0
  11. cloudpss-4.1.1a1/cloudpss/job/jobReceiver.py +33 -0
  12. cloudpss-4.1.1a1/cloudpss/job/jobTres.py +6 -0
  13. cloudpss-4.1.1a1/cloudpss/job/messageStreamReceiver.py +127 -0
  14. cloudpss-4.1.1a1/cloudpss/job/messageStreamSender.py +77 -0
  15. cloudpss-4.1.1a1/cloudpss/job/view/EMTView.py +216 -0
  16. cloudpss-4.1.1a1/cloudpss/job/view/IESLabSimulationView.py +5 -0
  17. cloudpss-4.1.1a1/cloudpss/job/view/IESLabTypicalDayView.py +27 -0
  18. cloudpss-4.1.1a1/cloudpss/job/view/IESView.py +103 -0
  19. cloudpss-4.1.1a1/cloudpss/job/view/PowerFlowView.py +80 -0
  20. cloudpss-4.1.1a1/cloudpss/job/view/__init__.py +42 -0
  21. cloudpss-4.1.1a1/cloudpss/job/view/view.py +122 -0
  22. cloudpss-4.1.1a1/cloudpss/model/implements/diagram.py +46 -0
  23. cloudpss-4.1.1a1/cloudpss/model/model.py +759 -0
  24. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/model/revision.py +9 -9
  25. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/model/topology.py +4 -2
  26. cloudpss-4.1.1a1/cloudpss/runner/MessageStreamReceiver.py +193 -0
  27. cloudpss-4.1.1a1/cloudpss/runner/__init__.py +10 -0
  28. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/runner/receiver.py +2 -0
  29. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/runner/runner.py +91 -18
  30. cloudpss-4.1.1a1/cloudpss/utils/AsyncIterable.py +27 -0
  31. cloudpss-4.1.1a1/cloudpss/utils/IO.py +164 -0
  32. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/utils/__init__.py +5 -1
  33. cloudpss-4.1.1a1/cloudpss/utils/httpAsyncRequest.py +88 -0
  34. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/utils/httprequests.py +6 -1
  35. cloudpss-4.1.1a1/cloudpss/utils/yamlLoader.py +80 -0
  36. cloudpss-4.1.1a1/cloudpss/version.py +1 -0
  37. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss.egg-info/PKG-INFO +1 -1
  38. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss.egg-info/SOURCES.txt +21 -0
  39. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss.egg-info/requires.txt +2 -0
  40. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/setup.py +2 -2
  41. cloudpss-4.1.1a1/test/test-topology.py +26 -0
  42. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/test/test.py +1 -1
  43. cloudpss-4.0.2a1/cloudpss/ieslab/IESLabSimulation.py +0 -114
  44. cloudpss-4.0.2a1/cloudpss/model/implements/diagram.py +0 -159
  45. cloudpss-4.0.2a1/cloudpss/model/model.py +0 -758
  46. cloudpss-4.0.2a1/cloudpss/runner/__init__.py +0 -8
  47. cloudpss-4.0.2a1/cloudpss/utils/yamlLoader.py +0 -81
  48. cloudpss-4.0.2a1/cloudpss/version.py +0 -1
  49. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/README.md +0 -0
  50. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/function/__init__.py +0 -0
  51. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/function/function.py +0 -0
  52. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/function/job.py +0 -0
  53. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/ieslab/DataManageModel.py +0 -0
  54. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/ieslab/EvaluationModel.py +0 -0
  55. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/ieslab/PlanModel.py +0 -0
  56. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/ieslab/__init__.py +0 -0
  57. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/model/__init__.py +0 -0
  58. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/model/implements/__init__.py +0 -0
  59. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/model/implements/component.py +0 -0
  60. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/model/implements/implement.py +0 -0
  61. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/model/jobDefinitions.py +0 -0
  62. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/project/__init__.py +0 -0
  63. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/project/project.py +0 -0
  64. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/runner/IESLabEvaluationResult.py +0 -0
  65. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/runner/IESLabPlanResult.py +0 -0
  66. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/runner/IESLabTypicalDayResult.py +0 -0
  67. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/runner/result.py +0 -0
  68. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/runner/storage.py +0 -0
  69. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/runner/transform.py +0 -0
  70. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/utils/dataEncoder.py +0 -0
  71. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/utils/graphqlUtil.py +0 -0
  72. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/utils/matlab.py +0 -0
  73. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss/verify.py +0 -0
  74. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss.egg-info/dependency_links.txt +0 -0
  75. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/cloudpss.egg-info/top_level.txt +0 -0
  76. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/setup.cfg +0 -0
  77. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/test/test-sdk.py +0 -0
  78. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/test/test-snapshot.py +0 -0
  79. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/test/test7950.py +0 -0
  80. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/test/testAsync.py +0 -0
  81. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/test/testEvent.py +0 -0
  82. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/test/testRt copy.py +0 -0
  83. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/test/testRt.py +0 -0
  84. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/test/testSend.py +0 -0
  85. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/test/test_in_new_web_1.py +0 -0
  86. {cloudpss-4.0.2a1 → cloudpss-4.1.1a1}/test/testb.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cloudpss
3
- Version: 4.0.2a1
3
+ Version: 4.1.1a1
4
4
  Summary: cloudpss sdk
5
5
  Home-page: https://www.cloudpss.net
6
6
  Author: cloudpss
@@ -6,13 +6,13 @@ 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
-
9
+ from .job import Job
10
10
  from .function import FunctionExecution
11
11
  from .version import __version__
12
12
  __all__ = [
13
13
  'setToken', 'Model', 'ModelRevision', 'ModelTopology', 'Runner', 'Result',
14
14
  'PowerFlowResult', 'EMTResult', 'MatlabDataEncoder', 'DateTimeEncode',
15
- 'function', 'Project', 'currentJob', 'IESLabSimulation', 'IESLabPlan','__version__'
15
+ 'function', 'Project', 'currentJob', 'IESLabSimulation', 'IESLabPlan','__version__','Job'
16
16
  ]
17
17
 
18
18
 
@@ -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
  '''
@@ -130,90 +130,3 @@ class IESLabPlan(object):
130
130
  :return: Boolean
131
131
  '''
132
132
  return self.planModel.kill()
133
-
134
- def createProjectGroup(self, name):
135
- '''
136
- 创建项目组
137
-
138
- :params name: 项目组名称
139
-
140
- :return: 返回一个创建的项目组
141
- '''
142
-
143
- @staticmethod
144
- def createProjectGroup(group_name, desc=None, createById=None):
145
- '''
146
- 创建项目组
147
-
148
- :params group_name: String 项目组名称
149
- :params desc: String 项目组描述 可选参数
150
- :params createById Int 父项目组id 可选参数,如果是从已有项目组导入的项目组,必填此项
151
-
152
- :return: Int 返回创建的项目组id
153
- '''
154
- try:
155
- if createById is None:
156
- isImport = 0
157
- else:
158
- isImport = 1
159
- payload = {
160
- 'group_name': group_name,
161
- 'desc': desc,
162
- 'isImport': isImport,
163
- 'createById': createById,
164
- }
165
- r = request(
166
- 'POST', 'api/ieslab-plan/rest/projectgroup/', data=json.dumps(payload))
167
- project = json.loads(r.text)
168
- return project.get('id', None)
169
- except Exception as e:
170
- raise Exception('创建项目组失败')
171
-
172
- @staticmethod
173
- def createProject(name, project_group, start_date, end_date, construction_cycle, desc=None, createById=None):
174
- '''
175
- 创建项目
176
-
177
- :params name: String 项目名称
178
- :params project_group: Int 父项目组id
179
- :param start_date: Int 项目开始年限,范围在[1500,3000]之间
180
- :param end_date: Int 项目结束年限,范围在项目开始时间之后且不超过五十年
181
- :param construction_cycle: Int 项目建设周期(年), 必须小于等于 项目结束年限 - 项目开始年限
182
- :params desc: String 项目描述, 可选参数
183
- :params createById Int 父项目id, 可选参数, 如果是从已有项目导入的项目,必填此项
184
-
185
- :return: Int 返回创建的项目id
186
- '''
187
- try:
188
- if start_date < 1500 or start_date > 3000:
189
- raise Exception('项目开始年限错误,范围在[1500,3000]之间')
190
- if end_date < start_date or end_date > start_date + 50:
191
- raise Exception('项目结束年限错误,范围在项目开始时间之后且不超过五十年')
192
- if construction_cycle > end_date - start_date:
193
- raise Exception('项目建设周期错误,必须小于等于 项目结束年限 - 项目开始年限')
194
- if createById is None:
195
- payload = {
196
- 'name': name,
197
- 'project_group': project_group,
198
- 'start_date': start_date,
199
- 'end_date': end_date,
200
- 'construction_cycle': construction_cycle,
201
- 'desc': desc
202
- }
203
- else:
204
- payload = {
205
- 'name': name,
206
- 'project_group': project_group,
207
- 'start_date': start_date,
208
- 'end_date': end_date,
209
- 'construction_cycle': construction_cycle,
210
- 'desc': desc,
211
- 'createById': createById
212
- }
213
- r = request(
214
- 'POST', 'api/ieslab-plan/rest/simu/', data=json.dumps(payload))
215
- project = json.loads(r.text)
216
- return project.get('id', None)
217
- except Exception as e:
218
- raise Exception('创建项目失败')
219
-
@@ -0,0 +1,54 @@
1
+ import json
2
+ from ..utils import request
3
+ from ..model.model import Model
4
+ from .DataManageModel import IESSimulationDataManageModel
5
+
6
+
7
+ class IESLabSimulation(object):
8
+ def __init__(self, project={}):
9
+ '''
10
+ 初始化
11
+ '''
12
+ self.id = project.get('id', None)
13
+ self.name = project.get('name', None)
14
+ self.__modelRid = project.get('model', None)
15
+ self.project_group = project.get('project_group', None)
16
+ if self.__modelRid is not None:
17
+ self.model = Model.fetch(self.__modelRid)
18
+ self.dataManageModel = IESSimulationDataManageModel(self.id)
19
+
20
+ @staticmethod
21
+ def fetch(simulationId):
22
+ '''
23
+ 获取算例信息
24
+
25
+ :params: simulationId string类型,代表数据项的算例id
26
+
27
+ :return: IESLabSimulation
28
+ '''
29
+ try:
30
+ r = request(
31
+ 'GET', 'api/ieslab-simulation/rest/simu/{0}/'.format(simulationId))
32
+ project = json.loads(r.text)
33
+ print(project)
34
+ return IESLabSimulation(project)
35
+ except:
36
+ raise Exception('未查询到当前算例')
37
+
38
+ def run(self, job=None, name=None):
39
+ '''
40
+ 调用仿真
41
+
42
+ :params job: 调用仿真时使用的计算方案,不指定将使用算例保存时选中的计算方案
43
+ :params name: 任务名称,为空时使用项目的参数方案名称和计算方案名称
44
+
45
+ :return: 返回一个运行实例
46
+ '''
47
+ if job is None:
48
+ currentJob = self.model.context['currentJob']
49
+ job = self.model.jobs[currentJob]
50
+
51
+ job['args']['simulationId'] = self.id
52
+ print(job)
53
+ return self.model.run(job, name=name)
54
+
@@ -0,0 +1,5 @@
1
+ from .job import Job
2
+
3
+ __all__ = [
4
+ 'Job'
5
+ ]
@@ -0,0 +1,240 @@
1
+ import asyncio
2
+ import random
3
+ import re
4
+ import time
5
+ from cloudpss.utils.AsyncIterable import CustomAsyncIterable
6
+
7
+ from cloudpss.utils.httpAsyncRequest import graphql_fetch
8
+ from .view import getViewClass
9
+
10
+ from cloudpss.utils.IO import IO
11
+ from .messageStreamReceiver import MessageStreamReceiver
12
+
13
+ from cloudpss.utils.graphqlUtil import graphql_request
14
+ from .jobPolicy import JobPolicy
15
+ from .jobMachine import JobMachine
16
+ from .messageStreamSender import MessageStreamSender
17
+
18
+
19
+ class Job(object):
20
+ """docstring for Job"""
21
+
22
+ def __init__(
23
+ self,
24
+ id,
25
+ args,
26
+ createTime,
27
+ startTime,
28
+ endTime,
29
+ status,
30
+ context,
31
+ user,
32
+ priority,
33
+ policy,
34
+ machine,
35
+ input,
36
+ output,
37
+ position,
38
+ ):
39
+ super(Job, self).__init__()
40
+ self.id = id
41
+ self.args = args
42
+ self.createTime = createTime
43
+ self.startTime = startTime
44
+ self.endTime = endTime
45
+ self.job_status = status #这里的status字段与原本的status()冲突
46
+ self.context = context
47
+ self.user = user
48
+ self.priority = priority
49
+ self.policy = policy # type: ignore
50
+ self.machine = JobMachine(**machine) # type: ignore
51
+ self.input = input
52
+ self.output = output
53
+ self.position = position
54
+ self.__receiver = None
55
+ self.__sender = None
56
+ self._result = None
57
+
58
+ @staticmethod
59
+ async def fetch(id):
60
+ """
61
+ 获取job信息
62
+ """
63
+ if id is None:
64
+ raise Exception("id is None")
65
+ query = """query($_a:JobInput!){
66
+ job(input:$_a){
67
+ id
68
+ args
69
+ createTime
70
+ startTime
71
+ endTime
72
+ status
73
+ context
74
+ user
75
+ priority
76
+ policy {
77
+ name
78
+ queue
79
+ tres {
80
+ cpu
81
+ ecpu
82
+ mem
83
+ }
84
+ priority
85
+ maxDuration
86
+ }
87
+ machine {
88
+ id
89
+ name
90
+ tres {
91
+ cpu
92
+ ecpu
93
+ mem
94
+ }
95
+ }
96
+ input
97
+ output
98
+ position
99
+ }
100
+ }"""
101
+ variables = {"_a": {"id": id}}
102
+
103
+ r = await graphql_fetch(query, variables)
104
+ if "errors" in r:
105
+ raise Exception(r["errors"])
106
+ return Job(**r["data"]["job"])
107
+
108
+ @staticmethod
109
+ def fetchMany(*args):
110
+ """
111
+ 批量获取任务信息
112
+ """
113
+ jobs = CustomAsyncIterable(Job.fetch,*args)
114
+ return jobs
115
+
116
+
117
+ @staticmethod
118
+ async def create(revisionHash, job, config, name=None, rid="", policy=None, **kwargs):
119
+ """
120
+ 创建一个运行任务
121
+
122
+ :params: revision 项目版本号
123
+ :params: job 调用仿真时使用的计算方案,为空时使用项目的第一个计算方案
124
+ :params: config 调用仿真时使用的参数方案,为空时使用项目的第一个参数方案
125
+ :params: name 任务名称,为空时使用项目的参数方案名称和计算方案名称
126
+ :params: rid 项目rid,可为空
127
+
128
+ :return: 返回一个运行实例
129
+
130
+ >>> runner = Runner.runRevision(revision,job,config,'')
131
+ """
132
+
133
+ # 处理policy字段
134
+ if policy is None:
135
+ policy = {}
136
+ if policy.get("tres", None) is None:
137
+ policy["tres"] = {}
138
+ policy["queue"] = job["args"].get("@queue", 1)
139
+ policy["priority"] = job["args"].get("@priority", 0)
140
+ tres = {"cpu": 1, "ecpu": 0, "mem": 0}
141
+ tresStr = job["args"].get("@tres", "")
142
+ for t in re.split("\s+", tresStr):
143
+ if t == "":
144
+ continue
145
+ k, v = t.split("=")
146
+ tres[k] = float(v) # type: ignore
147
+ policy["tres"] = tres
148
+
149
+ query = """mutation($input:CreateJobInput!){job:createJob(input:$input){id input output status position}}"""
150
+ function = job["rid"].replace("job-definition/cloudpss/", "function/CloudPSS/")
151
+ variables = {
152
+ "input": {
153
+ "args": {
154
+ **job["args"],
155
+ "_ModelRevision": revisionHash,
156
+ "_ModelArgs": config["args"],
157
+ },
158
+ "context": [
159
+ function,
160
+ rid,
161
+ f"model/@sdk/{str(int(time.time() * random.random()))}",
162
+ ],
163
+ "policy": policy,
164
+ }
165
+ }
166
+ r = await graphql_fetch(query, variables)
167
+ if "errors" in r:
168
+ raise Exception(r["errors"])
169
+ id = r["data"]["job"]["id"]
170
+ return await Job.fetch(id)
171
+
172
+ @staticmethod
173
+ async def abort(id, timeout):
174
+ """
175
+ 结束当前运行的算例
176
+
177
+ """
178
+ query = """mutation ($input: AbortJobInput!) {
179
+ job: abortJob(input: $input) {
180
+ id
181
+ status
182
+ }
183
+ }
184
+ """
185
+ variables = {"input": {"id": id, "timeout": timeout}}
186
+ await graphql_fetch(query, variables)
187
+
188
+ @staticmethod
189
+ def load(file, format="yaml"):
190
+ return IO.load(file, format)
191
+
192
+ @staticmethod
193
+ def dump(job, file, format="yaml", compress="gzip"):
194
+ return IO.dump(job, file, format, compress)
195
+
196
+ async def read(self, receiver=None, dev=False, **kwargs):
197
+ """
198
+ 使用接收器获取当前运行实例的输出
199
+ """
200
+ if receiver is not None:
201
+ self.__sender = receiver
202
+ if self.__receiver is None:
203
+ self.__receiver = MessageStreamReceiver(self, dev)
204
+ await self.__receiver.connect(**kwargs)
205
+ return self.__receiver
206
+
207
+ async def write(self, sender=None, dev=False, **kwargs) -> MessageStreamSender:
208
+ """
209
+ 使用发送器为当前运行实例输入
210
+ """
211
+
212
+ if sender is not None:
213
+ self.__sender = sender
214
+ if self.__sender is None:
215
+ self.__sender = MessageStreamSender(self, dev)
216
+ await self.__sender.connect(**kwargs)
217
+ return self.__sender
218
+
219
+ def status(self):
220
+ if self.__receiver is not None:
221
+ return self.__receiver.status
222
+ return 0
223
+
224
+ @property
225
+ def result(self):
226
+ """
227
+ 获取当前运行实例的输出
228
+ """
229
+ if self._result is None:
230
+ viewType = getViewClass(self.context[0])
231
+ self._result = asyncio.run(self.view(viewType))
232
+ return self._result
233
+
234
+ async def view(self, viewType):
235
+ """
236
+ 获取当前运行实例的输出
237
+ """
238
+ receiver = await self.read()
239
+ sender = await self.write()
240
+ 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
@@ -0,0 +1,129 @@
1
+ from cloudpss.job.jobQueue import JobQueue
2
+ from cloudpss.job.jobTres import JobTres
3
+ from cloudpss.utils.graphqlUtil import graphql_request
4
+
5
+
6
+ class JobPolicy(object):
7
+
8
+ def __init__(self, id, name, users, functions, tres, minPriority,
9
+ maxPriority, maxDuration, createTime, updateTime, visibility,
10
+ queue):
11
+ self.id = id
12
+ self.name = name
13
+ self.users = users
14
+ self.functions = functions
15
+ print(tres)
16
+ self.tres = []
17
+ for tre in tres:
18
+ self.tres.append(JobTres(**tre)) # type: ignore
19
+ self.minPriority = minPriority
20
+ self.maxPriority = maxPriority
21
+ self.maxDuration = maxDuration
22
+ self.createTime = createTime
23
+ self.updateTime = updateTime
24
+ self.visibility = visibility
25
+ self.queue = JobQueue(**queue) # type: ignore
26
+
27
+ @staticmethod
28
+ def fetch(id):
29
+ query = '''query($input:JobPolicyInput!)
30
+ {
31
+ jobPolicy(input:$input)
32
+ {
33
+ id
34
+ name
35
+ users
36
+ functions
37
+ tres {
38
+ cpu
39
+ ecpu
40
+ mem
41
+ }
42
+ minPriority
43
+ maxPriority
44
+ maxDuration
45
+ createTime
46
+ updateTime
47
+ visibility
48
+ queue {
49
+ id
50
+ name
51
+ scheduler
52
+ machines {
53
+ id
54
+ name
55
+ tres {
56
+ cpu
57
+ ecpu
58
+ mem
59
+ }
60
+ valid
61
+ }
62
+ createTime
63
+ updateTime
64
+ load
65
+ }
66
+ }
67
+
68
+ }'''
69
+ variables = {'input': {'id': id}}
70
+ r = graphql_request(query, variables)
71
+ print (r)
72
+ if 'errors' in r:
73
+ raise Exception(r['errors'])
74
+ return JobPolicy(**r['data']['jobPolicy'])
75
+
76
+ @staticmethod
77
+ def fetchMany(input):
78
+ query = '''query($input:JobPoliciesInput!)
79
+ {
80
+ jobPolicies(input:$input)
81
+ {
82
+ items {
83
+ id
84
+ name
85
+ users
86
+ functions
87
+ tres {
88
+ cpu
89
+ ecpu
90
+ mem
91
+ }
92
+ minPriority
93
+ maxPriority
94
+ maxDuration
95
+ createTime
96
+ updateTime
97
+ visibility
98
+ queue {
99
+ id
100
+ name
101
+ scheduler
102
+ machines {
103
+ id
104
+ name
105
+ tres {
106
+ cpu
107
+ ecpu
108
+ mem
109
+ }
110
+ valid
111
+ }
112
+ createTime
113
+ updateTime
114
+ load
115
+ }
116
+ }
117
+ cursor
118
+ count
119
+ total
120
+ }
121
+ }'''
122
+ variables = {'input': input}
123
+ r = graphql_request(query, variables)
124
+ if 'errors' in r:
125
+ raise Exception(r['errors'])
126
+ policies = []
127
+ for policy in r['data']['jobPolicies']['items']:
128
+ policies.append(JobPolicy(**policy))
129
+ return policies
@@ -0,0 +1,14 @@
1
+ from cloudpss.job.jobMachine import JobMachine
2
+
3
+
4
+ class JobQueue(object):
5
+
6
+ def __init__(self, id, name, scheduler, machines, createTime, updateTime,
7
+ load):
8
+ self.id = id
9
+ self.name = name
10
+ self.scheduler = scheduler
11
+ self.machines = [JobMachine(**m) for m in machines]
12
+ self.createTime = createTime
13
+ self.updateTime = updateTime
14
+ self.load = load
@@ -0,0 +1,33 @@
1
+ class JobReceiver(object):
2
+ messages = []
3
+ index = 0
4
+
5
+ def __init__(self):
6
+ self.index = 0
7
+ self.messages = []
8
+
9
+ def __len__(self):
10
+ return len(self.messages)
11
+
12
+ def __iter__(self):
13
+ return self
14
+
15
+ def __next__(self):
16
+ maxLength = len(self.messages)
17
+ if self.index < maxLength:
18
+ message = self.messages[self.index]
19
+ self.index += 1
20
+ return message
21
+ raise StopIteration()
22
+
23
+ def view(self, ViewType):
24
+ """
25
+ 获取指定类型的视图数据
26
+
27
+ :params viewType: 视图类型
28
+
29
+ :returns: 对应类型的视图数据
30
+
31
+ >>> view= receiver.view(EMTView)
32
+ """
33
+ return ViewType(self)
@@ -0,0 +1,6 @@
1
+ class JobTres(object):
2
+ '''tres'''
3
+ def __init__(self, cpu, mem, ecpu):
4
+ self.cpu = cpu
5
+ self.mem = mem
6
+ self.ecpu = ecpu