wizata-dsapi 2.2.0.dev18__tar.gz → 2.2.0.dev19__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.
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/PKG-INFO +1 -1
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/__init__.py +1 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/edge_device.py +8 -1
- wizata_dsapi-2.2.0.dev19/wizata_dsapi/edge_package.py +128 -0
- wizata_dsapi-2.2.0.dev19/wizata_dsapi/version.py +1 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/wizata_dsapi_client.py +17 -1
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi.egg-info/PKG-INFO +1 -1
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi.egg-info/SOURCES.txt +1 -0
- wizata_dsapi-2.2.0.dev18/wizata_dsapi/version.py +0 -1
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/LICENSE.txt +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/README.rst +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/setup.cfg +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/setup.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/api_config.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/api_dto.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/api_interface.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/bucket.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/business_label.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/connection.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/connection_types.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/context.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/dashboard.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/dataframe_toolkit.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/datapoint.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/datastore.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/deployment.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/ds_dataframe.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/dsapi_json_encoder.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/edge_config.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/edge_module.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/evaluation.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/execution.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/execution_log.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/experiment.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/graylog_log.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/group_system.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/ilogger.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/insight.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/inventory.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/mlmodel.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/mobile_asset.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/model_toolkit.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/models/__init__.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/models/common.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/notification.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/paged_query_result.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/pipeline.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/pipeline_image.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/plot.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/plots/__init__.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/plots/common.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/plots/theme.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/product.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/request.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/script.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/scripts/__init__.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/scripts/common.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/search.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/solution_component.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/streamlit_utils.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/template.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/template_config.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/trigger.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/twin.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/twinregistration.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/user.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/wizard_function.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/wizard_request.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi/words.py +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi.egg-info/dependency_links.txt +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi.egg-info/requires.txt +0 -0
- {wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi.egg-info/top_level.txt +0 -0
|
@@ -61,6 +61,7 @@ from .notification import NotificationScope, DeviceToken, AlertRule, AlertActive
|
|
|
61
61
|
from .edge_device import EdgeDevice, EdgeDeviceStatus, EdgeDeviceType, EdgeDeviceProvisioning
|
|
62
62
|
from .edge_module import EdgeModule, EdgeModuleType, WIZATA_MODULES
|
|
63
63
|
from .edge_config import EdgeConsumer, EdgeWriter, EdgeTrigger, EdgeFile, EdgeConfig, EdgeCommand
|
|
64
|
+
from .edge_package import EdgePackage, EdgePackageOperation, EdgeRelease
|
|
64
65
|
from .connection import Connection, ConnectionMapping, ConnectionDirection, TransformKind, \
|
|
65
66
|
EdgeDeviceKey, EdgeDeviceKeyStatus
|
|
66
67
|
from .connection_types import ConnectionType, CONNECTION_TYPES, TRANSFORM_SCHEMAS, get_connection_type, \
|
|
@@ -59,6 +59,7 @@ class EdgeDevice(ApiDto):
|
|
|
59
59
|
:ivar bool managed: the platform keeps this device's manifest ("deploy modules").
|
|
60
60
|
:ivar dict applied_modules: what was last applied: module -> {image, env names}.
|
|
61
61
|
:ivar str reconcile_error: why the last apply failed, until one succeeds.
|
|
62
|
+
:ivar int last_seen_at: last heartbeat of a manual edge, epoch ms (DEV-6109).
|
|
62
63
|
"""
|
|
63
64
|
|
|
64
65
|
@classmethod
|
|
@@ -96,7 +97,8 @@ class EdgeDevice(ApiDto):
|
|
|
96
97
|
runner_python_version: str = None,
|
|
97
98
|
managed: bool = None,
|
|
98
99
|
applied_modules: dict = None,
|
|
99
|
-
reconcile_error: str = None
|
|
100
|
+
reconcile_error: str = None,
|
|
101
|
+
last_seen_at: int = None):
|
|
100
102
|
self.device_id = device_id
|
|
101
103
|
self.name = name
|
|
102
104
|
self.twin_name = twin_name
|
|
@@ -117,6 +119,7 @@ class EdgeDevice(ApiDto):
|
|
|
117
119
|
self.managed = managed
|
|
118
120
|
self.applied_modules = applied_modules
|
|
119
121
|
self.reconcile_error = reconcile_error
|
|
122
|
+
self.last_seen_at = last_seen_at
|
|
120
123
|
|
|
121
124
|
def api_id(self) -> str:
|
|
122
125
|
return self.device_id
|
|
@@ -173,6 +176,8 @@ class EdgeDevice(ApiDto):
|
|
|
173
176
|
self.applied_modules = obj["appliedModules"]
|
|
174
177
|
if "reconcileError" in obj and obj["reconcileError"] is not None:
|
|
175
178
|
self.reconcile_error = obj["reconcileError"]
|
|
179
|
+
if "lastSeenAt" in obj and obj["lastSeenAt"] is not None:
|
|
180
|
+
self.last_seen_at = int(obj["lastSeenAt"])
|
|
176
181
|
|
|
177
182
|
def to_json(self, target: str = None):
|
|
178
183
|
obj = {}
|
|
@@ -215,4 +220,6 @@ class EdgeDevice(ApiDto):
|
|
|
215
220
|
obj["appliedModules"] = self.applied_modules
|
|
216
221
|
if self.reconcile_error is not None:
|
|
217
222
|
obj["reconcileError"] = self.reconcile_error
|
|
223
|
+
if self.last_seen_at is not None:
|
|
224
|
+
obj["lastSeenAt"] = self.last_seen_at
|
|
218
225
|
return obj
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
|
|
3
|
+
from .api_dto import Dto
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class EdgePackageOperation(Enum):
|
|
7
|
+
"""
|
|
8
|
+
What a package for a manual edge does (DEV-6109). A manual edge serves a validated
|
|
9
|
+
(21 CFR Part 11) site: the platform never changes it, the site's operator runs each
|
|
10
|
+
package as a procedure.
|
|
11
|
+
|
|
12
|
+
- ``pipeline``: the pipelines it runs — triggers.json and the pipeline images;
|
|
13
|
+
- ``platform``: the platform version — docker-compose.yml, the module settings and
|
|
14
|
+
the profile files of a release;
|
|
15
|
+
- ``full``: everything, for the first install or any other change (connections,
|
|
16
|
+
writers, functions).
|
|
17
|
+
"""
|
|
18
|
+
PIPELINE = "pipeline"
|
|
19
|
+
PLATFORM = "platform"
|
|
20
|
+
FULL = "full"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class EdgeRelease(Dto):
|
|
24
|
+
"""
|
|
25
|
+
The edge images of a release, as Wizata.Jobs publishes them (DEV-6109).
|
|
26
|
+
|
|
27
|
+
``edge_images.json`` in Wizata.Jobs stays where they are pinned. The Jobs consumer
|
|
28
|
+
writes them here at its start, so the DS API can compose a manual edge's platform
|
|
29
|
+
package with the images the environment runs.
|
|
30
|
+
|
|
31
|
+
:ivar str id: digest of the images: the same images are the same release.
|
|
32
|
+
:ivar str version: what published them, e.g. ``wizata-packages 2.2.0``.
|
|
33
|
+
:ivar dict images: module -> image; ``pipeline_runner`` maps a Python version to one.
|
|
34
|
+
:ivar int published_at: when last published, epoch ms.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
def __init__(self, id=None, version=None, images=None, published_at=None):
|
|
38
|
+
self.id = id
|
|
39
|
+
self.version = version
|
|
40
|
+
self.images = images
|
|
41
|
+
self.published_at = published_at
|
|
42
|
+
|
|
43
|
+
@classmethod
|
|
44
|
+
def from_dict(cls, data: dict) -> "EdgeRelease":
|
|
45
|
+
return cls(id=data.get("id"), version=data.get("version"), images=data.get("images"),
|
|
46
|
+
published_at=data.get("publishedAt"))
|
|
47
|
+
|
|
48
|
+
def to_dict(self) -> dict:
|
|
49
|
+
return {"id": self.id, "version": self.version, "images": self.images,
|
|
50
|
+
"publishedAt": self.published_at}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class EdgePackage(Dto):
|
|
54
|
+
"""
|
|
55
|
+
A procedure composed for a manual edge, and its record (DEV-6109): what it contains,
|
|
56
|
+
who generated and downloaded it, and when the edge reported it applied.
|
|
57
|
+
|
|
58
|
+
The package itself holds secrets (the module settings) and is never stored: it is
|
|
59
|
+
rendered again at each download, and refused if its contents changed since it was
|
|
60
|
+
generated. The record holds names and digests only.
|
|
61
|
+
|
|
62
|
+
:ivar str id: package id (UUID). The edge reports it once installed.
|
|
63
|
+
:ivar str edge_device_id: the device it is for.
|
|
64
|
+
:ivar EdgePackageOperation operation: pipeline, platform or full.
|
|
65
|
+
:ivar int sequence: 1, 2, 3... per device.
|
|
66
|
+
:ivar str release_id: the ``EdgeRelease`` its module images come from (platform, full).
|
|
67
|
+
:ivar str contents_hash: digest of the contents, secrets excluded.
|
|
68
|
+
:ivar dict contents: ``files`` (path -> sha256), ``settings`` (module -> variable
|
|
69
|
+
names), ``modules`` (module -> image), ``images`` (pipeline image ids),
|
|
70
|
+
``warnings``.
|
|
71
|
+
:ivar dict diff: against what the edge runs (its applied packages): added, changed
|
|
72
|
+
and removed files, pipeline images, module images.
|
|
73
|
+
:ivar list procedure: the steps, each ``{"title", "command"}``.
|
|
74
|
+
:ivar str generated_by: who generated it.
|
|
75
|
+
:ivar int generated_at: epoch ms.
|
|
76
|
+
:ivar list downloads: each ``{"by", "at"}``.
|
|
77
|
+
:ivar int applied_at: when it was first reported installed, epoch ms.
|
|
78
|
+
:ivar str applied_by: ``edge`` (its heartbeat), or the admin who confirmed it for an
|
|
79
|
+
edge that cannot reach the platform.
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
def __init__(self, id=None, edge_device_id=None, operation=None, sequence=None,
|
|
83
|
+
release_id=None, contents_hash=None, contents=None, diff=None, procedure=None,
|
|
84
|
+
generated_by=None, generated_at=None, downloads=None, applied_at=None,
|
|
85
|
+
applied_by=None):
|
|
86
|
+
self.id = id
|
|
87
|
+
self.edge_device_id = edge_device_id
|
|
88
|
+
self.operation = operation
|
|
89
|
+
self.sequence = sequence
|
|
90
|
+
self.release_id = release_id
|
|
91
|
+
self.contents_hash = contents_hash
|
|
92
|
+
self.contents = contents
|
|
93
|
+
self.diff = diff
|
|
94
|
+
self.procedure = procedure
|
|
95
|
+
self.generated_by = generated_by
|
|
96
|
+
self.generated_at = generated_at
|
|
97
|
+
self.downloads = downloads
|
|
98
|
+
self.applied_at = applied_at
|
|
99
|
+
self.applied_by = applied_by
|
|
100
|
+
|
|
101
|
+
@classmethod
|
|
102
|
+
def from_dict(cls, data: dict) -> "EdgePackage":
|
|
103
|
+
operation = data.get("operation")
|
|
104
|
+
return cls(id=data.get("id"), edge_device_id=data.get("edgeDeviceId"),
|
|
105
|
+
operation=EdgePackageOperation(operation) if operation else None,
|
|
106
|
+
sequence=data.get("sequence"), release_id=data.get("releaseId"),
|
|
107
|
+
contents_hash=data.get("contentsHash"), contents=data.get("contents"),
|
|
108
|
+
diff=data.get("diff"), procedure=data.get("procedure"),
|
|
109
|
+
generated_by=data.get("generatedBy"), generated_at=data.get("generatedAt"),
|
|
110
|
+
downloads=data.get("downloads"), applied_at=data.get("appliedAt"),
|
|
111
|
+
applied_by=data.get("appliedBy"))
|
|
112
|
+
|
|
113
|
+
def to_dict(self) -> dict:
|
|
114
|
+
return {"id": self.id, "edgeDeviceId": self.edge_device_id,
|
|
115
|
+
"operation": self.operation.value if self.operation else None,
|
|
116
|
+
"sequence": self.sequence, "releaseId": self.release_id,
|
|
117
|
+
"contentsHash": self.contents_hash, "contents": self.contents,
|
|
118
|
+
"diff": self.diff, "procedure": self.procedure,
|
|
119
|
+
"generatedBy": self.generated_by, "generatedAt": self.generated_at,
|
|
120
|
+
"downloads": self.downloads or [], "appliedAt": self.applied_at,
|
|
121
|
+
"appliedBy": self.applied_by}
|
|
122
|
+
|
|
123
|
+
def marker(self) -> dict:
|
|
124
|
+
"""What the package installs as ``conf/_packages/<id>.json`` and the edge reports."""
|
|
125
|
+
return {"id": self.id, "edgeDeviceId": self.edge_device_id,
|
|
126
|
+
"operation": self.operation.value if self.operation else None,
|
|
127
|
+
"sequence": self.sequence, "releaseId": self.release_id,
|
|
128
|
+
"contentsHash": self.contents_hash}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "2.2.0.dev19"
|
|
@@ -3004,13 +3004,14 @@ class WizataDSAPIClient(ApiInterface, ApiDtoInterface):
|
|
|
3004
3004
|
return "edge/" + "/".join(quoted)
|
|
3005
3005
|
|
|
3006
3006
|
def _edge_request(self, method: str, route: str, body=None, headers=None,
|
|
3007
|
-
expected=(200,), stream=False):
|
|
3007
|
+
expected=(200,), stream=False, timeout=None):
|
|
3008
3008
|
response = requests.request(
|
|
3009
3009
|
method,
|
|
3010
3010
|
self.__url() + route,
|
|
3011
3011
|
headers={**self.__header(), **(headers or {})},
|
|
3012
3012
|
data=json.dumps(body) if body is not None else None,
|
|
3013
3013
|
stream=stream,
|
|
3014
|
+
timeout=timeout,
|
|
3014
3015
|
)
|
|
3015
3016
|
if response.status_code not in expected:
|
|
3016
3017
|
raise self.__raise_error(response)
|
|
@@ -3080,6 +3081,21 @@ class WizataDSAPIClient(ApiInterface, ApiDtoInterface):
|
|
|
3080
3081
|
os.remove(temporary)
|
|
3081
3082
|
return path
|
|
3082
3083
|
|
|
3084
|
+
def send_edge_heartbeat(self, edge_device_id: str, packages: list = None,
|
|
3085
|
+
timeout=(5, 15)) -> dict:
|
|
3086
|
+
"""
|
|
3087
|
+
A manual edge's heartbeat (DEV-6109): it is alive, and these packages (the ids in
|
|
3088
|
+
its ``conf/_packages``) are installed. The platform records when it was seen, and
|
|
3089
|
+
each package as installed the first time it is listed.
|
|
3090
|
+
|
|
3091
|
+
:param timeout: (connect, read) seconds — a site that blocks outbound traffic must
|
|
3092
|
+
not hold the caller.
|
|
3093
|
+
:return: ``{"lastSeenAt", "applied": [ids newly recorded], "unknown": [ids]}``.
|
|
3094
|
+
"""
|
|
3095
|
+
response = self._edge_request("POST", self._edge_route(edge_device_id, "heartbeat"),
|
|
3096
|
+
body={"packages": list(packages or [])}, timeout=timeout)
|
|
3097
|
+
return response.json()
|
|
3098
|
+
|
|
3083
3099
|
|
|
3084
3100
|
def api() -> WizataDSAPIClient:
|
|
3085
3101
|
"""
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "2.2.0.dev18"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{wizata_dsapi-2.2.0.dev18 → wizata_dsapi-2.2.0.dev19}/wizata_dsapi.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|