anyscale 0.26.61__py3-none-any.whl → 0.26.62__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.
Files changed (31) hide show
  1. anyscale/_private/docgen/models.md +2 -0
  2. anyscale/client/README.md +16 -3
  3. anyscale/client/openapi_client/__init__.py +9 -3
  4. anyscale/client/openapi_client/api/default_api.py +3215 -2399
  5. anyscale/client/openapi_client/models/__init__.py +9 -3
  6. anyscale/client/openapi_client/models/api_key_info.py +280 -0
  7. anyscale/client/openapi_client/models/api_key_parameters.py +29 -3
  8. anyscale/client/openapi_client/models/{aggregatedinstanceusagecsv_list_response.py → apikeyinfo_list_response.py} +15 -15
  9. anyscale/client/openapi_client/models/compute_node_type.py +29 -1
  10. anyscale/client/openapi_client/models/gpu_usage.py +236 -0
  11. anyscale/client/openapi_client/models/node_metrics.py +404 -0
  12. anyscale/client/openapi_client/models/node_metrics_response.py +123 -0
  13. anyscale/client/openapi_client/models/{cloud_hosting_type.py → nodemetricsresponse_response.py} +34 -13
  14. anyscale/client/openapi_client/models/revoke_api_keys_request.py +123 -0
  15. anyscale/client/openapi_client/models/revoke_api_keys_response.py +202 -0
  16. anyscale/client/openapi_client/models/revokeapikeysresponse_response.py +121 -0
  17. anyscale/client/openapi_client/models/worker_node_type.py +29 -1
  18. anyscale/compute_config/_private/compute_config_sdk.py +4 -0
  19. anyscale/compute_config/models.py +24 -0
  20. anyscale/sdk/anyscale_client/models/compute_node_type.py +29 -1
  21. anyscale/sdk/anyscale_client/models/worker_node_type.py +29 -1
  22. anyscale/version.py +1 -1
  23. anyscale/workspace/commands.py +23 -114
  24. {anyscale-0.26.61.dist-info → anyscale-0.26.62.dist-info}/METADATA +1 -1
  25. {anyscale-0.26.61.dist-info → anyscale-0.26.62.dist-info}/RECORD +30 -24
  26. anyscale/client/openapi_client/models/aggregated_instance_usage_csv.py +0 -889
  27. {anyscale-0.26.61.dist-info → anyscale-0.26.62.dist-info}/WHEEL +0 -0
  28. {anyscale-0.26.61.dist-info → anyscale-0.26.62.dist-info}/entry_points.txt +0 -0
  29. {anyscale-0.26.61.dist-info → anyscale-0.26.62.dist-info}/licenses/LICENSE +0 -0
  30. {anyscale-0.26.61.dist-info → anyscale-0.26.62.dist-info}/licenses/NOTICE +0 -0
  31. {anyscale-0.26.61.dist-info → anyscale-0.26.62.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,236 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Managed Ray API
5
+
6
+ No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) # noqa: E501
7
+
8
+ The version of the OpenAPI document: 0.1.0
9
+ Generated by: https://openapi-generator.tech
10
+ """
11
+
12
+
13
+ import pprint
14
+ import re # noqa: F401
15
+
16
+ import six
17
+
18
+ from openapi_client.configuration import Configuration
19
+
20
+
21
+ class GPUUsage(object):
22
+ """NOTE: This class is auto generated by OpenAPI Generator.
23
+ Ref: https://openapi-generator.tech
24
+
25
+ Do not edit the class manually.
26
+ """
27
+
28
+ """
29
+ Attributes:
30
+ openapi_types (dict): The key is attribute name
31
+ and the value is attribute type.
32
+ attribute_map (dict): The key is attribute name
33
+ and the value is json key in definition.
34
+ """
35
+ openapi_types = {
36
+ 'gpu_index': 'int',
37
+ 'gpu_device_name': 'str',
38
+ 'gpu_usage': 'float',
39
+ 'gram_usage': 'int',
40
+ 'gram_free': 'int'
41
+ }
42
+
43
+ attribute_map = {
44
+ 'gpu_index': 'gpu_index',
45
+ 'gpu_device_name': 'gpu_device_name',
46
+ 'gpu_usage': 'gpu_usage',
47
+ 'gram_usage': 'gram_usage',
48
+ 'gram_free': 'gram_free'
49
+ }
50
+
51
+ def __init__(self, gpu_index=None, gpu_device_name=None, gpu_usage=None, gram_usage=None, gram_free=None, local_vars_configuration=None): # noqa: E501
52
+ """GPUUsage - a model defined in OpenAPI""" # noqa: E501
53
+ if local_vars_configuration is None:
54
+ local_vars_configuration = Configuration()
55
+ self.local_vars_configuration = local_vars_configuration
56
+
57
+ self._gpu_index = None
58
+ self._gpu_device_name = None
59
+ self._gpu_usage = None
60
+ self._gram_usage = None
61
+ self._gram_free = None
62
+ self.discriminator = None
63
+
64
+ self.gpu_index = gpu_index
65
+ self.gpu_device_name = gpu_device_name
66
+ if gpu_usage is not None:
67
+ self.gpu_usage = gpu_usage
68
+ if gram_usage is not None:
69
+ self.gram_usage = gram_usage
70
+ if gram_free is not None:
71
+ self.gram_free = gram_free
72
+
73
+ @property
74
+ def gpu_index(self):
75
+ """Gets the gpu_index of this GPUUsage. # noqa: E501
76
+
77
+ The index of the GPU. # noqa: E501
78
+
79
+ :return: The gpu_index of this GPUUsage. # noqa: E501
80
+ :rtype: int
81
+ """
82
+ return self._gpu_index
83
+
84
+ @gpu_index.setter
85
+ def gpu_index(self, gpu_index):
86
+ """Sets the gpu_index of this GPUUsage.
87
+
88
+ The index of the GPU. # noqa: E501
89
+
90
+ :param gpu_index: The gpu_index of this GPUUsage. # noqa: E501
91
+ :type: int
92
+ """
93
+ if self.local_vars_configuration.client_side_validation and gpu_index is None: # noqa: E501
94
+ raise ValueError("Invalid value for `gpu_index`, must not be `None`") # noqa: E501
95
+
96
+ self._gpu_index = gpu_index
97
+
98
+ @property
99
+ def gpu_device_name(self):
100
+ """Gets the gpu_device_name of this GPUUsage. # noqa: E501
101
+
102
+ The device name of the GPU. # noqa: E501
103
+
104
+ :return: The gpu_device_name of this GPUUsage. # noqa: E501
105
+ :rtype: str
106
+ """
107
+ return self._gpu_device_name
108
+
109
+ @gpu_device_name.setter
110
+ def gpu_device_name(self, gpu_device_name):
111
+ """Sets the gpu_device_name of this GPUUsage.
112
+
113
+ The device name of the GPU. # noqa: E501
114
+
115
+ :param gpu_device_name: The gpu_device_name of this GPUUsage. # noqa: E501
116
+ :type: str
117
+ """
118
+ if self.local_vars_configuration.client_side_validation and gpu_device_name is None: # noqa: E501
119
+ raise ValueError("Invalid value for `gpu_device_name`, must not be `None`") # noqa: E501
120
+
121
+ self._gpu_device_name = gpu_device_name
122
+
123
+ @property
124
+ def gpu_usage(self):
125
+ """Gets the gpu_usage of this GPUUsage. # noqa: E501
126
+
127
+ The GPU usage in percentage of this GPU. # noqa: E501
128
+
129
+ :return: The gpu_usage of this GPUUsage. # noqa: E501
130
+ :rtype: float
131
+ """
132
+ return self._gpu_usage
133
+
134
+ @gpu_usage.setter
135
+ def gpu_usage(self, gpu_usage):
136
+ """Sets the gpu_usage of this GPUUsage.
137
+
138
+ The GPU usage in percentage of this GPU. # noqa: E501
139
+
140
+ :param gpu_usage: The gpu_usage of this GPUUsage. # noqa: E501
141
+ :type: float
142
+ """
143
+
144
+ self._gpu_usage = gpu_usage
145
+
146
+ @property
147
+ def gram_usage(self):
148
+ """Gets the gram_usage of this GPUUsage. # noqa: E501
149
+
150
+ The GRAM usage in bytes of this GPU. # noqa: E501
151
+
152
+ :return: The gram_usage of this GPUUsage. # noqa: E501
153
+ :rtype: int
154
+ """
155
+ return self._gram_usage
156
+
157
+ @gram_usage.setter
158
+ def gram_usage(self, gram_usage):
159
+ """Sets the gram_usage of this GPUUsage.
160
+
161
+ The GRAM usage in bytes of this GPU. # noqa: E501
162
+
163
+ :param gram_usage: The gram_usage of this GPUUsage. # noqa: E501
164
+ :type: int
165
+ """
166
+
167
+ self._gram_usage = gram_usage
168
+
169
+ @property
170
+ def gram_free(self):
171
+ """Gets the gram_free of this GPUUsage. # noqa: E501
172
+
173
+ The GRAM free in bytes of this GPU. # noqa: E501
174
+
175
+ :return: The gram_free of this GPUUsage. # noqa: E501
176
+ :rtype: int
177
+ """
178
+ return self._gram_free
179
+
180
+ @gram_free.setter
181
+ def gram_free(self, gram_free):
182
+ """Sets the gram_free of this GPUUsage.
183
+
184
+ The GRAM free in bytes of this GPU. # noqa: E501
185
+
186
+ :param gram_free: The gram_free of this GPUUsage. # noqa: E501
187
+ :type: int
188
+ """
189
+
190
+ self._gram_free = gram_free
191
+
192
+ def to_dict(self):
193
+ """Returns the model properties as a dict"""
194
+ result = {}
195
+
196
+ for attr, _ in six.iteritems(self.openapi_types):
197
+ value = getattr(self, attr)
198
+ if isinstance(value, list):
199
+ result[attr] = list(map(
200
+ lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
201
+ value
202
+ ))
203
+ elif hasattr(value, "to_dict"):
204
+ result[attr] = value.to_dict()
205
+ elif isinstance(value, dict):
206
+ result[attr] = dict(map(
207
+ lambda item: (item[0], item[1].to_dict())
208
+ if hasattr(item[1], "to_dict") else item,
209
+ value.items()
210
+ ))
211
+ else:
212
+ result[attr] = value
213
+
214
+ return result
215
+
216
+ def to_str(self):
217
+ """Returns the string representation of the model"""
218
+ return pprint.pformat(self.to_dict())
219
+
220
+ def __repr__(self):
221
+ """For `print` and `pprint`"""
222
+ return self.to_str()
223
+
224
+ def __eq__(self, other):
225
+ """Returns true if both objects are equal"""
226
+ if not isinstance(other, GPUUsage):
227
+ return False
228
+
229
+ return self.to_dict() == other.to_dict()
230
+
231
+ def __ne__(self, other):
232
+ """Returns true if both objects are not equal"""
233
+ if not isinstance(other, GPUUsage):
234
+ return True
235
+
236
+ return self.to_dict() != other.to_dict()
@@ -0,0 +1,404 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Managed Ray API
5
+
6
+ No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) # noqa: E501
7
+
8
+ The version of the OpenAPI document: 0.1.0
9
+ Generated by: https://openapi-generator.tech
10
+ """
11
+
12
+
13
+ import pprint
14
+ import re # noqa: F401
15
+
16
+ import six
17
+
18
+ from openapi_client.configuration import Configuration
19
+
20
+
21
+ class NodeMetrics(object):
22
+ """NOTE: This class is auto generated by OpenAPI Generator.
23
+ Ref: https://openapi-generator.tech
24
+
25
+ Do not edit the class manually.
26
+ """
27
+
28
+ """
29
+ Attributes:
30
+ openapi_types (dict): The key is attribute name
31
+ and the value is attribute type.
32
+ attribute_map (dict): The key is attribute name
33
+ and the value is json key in definition.
34
+ """
35
+ openapi_types = {
36
+ 'node_id': 'str',
37
+ 'cpu_usage': 'float',
38
+ 'memory_used': 'int',
39
+ 'memory_total': 'int',
40
+ 'gpus': 'list[GPUUsage]',
41
+ 'object_store_usage': 'int',
42
+ 'object_store_free': 'int',
43
+ 'disk_usage': 'int',
44
+ 'disk_free': 'int',
45
+ 'network_sent': 'int',
46
+ 'network_received': 'int'
47
+ }
48
+
49
+ attribute_map = {
50
+ 'node_id': 'node_id',
51
+ 'cpu_usage': 'cpu_usage',
52
+ 'memory_used': 'memory_used',
53
+ 'memory_total': 'memory_total',
54
+ 'gpus': 'gpus',
55
+ 'object_store_usage': 'object_store_usage',
56
+ 'object_store_free': 'object_store_free',
57
+ 'disk_usage': 'disk_usage',
58
+ 'disk_free': 'disk_free',
59
+ 'network_sent': 'network_sent',
60
+ 'network_received': 'network_received'
61
+ }
62
+
63
+ def __init__(self, node_id=None, cpu_usage=None, memory_used=None, memory_total=None, gpus=None, object_store_usage=None, object_store_free=None, disk_usage=None, disk_free=None, network_sent=None, network_received=None, local_vars_configuration=None): # noqa: E501
64
+ """NodeMetrics - a model defined in OpenAPI""" # noqa: E501
65
+ if local_vars_configuration is None:
66
+ local_vars_configuration = Configuration()
67
+ self.local_vars_configuration = local_vars_configuration
68
+
69
+ self._node_id = None
70
+ self._cpu_usage = None
71
+ self._memory_used = None
72
+ self._memory_total = None
73
+ self._gpus = None
74
+ self._object_store_usage = None
75
+ self._object_store_free = None
76
+ self._disk_usage = None
77
+ self._disk_free = None
78
+ self._network_sent = None
79
+ self._network_received = None
80
+ self.discriminator = None
81
+
82
+ self.node_id = node_id
83
+ if cpu_usage is not None:
84
+ self.cpu_usage = cpu_usage
85
+ if memory_used is not None:
86
+ self.memory_used = memory_used
87
+ if memory_total is not None:
88
+ self.memory_total = memory_total
89
+ self.gpus = gpus
90
+ if object_store_usage is not None:
91
+ self.object_store_usage = object_store_usage
92
+ if object_store_free is not None:
93
+ self.object_store_free = object_store_free
94
+ if disk_usage is not None:
95
+ self.disk_usage = disk_usage
96
+ if disk_free is not None:
97
+ self.disk_free = disk_free
98
+ if network_sent is not None:
99
+ self.network_sent = network_sent
100
+ if network_received is not None:
101
+ self.network_received = network_received
102
+
103
+ @property
104
+ def node_id(self):
105
+ """Gets the node_id of this NodeMetrics. # noqa: E501
106
+
107
+ The ID of the node. # noqa: E501
108
+
109
+ :return: The node_id of this NodeMetrics. # noqa: E501
110
+ :rtype: str
111
+ """
112
+ return self._node_id
113
+
114
+ @node_id.setter
115
+ def node_id(self, node_id):
116
+ """Sets the node_id of this NodeMetrics.
117
+
118
+ The ID of the node. # noqa: E501
119
+
120
+ :param node_id: The node_id of this NodeMetrics. # noqa: E501
121
+ :type: str
122
+ """
123
+ if self.local_vars_configuration.client_side_validation and node_id is None: # noqa: E501
124
+ raise ValueError("Invalid value for `node_id`, must not be `None`") # noqa: E501
125
+
126
+ self._node_id = node_id
127
+
128
+ @property
129
+ def cpu_usage(self):
130
+ """Gets the cpu_usage of this NodeMetrics. # noqa: E501
131
+
132
+ The CPU usage in percentage of the node. # noqa: E501
133
+
134
+ :return: The cpu_usage of this NodeMetrics. # noqa: E501
135
+ :rtype: float
136
+ """
137
+ return self._cpu_usage
138
+
139
+ @cpu_usage.setter
140
+ def cpu_usage(self, cpu_usage):
141
+ """Sets the cpu_usage of this NodeMetrics.
142
+
143
+ The CPU usage in percentage of the node. # noqa: E501
144
+
145
+ :param cpu_usage: The cpu_usage of this NodeMetrics. # noqa: E501
146
+ :type: float
147
+ """
148
+
149
+ self._cpu_usage = cpu_usage
150
+
151
+ @property
152
+ def memory_used(self):
153
+ """Gets the memory_used of this NodeMetrics. # noqa: E501
154
+
155
+ The memory used in bytes of the node. # noqa: E501
156
+
157
+ :return: The memory_used of this NodeMetrics. # noqa: E501
158
+ :rtype: int
159
+ """
160
+ return self._memory_used
161
+
162
+ @memory_used.setter
163
+ def memory_used(self, memory_used):
164
+ """Sets the memory_used of this NodeMetrics.
165
+
166
+ The memory used in bytes of the node. # noqa: E501
167
+
168
+ :param memory_used: The memory_used of this NodeMetrics. # noqa: E501
169
+ :type: int
170
+ """
171
+
172
+ self._memory_used = memory_used
173
+
174
+ @property
175
+ def memory_total(self):
176
+ """Gets the memory_total of this NodeMetrics. # noqa: E501
177
+
178
+ The memory total in bytes of the node. # noqa: E501
179
+
180
+ :return: The memory_total of this NodeMetrics. # noqa: E501
181
+ :rtype: int
182
+ """
183
+ return self._memory_total
184
+
185
+ @memory_total.setter
186
+ def memory_total(self, memory_total):
187
+ """Sets the memory_total of this NodeMetrics.
188
+
189
+ The memory total in bytes of the node. # noqa: E501
190
+
191
+ :param memory_total: The memory_total of this NodeMetrics. # noqa: E501
192
+ :type: int
193
+ """
194
+
195
+ self._memory_total = memory_total
196
+
197
+ @property
198
+ def gpus(self):
199
+ """Gets the gpus of this NodeMetrics. # noqa: E501
200
+
201
+ The GPUs used by the node. # noqa: E501
202
+
203
+ :return: The gpus of this NodeMetrics. # noqa: E501
204
+ :rtype: list[GPUUsage]
205
+ """
206
+ return self._gpus
207
+
208
+ @gpus.setter
209
+ def gpus(self, gpus):
210
+ """Sets the gpus of this NodeMetrics.
211
+
212
+ The GPUs used by the node. # noqa: E501
213
+
214
+ :param gpus: The gpus of this NodeMetrics. # noqa: E501
215
+ :type: list[GPUUsage]
216
+ """
217
+ if self.local_vars_configuration.client_side_validation and gpus is None: # noqa: E501
218
+ raise ValueError("Invalid value for `gpus`, must not be `None`") # noqa: E501
219
+
220
+ self._gpus = gpus
221
+
222
+ @property
223
+ def object_store_usage(self):
224
+ """Gets the object_store_usage of this NodeMetrics. # noqa: E501
225
+
226
+ The object store usage in bytes of the node. # noqa: E501
227
+
228
+ :return: The object_store_usage of this NodeMetrics. # noqa: E501
229
+ :rtype: int
230
+ """
231
+ return self._object_store_usage
232
+
233
+ @object_store_usage.setter
234
+ def object_store_usage(self, object_store_usage):
235
+ """Sets the object_store_usage of this NodeMetrics.
236
+
237
+ The object store usage in bytes of the node. # noqa: E501
238
+
239
+ :param object_store_usage: The object_store_usage of this NodeMetrics. # noqa: E501
240
+ :type: int
241
+ """
242
+
243
+ self._object_store_usage = object_store_usage
244
+
245
+ @property
246
+ def object_store_free(self):
247
+ """Gets the object_store_free of this NodeMetrics. # noqa: E501
248
+
249
+ The object store free in bytes of the node. # noqa: E501
250
+
251
+ :return: The object_store_free of this NodeMetrics. # noqa: E501
252
+ :rtype: int
253
+ """
254
+ return self._object_store_free
255
+
256
+ @object_store_free.setter
257
+ def object_store_free(self, object_store_free):
258
+ """Sets the object_store_free of this NodeMetrics.
259
+
260
+ The object store free in bytes of the node. # noqa: E501
261
+
262
+ :param object_store_free: The object_store_free of this NodeMetrics. # noqa: E501
263
+ :type: int
264
+ """
265
+
266
+ self._object_store_free = object_store_free
267
+
268
+ @property
269
+ def disk_usage(self):
270
+ """Gets the disk_usage of this NodeMetrics. # noqa: E501
271
+
272
+ The disk usage in bytes of the node. # noqa: E501
273
+
274
+ :return: The disk_usage of this NodeMetrics. # noqa: E501
275
+ :rtype: int
276
+ """
277
+ return self._disk_usage
278
+
279
+ @disk_usage.setter
280
+ def disk_usage(self, disk_usage):
281
+ """Sets the disk_usage of this NodeMetrics.
282
+
283
+ The disk usage in bytes of the node. # noqa: E501
284
+
285
+ :param disk_usage: The disk_usage of this NodeMetrics. # noqa: E501
286
+ :type: int
287
+ """
288
+
289
+ self._disk_usage = disk_usage
290
+
291
+ @property
292
+ def disk_free(self):
293
+ """Gets the disk_free of this NodeMetrics. # noqa: E501
294
+
295
+ The disk free in bytes of the node. # noqa: E501
296
+
297
+ :return: The disk_free of this NodeMetrics. # noqa: E501
298
+ :rtype: int
299
+ """
300
+ return self._disk_free
301
+
302
+ @disk_free.setter
303
+ def disk_free(self, disk_free):
304
+ """Sets the disk_free of this NodeMetrics.
305
+
306
+ The disk free in bytes of the node. # noqa: E501
307
+
308
+ :param disk_free: The disk_free of this NodeMetrics. # noqa: E501
309
+ :type: int
310
+ """
311
+
312
+ self._disk_free = disk_free
313
+
314
+ @property
315
+ def network_sent(self):
316
+ """Gets the network_sent of this NodeMetrics. # noqa: E501
317
+
318
+ The network sent in bytes of the node. # noqa: E501
319
+
320
+ :return: The network_sent of this NodeMetrics. # noqa: E501
321
+ :rtype: int
322
+ """
323
+ return self._network_sent
324
+
325
+ @network_sent.setter
326
+ def network_sent(self, network_sent):
327
+ """Sets the network_sent of this NodeMetrics.
328
+
329
+ The network sent in bytes of the node. # noqa: E501
330
+
331
+ :param network_sent: The network_sent of this NodeMetrics. # noqa: E501
332
+ :type: int
333
+ """
334
+
335
+ self._network_sent = network_sent
336
+
337
+ @property
338
+ def network_received(self):
339
+ """Gets the network_received of this NodeMetrics. # noqa: E501
340
+
341
+ The network received in bytes of the node. # noqa: E501
342
+
343
+ :return: The network_received of this NodeMetrics. # noqa: E501
344
+ :rtype: int
345
+ """
346
+ return self._network_received
347
+
348
+ @network_received.setter
349
+ def network_received(self, network_received):
350
+ """Sets the network_received of this NodeMetrics.
351
+
352
+ The network received in bytes of the node. # noqa: E501
353
+
354
+ :param network_received: The network_received of this NodeMetrics. # noqa: E501
355
+ :type: int
356
+ """
357
+
358
+ self._network_received = network_received
359
+
360
+ def to_dict(self):
361
+ """Returns the model properties as a dict"""
362
+ result = {}
363
+
364
+ for attr, _ in six.iteritems(self.openapi_types):
365
+ value = getattr(self, attr)
366
+ if isinstance(value, list):
367
+ result[attr] = list(map(
368
+ lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
369
+ value
370
+ ))
371
+ elif hasattr(value, "to_dict"):
372
+ result[attr] = value.to_dict()
373
+ elif isinstance(value, dict):
374
+ result[attr] = dict(map(
375
+ lambda item: (item[0], item[1].to_dict())
376
+ if hasattr(item[1], "to_dict") else item,
377
+ value.items()
378
+ ))
379
+ else:
380
+ result[attr] = value
381
+
382
+ return result
383
+
384
+ def to_str(self):
385
+ """Returns the string representation of the model"""
386
+ return pprint.pformat(self.to_dict())
387
+
388
+ def __repr__(self):
389
+ """For `print` and `pprint`"""
390
+ return self.to_str()
391
+
392
+ def __eq__(self, other):
393
+ """Returns true if both objects are equal"""
394
+ if not isinstance(other, NodeMetrics):
395
+ return False
396
+
397
+ return self.to_dict() == other.to_dict()
398
+
399
+ def __ne__(self, other):
400
+ """Returns true if both objects are not equal"""
401
+ if not isinstance(other, NodeMetrics):
402
+ return True
403
+
404
+ return self.to_dict() != other.to_dict()