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/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:
@@ -20,5 +20,4 @@ class ApiGateway(APIEndpoints):
20
20
  ...
21
21
 
22
22
  @post("/apigw/client/registration")
23
- def on_board_client(self, payload: OnBoardClient) -> None:
24
- ...
23
+ def on_board_client(self, payload: OnBoardClient) -> None: ...
@@ -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
- [Optional[Response], Union[Request, PreparedRequest, None]], str
244
- ] = response_history_debug
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 = False
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
- templated_values[field_key] = DeviceVariable(name=var_name)
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(item: Any, target_key: str = "vipType", target_key_for_template_value: str = "vipValue"):
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":
@@ -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__(self, username: str, password: str, logger: Optional[logging.Logger] = None, verify: bool = False):
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)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: catalystwan
3
- Version: 0.41.1.dev5
3
+ Version: 0.41.2.dev0
4
4
  Summary: Cisco Catalyst WAN SDK for Python
5
5
  Author: kagorski
6
6
  Author-email: kagorski@cisco.com
@@ -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=6EPSkH3nsUMH4PQ0KAcCUmMVEt3WM2jevP_F_pc_xvU,7360
26
- catalystwan/api/feature_profile_api.py,sha256=Sv4qdH9vmMoseJkZybUGrRlJ87NfKnT0Fw_H3nBfj3k,78253
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=fJ8sW1WuKyac0s270R68nszrJZ6Fp2jg_kdjHeanuPo,6479
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=5dPm9dGyTcmVsQCH5DGR9SacowDHaHwOPLo11qgl-F8,754
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=jyRfsyXQF5g2qGHckfXsb0PZ1g3ddE0IM3uNCHvZV5o,4456
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=urg0ptmJwSWVJTCg1JHh0wObyNo_WTjN0BptM2ZCepQ,22590
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=vERVA4rLv4xOq-BFe65jethDHh9FTg7X5goAxTv0zic,6818
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=dCsg-aL7FxvFu33uX5luEY6Zb9M_VCUfd5-IUvOYo78,4941
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=2YmNFAFuyd0thOGl2mnVUe8mtXOfQEFOomA6IWhsZlM,10723
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.1.dev5.dist-info/LICENSE,sha256=97ROi91Vxrj_Jio2v8FI9E8-y6x2uYdQRaFlrEbVjkc,11375
634
- catalystwan-0.41.1.dev5.dist-info/METADATA,sha256=EgK7JxBbsdtRw17_EHd8hTA6OadYfuoBJConMRl_EaI,21275
635
- catalystwan-0.41.1.dev5.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
636
- catalystwan-0.41.1.dev5.dist-info/RECORD,,
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,,