catalystwan 0.41.1.dev5__py3-none-any.whl → 0.41.2.dev0__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.
- catalystwan/api/device_action_api.py +7 -5
- catalystwan/api/feature_profile_api.py +184 -325
- catalystwan/apigw_auth.py +4 -4
- catalystwan/endpoints/api_gateway.py +1 -2
- catalystwan/models/configuration/feature_profile/sdwan/transport/t1e1controller.py +2 -2
- catalystwan/session.py +9 -5
- catalystwan/tests/templates/test_find_template_values.py +229 -0
- catalystwan/utils/feature_template/find_template_values.py +15 -3
- catalystwan/vmanage_auth.py +6 -4
- {catalystwan-0.41.1.dev5.dist-info → catalystwan-0.41.2.dev0.dist-info}/METADATA +1 -1
- {catalystwan-0.41.1.dev5.dist-info → catalystwan-0.41.2.dev0.dist-info}/RECORD +13 -13
- {catalystwan-0.41.1.dev5.dist-info → catalystwan-0.41.2.dev0.dist-info}/LICENSE +0 -0
- {catalystwan-0.41.1.dev5.dist-info → catalystwan-0.41.2.dev0.dist-info}/WHEEL +0 -0
catalystwan/apigw_auth.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Copyright 2024 Cisco Systems, Inc. and its affiliates
|
|
2
2
|
import logging
|
|
3
3
|
from threading import RLock
|
|
4
|
-
from typing import Literal, Optional
|
|
4
|
+
from typing import Literal, Optional, Union
|
|
5
5
|
from urllib.parse import urlparse
|
|
6
6
|
|
|
7
7
|
from pydantic import BaseModel, Field, PositiveInt
|
|
@@ -34,7 +34,7 @@ class ApiGwAuth(AuthBase, AuthProtocol):
|
|
|
34
34
|
2. Use the token in the Authorization header for subsequent requests.
|
|
35
35
|
"""
|
|
36
36
|
|
|
37
|
-
def __init__(self, login: ApiGwLogin, logger: Optional[logging.Logger] = None, verify: bool = False):
|
|
37
|
+
def __init__(self, login: ApiGwLogin, logger: Optional[logging.Logger] = None, verify: Union[bool, str] = False):
|
|
38
38
|
self.login = login
|
|
39
39
|
self.token = ""
|
|
40
40
|
self.org_registered: bool = False
|
|
@@ -86,7 +86,7 @@ class ApiGwAuth(AuthBase, AuthProtocol):
|
|
|
86
86
|
base_url: str,
|
|
87
87
|
apigw_login: ApiGwLogin,
|
|
88
88
|
logger: Optional[logging.Logger] = None,
|
|
89
|
-
verify: bool = False,
|
|
89
|
+
verify: Union[bool, str] = False,
|
|
90
90
|
timeout: int = 10,
|
|
91
91
|
) -> str:
|
|
92
92
|
try:
|
|
@@ -120,7 +120,7 @@ class ApiGwAuth(AuthBase, AuthProtocol):
|
|
|
120
120
|
base_url: str,
|
|
121
121
|
apigw_login: ApiGwLogin,
|
|
122
122
|
logger: Optional[logging.Logger] = None,
|
|
123
|
-
verify: bool = False,
|
|
123
|
+
verify: Union[bool, str] = False,
|
|
124
124
|
timeout: int = 10,
|
|
125
125
|
) -> None:
|
|
126
126
|
try:
|
|
@@ -117,8 +117,8 @@ class ControllerTxExList(BaseModel):
|
|
|
117
117
|
class T1E1ControllerParcel(_ParcelBase):
|
|
118
118
|
model_config = ConfigDict(populate_by_name=True, extra="forbid")
|
|
119
119
|
type_: Literal["t1-e1-controller"] = Field(default="t1-e1-controller", exclude=True)
|
|
120
|
+
type: Optional[Global[ControllerType]] = Field(default=None, validation_alias=AliasPath("data", "type"))
|
|
121
|
+
slot: Union[Global[str], Variable] = Field(validation_alias=AliasPath("data", "slot"))
|
|
120
122
|
controller_tx_ex_list: List[ControllerTxExList] = Field(
|
|
121
123
|
validation_alias=AliasPath("data", "controllerTxExList"), description="Controller tx-ex List"
|
|
122
124
|
)
|
|
123
|
-
slot: Union[Global[str], Variable] = Field(validation_alias=AliasPath("data", "slot"))
|
|
124
|
-
type: Optional[Global[ControllerType]] = Field(default=None, validation_alias=AliasPath("data", "type"))
|
catalystwan/session.py
CHANGED
|
@@ -211,6 +211,7 @@ class ManagerSession(ManagerResponseAdapter, APIEndpointClient):
|
|
|
211
211
|
subdomain: subdomain specifying to which view switch when creating provider as a tenant session,
|
|
212
212
|
works only on provider user mode
|
|
213
213
|
logger: override default module logger
|
|
214
|
+
verify: bool or str: bool to verify SSL certificate, or a path to a CA bundle
|
|
214
215
|
|
|
215
216
|
Attributes:
|
|
216
217
|
api: APIContainer: container for API methods
|
|
@@ -222,7 +223,7 @@ class ManagerSession(ManagerResponseAdapter, APIEndpointClient):
|
|
|
222
223
|
api_version: Version: API version
|
|
223
224
|
restart_timeout: int: restart timeout in seconds
|
|
224
225
|
session_type: SessionType: type of session
|
|
225
|
-
verify: bool: verify SSL certificate
|
|
226
|
+
verify: bool or str: bool to verify SSL certificate, or a path to a CA bundle
|
|
226
227
|
|
|
227
228
|
"""
|
|
228
229
|
|
|
@@ -233,17 +234,18 @@ class ManagerSession(ManagerResponseAdapter, APIEndpointClient):
|
|
|
233
234
|
subdomain: Optional[str] = None,
|
|
234
235
|
logger: Optional[logging.Logger] = None,
|
|
235
236
|
request_limiter: Optional[RequestLimiter] = None,
|
|
237
|
+
verify: Union[bool, str] = False,
|
|
236
238
|
) -> None:
|
|
237
239
|
self.base_url = base_url
|
|
238
240
|
self.subdomain = subdomain
|
|
239
241
|
self._session_type = SessionType.NOT_DEFINED
|
|
240
242
|
self.server_name: Optional[str] = None
|
|
241
243
|
self.logger = logger or logging.getLogger(__name__)
|
|
242
|
-
self.response_trace: Callable[
|
|
243
|
-
|
|
244
|
-
|
|
244
|
+
self.response_trace: Callable[[Optional[Response], Union[Request, PreparedRequest, None]], str] = (
|
|
245
|
+
response_history_debug
|
|
246
|
+
)
|
|
245
247
|
super(ManagerSession, self).__init__()
|
|
246
|
-
self.verify =
|
|
248
|
+
self.verify = verify
|
|
247
249
|
self.headers.update({"User-Agent": USER_AGENT})
|
|
248
250
|
self._added_to_auth = False
|
|
249
251
|
self._auth = auth
|
|
@@ -429,6 +431,8 @@ class ManagerSession(ManagerResponseAdapter, APIEndpointClient):
|
|
|
429
431
|
_kwargs = dict(kwargs)
|
|
430
432
|
if self.request_timeout is not None: # do not modify user provided kwargs unless property is set
|
|
431
433
|
_kwargs.update(timeout=self.request_timeout)
|
|
434
|
+
if "verify" not in kwargs:
|
|
435
|
+
_kwargs.update(verify=self.verify)
|
|
432
436
|
try:
|
|
433
437
|
with self._limiter:
|
|
434
438
|
response = super(ManagerSession, self).request(method, full_url, *args, **_kwargs)
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
# Copyright 2024 Cisco Systems, Inc. and its affiliates
|
|
2
|
+
import logging
|
|
3
|
+
|
|
2
4
|
from catalystwan.api.templates.device_variable import DeviceVariable
|
|
3
5
|
from catalystwan.utils.feature_template.find_template_values import find_template_values
|
|
4
6
|
|
|
@@ -191,3 +193,230 @@ def test_find_template_values():
|
|
|
191
193
|
result = find_template_values(input_values)
|
|
192
194
|
# Assert
|
|
193
195
|
assert expected_values == result
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def test_log_error_when_overwriting_existing_variable_value(caplog):
|
|
199
|
+
input_values = {
|
|
200
|
+
"if-name": {
|
|
201
|
+
"vipObjectType": "object",
|
|
202
|
+
"vipType": "variableName",
|
|
203
|
+
"vipValue": "",
|
|
204
|
+
"vipVariableName": "inet-if_name",
|
|
205
|
+
},
|
|
206
|
+
"description": {
|
|
207
|
+
"vipObjectType": "object",
|
|
208
|
+
"vipType": "variableName",
|
|
209
|
+
"vipValue": "",
|
|
210
|
+
"vipVariableName": "inet-if_desc",
|
|
211
|
+
},
|
|
212
|
+
"ip": {
|
|
213
|
+
"value": {
|
|
214
|
+
"vipObjectType": "object",
|
|
215
|
+
"vipType": "variableName",
|
|
216
|
+
"vipValue": "",
|
|
217
|
+
"vipVariableName": "first_test_value_variable",
|
|
218
|
+
},
|
|
219
|
+
"address": {
|
|
220
|
+
"vipObjectType": "object",
|
|
221
|
+
"vipType": "variableName",
|
|
222
|
+
"vipValue": "",
|
|
223
|
+
"vipVariableName": "inet-if_ipv4_address",
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
"tunnel-interface": {
|
|
227
|
+
"color": {
|
|
228
|
+
"value": {
|
|
229
|
+
"vipObjectType": "object",
|
|
230
|
+
"vipType": "variableName",
|
|
231
|
+
"vipValue": "",
|
|
232
|
+
"vipVariableName": "second_test_value_variable",
|
|
233
|
+
},
|
|
234
|
+
"restrict": {
|
|
235
|
+
"vipObjectType": "node-only",
|
|
236
|
+
"vipType": "ignore",
|
|
237
|
+
"vipValue": "false",
|
|
238
|
+
"vipVariableName": "vpn_if_tunnel_color_restrict",
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
expected_error_log = (
|
|
245
|
+
"Overwriting existing value for field: 'value' in templated_values. "
|
|
246
|
+
"Previous value: name='first_test_value_variable', new value: name='second_test_value_variable'."
|
|
247
|
+
)
|
|
248
|
+
# Act
|
|
249
|
+
result = find_template_values(input_values)
|
|
250
|
+
|
|
251
|
+
# Assert
|
|
252
|
+
error_logs = [log.getMessage() for log in caplog.records if log.levelno == logging.ERROR]
|
|
253
|
+
assert expected_error_log in error_logs
|
|
254
|
+
assert isinstance(result.get("value"), DeviceVariable)
|
|
255
|
+
assert result.get("value").name == "second_test_value_variable"
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
def test_log_error_when_overwriting_existing_top_level_global_value(caplog):
|
|
259
|
+
input_values = {
|
|
260
|
+
"if-name": {
|
|
261
|
+
"vipObjectType": "object",
|
|
262
|
+
"vipType": "variableName",
|
|
263
|
+
"vipValue": "",
|
|
264
|
+
"vipVariableName": "inet-if_name",
|
|
265
|
+
},
|
|
266
|
+
"description": {
|
|
267
|
+
"vipObjectType": "object",
|
|
268
|
+
"vipType": "variableName",
|
|
269
|
+
"vipValue": "",
|
|
270
|
+
"vipVariableName": "inet-if_desc",
|
|
271
|
+
},
|
|
272
|
+
"value": {
|
|
273
|
+
"vipObjectType": "object",
|
|
274
|
+
"vipType": "constant",
|
|
275
|
+
"vipValue": "test_value",
|
|
276
|
+
"vipVariableName": "first_test_value_variable",
|
|
277
|
+
},
|
|
278
|
+
"ip": {
|
|
279
|
+
"address": {
|
|
280
|
+
"vipObjectType": "object",
|
|
281
|
+
"vipType": "variableName",
|
|
282
|
+
"vipValue": "",
|
|
283
|
+
"vipVariableName": "inet-if_ipv4_address",
|
|
284
|
+
},
|
|
285
|
+
},
|
|
286
|
+
"tunnel-interface": {
|
|
287
|
+
"color": {
|
|
288
|
+
"value": {
|
|
289
|
+
"vipObjectType": "object",
|
|
290
|
+
"vipType": "variableName",
|
|
291
|
+
"vipValue": "",
|
|
292
|
+
"vipVariableName": "second_test_value_variable",
|
|
293
|
+
},
|
|
294
|
+
"restrict": {
|
|
295
|
+
"vipObjectType": "node-only",
|
|
296
|
+
"vipType": "ignore",
|
|
297
|
+
"vipValue": "false",
|
|
298
|
+
"vipVariableName": "vpn_if_tunnel_color_restrict",
|
|
299
|
+
},
|
|
300
|
+
},
|
|
301
|
+
},
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
expected_error_log = (
|
|
305
|
+
"Overwriting existing value for field: 'value' in templated_values. "
|
|
306
|
+
"Previous value: test_value, new value: name='second_test_value_variable'."
|
|
307
|
+
)
|
|
308
|
+
# Act
|
|
309
|
+
result = find_template_values(input_values)
|
|
310
|
+
|
|
311
|
+
# Assert
|
|
312
|
+
error_logs = [log.getMessage() for log in caplog.records if log.levelno == logging.ERROR]
|
|
313
|
+
|
|
314
|
+
assert expected_error_log in error_logs
|
|
315
|
+
assert isinstance(result.get("value"), DeviceVariable)
|
|
316
|
+
assert result.get("value").name == "second_test_value_variable"
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
def test_no_log_error_when_setting_value_first_time(caplog):
|
|
320
|
+
input_values = {
|
|
321
|
+
"if-name": {
|
|
322
|
+
"vipObjectType": "object",
|
|
323
|
+
"vipType": "variableName",
|
|
324
|
+
"vipValue": "",
|
|
325
|
+
"vipVariableName": "inet-if_name",
|
|
326
|
+
},
|
|
327
|
+
"description": {
|
|
328
|
+
"vipObjectType": "object",
|
|
329
|
+
"vipType": "variableName",
|
|
330
|
+
"vipValue": "",
|
|
331
|
+
"vipVariableName": "inet-if_desc",
|
|
332
|
+
},
|
|
333
|
+
"ip": {
|
|
334
|
+
"address": {
|
|
335
|
+
"vipObjectType": "object",
|
|
336
|
+
"vipType": "variableName",
|
|
337
|
+
"vipValue": "",
|
|
338
|
+
"vipVariableName": "inet-if_ipv4_address",
|
|
339
|
+
},
|
|
340
|
+
},
|
|
341
|
+
"tunnel-interface": {
|
|
342
|
+
"color": {
|
|
343
|
+
"value": {
|
|
344
|
+
"vipObjectType": "object",
|
|
345
|
+
"vipType": "variableName",
|
|
346
|
+
"vipValue": "",
|
|
347
|
+
"vipVariableName": "test_value_variable",
|
|
348
|
+
},
|
|
349
|
+
"restrict": {
|
|
350
|
+
"vipObjectType": "node-only",
|
|
351
|
+
"vipType": "ignore",
|
|
352
|
+
"vipValue": "false",
|
|
353
|
+
"vipVariableName": "vpn_if_tunnel_color_restrict",
|
|
354
|
+
},
|
|
355
|
+
},
|
|
356
|
+
},
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
# Act
|
|
360
|
+
result = find_template_values(input_values)
|
|
361
|
+
|
|
362
|
+
# Assert
|
|
363
|
+
error_logs = [log.getMessage() for log in caplog.records if log.levelno == logging.ERROR]
|
|
364
|
+
assert len(error_logs) == 0
|
|
365
|
+
assert isinstance(result.get("value"), DeviceVariable)
|
|
366
|
+
assert result.get("value").name == "test_value_variable"
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
def test_no_log_error_when_global_value_is_nested(caplog):
|
|
370
|
+
input_values = {
|
|
371
|
+
"if-name": {
|
|
372
|
+
"vipObjectType": "object",
|
|
373
|
+
"vipType": "variableName",
|
|
374
|
+
"vipValue": "",
|
|
375
|
+
"vipVariableName": "inet-if_name",
|
|
376
|
+
},
|
|
377
|
+
"description": {
|
|
378
|
+
"vipObjectType": "object",
|
|
379
|
+
"vipType": "variableName",
|
|
380
|
+
"vipValue": "",
|
|
381
|
+
"vipVariableName": "inet-if_desc",
|
|
382
|
+
},
|
|
383
|
+
"ip": {
|
|
384
|
+
"address": {
|
|
385
|
+
"vipObjectType": "object",
|
|
386
|
+
"vipType": "variableName",
|
|
387
|
+
"vipValue": "",
|
|
388
|
+
"vipVariableName": "inet-if_ipv4_address",
|
|
389
|
+
},
|
|
390
|
+
"value": {
|
|
391
|
+
"vipObjectType": "object",
|
|
392
|
+
"vipType": "constant",
|
|
393
|
+
"vipValue": "test_value",
|
|
394
|
+
"vipVariableName": "first_test_value_variable",
|
|
395
|
+
},
|
|
396
|
+
},
|
|
397
|
+
"tunnel-interface": {
|
|
398
|
+
"color": {
|
|
399
|
+
"value": {
|
|
400
|
+
"vipObjectType": "object",
|
|
401
|
+
"vipType": "variableName",
|
|
402
|
+
"vipValue": "",
|
|
403
|
+
"vipVariableName": "second_test_value_variable",
|
|
404
|
+
},
|
|
405
|
+
"restrict": {
|
|
406
|
+
"vipObjectType": "node-only",
|
|
407
|
+
"vipType": "ignore",
|
|
408
|
+
"vipValue": "false",
|
|
409
|
+
"vipVariableName": "vpn_if_tunnel_color_restrict",
|
|
410
|
+
},
|
|
411
|
+
},
|
|
412
|
+
},
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
# Act
|
|
416
|
+
result = find_template_values(input_values)
|
|
417
|
+
|
|
418
|
+
# Assert
|
|
419
|
+
error_logs = [log.getMessage() for log in caplog.records if log.levelno == logging.ERROR]
|
|
420
|
+
assert len(error_logs) == 0
|
|
421
|
+
assert isinstance(result.get("value"), DeviceVariable)
|
|
422
|
+
assert result.get("value").name == "second_test_value_variable"
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
# Copyright 2024 Cisco Systems, Inc. and its affiliates
|
|
2
|
-
|
|
2
|
+
import logging
|
|
3
3
|
from typing import Any, Dict, List, Optional, Union
|
|
4
4
|
|
|
5
5
|
from catalystwan.api.templates.device_variable import DeviceVariable
|
|
6
6
|
|
|
7
|
+
logger = logging.getLogger(__name__)
|
|
8
|
+
|
|
7
9
|
|
|
8
10
|
def find_template_values(
|
|
9
11
|
template_definition: dict,
|
|
@@ -53,7 +55,13 @@ def find_template_values(
|
|
|
53
55
|
# vipType is "variableName" so we need to return
|
|
54
56
|
# {"dns-addr": DeviceVariable(name="vpn_dns_primary")}
|
|
55
57
|
if var_name := template_definition.get("vipVariableName"):
|
|
56
|
-
|
|
58
|
+
new_value = DeviceVariable(name=var_name)
|
|
59
|
+
if previous_value := templated_values.get(field_key):
|
|
60
|
+
logger.error(
|
|
61
|
+
f"Overwriting existing value for field: '{field_key}' in templated_values. "
|
|
62
|
+
f"Previous value: {previous_value}, new value: {new_value}."
|
|
63
|
+
)
|
|
64
|
+
templated_values[field_key] = new_value
|
|
57
65
|
return templated_values
|
|
58
66
|
|
|
59
67
|
if template_value is None:
|
|
@@ -94,7 +102,11 @@ def get_nested_dict(d: dict, path: List[str], populate: bool = True):
|
|
|
94
102
|
return current_dict
|
|
95
103
|
|
|
96
104
|
|
|
97
|
-
def process_list_value(
|
|
105
|
+
def process_list_value(
|
|
106
|
+
item: Any,
|
|
107
|
+
target_key: str = "vipType",
|
|
108
|
+
target_key_for_template_value: str = "vipValue",
|
|
109
|
+
):
|
|
98
110
|
if isinstance(item, dict):
|
|
99
111
|
if target_key in item:
|
|
100
112
|
if item["vipObjectType"] == "list":
|
catalystwan/vmanage_auth.py
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import logging
|
|
4
4
|
from http.cookies import SimpleCookie
|
|
5
5
|
from threading import RLock
|
|
6
|
-
from typing import Optional
|
|
6
|
+
from typing import Optional, Union
|
|
7
7
|
from urllib.parse import urlparse
|
|
8
8
|
|
|
9
9
|
from packaging.version import Version # type: ignore
|
|
@@ -71,7 +71,9 @@ class vManageAuth(AuthBase, AuthProtocol):
|
|
|
71
71
|
2. Get a cross-site request forgery prevention token, which is required for most POST operations.
|
|
72
72
|
"""
|
|
73
73
|
|
|
74
|
-
def __init__(
|
|
74
|
+
def __init__(
|
|
75
|
+
self, username: str, password: str, logger: Optional[logging.Logger] = None, verify: Union[bool, str] = False
|
|
76
|
+
):
|
|
75
77
|
self.username = username
|
|
76
78
|
self.password = password
|
|
77
79
|
self.xsrftoken: Optional[str] = None
|
|
@@ -203,7 +205,7 @@ class vSessionAuth(vManageAuth):
|
|
|
203
205
|
password: str,
|
|
204
206
|
subdomain: str,
|
|
205
207
|
logger: Optional[logging.Logger] = None,
|
|
206
|
-
verify: bool = False,
|
|
208
|
+
verify: Union[bool, str] = False,
|
|
207
209
|
):
|
|
208
210
|
super().__init__(username, password, logger, verify)
|
|
209
211
|
self.subdomain = subdomain
|
|
@@ -264,7 +266,7 @@ def create_vmanage_auth(
|
|
|
264
266
|
password: str,
|
|
265
267
|
subdomain: Optional[str] = None,
|
|
266
268
|
logger: Optional[logging.Logger] = None,
|
|
267
|
-
verify: bool = False,
|
|
269
|
+
verify: Union[bool, str] = False,
|
|
268
270
|
) -> vManageAuth:
|
|
269
271
|
if subdomain is not None:
|
|
270
272
|
return vSessionAuth(username, password, subdomain, logger=logger, verify=verify)
|
|
@@ -22,8 +22,8 @@ catalystwan/api/config_device_inventory_api.py,sha256=5TG7oYtGS8TwpSLAB3sBXh5Yh_
|
|
|
22
22
|
catalystwan/api/config_group_api.py,sha256=9CRsKLHmlhZ2Ada4WTbxx7LrOdqfg8Tr19XNYrSgP9E,5087
|
|
23
23
|
catalystwan/api/configuration_groups/parcel.py,sha256=n4oD5zk3-Hz_qX5qPxQFGGByoaQ-7mMlJmlOHsY6hVQ,7350
|
|
24
24
|
catalystwan/api/dashboard_api.py,sha256=_bBcotOX2GKITEGIjl7l5NdyflHrDGAhPr5Y_B_aFNg,7315
|
|
25
|
-
catalystwan/api/device_action_api.py,sha256=
|
|
26
|
-
catalystwan/api/feature_profile_api.py,sha256=
|
|
25
|
+
catalystwan/api/device_action_api.py,sha256=ZlZ4RxwZQ5qsAUCbyzSy38fQcMuxQEQWiMs1wVHqpNE,7400
|
|
26
|
+
catalystwan/api/feature_profile_api.py,sha256=91KrSJbwaINaxFFhNb4K9Bjf6ZP4DKJm-QDcWflBpBY,77157
|
|
27
27
|
catalystwan/api/logs_api.py,sha256=PcRED920U83QNohYk7xGZ9C6lzqvQP9FYeiGr09YQzU,1919
|
|
28
28
|
catalystwan/api/monitoring_status_api.py,sha256=ZxDNb3kxGQTQ_cA_a5ho2hbv637dvX_PZIhZkPSB7Ng,2449
|
|
29
29
|
catalystwan/api/mtt_aaa_api.py,sha256=YUNbKxMyQnJSfTPqBc0zXzDR1NWiCNmpHubokYAGSHk,5550
|
|
@@ -86,11 +86,11 @@ catalystwan/api/tenant_management_api.py,sha256=KKQzO0_IX71d2OiYRXVF_g1CCNMDzKOk
|
|
|
86
86
|
catalystwan/api/tenant_migration_api.py,sha256=tyjfdjZq7WxwpNR-M64GSKGH1b-9yT6e0WCZFAFggtg,5090
|
|
87
87
|
catalystwan/api/versions_utils.py,sha256=tK_zfxQ4fVlu3wfJ27DJ4FaGYqut7jRjGTrEKKt8ni4,15919
|
|
88
88
|
catalystwan/api/virtual_image_action_api.py,sha256=mMZ40HZHw1EataUluHAGznKs-X7NP_-2-1tDBOQYizs,7715
|
|
89
|
-
catalystwan/apigw_auth.py,sha256=
|
|
89
|
+
catalystwan/apigw_auth.py,sha256=6jh7euW3Gara4V4jb25JKqSubeXSIdQTNFV08i5QiYI,6522
|
|
90
90
|
catalystwan/dataclasses.py,sha256=c6ZzesD-9iGuVbyYH3w4mAejhrO7ZObkb5Gyyo-iL-s,19634
|
|
91
91
|
catalystwan/endpoints/__init__.py,sha256=3lL6NlSJ_h8eohRpN88TMgkUsa3Lh2BSPsrNen2piSo,25622
|
|
92
92
|
catalystwan/endpoints/administration_user_and_group.py,sha256=N7c1MZ98M6hKOfOWjK0GL1uh9DdzlxQmGSFUj5GjK5w,11938
|
|
93
|
-
catalystwan/endpoints/api_gateway.py,sha256=
|
|
93
|
+
catalystwan/endpoints/api_gateway.py,sha256=O5vZlGEqkSJksKqiz9VLHha-arl4Hu2qgopE2sYsMPE,746
|
|
94
94
|
catalystwan/endpoints/certificate_management_device.py,sha256=idWO5xjz9SrxJrVN8PePWtoWDDoy294yZZb3RtXpir4,7073
|
|
95
95
|
catalystwan/endpoints/certificate_management_vmanage.py,sha256=Xcrnh8v7FduXxc4n8814AGLBWJsNvvGgeaEE1SATgzM,1476
|
|
96
96
|
catalystwan/endpoints/client.py,sha256=4YY08AT0jhybuJ9BN_VNBAVTp-rHlIRc8Xvdyj9uk38,4035
|
|
@@ -361,7 +361,7 @@ catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_contro
|
|
|
361
361
|
catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_profile.py,sha256=SxevOuNFNZyCmv7nWpdhRpb4LI-zq9Uli5PqicfbnP4,2754
|
|
362
362
|
catalystwan/models/configuration/feature_profile/sdwan/transport/gps.py,sha256=LZ_9eHM6G7F8XQFS4WhhT8dY54IWgdHgRKBunjI9DlQ,1579
|
|
363
363
|
catalystwan/models/configuration/feature_profile/sdwan/transport/management/ethernet.py,sha256=zWH0-0zCRUSkGO94PamhwSjIkLjk9hPL9fmbFAokios,5689
|
|
364
|
-
catalystwan/models/configuration/feature_profile/sdwan/transport/t1e1controller.py,sha256=
|
|
364
|
+
catalystwan/models/configuration/feature_profile/sdwan/transport/t1e1controller.py,sha256=CGYgVu6S0bH699KMutVLNaUwSN2W1r-7FpGirIBt-ig,4456
|
|
365
365
|
catalystwan/models/configuration/feature_profile/sdwan/transport/vpn.py,sha256=rHHtuOC_6YGhuOFJkMd4vH_vNfwwJLQBDCOJYFxMs0s,10966
|
|
366
366
|
catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/cellular.py,sha256=UB5LQo9G-b4R7rE-jcJFKcjeGB173UPYK-9beXjcJ5I,8834
|
|
367
367
|
catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/ethernet.py,sha256=2jWoQv-A2LuRGsoRhBt6IRbeq3lb2g_y8AW0HYuEgf4,18669
|
|
@@ -478,7 +478,7 @@ catalystwan/models/tenant.py,sha256=UCACzI8n12UT-zpPvPqEQKfbkX9SsDMkET3Lm1kTP0Q,
|
|
|
478
478
|
catalystwan/models/url_monitoring.py,sha256=y8xl0BefAFy5oJCGduiaCRowXRtadm8-ABiQVwQ7p34,924
|
|
479
479
|
catalystwan/request_limiter.py,sha256=-SQCiA7CIjVHLXThxq034ufFigHEKA3xGPH9akBRK-w,577
|
|
480
480
|
catalystwan/response.py,sha256=GRg2ivRb88TXLsXCRZRW1Ix6uyTF9iEyXmLEEYUzeMM,10561
|
|
481
|
-
catalystwan/session.py,sha256=
|
|
481
|
+
catalystwan/session.py,sha256=uSMOeDitZ8lyuFV9iFpDE5YdQKfXvQp27q6GcyilCJQ,22844
|
|
482
482
|
catalystwan/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
483
483
|
catalystwan/tests/builders/test_report.py,sha256=BAppdGUpkH_SQrYmnB5NYutK-beRsz7aoiDPk5o74zw,2227
|
|
484
484
|
catalystwan/tests/builders/uc_voice.py,sha256=9oU5mxRK2quLXeutxVEhdMSbnj-UEY7gugYNupUYX_8,3265
|
|
@@ -566,7 +566,7 @@ catalystwan/tests/templates/schemas/vpn-vsmart-interface.json,sha256=4JkUmBhHeJV
|
|
|
566
566
|
catalystwan/tests/templates/schemas/vpn-vsmart.json,sha256=7HAG6WYoVxG_ZNrQHj3rVyHxcS8ZVe4twhjIsdXR-m8,14994
|
|
567
567
|
catalystwan/tests/templates/test_chose_model.py,sha256=JAxRaBDkg-9zAjDGD_TylmgefsNzcRO1HrGQQ3Iw9PE,1086
|
|
568
568
|
catalystwan/tests/templates/test_deserialize_model.py,sha256=uIDA7fQyESJaNbLdYKrFo_8X_flbQRame1dPCFlzsI0,2625
|
|
569
|
-
catalystwan/tests/templates/test_find_template_values.py,sha256=
|
|
569
|
+
catalystwan/tests/templates/test_find_template_values.py,sha256=_eXOgL426s78u6QJa4Us5U96q1BNncUsg0sV9Jqv66A,14367
|
|
570
570
|
catalystwan/tests/templates/test_find_template_values_2.py,sha256=vERVA4rLv4xOq-BFe65jethDHh9FTg7X5goAxTv0zic,6818
|
|
571
571
|
catalystwan/tests/templates/test_generate_payload.py,sha256=9fuYPtb2gXjTE4RiiHM8EDCwlsFwLnSCNhE_Gz_aIFc,4598
|
|
572
572
|
catalystwan/tests/templates/test_serialize_model.py,sha256=lunkXGyMgUuvzfS2Vd-9WooHcOoUkLom6CUCOjkkXUY,1755
|
|
@@ -614,7 +614,7 @@ catalystwan/utils/dashboard.py,sha256=5DBDdnFuNEebo9R8UpXDETrYJsfZp-vv9OCr9ahU6V
|
|
|
614
614
|
catalystwan/utils/device_model.py,sha256=IPEQD7yYyhCH91Uw9P-dF34TcIEimYEnImYVaaQOjRY,15996
|
|
615
615
|
catalystwan/utils/dict.py,sha256=1IC4pcPFQ7yS39-ZWSFwyCvQKYzfZoxsz3YtJ-S6l7w,2110
|
|
616
616
|
catalystwan/utils/feature_template/choose_model.py,sha256=JoQ7l_TF2PTH8bciOSVAFavevo35n2F4DbusIIvapM8,953
|
|
617
|
-
catalystwan/utils/feature_template/find_template_values.py,sha256=
|
|
617
|
+
catalystwan/utils/feature_template/find_template_values.py,sha256=UpGx4-MDhgyqOGkd-8bTKGXIVu8KxjI4ensxsRTSmqQ,5358
|
|
618
618
|
catalystwan/utils/model.py,sha256=UCqpk2kpgT8YYRp4prv9kmR4ciBNvQDCl3ZB8Ln941k,1506
|
|
619
619
|
catalystwan/utils/operation_status.py,sha256=SeT34c_x8F98mwl9x0-klvGTMKbrKSTY_w0zaKyuds8,584
|
|
620
620
|
catalystwan/utils/persona.py,sha256=fZEMM2wgvvSuNaGwsLk-qWJUuZzkhYm1C3YUnRGOqRw,147
|
|
@@ -627,10 +627,10 @@ catalystwan/utils/type_check.py,sha256=VMptWc9WclKu7jsxHqjTsQ26lLwt2ePi4Y1KDfPfE
|
|
|
627
627
|
catalystwan/utils/upgrades_helper.py,sha256=XpfSbiR1TIZr9seQshHpwweydnOO8Ynp30--mVYjrIg,3930
|
|
628
628
|
catalystwan/utils/validate_status.py,sha256=kT35hkjFauDhiEKz7zd6rsG7sNctzbW-Wu1LZNNh7h0,159
|
|
629
629
|
catalystwan/version.py,sha256=X5yIMPIrWPbdoF9eJfwxfjcvWr7JMfWQF98hQhlGB5I,3032
|
|
630
|
-
catalystwan/vmanage_auth.py,sha256=
|
|
630
|
+
catalystwan/vmanage_auth.py,sha256=UZ57lTihsLsXw4AdU7Vn8XuY1jo3732Vc9WuFoHSiiQ,10780
|
|
631
631
|
catalystwan/workflows/backup_restore_device_templates.py,sha256=BoR2KlRbpCI6RxIWG7j7tucaLpw5w3ESN20dLhsrZFY,19796
|
|
632
632
|
catalystwan/workflows/tenant_migration.py,sha256=4KLbqUwH4gEegE92PCGfRd226eZd_crCUpaYUWoGXDI,9790
|
|
633
|
-
catalystwan-0.41.
|
|
634
|
-
catalystwan-0.41.
|
|
635
|
-
catalystwan-0.41.
|
|
636
|
-
catalystwan-0.41.
|
|
633
|
+
catalystwan-0.41.2.dev0.dist-info/LICENSE,sha256=97ROi91Vxrj_Jio2v8FI9E8-y6x2uYdQRaFlrEbVjkc,11375
|
|
634
|
+
catalystwan-0.41.2.dev0.dist-info/METADATA,sha256=HrCNn_O_CddvebqxbAwiNFW3N-NWRtAUE4sl-artDUA,21275
|
|
635
|
+
catalystwan-0.41.2.dev0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
636
|
+
catalystwan-0.41.2.dev0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|