qarnot 2.18.0__py3-none-any.whl → 2.19.0__py3-none-any.whl
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.
- qarnot/_version.py +3 -3
- qarnot/computing_quotas.py +16 -4
- qarnot/forced_network_rule.py +41 -14
- qarnot/multi_slots_settings.py +48 -0
- qarnot/pool.py +52 -0
- qarnot/task.py +27 -0
- {qarnot-2.18.0.dist-info → qarnot-2.19.0.dist-info}/METADATA +1 -1
- {qarnot-2.18.0.dist-info → qarnot-2.19.0.dist-info}/RECORD +11 -10
- {qarnot-2.18.0.dist-info → qarnot-2.19.0.dist-info}/WHEEL +1 -1
- {qarnot-2.18.0.dist-info → qarnot-2.19.0.dist-info}/licenses/LICENSE +0 -0
- {qarnot-2.18.0.dist-info → qarnot-2.19.0.dist-info}/top_level.txt +0 -0
qarnot/_version.py
CHANGED
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2025-
|
|
11
|
+
"date": "2025-09-04T17:06:17+0200",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "v2.
|
|
14
|
+
"full-revisionid": "2436d80006a87be548b2235b12f0a6f041ef66c1",
|
|
15
|
+
"version": "v2.19.0"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
qarnot/computing_quotas.py
CHANGED
|
@@ -70,7 +70,7 @@ class UserReservedSchedulingQuota(UserSchedulingQuota):
|
|
|
70
70
|
"""Describes a reserved scheduling quota for the user.
|
|
71
71
|
"""
|
|
72
72
|
|
|
73
|
-
def __init__(self, machine_key: str, max_cores: int, running_cores_count: int, max_instances: int, running_instances_count: int):
|
|
73
|
+
def __init__(self, reservation_name: str, machine_key: str, max_cores: int, running_cores_count: int, max_instances: int, running_instances_count: int):
|
|
74
74
|
"""Create a new UserReservedSchedulingQuota object describing a reserved scheduling quota for the user.
|
|
75
75
|
|
|
76
76
|
:param str machine_key: Machine key of the reservation.
|
|
@@ -86,6 +86,11 @@ class UserReservedSchedulingQuota(UserSchedulingQuota):
|
|
|
86
86
|
|
|
87
87
|
Machine key of the reservation.
|
|
88
88
|
"""
|
|
89
|
+
self.reservation_name = reservation_name
|
|
90
|
+
""":type: :class:`str`
|
|
91
|
+
|
|
92
|
+
Name of the reservation.
|
|
93
|
+
"""
|
|
89
94
|
|
|
90
95
|
@classmethod
|
|
91
96
|
def from_json(cls, json: Dict[str, Any]):
|
|
@@ -97,6 +102,7 @@ class UserReservedSchedulingQuota(UserSchedulingQuota):
|
|
|
97
102
|
if json is None:
|
|
98
103
|
return None
|
|
99
104
|
return cls(
|
|
105
|
+
json.get('reservationName'),
|
|
100
106
|
json.get('machineKey'),
|
|
101
107
|
json.get('maxCores'),
|
|
102
108
|
json.get('runningCoresCount'),
|
|
@@ -142,7 +148,7 @@ class UserComputingQuotas(object):
|
|
|
142
148
|
return cls(
|
|
143
149
|
UserSchedulingQuota.from_json(json.get('flex')),
|
|
144
150
|
UserSchedulingQuota.from_json(json.get('onDemand')),
|
|
145
|
-
[UserReservedSchedulingQuota.from_json(v) for v in json.get('reserved'
|
|
151
|
+
[UserReservedSchedulingQuota.from_json(v) for v in (json.get('reserved') if json.get('reserved') is not None else []) if v is not None]
|
|
146
152
|
)
|
|
147
153
|
|
|
148
154
|
|
|
@@ -201,7 +207,7 @@ class OrganizationReservedSchedulingQuota(OrganizationSchedulingQuota):
|
|
|
201
207
|
"""Describes a reserved scheduling quota for the organization.
|
|
202
208
|
"""
|
|
203
209
|
|
|
204
|
-
def __init__(self, machine_key: str, max_cores: int, running_cores_count: int, max_instances: int, running_instances_count: int):
|
|
210
|
+
def __init__(self, reservation_name: str, machine_key: str, max_cores: int, running_cores_count: int, max_instances: int, running_instances_count: int):
|
|
205
211
|
"""Create a new OrganizationReservedSchedulingQuota object describing a reserved scheduling quota for the organization.
|
|
206
212
|
|
|
207
213
|
:param str machine_key: Machine key of the reservation.
|
|
@@ -217,6 +223,11 @@ class OrganizationReservedSchedulingQuota(OrganizationSchedulingQuota):
|
|
|
217
223
|
|
|
218
224
|
Machine key of the reservation.
|
|
219
225
|
"""
|
|
226
|
+
self.reservation_name = reservation_name
|
|
227
|
+
""":type: :class:`str`
|
|
228
|
+
|
|
229
|
+
Name of the reservation.
|
|
230
|
+
"""
|
|
220
231
|
|
|
221
232
|
@classmethod
|
|
222
233
|
def from_json(cls, json: Dict[str, Any]):
|
|
@@ -228,6 +239,7 @@ class OrganizationReservedSchedulingQuota(OrganizationSchedulingQuota):
|
|
|
228
239
|
if json is None:
|
|
229
240
|
return None
|
|
230
241
|
return cls(
|
|
242
|
+
json.get('reservationName'),
|
|
231
243
|
json.get('machineKey'),
|
|
232
244
|
json.get('maxCores'),
|
|
233
245
|
json.get('runningCoresCount'),
|
|
@@ -279,7 +291,7 @@ class OrganizationComputingQuotas(object):
|
|
|
279
291
|
json.get('name'),
|
|
280
292
|
OrganizationSchedulingQuota.from_json(json.get('flex')),
|
|
281
293
|
OrganizationSchedulingQuota.from_json(json.get('onDemand')),
|
|
282
|
-
[OrganizationReservedSchedulingQuota.from_json(v) for v in json.get('reserved'
|
|
294
|
+
[OrganizationReservedSchedulingQuota.from_json(v) for v in (json.get('reserved') if json.get('reserved') is not None else []) if v is not None]
|
|
283
295
|
)
|
|
284
296
|
|
|
285
297
|
|
qarnot/forced_network_rule.py
CHANGED
|
@@ -20,7 +20,18 @@ class ForcedNetworkRule(object):
|
|
|
20
20
|
priority: str = None,
|
|
21
21
|
description: str = None,
|
|
22
22
|
to_qbox: Optional[bool] = None,
|
|
23
|
-
to_payload: Optional[bool] = None
|
|
23
|
+
to_payload: Optional[bool] = None,
|
|
24
|
+
name: str = None,
|
|
25
|
+
application_type: str = None):
|
|
26
|
+
|
|
27
|
+
self.name = name
|
|
28
|
+
""":type: :class:`str`
|
|
29
|
+
|
|
30
|
+
Name of the associated rule."""
|
|
31
|
+
self.application_type = application_type
|
|
32
|
+
""":type: :class:`str`
|
|
33
|
+
|
|
34
|
+
Application layer protocol used / hint about it (e.g. ssh, http, https...)."""
|
|
24
35
|
self.inbound = inbound
|
|
25
36
|
""":type: :class:`bool`
|
|
26
37
|
|
|
@@ -84,6 +95,14 @@ class ForcedNetworkRule(object):
|
|
|
84
95
|
:returns: The created :class:`~qarnot.forced_network_rule.ForcedNetworkRule`
|
|
85
96
|
"""
|
|
86
97
|
|
|
98
|
+
name: str = None
|
|
99
|
+
if 'name' in json:
|
|
100
|
+
name = str(json.get("name"))
|
|
101
|
+
|
|
102
|
+
application_type: str = None
|
|
103
|
+
if 'applicationType' in json:
|
|
104
|
+
application_type = str(json.get("applicationType"))
|
|
105
|
+
|
|
87
106
|
inbound: bool = bool(json.get("inbound"))
|
|
88
107
|
proto: str = str(json.get("proto"))
|
|
89
108
|
|
|
@@ -96,12 +115,12 @@ class ForcedNetworkRule(object):
|
|
|
96
115
|
to = str(json.get("to"))
|
|
97
116
|
|
|
98
117
|
public_host: str = None
|
|
99
|
-
if '
|
|
100
|
-
public_host = str(json.get("
|
|
118
|
+
if 'publicHost' in json:
|
|
119
|
+
public_host = str(json.get("publicHost"))
|
|
101
120
|
|
|
102
121
|
public_port: str = None
|
|
103
|
-
if '
|
|
104
|
-
public_port = str(json.get("
|
|
122
|
+
if 'publicPort' in json:
|
|
123
|
+
public_port = str(json.get("publicPort"))
|
|
105
124
|
|
|
106
125
|
forwarder: str = None
|
|
107
126
|
if 'forwarder' in json:
|
|
@@ -116,12 +135,12 @@ class ForcedNetworkRule(object):
|
|
|
116
135
|
description = str(json.get("description"))
|
|
117
136
|
|
|
118
137
|
to_qbox: Optional[bool] = None
|
|
119
|
-
if '
|
|
120
|
-
to_qbox = bool(json.get("
|
|
138
|
+
if 'toQBox' in json:
|
|
139
|
+
to_qbox = bool(json.get("toQBox"))
|
|
121
140
|
|
|
122
141
|
to_payload: Optional[bool] = None
|
|
123
|
-
if '
|
|
124
|
-
to_payload = bool(json.get("
|
|
142
|
+
if 'toPayload' in json:
|
|
143
|
+
to_payload = bool(json.get("toPayload"))
|
|
125
144
|
|
|
126
145
|
return ForcedNetworkRule(
|
|
127
146
|
inbound,
|
|
@@ -134,7 +153,9 @@ class ForcedNetworkRule(object):
|
|
|
134
153
|
priority,
|
|
135
154
|
description,
|
|
136
155
|
to_qbox,
|
|
137
|
-
to_payload
|
|
156
|
+
to_payload,
|
|
157
|
+
name,
|
|
158
|
+
application_type)
|
|
138
159
|
|
|
139
160
|
def to_json(self):
|
|
140
161
|
result: Dict[str, Union[str, bool]] = {
|
|
@@ -142,6 +163,12 @@ class ForcedNetworkRule(object):
|
|
|
142
163
|
"proto": self.proto,
|
|
143
164
|
}
|
|
144
165
|
|
|
166
|
+
if self.name is not None:
|
|
167
|
+
result["name"] = self.name
|
|
168
|
+
|
|
169
|
+
if self.application_type is not None:
|
|
170
|
+
result["applicationType"] = self.application_type
|
|
171
|
+
|
|
145
172
|
if self.port is not None:
|
|
146
173
|
result["port"] = self.port
|
|
147
174
|
|
|
@@ -149,10 +176,10 @@ class ForcedNetworkRule(object):
|
|
|
149
176
|
result["to"] = self.to
|
|
150
177
|
|
|
151
178
|
if self.public_host is not None:
|
|
152
|
-
result["
|
|
179
|
+
result["publicHost"] = self.public_host
|
|
153
180
|
|
|
154
181
|
if self.public_port is not None:
|
|
155
|
-
result["
|
|
182
|
+
result["publicPort"] = self.public_port
|
|
156
183
|
|
|
157
184
|
if self.forwarder is not None:
|
|
158
185
|
result["forwarder"] = self.forwarder
|
|
@@ -164,9 +191,9 @@ class ForcedNetworkRule(object):
|
|
|
164
191
|
result["description"] = self.description
|
|
165
192
|
|
|
166
193
|
if self.to_qbox is not None:
|
|
167
|
-
result["
|
|
194
|
+
result["toQBox"] = self.to_qbox
|
|
168
195
|
|
|
169
196
|
if self.to_payload is not None:
|
|
170
|
-
result["
|
|
197
|
+
result["toPayload"] = self.to_payload
|
|
171
198
|
|
|
172
199
|
return result
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"""Multi Slots Settings that can be used when creating a pool"""
|
|
2
|
+
|
|
3
|
+
from typing import Dict
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class MultiSlotsSettings(object):
|
|
7
|
+
"""Represents task multi slots settings."""
|
|
8
|
+
|
|
9
|
+
_slotsPerNode: int = None
|
|
10
|
+
|
|
11
|
+
def __init__(self, slotsPerNode: int = None):
|
|
12
|
+
"""Create a new :class:`~qarnot.multi_slots_settings.MultiSlotsSettings`.
|
|
13
|
+
|
|
14
|
+
:param slotsPerNode: slots per node
|
|
15
|
+
:type slotsPerNode: int
|
|
16
|
+
"""
|
|
17
|
+
self._slotsPerNode = slotsPerNode
|
|
18
|
+
|
|
19
|
+
@classmethod
|
|
20
|
+
def from_json(cls, json: Dict[str, int]):
|
|
21
|
+
"""Create the multi slots settings from json.
|
|
22
|
+
|
|
23
|
+
:param dict json: Dictionary representing the multi slots settings
|
|
24
|
+
:returns: The created :class:`~qarnot.multi_slots_settings.MultiSlotsSettings`
|
|
25
|
+
"""
|
|
26
|
+
slotsPerNode: int = json.get("slotsPerNode")
|
|
27
|
+
return MultiSlotsSettings(slotsPerNode)
|
|
28
|
+
|
|
29
|
+
def to_json(self) -> Dict[str, int]:
|
|
30
|
+
"""Get a dict ready to be json packed.
|
|
31
|
+
|
|
32
|
+
:return: the json elements of the class.
|
|
33
|
+
:rtype: `dict`
|
|
34
|
+
"""
|
|
35
|
+
return {
|
|
36
|
+
"slotsPerNode": self._slotsPerNode
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
def __eq__(self, other):
|
|
40
|
+
if other is None or not isinstance(other, MultiSlotsSettings):
|
|
41
|
+
return False
|
|
42
|
+
return self._slotsPerNode == other._slotsPerNode
|
|
43
|
+
|
|
44
|
+
def __str__(self) -> str:
|
|
45
|
+
return "multi slots settings: slotsPerNode {}.".format(self._slotsPerNode)
|
|
46
|
+
|
|
47
|
+
def __repr__(self) -> str:
|
|
48
|
+
return "multi_slots_settings.MultiSlotsSettings(slotsPerNode: {})".format(self._slotsPerNode)
|
qarnot/pool.py
CHANGED
|
@@ -19,6 +19,7 @@ from typing import Dict, List, Optional
|
|
|
19
19
|
|
|
20
20
|
from qarnot.carbon_facts import CarbonClient, CarbonFacts
|
|
21
21
|
from qarnot.retry_settings import RetrySettings
|
|
22
|
+
from qarnot.multi_slots_settings import MultiSlotsSettings
|
|
22
23
|
from qarnot.forced_network_rule import ForcedNetworkRule
|
|
23
24
|
from qarnot.secrets import SecretsAccessRights
|
|
24
25
|
|
|
@@ -86,6 +87,7 @@ class Pool(object):
|
|
|
86
87
|
self._update_cache_time = 5
|
|
87
88
|
self._scheduling_type = scheduling_type
|
|
88
89
|
self._targeted_reserved_machine_key: str = None
|
|
90
|
+
self._targeted_reservation_name: str = None
|
|
89
91
|
|
|
90
92
|
self._last_cache = time.time()
|
|
91
93
|
self._instancecount = instancecount
|
|
@@ -128,6 +130,7 @@ class Pool(object):
|
|
|
128
130
|
self._default_resources_cache_ttl_sec: Optional[int] = None
|
|
129
131
|
self._privileges: Privileges = Privileges()
|
|
130
132
|
self._default_retry_settings: RetrySettings = RetrySettings()
|
|
133
|
+
self._multi_slots_settings: Optional[MultiSlotsSettings] = None
|
|
131
134
|
self._forced_network_rules: List[ForcedNetworkRule] = []
|
|
132
135
|
self._secrets_access_rights: SecretsAccessRights = SecretsAccessRights()
|
|
133
136
|
|
|
@@ -238,10 +241,13 @@ class Pool(object):
|
|
|
238
241
|
self._hardware_constraints = [HardwareConstraint.from_json(hw_constraint_dict) for hw_constraint_dict in json_pool.get("hardwareConstraints", [])]
|
|
239
242
|
self._default_resources_cache_ttl_sec = json_pool.get("defaultResourcesCacheTTLSec", None)
|
|
240
243
|
self._targeted_reserved_machine_key = json_pool.get("targetedReservedMachineKey", None)
|
|
244
|
+
self._targeted_reservation_name = json_pool.get("targetedReservationName", None)
|
|
241
245
|
if 'privileges' in json_pool:
|
|
242
246
|
self._privileges = Privileges.from_json(json_pool.get("privileges"))
|
|
243
247
|
if 'defaultRetrySettings' in json_pool:
|
|
244
248
|
self._default_retry_settings = RetrySettings.from_json(json_pool.get("defaultRetrySettings"))
|
|
249
|
+
if 'multiSlotsSettings' in json_pool:
|
|
250
|
+
self._multi_slots_settings = MultiSlotsSettings.from_json(json_pool.get("multiSlotsSettings"))
|
|
245
251
|
if 'schedulingType' in json_pool:
|
|
246
252
|
self._scheduling_type = SchedulingType.from_string(json_pool.get("schedulingType"))
|
|
247
253
|
self._forced_network_rules = [ForcedNetworkRule.from_json(forced_network_dict) for forced_network_dict in json_pool.get("forcedNetworkRules", [])]
|
|
@@ -309,12 +315,18 @@ class Pool(object):
|
|
|
309
315
|
if self._targeted_reserved_machine_key is not None:
|
|
310
316
|
json_pool['targetedReservedMachineKey'] = self._targeted_reserved_machine_key
|
|
311
317
|
|
|
318
|
+
if self._targeted_reservation_name is not None:
|
|
319
|
+
json_pool['targetedReservationName'] = self._targeted_reservation_name
|
|
320
|
+
|
|
312
321
|
if self._forced_network_rules is not None:
|
|
313
322
|
json_pool['forcedNetworkRules'] = [x.to_json() for x in self._forced_network_rules]
|
|
314
323
|
|
|
315
324
|
if self._secrets_access_rights:
|
|
316
325
|
json_pool['secretsAccessRights'] = self._secrets_access_rights.to_json()
|
|
317
326
|
|
|
327
|
+
if self._multi_slots_settings:
|
|
328
|
+
json_pool['multiSlotsSettings'] = self._multi_slots_settings.to_json()
|
|
329
|
+
|
|
318
330
|
return json_pool
|
|
319
331
|
|
|
320
332
|
def submit(self):
|
|
@@ -1279,6 +1291,24 @@ class Pool(object):
|
|
|
1279
1291
|
raise AttributeError("can't set attribute on a submitted job")
|
|
1280
1292
|
self._completion_time_to_live = _util.parse_to_timespan_string(value)
|
|
1281
1293
|
|
|
1294
|
+
@property
|
|
1295
|
+
def multi_slots_settings(self):
|
|
1296
|
+
"""
|
|
1297
|
+
:getter: Returns this pool's multi slots settings.
|
|
1298
|
+
:type: :class:`~qarnot.multi_slots_settings.MultiSlotsSettings`
|
|
1299
|
+
:default_value: None
|
|
1300
|
+
"""
|
|
1301
|
+
self._update_if_summary()
|
|
1302
|
+
return self._multi_slots_settings
|
|
1303
|
+
|
|
1304
|
+
@multi_slots_settings.setter
|
|
1305
|
+
def multi_slots_settings(self, value):
|
|
1306
|
+
"""Setter for multi_slots_settings, this can only be set before pool's submission"""
|
|
1307
|
+
self._update_if_summary()
|
|
1308
|
+
if self._multi_slots_settings is not None:
|
|
1309
|
+
raise AttributeError("can't set attribute on a submitted pool")
|
|
1310
|
+
self._multi_slots_settings = value
|
|
1311
|
+
|
|
1282
1312
|
@property
|
|
1283
1313
|
def previous_state(self):
|
|
1284
1314
|
"""
|
|
@@ -1497,6 +1527,9 @@ class Pool(object):
|
|
|
1497
1527
|
|
|
1498
1528
|
:getter: The reserved machine key when using the "reserved" scheduling type
|
|
1499
1529
|
|
|
1530
|
+
.. deprecated:: v2.19.0
|
|
1531
|
+
Use `self.targeted_reservation_name` instead.
|
|
1532
|
+
|
|
1500
1533
|
:raises AttributeError: trying to set this after the pool is submitted
|
|
1501
1534
|
"""
|
|
1502
1535
|
return self._targeted_reserved_machine_key
|
|
@@ -1510,6 +1543,25 @@ class Pool(object):
|
|
|
1510
1543
|
|
|
1511
1544
|
self._targeted_reserved_machine_key = value
|
|
1512
1545
|
|
|
1546
|
+
@property
|
|
1547
|
+
def targeted_reservation_name(self) -> str:
|
|
1548
|
+
""":type: :class:`str`
|
|
1549
|
+
|
|
1550
|
+
:getter: The name of the reservation that describes the targeted machines when using the "reserved" scheduling type
|
|
1551
|
+
|
|
1552
|
+
:raises AttributeError: trying to set this after the task is submitted
|
|
1553
|
+
"""
|
|
1554
|
+
return self._targeted_reservation_name
|
|
1555
|
+
|
|
1556
|
+
@targeted_reservation_name.setter
|
|
1557
|
+
def targeted_reservation_name(self, value: str):
|
|
1558
|
+
"""Setted for targeted_reservation_name
|
|
1559
|
+
"""
|
|
1560
|
+
if self.uuid is not None:
|
|
1561
|
+
raise AttributeError("can't set attribute on a launched task")
|
|
1562
|
+
|
|
1563
|
+
self._targeted_reservation_name = value
|
|
1564
|
+
|
|
1513
1565
|
def __repr__(self):
|
|
1514
1566
|
return '{0} - {1} - {2} - {3} - {5} - InstanceCount : {4} - Resources : {6} '\
|
|
1515
1567
|
'Tag {7} - IsElastic {8} - ElasticMin {9} - ElasticMax {10} - ElasticMinIdle {11} -'\
|
qarnot/task.py
CHANGED
|
@@ -132,6 +132,7 @@ class Task(object):
|
|
|
132
132
|
self._secrets_access_rights: SecretsAccessRights = SecretsAccessRights()
|
|
133
133
|
self._scheduling_type = scheduling_type
|
|
134
134
|
self._targeted_reserved_machine_key: str = None
|
|
135
|
+
self._targeted_reservation_name: str = None
|
|
135
136
|
self._dependentOn: List[Uuid] = []
|
|
136
137
|
|
|
137
138
|
self._auto_update = True
|
|
@@ -521,6 +522,7 @@ class Task(object):
|
|
|
521
522
|
self._hardware_constraints = [HardwareConstraint.from_json(hw_constraint_dict) for hw_constraint_dict in json_task.get("hardwareConstraints", [])]
|
|
522
523
|
self._default_resources_cache_ttl_sec = json_task.get("defaultResourcesCacheTTLSec", None)
|
|
523
524
|
self._targeted_reserved_machine_key = json_task.get("targetedReservedMachineKey", None)
|
|
525
|
+
self._targeted_reservation_name = json_task.get("targetedReservationName", None)
|
|
524
526
|
if 'privileges' in json_task:
|
|
525
527
|
self._privileges = Privileges.from_json(json_task.get("privileges"))
|
|
526
528
|
if 'retrySettings' in json_task:
|
|
@@ -1641,6 +1643,9 @@ class Task(object):
|
|
|
1641
1643
|
|
|
1642
1644
|
:getter: The reserved machine key when using the "reserved" scheduling type
|
|
1643
1645
|
|
|
1646
|
+
.. deprecated:: v2.19.0
|
|
1647
|
+
Use `self.targeted_reservation_name` instead.
|
|
1648
|
+
|
|
1644
1649
|
:raises AttributeError: trying to set this after the task is submitted
|
|
1645
1650
|
"""
|
|
1646
1651
|
return self._targeted_reserved_machine_key
|
|
@@ -1654,6 +1659,25 @@ class Task(object):
|
|
|
1654
1659
|
|
|
1655
1660
|
self._targeted_reserved_machine_key = value
|
|
1656
1661
|
|
|
1662
|
+
@property
|
|
1663
|
+
def targeted_reservation_name(self) -> str:
|
|
1664
|
+
""":type: :class:`str`
|
|
1665
|
+
|
|
1666
|
+
:getter: The name of the reservation that describes the targeted machines when using the "reserved" scheduling type
|
|
1667
|
+
|
|
1668
|
+
:raises AttributeError: trying to set this after the task is submitted
|
|
1669
|
+
"""
|
|
1670
|
+
return self._targeted_reservation_name
|
|
1671
|
+
|
|
1672
|
+
@targeted_reservation_name.setter
|
|
1673
|
+
def targeted_reservation_name(self, value: str):
|
|
1674
|
+
"""Setted for targeted_reservation_name
|
|
1675
|
+
"""
|
|
1676
|
+
if self.uuid is not None:
|
|
1677
|
+
raise AttributeError("can't set attribute on a launched task")
|
|
1678
|
+
|
|
1679
|
+
self._targeted_reservation_name = value
|
|
1680
|
+
|
|
1657
1681
|
@property
|
|
1658
1682
|
def auto_delete(self):
|
|
1659
1683
|
"""Autodelete this Task if it is finished and your max number of task is reach
|
|
@@ -1892,6 +1916,9 @@ class Task(object):
|
|
|
1892
1916
|
if self._targeted_reserved_machine_key is not None:
|
|
1893
1917
|
json_task["targetedReservedMachineKey"] = self._targeted_reserved_machine_key
|
|
1894
1918
|
|
|
1919
|
+
if self._targeted_reservation_name is not None:
|
|
1920
|
+
json_task["targetedReservationName"] = self._targeted_reservation_name
|
|
1921
|
+
|
|
1895
1922
|
if self._forced_network_rules is not None:
|
|
1896
1923
|
json_task['forcedNetworkRules'] = [x.to_json() for x in self._forced_network_rules]
|
|
1897
1924
|
|
|
@@ -2,30 +2,31 @@ qarnot/__init__.py,sha256=BCIFvWIe1EbzdZAMeKnyK9HYIqNHlSsbaaDMIL7VghA,5626
|
|
|
2
2
|
qarnot/_filter.py,sha256=J--0lOY2rverPEE3zrvuipYkOd9T_4HrW4eVNJqheac,10109
|
|
3
3
|
qarnot/_retry.py,sha256=4QdtI5Y_Jshja8zDxhx_g17dzABCIUGXQsjcPl65u7g,890
|
|
4
4
|
qarnot/_util.py,sha256=fmAq55CmfDTTB7yaOLspayC3Mvre7SCzp0YwWsnwpDA,5673
|
|
5
|
-
qarnot/_version.py,sha256=
|
|
5
|
+
qarnot/_version.py,sha256=cs1IDGNzxS3VmGc68RuKml3o2BY_Hw0Eo2b6p2eCVwI,499
|
|
6
6
|
qarnot/advanced_bucket.py,sha256=dfhHOz0foJfEQoaCdGiS_-28w4Y6rq36ZloPgoEQiLE,7927
|
|
7
7
|
qarnot/bucket.py,sha256=aNuJqfYUm2YCQ0m8SBl384xspYkc9SJy6_G-FEKs8nk,24449
|
|
8
8
|
qarnot/carbon_facts.py,sha256=E_tBMsa2byEMgKAEilIFRsCE6_T978Zl7-ZXk4--PPI,10292
|
|
9
|
-
qarnot/computing_quotas.py,sha256=
|
|
9
|
+
qarnot/computing_quotas.py,sha256=gXKAZ1QqnXGzR17yTYNmjDF1TBEXALtCHzEe51wk4to,15882
|
|
10
10
|
qarnot/connection.py,sha256=x71AuXeO33iyxbdoWEQecjsyI_8VSvX7PXztzsNpzLE,46022
|
|
11
11
|
qarnot/error.py,sha256=WCkkILJzOi06Q5QRBfacU41D0MQeFCPsQc9Ub1Y6SXw,734
|
|
12
12
|
qarnot/exceptions.py,sha256=yt_iwCw_9pFdoKeOTxsr05kqW5Gu-th3gSfos5zI26g,2729
|
|
13
13
|
qarnot/forced_constant.py,sha256=-i4b_JO10YiWuJ7Q0bmWE_TEwtf8qSeLlkMTAbH55EM,1309
|
|
14
|
-
qarnot/forced_network_rule.py,sha256=
|
|
14
|
+
qarnot/forced_network_rule.py,sha256=gAalmj5p3MDXEG_jRfszhUTpOSKDMH_BFiXDuSnnyOc,5306
|
|
15
15
|
qarnot/hardware_constraint.py,sha256=YZi4FgaJQ84mxVDT4u2WxqJ-i_bikwssidTRHRc3JHA,13694
|
|
16
16
|
qarnot/helper.py,sha256=HWy0ollEMoGvCXbAY_FfgkhJjpHRRmkNtavvrJba2PY,1564
|
|
17
17
|
qarnot/job.py,sha256=bag9NbugWCSf18J2c6nFKmWFFusXP58dfYYxd8CMsy8,19508
|
|
18
|
+
qarnot/multi_slots_settings.py,sha256=RsSC-3YGu0wBsQlOgvJ8oMKFvApN6XEGdC5ozgQyXXs,1542
|
|
18
19
|
qarnot/paginate.py,sha256=DaUYDPAS0M8hf0hph8GuMSzTASymSUOpp-WqbfevX-s,1387
|
|
19
|
-
qarnot/pool.py,sha256=
|
|
20
|
+
qarnot/pool.py,sha256=IaRYjCamrLHm9BWpjDmbxRhNIjb8f7m88wDIi6gGRa8,59165
|
|
20
21
|
qarnot/privileges.py,sha256=6j3n8q_RNdZ8bBPD9misHEpS0CbcQByqzxlOu8CS-rU,1896
|
|
21
22
|
qarnot/retry_settings.py,sha256=Illobh-1U8hPdzkffJu5TFKM_NdzCNYS2j1teBljX94,2512
|
|
22
23
|
qarnot/scheduling_type.py,sha256=j90APc1ji7xe2Z9OH9l81tjO12k0Wf9bSaG-_UCyeNI,2223
|
|
23
24
|
qarnot/secrets.py,sha256=v6-1UNhCnnW71eJYMeqhcUYLHnsnONGi4Qa3aoiG9qc,12354
|
|
24
25
|
qarnot/status.py,sha256=dCVsh9_ewIASZcreATbUd2qJ-cUMk0cRkyVLdrOot3Q,12348
|
|
25
26
|
qarnot/storage.py,sha256=jAist_J_6yzmRrkF5jqYNG3mhEP_y7KqCdNv4dJcHuM,6929
|
|
26
|
-
qarnot/task.py,sha256=
|
|
27
|
-
qarnot-2.
|
|
28
|
-
qarnot-2.
|
|
29
|
-
qarnot-2.
|
|
30
|
-
qarnot-2.
|
|
31
|
-
qarnot-2.
|
|
27
|
+
qarnot/task.py,sha256=uUfnF2BDq6X8jcGaVRDgK2emFWydwbH_b2QdwXnhtzc,77172
|
|
28
|
+
qarnot-2.19.0.dist-info/licenses/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
|
|
29
|
+
qarnot-2.19.0.dist-info/METADATA,sha256=rR-mDeDXMVjIRA3PuZbTs2bLt9TAAxPO_EDv9mSRAb0,2543
|
|
30
|
+
qarnot-2.19.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
31
|
+
qarnot-2.19.0.dist-info/top_level.txt,sha256=acRyoLZNyf_kuGTwHQgfZv2MfdTcZstyNjBhOxFtHzU,7
|
|
32
|
+
qarnot-2.19.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|