|
1
|
|
|
# Licensed to the StackStorm, Inc ('StackStorm') under one or more |
|
2
|
|
|
# contributor license agreements. See the NOTICE file distributed with |
|
3
|
|
|
# this work for additional information regarding copyright ownership. |
|
4
|
|
|
# The ASF licenses this file to You under the Apache License, Version 2.0 |
|
5
|
|
|
# (the "License"); you may not use this file except in compliance with |
|
6
|
|
|
# the License. You may obtain a copy of the License at |
|
7
|
|
|
# |
|
8
|
|
|
# http://www.apache.org/licenses/LICENSE-2.0 |
|
9
|
|
|
# |
|
10
|
|
|
# Unless required by applicable law or agreed to in writing, software |
|
11
|
|
|
# distributed under the License is distributed on an "AS IS" BASIS, |
|
12
|
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
13
|
|
|
# See the License for the specific language governing permissions and |
|
14
|
|
|
# limitations under the License. |
|
15
|
|
|
|
|
16
|
|
|
import copy |
|
17
|
|
|
|
|
18
|
|
|
from st2common.util import isotime |
|
19
|
|
|
from st2common.util import schema as util_schema |
|
20
|
|
|
from st2common import log as logging |
|
21
|
|
|
from st2common.models.api.base import BaseAPI |
|
22
|
|
|
from st2common.models.api.base import APIUIDMixin |
|
23
|
|
|
from st2common.models.api.tag import TagsHelper |
|
24
|
|
|
from st2common.models.api.notification import (NotificationSubSchemaAPI, NotificationsHelper) |
|
25
|
|
|
from st2common.models.db.action import ActionDB |
|
26
|
|
|
from st2common.models.db.actionalias import ActionAliasDB |
|
27
|
|
|
from st2common.models.db.executionstate import ActionExecutionStateDB |
|
28
|
|
|
from st2common.models.db.liveaction import LiveActionDB |
|
29
|
|
|
from st2common.models.db.runner import RunnerTypeDB |
|
30
|
|
|
from st2common.constants.action import LIVEACTION_STATUSES |
|
31
|
|
|
from st2common.models.system.common import ResourceReference |
|
32
|
|
|
|
|
33
|
|
|
|
|
34
|
|
|
__all__ = [ |
|
35
|
|
|
'ActionAPI', |
|
36
|
|
|
'ActionCreateAPI', |
|
37
|
|
|
'LiveActionAPI', |
|
38
|
|
|
'RunnerTypeAPI' |
|
39
|
|
|
] |
|
40
|
|
|
|
|
41
|
|
|
|
|
42
|
|
|
LOG = logging.getLogger(__name__) |
|
43
|
|
|
|
|
44
|
|
|
|
|
45
|
|
|
class RunnerTypeAPI(BaseAPI): |
|
46
|
|
|
""" |
|
47
|
|
|
The representation of an RunnerType in the system. An RunnerType |
|
48
|
|
|
has a one-to-one mapping to a particular ActionRunner implementation. |
|
49
|
|
|
""" |
|
50
|
|
|
model = RunnerTypeDB |
|
51
|
|
|
schema = { |
|
52
|
|
|
"title": "Runner", |
|
53
|
|
|
"description": "A handler for a specific type of actions.", |
|
54
|
|
|
"type": "object", |
|
55
|
|
|
"properties": { |
|
56
|
|
|
"id": { |
|
57
|
|
|
"description": "The unique identifier for the action runner.", |
|
58
|
|
|
"type": "string", |
|
59
|
|
|
"default": None |
|
60
|
|
|
}, |
|
61
|
|
|
"name": { |
|
62
|
|
|
"description": "The name of the action runner.", |
|
63
|
|
|
"type": "string", |
|
64
|
|
|
"required": True |
|
65
|
|
|
}, |
|
66
|
|
|
"description": { |
|
67
|
|
|
"description": "The description of the action runner.", |
|
68
|
|
|
"type": "string" |
|
69
|
|
|
}, |
|
70
|
|
|
"enabled": { |
|
71
|
|
|
"description": "Enable or disable the action runner.", |
|
72
|
|
|
"type": "boolean", |
|
73
|
|
|
"default": True |
|
74
|
|
|
}, |
|
75
|
|
|
"runner_module": { |
|
76
|
|
|
"description": "The python module that implements the " |
|
77
|
|
|
"action runner for this type.", |
|
78
|
|
|
"type": "string", |
|
79
|
|
|
"required": True |
|
80
|
|
|
}, |
|
81
|
|
|
"query_module": { |
|
82
|
|
|
"description": "The python module that implements the " |
|
83
|
|
|
"results tracker (querier) for the runner.", |
|
84
|
|
|
"type": "string", |
|
85
|
|
|
"required": False |
|
86
|
|
|
}, |
|
87
|
|
|
"runner_parameters": { |
|
88
|
|
|
"description": "Input parameters for the action runner.", |
|
89
|
|
|
"type": "object", |
|
90
|
|
|
"patternProperties": { |
|
91
|
|
|
"^\w+$": util_schema.get_action_parameters_schema() |
|
|
|
|
|
|
92
|
|
|
} |
|
93
|
|
|
} |
|
94
|
|
|
}, |
|
95
|
|
|
"additionalProperties": False |
|
96
|
|
|
} |
|
97
|
|
|
|
|
98
|
|
|
def __init__(self, **kw): |
|
|
|
|
|
|
99
|
|
|
# Ideally, you should not do that. You should not redefine __init__ to validate and then set |
|
100
|
|
|
# default values, instead you should define defaults in schema and use BaseAPI __init__ |
|
101
|
|
|
# validator to unwrap them. The problem here is that draft schema also contains default |
|
102
|
|
|
# values and we don't want them to be unwrapped at the same time. I've tried to remove the |
|
103
|
|
|
# default values from draft schema, but, either because of a bug or some weird intention, it |
|
104
|
|
|
# has continued to resolve $ref'erenced properties against the initial draft schema, not the |
|
105
|
|
|
# modified one |
|
106
|
|
|
for key, value in kw.items(): |
|
107
|
|
|
setattr(self, key, value) |
|
108
|
|
|
if not hasattr(self, 'runner_parameters'): |
|
109
|
|
|
setattr(self, 'runner_parameters', dict()) |
|
110
|
|
|
|
|
111
|
|
|
@classmethod |
|
112
|
|
|
def to_model(cls, runner_type): |
|
113
|
|
|
name = runner_type.name |
|
114
|
|
|
description = runner_type.description |
|
115
|
|
|
enabled = bool(runner_type.enabled) |
|
116
|
|
|
runner_module = str(runner_type.runner_module) |
|
117
|
|
|
runner_parameters = getattr(runner_type, 'runner_parameters', dict()) |
|
118
|
|
|
query_module = getattr(runner_type, 'query_module', None) |
|
119
|
|
|
|
|
120
|
|
|
model = cls.model(name=name, description=description, enabled=enabled, |
|
121
|
|
|
runner_module=runner_module, runner_parameters=runner_parameters, |
|
122
|
|
|
query_module=query_module) |
|
123
|
|
|
|
|
124
|
|
|
return model |
|
125
|
|
|
|
|
126
|
|
|
|
|
127
|
|
|
class ActionAPI(BaseAPI, APIUIDMixin): |
|
128
|
|
|
""" |
|
129
|
|
|
The system entity that represents a Stack Action/Automation in the system. |
|
130
|
|
|
""" |
|
131
|
|
|
|
|
132
|
|
|
model = ActionDB |
|
133
|
|
|
schema = { |
|
134
|
|
|
"title": "Action", |
|
135
|
|
|
"description": "An activity that happens as a response to the external event.", |
|
136
|
|
|
"type": "object", |
|
137
|
|
|
"properties": { |
|
138
|
|
|
"id": { |
|
139
|
|
|
"description": "The unique identifier for the action.", |
|
140
|
|
|
"type": "string" |
|
141
|
|
|
}, |
|
142
|
|
|
"ref": { |
|
143
|
|
|
"description": "System computed user friendly reference for the action. \ |
|
144
|
|
|
Provided value will be overridden by computed value.", |
|
145
|
|
|
"type": "string" |
|
146
|
|
|
}, |
|
147
|
|
|
"uid": { |
|
148
|
|
|
"type": "string" |
|
149
|
|
|
}, |
|
150
|
|
|
"name": { |
|
151
|
|
|
"description": "The name of the action.", |
|
152
|
|
|
"type": "string", |
|
153
|
|
|
"required": True |
|
154
|
|
|
}, |
|
155
|
|
|
"description": { |
|
156
|
|
|
"description": "The description of the action.", |
|
157
|
|
|
"type": "string" |
|
158
|
|
|
}, |
|
159
|
|
|
"enabled": { |
|
160
|
|
|
"description": "Enable or disable the action from invocation.", |
|
161
|
|
|
"type": "boolean", |
|
162
|
|
|
"default": True |
|
163
|
|
|
}, |
|
164
|
|
|
"runner_type": { |
|
165
|
|
|
"description": "The type of runner that executes the action.", |
|
166
|
|
|
"type": "string", |
|
167
|
|
|
"required": True |
|
168
|
|
|
}, |
|
169
|
|
|
"entry_point": { |
|
170
|
|
|
"description": "The entry point for the action.", |
|
171
|
|
|
"type": "string", |
|
172
|
|
|
"default": "" |
|
173
|
|
|
}, |
|
174
|
|
|
"pack": { |
|
175
|
|
|
"description": "The content pack this action belongs to.", |
|
176
|
|
|
"type": "string" |
|
177
|
|
|
}, |
|
178
|
|
|
"parameters": { |
|
179
|
|
|
"description": "Input parameters for the action.", |
|
180
|
|
|
"type": "object", |
|
181
|
|
|
"patternProperties": { |
|
182
|
|
|
"^\w+$": util_schema.get_action_parameters_schema() |
|
|
|
|
|
|
183
|
|
|
}, |
|
184
|
|
|
"default": {} |
|
185
|
|
|
}, |
|
186
|
|
|
"tags": { |
|
187
|
|
|
"description": "User associated metadata assigned to this object.", |
|
188
|
|
|
"type": "array", |
|
189
|
|
|
"items": {"type": "object"} |
|
190
|
|
|
}, |
|
191
|
|
|
"notify": { |
|
192
|
|
|
"description": "Notification settings for action.", |
|
193
|
|
|
"type": "object", |
|
194
|
|
|
"properties": { |
|
195
|
|
|
"on-complete": NotificationSubSchemaAPI, |
|
196
|
|
|
"on-failure": NotificationSubSchemaAPI, |
|
197
|
|
|
"on-success": NotificationSubSchemaAPI |
|
198
|
|
|
}, |
|
199
|
|
|
"additionalProperties": False |
|
200
|
|
|
} |
|
201
|
|
|
}, |
|
202
|
|
|
"additionalProperties": False |
|
203
|
|
|
} |
|
204
|
|
|
|
|
205
|
|
|
def __init__(self, **kw): |
|
|
|
|
|
|
206
|
|
|
for key, value in kw.items(): |
|
207
|
|
|
setattr(self, key, value) |
|
208
|
|
|
if not hasattr(self, 'parameters'): |
|
209
|
|
|
setattr(self, 'parameters', dict()) |
|
210
|
|
|
if not hasattr(self, 'entry_point'): |
|
211
|
|
|
setattr(self, 'entry_point', '') |
|
212
|
|
|
|
|
213
|
|
|
@classmethod |
|
214
|
|
|
def from_model(cls, model, mask_secrets=False): |
|
215
|
|
|
action = cls._from_model(model) |
|
216
|
|
|
action['runner_type'] = action['runner_type']['name'] |
|
217
|
|
|
action['tags'] = TagsHelper.from_model(model.tags) |
|
218
|
|
|
|
|
219
|
|
|
if getattr(model, 'notify', None): |
|
220
|
|
|
action['notify'] = NotificationsHelper.from_model(model.notify) |
|
221
|
|
|
|
|
222
|
|
|
return cls(**action) |
|
223
|
|
|
|
|
224
|
|
|
@classmethod |
|
225
|
|
|
def to_model(cls, action): |
|
226
|
|
|
name = getattr(action, 'name', None) |
|
227
|
|
|
description = getattr(action, 'description', None) |
|
228
|
|
|
enabled = bool(getattr(action, 'enabled', True)) |
|
229
|
|
|
entry_point = str(action.entry_point) |
|
230
|
|
|
pack = str(action.pack) |
|
231
|
|
|
runner_type = {'name': str(action.runner_type)} |
|
232
|
|
|
parameters = getattr(action, 'parameters', dict()) |
|
233
|
|
|
tags = TagsHelper.to_model(getattr(action, 'tags', [])) |
|
234
|
|
|
ref = ResourceReference.to_string_reference(pack=pack, name=name) |
|
235
|
|
|
|
|
236
|
|
|
if getattr(action, 'notify', None): |
|
237
|
|
|
notify = NotificationsHelper.to_model(action.notify) |
|
238
|
|
|
else: |
|
239
|
|
|
# We use embedded document model for ``notify`` in action model. If notify is |
|
240
|
|
|
# set notify to None, Mongoengine interprets ``None`` as unmodified |
|
241
|
|
|
# field therefore doesn't delete the embedded document. Therefore, we need |
|
242
|
|
|
# to use an empty document. |
|
243
|
|
|
notify = NotificationsHelper.to_model({}) |
|
244
|
|
|
|
|
245
|
|
|
model = cls.model(name=name, description=description, enable=enabled, enabled=enabled, |
|
246
|
|
|
entry_point=entry_point, pack=pack, runner_type=runner_type, |
|
247
|
|
|
tags=tags, parameters=parameters, notify=notify, |
|
248
|
|
|
ref=ref) |
|
249
|
|
|
|
|
250
|
|
|
return model |
|
251
|
|
|
|
|
252
|
|
|
|
|
253
|
|
|
class ActionCreateAPI(ActionAPI, APIUIDMixin): |
|
254
|
|
|
""" |
|
255
|
|
|
API model for create action operations. |
|
256
|
|
|
""" |
|
257
|
|
|
schema = copy.deepcopy(ActionAPI.schema) |
|
258
|
|
|
schema['properties']['data_files'] = { |
|
259
|
|
|
'description': 'Optional action script and data files which are written to the filesystem.', |
|
260
|
|
|
'type': 'array', |
|
261
|
|
|
'items': { |
|
262
|
|
|
'type': 'object', |
|
263
|
|
|
'properties': { |
|
264
|
|
|
'file_path': { |
|
265
|
|
|
'type': 'string', |
|
266
|
|
|
'required': True |
|
267
|
|
|
}, |
|
268
|
|
|
'content': { |
|
269
|
|
|
'type': 'string', |
|
270
|
|
|
'required': True |
|
271
|
|
|
}, |
|
272
|
|
|
}, |
|
273
|
|
|
'additionalProperties': False |
|
274
|
|
|
}, |
|
275
|
|
|
'default': [] |
|
276
|
|
|
} |
|
277
|
|
|
|
|
278
|
|
|
|
|
279
|
|
|
class LiveActionAPI(BaseAPI): |
|
280
|
|
|
"""The system entity that represents the execution of a Stack Action/Automation |
|
281
|
|
|
in the system. |
|
282
|
|
|
""" |
|
283
|
|
|
|
|
284
|
|
|
model = LiveActionDB |
|
285
|
|
|
schema = { |
|
286
|
|
|
"title": "liveaction", |
|
287
|
|
|
"description": "An execution of an action.", |
|
288
|
|
|
"type": "object", |
|
289
|
|
|
"properties": { |
|
290
|
|
|
"id": { |
|
291
|
|
|
"description": "The unique identifier for the action execution.", |
|
292
|
|
|
"type": "string" |
|
293
|
|
|
}, |
|
294
|
|
|
"status": { |
|
295
|
|
|
"description": "The current status of the action execution.", |
|
296
|
|
|
"type": "string", |
|
297
|
|
|
"enum": LIVEACTION_STATUSES |
|
298
|
|
|
}, |
|
299
|
|
|
"start_timestamp": { |
|
300
|
|
|
"description": "The start time when the action is executed.", |
|
301
|
|
|
"type": "string", |
|
302
|
|
|
"pattern": isotime.ISO8601_UTC_REGEX |
|
303
|
|
|
}, |
|
304
|
|
|
"end_timestamp": { |
|
305
|
|
|
"description": "The timestamp when the action has finished.", |
|
306
|
|
|
"type": "string", |
|
307
|
|
|
"pattern": isotime.ISO8601_UTC_REGEX |
|
308
|
|
|
}, |
|
309
|
|
|
"action": { |
|
310
|
|
|
"description": "Reference to the action to be executed.", |
|
311
|
|
|
"type": "string", |
|
312
|
|
|
"required": True |
|
313
|
|
|
}, |
|
314
|
|
|
"parameters": { |
|
315
|
|
|
"description": "Input parameters for the action.", |
|
316
|
|
|
"type": "object", |
|
317
|
|
|
"patternProperties": { |
|
318
|
|
|
"^\w+$": { |
|
|
|
|
|
|
319
|
|
|
"anyOf": [ |
|
320
|
|
|
{"type": "array"}, |
|
321
|
|
|
{"type": "boolean"}, |
|
322
|
|
|
{"type": "integer"}, |
|
323
|
|
|
{"type": "number"}, |
|
324
|
|
|
{"type": "object"}, |
|
325
|
|
|
{"type": "string"}, |
|
326
|
|
|
{"type": "null"} |
|
327
|
|
|
] |
|
328
|
|
|
} |
|
329
|
|
|
} |
|
330
|
|
|
}, |
|
331
|
|
|
"result": { |
|
332
|
|
|
"anyOf": [{"type": "array"}, |
|
333
|
|
|
{"type": "boolean"}, |
|
334
|
|
|
{"type": "integer"}, |
|
335
|
|
|
{"type": "number"}, |
|
336
|
|
|
{"type": "object"}, |
|
337
|
|
|
{"type": "string"}] |
|
338
|
|
|
}, |
|
339
|
|
|
"context": { |
|
340
|
|
|
"type": "object" |
|
341
|
|
|
}, |
|
342
|
|
|
"callback": { |
|
343
|
|
|
"type": "object" |
|
344
|
|
|
}, |
|
345
|
|
|
"runner_info": { |
|
346
|
|
|
"type": "object" |
|
347
|
|
|
}, |
|
348
|
|
|
"notify": { |
|
349
|
|
|
"description": "Notification settings for liveaction.", |
|
350
|
|
|
"type": "object", |
|
351
|
|
|
"properties": { |
|
352
|
|
|
"on-complete": NotificationSubSchemaAPI, |
|
353
|
|
|
"on-failure": NotificationSubSchemaAPI, |
|
354
|
|
|
"on-success": NotificationSubSchemaAPI |
|
355
|
|
|
}, |
|
356
|
|
|
"additionalProperties": False |
|
357
|
|
|
} |
|
358
|
|
|
}, |
|
359
|
|
|
"additionalProperties": False |
|
360
|
|
|
} |
|
361
|
|
|
|
|
362
|
|
|
@classmethod |
|
363
|
|
|
def from_model(cls, model, mask_secrets=False): |
|
364
|
|
|
doc = super(cls, cls)._from_model(model, mask_secrets=mask_secrets) |
|
365
|
|
|
if model.start_timestamp: |
|
366
|
|
|
doc['start_timestamp'] = isotime.format(model.start_timestamp, offset=False) |
|
367
|
|
|
if model.end_timestamp: |
|
368
|
|
|
doc['end_timestamp'] = isotime.format(model.end_timestamp, offset=False) |
|
369
|
|
|
|
|
370
|
|
|
if getattr(model, 'notify', None): |
|
371
|
|
|
doc['notify'] = NotificationsHelper.from_model(model.notify) |
|
372
|
|
|
|
|
373
|
|
|
return cls(**doc) |
|
374
|
|
|
|
|
375
|
|
|
@classmethod |
|
376
|
|
|
def to_model(cls, live_action): |
|
377
|
|
|
name = getattr(live_action, 'name', None) |
|
378
|
|
|
description = getattr(live_action, 'description', None) |
|
379
|
|
|
action = live_action.action |
|
380
|
|
|
|
|
381
|
|
|
if getattr(live_action, 'start_timestamp', None): |
|
382
|
|
|
start_timestamp = isotime.parse(live_action.start_timestamp) |
|
383
|
|
|
else: |
|
384
|
|
|
start_timestamp = None |
|
385
|
|
|
|
|
386
|
|
|
if getattr(live_action, 'end_timestamp', None): |
|
387
|
|
|
end_timestamp = isotime.parse(live_action.end_timestamp) |
|
388
|
|
|
else: |
|
389
|
|
|
end_timestamp = None |
|
390
|
|
|
|
|
391
|
|
|
status = getattr(live_action, 'status', None) |
|
392
|
|
|
parameters = getattr(live_action, 'parameters', dict()) |
|
393
|
|
|
context = getattr(live_action, 'context', dict()) |
|
394
|
|
|
callback = getattr(live_action, 'callback', dict()) |
|
395
|
|
|
result = getattr(live_action, 'result', None) |
|
396
|
|
|
|
|
397
|
|
|
if getattr(live_action, 'notify', None): |
|
398
|
|
|
notify = NotificationsHelper.to_model(live_action.notify) |
|
399
|
|
|
else: |
|
400
|
|
|
notify = None |
|
401
|
|
|
|
|
402
|
|
|
model = cls.model(name=name, description=description, action=action, |
|
403
|
|
|
start_timestamp=start_timestamp, end_timestamp=end_timestamp, |
|
404
|
|
|
status=status, parameters=parameters, context=context, |
|
405
|
|
|
callback=callback, result=result, notify=notify) |
|
406
|
|
|
|
|
407
|
|
|
return model |
|
408
|
|
|
|
|
409
|
|
|
|
|
410
|
|
|
class ActionExecutionStateAPI(BaseAPI): |
|
411
|
|
|
""" |
|
412
|
|
|
System entity that represents state of an action in the system. |
|
413
|
|
|
This is used only in tests for now. |
|
414
|
|
|
""" |
|
415
|
|
|
model = ActionExecutionStateDB |
|
416
|
|
|
schema = { |
|
417
|
|
|
"title": "ActionExecutionState", |
|
418
|
|
|
"description": "Execution state of an action.", |
|
419
|
|
|
"type": "object", |
|
420
|
|
|
"properties": { |
|
421
|
|
|
"id": { |
|
422
|
|
|
"description": "The unique identifier for the action execution state.", |
|
423
|
|
|
"type": "string" |
|
424
|
|
|
}, |
|
425
|
|
|
"execution_id": { |
|
426
|
|
|
"type": "string", |
|
427
|
|
|
"description": "ID of the action execution.", |
|
428
|
|
|
"required": True |
|
429
|
|
|
}, |
|
430
|
|
|
"query_context": { |
|
431
|
|
|
"type": "object", |
|
432
|
|
|
"description": "query context to be used by querier.", |
|
433
|
|
|
"required": True |
|
434
|
|
|
}, |
|
435
|
|
|
"query_module": { |
|
436
|
|
|
"type": "string", |
|
437
|
|
|
"description": "Name of the query module.", |
|
438
|
|
|
"required": True |
|
439
|
|
|
} |
|
440
|
|
|
}, |
|
441
|
|
|
"additionalProperties": False |
|
442
|
|
|
} |
|
443
|
|
|
|
|
444
|
|
|
@classmethod |
|
445
|
|
|
def to_model(cls, state): |
|
446
|
|
|
execution_id = state.execution_id |
|
447
|
|
|
query_module = state.query_module |
|
448
|
|
|
query_context = state.query_context |
|
449
|
|
|
|
|
450
|
|
|
model = cls.model(execution_id=execution_id, query_module=query_module, |
|
451
|
|
|
query_context=query_context) |
|
452
|
|
|
return model |
|
453
|
|
|
|
|
454
|
|
|
|
|
455
|
|
|
class ActionAliasAPI(BaseAPI, APIUIDMixin): |
|
456
|
|
|
""" |
|
457
|
|
|
Alias for an action in the system. |
|
458
|
|
|
""" |
|
459
|
|
|
model = ActionAliasDB |
|
460
|
|
|
schema = { |
|
461
|
|
|
"title": "ActionAlias", |
|
462
|
|
|
"description": "Alias for an action.", |
|
463
|
|
|
"type": "object", |
|
464
|
|
|
"properties": { |
|
465
|
|
|
"id": { |
|
466
|
|
|
"description": "The unique identifier for the action alias.", |
|
467
|
|
|
"type": "string" |
|
468
|
|
|
}, |
|
469
|
|
|
"ref": { |
|
470
|
|
|
"description": "System computed user friendly reference for the alias. \ |
|
471
|
|
|
Provided value will be overridden by computed value.", |
|
472
|
|
|
"type": "string" |
|
473
|
|
|
}, |
|
474
|
|
|
"uid": { |
|
475
|
|
|
"type": "string" |
|
476
|
|
|
}, |
|
477
|
|
|
"name": { |
|
478
|
|
|
"type": "string", |
|
479
|
|
|
"description": "Name of the action alias.", |
|
480
|
|
|
"required": True |
|
481
|
|
|
}, |
|
482
|
|
|
"pack": { |
|
483
|
|
|
"description": "The content pack this actionalias belongs to.", |
|
484
|
|
|
"type": "string", |
|
485
|
|
|
"required": True |
|
486
|
|
|
}, |
|
487
|
|
|
"description": { |
|
488
|
|
|
"type": "string", |
|
489
|
|
|
"description": "Description of the action alias.", |
|
490
|
|
|
"default": None |
|
491
|
|
|
}, |
|
492
|
|
|
"enabled": { |
|
493
|
|
|
"description": "Flag indicating of action alias is enabled.", |
|
494
|
|
|
"type": "boolean", |
|
495
|
|
|
"default": True |
|
496
|
|
|
}, |
|
497
|
|
|
"action_ref": { |
|
498
|
|
|
"type": "string", |
|
499
|
|
|
"description": "Reference to the aliased action.", |
|
500
|
|
|
"required": True |
|
501
|
|
|
}, |
|
502
|
|
|
"formats": { |
|
503
|
|
|
"type": "array", |
|
504
|
|
|
"items": { |
|
505
|
|
|
"anyOf": [ |
|
506
|
|
|
{"type": "string"}, |
|
507
|
|
|
{ |
|
508
|
|
|
"type": "object", |
|
509
|
|
|
"properties": { |
|
510
|
|
|
"display": {"type": "string"}, |
|
511
|
|
|
"representation": { |
|
512
|
|
|
"type": "array", |
|
513
|
|
|
"items": {"type": "string"} |
|
514
|
|
|
} |
|
515
|
|
|
} |
|
516
|
|
|
} |
|
517
|
|
|
] |
|
518
|
|
|
}, |
|
519
|
|
|
"description": "Possible parameter format." |
|
520
|
|
|
}, |
|
521
|
|
|
"ack": { |
|
522
|
|
|
"type": "object", |
|
523
|
|
|
"properties": { |
|
524
|
|
|
"enabled": {"type": "boolean"}, |
|
525
|
|
|
"format": {"type": "string"}, |
|
526
|
|
|
"append_url": {"type": "boolean"} |
|
527
|
|
|
}, |
|
528
|
|
|
"description": "Acknowledgement message format." |
|
529
|
|
|
}, |
|
530
|
|
|
"result": { |
|
531
|
|
|
"type": "object", |
|
532
|
|
|
"properties": { |
|
533
|
|
|
"enabled": {"type": "boolean"}, |
|
534
|
|
|
"format": {"type": "string"} |
|
535
|
|
|
}, |
|
536
|
|
|
"description": "Execution message format." |
|
537
|
|
|
} |
|
538
|
|
|
}, |
|
539
|
|
|
"additionalProperties": False |
|
540
|
|
|
} |
|
541
|
|
|
|
|
542
|
|
|
@classmethod |
|
543
|
|
|
def to_model(cls, alias): |
|
544
|
|
|
name = alias.name |
|
545
|
|
|
description = getattr(alias, 'description', None) |
|
546
|
|
|
pack = alias.pack |
|
547
|
|
|
ref = ResourceReference.to_string_reference(pack=pack, name=name) |
|
548
|
|
|
enabled = getattr(alias, 'enabled', True) |
|
549
|
|
|
action_ref = alias.action_ref |
|
550
|
|
|
formats = alias.formats |
|
551
|
|
|
ack = getattr(alias, 'ack', None) |
|
552
|
|
|
result = getattr(alias, 'result', None) |
|
553
|
|
|
|
|
554
|
|
|
model = cls.model(name=name, description=description, pack=pack, ref=ref, enabled=enabled, |
|
555
|
|
|
action_ref=action_ref, formats=formats, ack=ack, result=result) |
|
556
|
|
|
return model |
|
557
|
|
|
|
|
558
|
|
|
|
|
559
|
|
|
class AliasExecutionAPI(BaseAPI): |
|
560
|
|
|
""" |
|
561
|
|
|
Alias for an action in the system. |
|
562
|
|
|
""" |
|
563
|
|
|
model = None |
|
564
|
|
|
schema = { |
|
565
|
|
|
"title": "AliasExecution", |
|
566
|
|
|
"description": "Execution of an ActionAlias.", |
|
567
|
|
|
"type": "object", |
|
568
|
|
|
"properties": { |
|
569
|
|
|
"name": { |
|
570
|
|
|
"type": "string", |
|
571
|
|
|
"description": "Name of the action alias which matched.", |
|
572
|
|
|
"required": True |
|
573
|
|
|
}, |
|
574
|
|
|
"format": { |
|
575
|
|
|
"type": "string", |
|
576
|
|
|
"description": "Format string which matched.", |
|
577
|
|
|
"required": True |
|
578
|
|
|
}, |
|
579
|
|
|
"command": { |
|
580
|
|
|
"type": "string", |
|
581
|
|
|
"description": "Command used in chat.", |
|
582
|
|
|
"required": True |
|
583
|
|
|
}, |
|
584
|
|
|
"user": { |
|
585
|
|
|
"type": "string", |
|
586
|
|
|
"description": "User that requested the execution.", |
|
587
|
|
|
"default": "channel" # TODO: This value doesnt get set |
|
588
|
|
|
}, |
|
589
|
|
|
"source_channel": { |
|
590
|
|
|
"type": "string", |
|
591
|
|
|
"description": "Channel from which the execution was requested. This is not the \ |
|
592
|
|
|
channel as defined by the notification system.", |
|
593
|
|
|
"required": True |
|
594
|
|
|
}, |
|
595
|
|
|
"notification_channel": { |
|
596
|
|
|
"type": "string", |
|
597
|
|
|
"description": "StackStorm notification channel to use to respond.", |
|
598
|
|
|
"required": False |
|
599
|
|
|
}, |
|
600
|
|
|
"notification_route": { |
|
601
|
|
|
"type": "string", |
|
602
|
|
|
"description": "StackStorm notification route to use to respond.", |
|
603
|
|
|
"required": False |
|
604
|
|
|
} |
|
605
|
|
|
}, |
|
606
|
|
|
"additionalProperties": False |
|
607
|
|
|
} |
|
608
|
|
|
|
|
609
|
|
|
@classmethod |
|
610
|
|
|
def to_model(cls, aliasexecution): |
|
611
|
|
|
# probably should be unsupported |
|
612
|
|
|
raise NotImplementedError() |
|
613
|
|
|
|
|
614
|
|
|
@classmethod |
|
615
|
|
|
def from_model(cls, aliasexecution): |
|
|
|
|
|
|
616
|
|
|
raise NotImplementedError() |
|
617
|
|
|
|
Escape sequences in Python are generally interpreted according to rules similar to standard C. Only if strings are prefixed with
rorRare they interpreted as regular expressions.The escape sequence that was used indicates that you might have intended to write a regular expression.
Learn more about the available escape sequences. in the Python documentation.