cloudpss 4.0.2a1__tar.gz → 4.1.1a2__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.
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/PKG-INFO +1 -1
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/__init__.py +2 -2
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/function/functionExecution.py +1 -1
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/ieslab/IESLabPlan.py +0 -87
- cloudpss-4.1.1a2/cloudpss/ieslab/IESLabSimulation.py +54 -0
- cloudpss-4.1.1a2/cloudpss/job/__init__.py +5 -0
- cloudpss-4.1.1a2/cloudpss/job/job.py +240 -0
- cloudpss-4.1.1a2/cloudpss/job/jobMachine.py +11 -0
- cloudpss-4.1.1a2/cloudpss/job/jobPolicy.py +129 -0
- cloudpss-4.1.1a2/cloudpss/job/jobQueue.py +14 -0
- cloudpss-4.1.1a2/cloudpss/job/jobReceiver.py +33 -0
- cloudpss-4.1.1a2/cloudpss/job/jobTres.py +6 -0
- cloudpss-4.1.1a2/cloudpss/job/messageStreamReceiver.py +126 -0
- cloudpss-4.1.1a2/cloudpss/job/messageStreamSender.py +79 -0
- cloudpss-4.1.1a2/cloudpss/job/view/EMTView.py +216 -0
- cloudpss-4.1.1a2/cloudpss/job/view/IESLabSimulationView.py +5 -0
- cloudpss-4.1.1a2/cloudpss/job/view/IESLabTypicalDayView.py +27 -0
- cloudpss-4.1.1a2/cloudpss/job/view/IESView.py +103 -0
- cloudpss-4.1.1a2/cloudpss/job/view/PowerFlowView.py +80 -0
- cloudpss-4.1.1a2/cloudpss/job/view/__init__.py +42 -0
- cloudpss-4.1.1a2/cloudpss/job/view/view.py +122 -0
- cloudpss-4.1.1a2/cloudpss/model/implements/diagram.py +46 -0
- cloudpss-4.1.1a2/cloudpss/model/model.py +759 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/model/revision.py +9 -9
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/model/topology.py +9 -2
- cloudpss-4.1.1a2/cloudpss/runner/MessageStreamReceiver.py +193 -0
- cloudpss-4.1.1a2/cloudpss/runner/__init__.py +10 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/runner/receiver.py +2 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/runner/runner.py +91 -18
- cloudpss-4.1.1a2/cloudpss/utils/AsyncIterable.py +27 -0
- cloudpss-4.1.1a2/cloudpss/utils/IO.py +164 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/utils/__init__.py +5 -1
- cloudpss-4.1.1a2/cloudpss/utils/httpAsyncRequest.py +89 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/utils/httprequests.py +6 -1
- cloudpss-4.1.1a2/cloudpss/utils/yamlLoader.py +80 -0
- cloudpss-4.1.1a2/cloudpss/version.py +1 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss.egg-info/PKG-INFO +1 -1
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss.egg-info/SOURCES.txt +21 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss.egg-info/requires.txt +3 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/setup.py +2 -2
- cloudpss-4.1.1a2/test/test-topology.py +26 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/test/test.py +1 -1
- cloudpss-4.0.2a1/cloudpss/ieslab/IESLabSimulation.py +0 -114
- cloudpss-4.0.2a1/cloudpss/model/implements/diagram.py +0 -159
- cloudpss-4.0.2a1/cloudpss/model/model.py +0 -758
- cloudpss-4.0.2a1/cloudpss/runner/__init__.py +0 -8
- cloudpss-4.0.2a1/cloudpss/utils/yamlLoader.py +0 -81
- cloudpss-4.0.2a1/cloudpss/version.py +0 -1
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/README.md +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/function/__init__.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/function/function.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/function/job.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/ieslab/DataManageModel.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/ieslab/EvaluationModel.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/ieslab/PlanModel.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/ieslab/__init__.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/model/__init__.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/model/implements/__init__.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/model/implements/component.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/model/implements/implement.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/model/jobDefinitions.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/project/__init__.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/project/project.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/runner/IESLabEvaluationResult.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/runner/IESLabPlanResult.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/runner/IESLabTypicalDayResult.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/runner/result.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/runner/storage.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/runner/transform.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/utils/dataEncoder.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/utils/graphqlUtil.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/utils/matlab.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss/verify.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss.egg-info/dependency_links.txt +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/cloudpss.egg-info/top_level.txt +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/setup.cfg +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/test/test-sdk.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/test/test-snapshot.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/test/test7950.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/test/testAsync.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/test/testEvent.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/test/testRt copy.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/test/testRt.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/test/testSend.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/test/test_in_new_web_1.py +0 -0
- {cloudpss-4.0.2a1 → cloudpss-4.1.1a2}/test/testb.py +0 -0
@@ -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,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,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)
|