catalystwan 0.31.0.dev2__tar.gz → 0.31.0.dev3__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.
Files changed (333) hide show
  1. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/PKG-INFO +3 -2
  2. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/partition_manager_api.py +5 -3
  3. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/software_action_api.py +101 -40
  4. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/template_api.py +12 -7
  5. catalystwan-0.31.0.dev3/catalystwan/api/templates/bool_str.py +4 -0
  6. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/feature_template.py +1 -1
  7. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/feature_template_field.py +5 -6
  8. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_bfd_model.py +5 -5
  9. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_bgp_model.py +29 -70
  10. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_logging_model.py +17 -13
  11. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_ntp_model.py +5 -5
  12. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_omp_model.py +7 -7
  13. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_ospf.py +21 -17
  14. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_ospfv3.py +31 -24
  15. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_secure_internet_gateway.py +2 -3
  16. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_snmp_model.py +5 -5
  17. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_system.py +15 -15
  18. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_vpn_interface_model.py +80 -64
  19. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/omp_vsmart_model.py +7 -7
  20. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/versions_utils.py +80 -20
  21. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/software_actions.py +1 -0
  22. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration_dashboard_status.py +3 -3
  23. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration_device_actions.py +6 -3
  24. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/test_generate_payload.py +6 -4
  25. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/test_serialize_model.py +1 -1
  26. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_partition_manager_api.py +4 -4
  27. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_software_action_api.py +68 -9
  28. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_task_status_api.py +86 -0
  29. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_version_utils.py +101 -3
  30. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/upgrades_helper.py +15 -8
  31. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/pyproject.toml +3 -2
  32. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/setup.py +4 -3
  33. catalystwan-0.31.0.dev2/catalystwan/utils/pydantic_validators.py +0 -32
  34. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/LICENSE +0 -0
  35. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/README.md +0 -0
  36. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/__init__.py +0 -0
  37. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/abstractions.py +0 -0
  38. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/__init__.py +0 -0
  39. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/admin_tech_api.py +0 -0
  40. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/administration.py +0 -0
  41. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/alarms_api.py +0 -0
  42. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/api_container.py +0 -0
  43. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/basic_api.py +0 -0
  44. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/config_device_inventory_api.py +0 -0
  45. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/config_group_api.py +0 -0
  46. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/configuration_groups/parcel.py +0 -0
  47. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/configuration_groups/parcels/cellular_controller.py +0 -0
  48. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/dashboard_api.py +0 -0
  49. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/device_action_api.py +0 -0
  50. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/feature_profile_api.py +0 -0
  51. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/logs_api.py +0 -0
  52. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/monitoring_status_api.py +0 -0
  53. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/mtt_aaa_api.py +0 -0
  54. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/omp_api.py +0 -0
  55. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/packet_capture_api.py +0 -0
  56. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/parcel_api.py +0 -0
  57. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/policy_api.py +0 -0
  58. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/resource_pool_api.py +0 -0
  59. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/speedtest_api.py +0 -0
  60. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/task_status_api.py +0 -0
  61. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/README.md +0 -0
  62. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/cli_template.py +0 -0
  63. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/device_template/device_template.py +0 -0
  64. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/device_template/device_template_payload.json.j2 +0 -0
  65. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/device_variable.py +0 -0
  66. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/feature_template_payload.py +0 -0
  67. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_aaa_model.py +0 -0
  68. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_banner_model.py +0 -0
  69. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_vpn_model.py +0 -0
  70. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cli_template.py +0 -0
  71. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/security_vsmart_model.py +0 -0
  72. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/supported.py +0 -0
  73. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/system_vsmart_model.py +0 -0
  74. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/aaa/aaa_model.py +0 -0
  75. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/aaa/feature/aaa.json.j2 +0 -0
  76. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/aaa/feature/accounting.json.j2 +0 -0
  77. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/aaa/feature/radius.json.j2 +0 -0
  78. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/aaa/feature/tacacs.json.j2 +0 -0
  79. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/aaa/feature/user.json.j2 +0 -0
  80. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/cisco_vpn/cisco_vpn_model.py +0 -0
  81. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/cisco_vpn/feature/cisco_vpn.json.j2 +0 -0
  82. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/cisco_vpn/feature/dns.json.j2 +0 -0
  83. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/cisco_vpn/feature/ipv4route.json.j2 +0 -0
  84. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/cisco_vpn/feature/ipv6route.json.j2 +0 -0
  85. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/cisco_vpn/feature/mapping.json.j2 +0 -0
  86. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/tenant/tenant.json.j2 +0 -0
  87. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/tenant/tenant_model.py +0 -0
  88. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/tenant_backup_restore_api.py +0 -0
  89. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/tenant_management_api.py +0 -0
  90. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/tenant_migration_api.py +0 -0
  91. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/dataclasses.py +0 -0
  92. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/__init__.py +0 -0
  93. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/administration_user_and_group.py +0 -0
  94. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/certificate_management_device.py +0 -0
  95. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/certificate_management_vmanage.py +0 -0
  96. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/client.py +0 -0
  97. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/cluster_management.py +0 -0
  98. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/device/software_update.py +0 -0
  99. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/disaster_recovery.py +0 -0
  100. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/feature_profile/sdwan/policy_object.py +0 -0
  101. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py +0 -0
  102. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py +0 -0
  103. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/access_control_list.py +0 -0
  104. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/access_control_list_ipv6.py +0 -0
  105. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/control.py +0 -0
  106. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/device_access.py +0 -0
  107. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/device_access_ipv6.py +0 -0
  108. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/hub_and_spoke.py +0 -0
  109. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/mesh.py +0 -0
  110. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/qos_map.py +0 -0
  111. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/rewrite.py +0 -0
  112. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/rule_set.py +0 -0
  113. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/security_group.py +0 -0
  114. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/traffic_data.py +0 -0
  115. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/vpn_membership.py +0 -0
  116. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/zone_based_firewall.py +0 -0
  117. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/app.py +0 -0
  118. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/app_probe.py +0 -0
  119. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/as_path.py +0 -0
  120. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/class_map.py +0 -0
  121. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/color.py +0 -0
  122. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/community.py +0 -0
  123. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/data_ipv6_prefix.py +0 -0
  124. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/data_prefix.py +0 -0
  125. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/expanded_community.py +0 -0
  126. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/fqdn.py +0 -0
  127. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/geo_location.py +0 -0
  128. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/ips_signature.py +0 -0
  129. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/ipv6_prefix.py +0 -0
  130. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/local_app.py +0 -0
  131. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/local_domain.py +0 -0
  132. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/mirror.py +0 -0
  133. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/policer.py +0 -0
  134. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/port.py +0 -0
  135. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/preferred_color_group.py +0 -0
  136. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/prefix.py +0 -0
  137. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/protocol_name.py +0 -0
  138. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/region.py +0 -0
  139. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/site.py +0 -0
  140. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/sla.py +0 -0
  141. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/tloc.py +0 -0
  142. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/url_black_list.py +0 -0
  143. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/url_white_list.py +0 -0
  144. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/vpn.py +0 -0
  145. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/zone.py +0 -0
  146. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/security_template.py +0 -0
  147. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/vedge_template.py +0 -0
  148. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/vsmart_template.py +0 -0
  149. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration_device_inventory.py +0 -0
  150. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration_device_template.py +0 -0
  151. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration_feature_profile.py +0 -0
  152. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration_group.py +0 -0
  153. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration_settings.py +0 -0
  154. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/endpoints_container.py +0 -0
  155. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/misc.py +0 -0
  156. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/monitoring_device_details.py +0 -0
  157. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/monitoring_status.py +0 -0
  158. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/real_time_monitoring/reboot_history.py +0 -0
  159. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/sdavc_cloud_connector.py +0 -0
  160. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/tenant_backup_restore.py +0 -0
  161. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/tenant_management.py +0 -0
  162. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/tenant_migration.py +0 -0
  163. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/troubleshooting_tools/device_connectivity.py +0 -0
  164. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/exceptions.py +0 -0
  165. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/logging.conf +0 -0
  166. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/common.py +0 -0
  167. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/common.py +0 -0
  168. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/config_migration.py +0 -0
  169. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/README.md +0 -0
  170. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/builder.py +0 -0
  171. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/common.py +0 -0
  172. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/management/vpn.py +0 -0
  173. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/__init__.py +0 -0
  174. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/app_probe.py +0 -0
  175. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/application_list.py +0 -0
  176. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/color_list.py +0 -0
  177. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/data_prefix.py +0 -0
  178. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/expanded_community_list.py +0 -0
  179. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/fowarding_class.py +0 -0
  180. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_data_prefix.py +0 -0
  181. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_prefix_list.py +0 -0
  182. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/policier.py +0 -0
  183. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefered_group_color.py +0 -0
  184. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefix_list.py +0 -0
  185. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/sla_class.py +0 -0
  186. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/standard_community.py +0 -0
  187. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/tloc_list.py +0 -0
  188. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/application_list.py +0 -0
  189. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/data_prefix.py +0 -0
  190. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/fqdn.py +0 -0
  191. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/geolocation_list.py +0 -0
  192. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ips_signature.py +0 -0
  193. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/local_domain.py +0 -0
  194. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/protocol_list.py +0 -0
  195. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/security_port.py +0 -0
  196. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url.py +0 -0
  197. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/zone.py +0 -0
  198. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/acl.py +0 -0
  199. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/appqoe.py +0 -0
  200. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/bgp.py +0 -0
  201. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/dhcp_server.py +0 -0
  202. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/eigrp.py +0 -0
  203. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/lan/common.py +0 -0
  204. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/lan/ethernet.py +0 -0
  205. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/lan/gre.py +0 -0
  206. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/lan/ipsec.py +0 -0
  207. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/lan/svi.py +0 -0
  208. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/lan/vpn.py +0 -0
  209. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/multicast.py +0 -0
  210. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/object_tracker.py +0 -0
  211. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/ospf.py +0 -0
  212. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/ospfv3.py +0 -0
  213. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/route_policy.py +0 -0
  214. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/service_insertion_attachment.py +0 -0
  215. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/switchport.py +0 -0
  216. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/tracker.py +0 -0
  217. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/wireless_lan.py +0 -0
  218. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/system/aaa.py +0 -0
  219. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_controller.py +0 -0
  220. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/profile_type.py +0 -0
  221. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/device_inventory.py +0 -0
  222. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/feature_profile_parcel.py +0 -0
  223. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/misc/application_protocols.py +0 -0
  224. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/__init__.py +0 -0
  225. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/centralized.py +0 -0
  226. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/access_control_list.py +0 -0
  227. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/access_control_list_ipv6.py +0 -0
  228. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/control.py +0 -0
  229. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/device_access.py +0 -0
  230. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/device_access_ipv6.py +0 -0
  231. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/hub_and_spoke.py +0 -0
  232. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/mesh.py +0 -0
  233. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/qos_map.py +0 -0
  234. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/rewrite.py +0 -0
  235. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/rule_set.py +0 -0
  236. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/security_group.py +0 -0
  237. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/traffic_data.py +0 -0
  238. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/vpn_membership.py +0 -0
  239. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/zone_based_firewall.py +0 -0
  240. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/lists.py +0 -0
  241. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/lists_entries.py +0 -0
  242. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/localized.py +0 -0
  243. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/policy.py +0 -0
  244. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/policy_definition.py +0 -0
  245. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/policy_list.py +0 -0
  246. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/security.py +0 -0
  247. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/tenant.py +0 -0
  248. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/response.py +0 -0
  249. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/session.py +0 -0
  250. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/Basic_Cisco_VPN_Model.json +0 -0
  251. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/banner_1.json +0 -0
  252. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/basic/alias.json +0 -0
  253. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/basic/basic.json +0 -0
  254. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/basic/basic_no_value.json +0 -0
  255. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/basic/children.json +0 -0
  256. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/basic/children_nested.json +0 -0
  257. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/basic/children_nested_datapath.json +0 -0
  258. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/basic/data_path.json +0 -0
  259. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/cisco_bfd.json +0 -0
  260. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/complex_aaa.json +0 -0
  261. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/complex_cisco_vpn.json +0 -0
  262. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/default_cisco_system.json +0 -0
  263. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/iuo.json +0 -0
  264. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/omp_1.json +0 -0
  265. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/omp_2.json +0 -0
  266. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/omp_3.json +0 -0
  267. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/models/__init__.py +0 -0
  268. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/models/cisco_aaa.py +0 -0
  269. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/models/cisco_banner.py +0 -0
  270. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/models/cisco_bfd.py +0 -0
  271. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/models/cisco_system.py +0 -0
  272. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/models/cisco_vpn.py +0 -0
  273. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/models/omp_vsmart.py +0 -0
  274. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/schemas/basic/alias.json +0 -0
  275. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/schemas/basic/basic.json +0 -0
  276. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/schemas/basic/children.json +0 -0
  277. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/schemas/basic/children_nested.json +0 -0
  278. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/schemas/basic/children_nested_datapath.json +0 -0
  279. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/schemas/basic/data_path.json +0 -0
  280. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/schemas/cedge_aaa.json +0 -0
  281. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/schemas/cisco_banner.json +0 -0
  282. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/schemas/cisco_bfd.json +0 -0
  283. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/schemas/cisco_system.json +0 -0
  284. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/schemas/cisco_vpn.json +0 -0
  285. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/schemas/omp-vsmart.json +0 -0
  286. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/test_chose_model.py +0 -0
  287. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/test_deserialize_model.py +0 -0
  288. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_admin_tech_api.py +0 -0
  289. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_administration.py +0 -0
  290. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_alarms_api.py +0 -0
  291. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_cli_template.py +0 -0
  292. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_creation_tools.py +0 -0
  293. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_device_action_api.py +0 -0
  294. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_devices_api.py +0 -0
  295. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_endpoints.py +0 -0
  296. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_feature_template_field.py +0 -0
  297. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_logs_api.py +0 -0
  298. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_monitoring_status_api.py +0 -0
  299. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_mtt_aaa_api.py +0 -0
  300. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_omp_api.py +0 -0
  301. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_packet_capture.py +0 -0
  302. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_response.py +0 -0
  303. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_session.py +0 -0
  304. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_speed_test_api.py +0 -0
  305. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_templates.py +0 -0
  306. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_tenant_backup_restore_api.py +0 -0
  307. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_tenant_management_api.py +0 -0
  308. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_tenant_migration_api.py +0 -0
  309. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_typed_list.py +0 -0
  310. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_version.py +0 -0
  311. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_vmanage_auth.py +0 -0
  312. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/typed_list.py +0 -0
  313. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/__init__.py +0 -0
  314. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/alarm_status.py +0 -0
  315. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/certificate_status.py +0 -0
  316. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/colors.py +0 -0
  317. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/config_status.py +0 -0
  318. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/creation_tools.py +0 -0
  319. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/dashboard.py +0 -0
  320. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/device_model.py +0 -0
  321. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/dict.py +0 -0
  322. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/feature_template.py +0 -0
  323. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/operation_status.py +0 -0
  324. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/personality.py +0 -0
  325. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/pydantic_field.py +0 -0
  326. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/reachability.py +0 -0
  327. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/session_type.py +0 -0
  328. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/template_type.py +0 -0
  329. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/timezone.py +0 -0
  330. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/validate_status.py +0 -0
  331. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/version.py +0 -0
  332. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/vmanage_auth.py +0 -0
  333. {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/workflows/tenant_migration.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: catalystwan
3
- Version: 0.31.0.dev2
3
+ Version: 0.31.0.dev3
4
4
  Summary: Cisco Catalyst WAN SDK for Python
5
5
  Home-page: https://github.com/CiscoDevNet/catalystwan
6
6
  Author: kagorski
@@ -17,11 +17,12 @@ Requires-Dist: ciscoconfparse (==1.9.41)
17
17
  Requires-Dist: clint (>=0.5.1,<0.6.0)
18
18
  Requires-Dist: flake8-quotes (>=3.3.1,<4.0.0)
19
19
  Requires-Dist: packaging (>=23.0,<24.0)
20
- Requires-Dist: pydantic (==2.5)
20
+ Requires-Dist: pydantic (>=2.5,<3.0)
21
21
  Requires-Dist: python-dateutil (>=2.8.2,<3.0.0)
22
22
  Requires-Dist: requests (>=2.27.1,<3.0.0)
23
23
  Requires-Dist: requests-toolbelt (>=1.0.0,<2.0.0)
24
24
  Requires-Dist: tenacity (>=8.1.0,<9.0.0)
25
+ Requires-Dist: typing-extensions (>=4.6.1,<5.0.0)
25
26
  Project-URL: Repository, https://github.com/CiscoDevNet/catalystwan
26
27
  Description-Content-Type: text/markdown
27
28
 
@@ -5,12 +5,12 @@ from typing import TYPE_CHECKING, List, Optional, cast
5
5
 
6
6
  from catalystwan.api.task_status_api import Task
7
7
  from catalystwan.api.versions_utils import DeviceVersions, RepositoryAPI
8
- from catalystwan.dataclasses import Device
9
8
  from catalystwan.endpoints.configuration_device_actions import (
10
9
  PartitionActionPayload,
11
10
  RemovePartitionActionPayload,
12
11
  RemovePartitionDevice,
13
12
  )
13
+ from catalystwan.endpoints.configuration_device_inventory import DeviceDetailsResponse
14
14
  from catalystwan.exceptions import EmptyVersionPayloadError
15
15
  from catalystwan.typed_list import DataSequence
16
16
  from catalystwan.utils.upgrades_helper import get_install_specification, validate_personality_homogeneity
@@ -48,7 +48,9 @@ class PartitionManagerAPI:
48
48
  self.repository = RepositoryAPI(self.session)
49
49
  self.device_version = DeviceVersions(self.session)
50
50
 
51
- def set_default_partition(self, devices: DataSequence[Device], partition: Optional[str] = None) -> Task:
51
+ def set_default_partition(
52
+ self, devices: DataSequence[DeviceDetailsResponse], partition: Optional[str] = None
53
+ ) -> Task:
52
54
  """
53
55
  Set default software versions for devices
54
56
 
@@ -82,7 +84,7 @@ class PartitionManagerAPI:
82
84
  return Task(self.session, partition_action.id)
83
85
 
84
86
  def remove_partition(
85
- self, devices: DataSequence[Device], partition: Optional[str] = None, force: bool = False
87
+ self, devices: DataSequence[DeviceDetailsResponse], partition: Optional[str] = None, force: bool = False
86
88
  ) -> Task:
87
89
  """
88
90
  Remove chosen software version from device
@@ -5,14 +5,15 @@ from typing import TYPE_CHECKING, List, Optional, cast
5
5
 
6
6
  from catalystwan.api.task_status_api import Task
7
7
  from catalystwan.api.versions_utils import DeviceVersions, RepositoryAPI
8
- from catalystwan.dataclasses import Device
9
8
  from catalystwan.endpoints.configuration_device_actions import (
10
9
  InstallActionPayload,
10
+ InstallData,
11
11
  InstallDevice,
12
12
  InstallInput,
13
13
  PartitionActionPayload,
14
14
  )
15
- from catalystwan.exceptions import EmptyVersionPayloadError, VersionDeclarationError # type: ignore
15
+ from catalystwan.endpoints.configuration_device_inventory import DeviceDetailsResponse
16
+ from catalystwan.exceptions import EmptyVersionPayloadError, ImageNotInRepositoryError # type: ignore
16
17
  from catalystwan.typed_list import DataSequence
17
18
  from catalystwan.utils.personality import Personality
18
19
  from catalystwan.utils.upgrades_helper import get_install_specification, validate_personality_homogeneity
@@ -35,13 +36,12 @@ class SoftwareActionAPI:
35
36
  session = create_manager_session(...)
36
37
 
37
38
  # Prepare devices list
38
- devices = session.api.devices.get()
39
- vsmarts = devices.filter(personality=Personality.VSMART)
39
+ controllers = session.endpoints.configuration_device_inventory.get_device_details('controllers')
40
+ vsmarts = controllers.filter(personality=Personality.VSMART)
40
41
  software_image = "viptela-20.7.2-x86_64.tar.gz"
41
42
 
42
43
  # Upgrade
43
- upgrade_id = SoftwareActionAPI(session).install(devices = vmanages,
44
- software_image=software_image)
44
+ upgrade_id = SoftwareActionAPI(session).install(devices = vsmarts, software_image=software_image)
45
45
 
46
46
  # Check upgrade status
47
47
  TaskAPI(session, software_action_id).wait_for_completed()
@@ -54,20 +54,23 @@ class SoftwareActionAPI:
54
54
 
55
55
  def activate(
56
56
  self,
57
- devices: DataSequence[Device],
57
+ devices: DataSequence[DeviceDetailsResponse],
58
58
  version_to_activate: Optional[str] = "",
59
59
  image: Optional[str] = "",
60
60
  ) -> Task:
61
61
  """
62
- Set chosen version as current version
62
+ Set chosen version as current version. Requires that selected devices have already version_to_activate
63
+ or image present in their available files.
63
64
 
64
65
  Args:
65
- devices (List[Device]): For those devices software will be activated
66
+ devices (List[DeviceDetailsResponse]): For those devices software will be activated
66
67
  version_to_activate (Optional[str]): version to be set as current version
67
- image (Optional[str]): path to software image or its name from available files
68
+ image (Optional[str]): software image name in available files
68
69
 
69
- Notice: Have to pass one of those arguments (version_to_activate,
70
- image)
70
+ Notice: Have to pass one of those arguments (version_to_activate, image)
71
+
72
+ Raises:
73
+ EmptyVersionPayloadError: If selected version_to_activate or image not detected in available files
71
74
 
72
75
  Returns:
73
76
  str: Activate software action id
@@ -78,7 +81,7 @@ class SoftwareActionAPI:
78
81
  elif version_to_activate and not image:
79
82
  version = cast(str, version_to_activate)
80
83
  else:
81
- raise VersionDeclarationError("You can not provide software_image and image version at the same time!")
84
+ raise ValueError("You can not provide software_image and image version at the same time!")
82
85
 
83
86
  payload_devices = self.device_versions.get_device_available(version, devices)
84
87
  for device in payload_devices:
@@ -98,55 +101,111 @@ class SoftwareActionAPI:
98
101
 
99
102
  def install(
100
103
  self,
101
- devices: DataSequence[Device],
104
+ devices: DataSequence[DeviceDetailsResponse],
102
105
  reboot: bool = False,
103
106
  sync: bool = True,
104
- image: str = "",
105
- image_version: str = "",
107
+ v_edge_vpn: int = 0,
108
+ v_smart_vpn: int = 0,
109
+ image: Optional[str] = None,
110
+ image_version: Optional[str] = None,
106
111
  downgrade_check: bool = True,
112
+ remote_server_name: Optional[str] = None,
113
+ remote_image_filename: Optional[str] = None,
107
114
  ) -> Task:
108
115
  """
109
116
  Method to install new software
110
117
 
111
118
  Args:
112
- devices (List[Device]): For those devices software will be activated
113
- reboot (bool): reboot device after action end
119
+ devices (List[DeviceDetailsResponse]): For those devices software will be activated
120
+ reboot (bool, optional): reboot device after action end
114
121
  sync (bool, optional): Synchronize settings. Defaults to True.
122
+ v_edge_vpn (int, optional): vEdge VPN
123
+ v_smart_vpn (int, optional): vSmart VPN
115
124
  image (str): path to software image or its name from available files
116
125
  image_version (str): version of software image
117
- downgrade_check (bool): perform a downgrade check when applicable
126
+ downgrade_check (bool, optional): perform a downgrade check when applicable
127
+ remote_server_name (str): name of configured Remote Server
128
+ remote_image_filename (str): filename to choose from selected Remote Server
118
129
 
119
- Notice: Have to pass one of those arguments (image_version,
120
- image)
130
+ Notice: Have to pass one of those:
131
+ - image_version
132
+ - image
133
+ - remote_server_name and remote_image_filename
121
134
 
122
135
  Raises:
123
- ValueError: Raise error if downgrade in certain cases
136
+ ValueError: Raise error if downgrade in certain cases or wrong arguments combination provided
137
+ ImageNotInRepositoryError: If selected image, image_version or remote_image_filename not found
124
138
 
125
139
  Returns:
126
140
  Task: Task object representing started install process
127
141
  """
128
142
  validate_personality_homogeneity(devices)
129
- if image and not image_version:
143
+
144
+ if (
145
+ sum(
146
+ [
147
+ image is not None,
148
+ image_version is not None,
149
+ all([remote_server_name is not None, remote_image_filename is not None]),
150
+ ]
151
+ )
152
+ != 1
153
+ ):
154
+ raise ValueError(
155
+ "Please provide one option to detect software to install."
156
+ "Pick either 'image', 'image_version', or both 'remote_server_name' and 'remote_image_filename'."
157
+ )
158
+
159
+ # FIXME downgrade_check will be supported when software images from Remote Server will have versions fields
160
+ if remote_server_name and remote_image_filename and downgrade_check:
161
+ raise ValueError("Downgrade check is not supported for install action for images from Remote Server.")
162
+
163
+ version, remote_image_details = None, None
164
+ if image:
130
165
  version = cast(str, self.repository.get_image_version(image))
131
- elif image_version and not image:
166
+ if image_version:
132
167
  version = cast(str, image_version)
133
- else:
134
- raise VersionDeclarationError("You can not provide image and image version at the same time")
168
+ if remote_server_name and remote_image_filename:
169
+ remote_image_details = self.repository.get_remote_image(remote_image_filename, remote_server_name)
135
170
 
136
- install_specification = get_install_specification(devices.first())
171
+ if not any([version, remote_image_details]):
172
+ raise ImageNotInRepositoryError(
173
+ "Based on provided arguments, software version to install on device(s) cannot be detected."
174
+ )
175
+
176
+ install_specification = get_install_specification(devices.first(), remote=bool(remote_image_details))
137
177
  install_devices = [
138
178
  InstallDevice(**device.model_dump(by_alias=True))
139
179
  for device in self.device_versions.get_device_list(devices)
140
180
  ]
141
- input = InstallInput(
142
- v_edge_vpn=0,
143
- v_smart_vpn=0,
144
- family=install_specification.family.value,
145
- version=version,
146
- version_type=install_specification.version_type.value,
147
- reboot=reboot,
148
- sync=sync,
149
- )
181
+
182
+ if version:
183
+ input = InstallInput(
184
+ v_edge_vpn=v_edge_vpn,
185
+ v_smart_vpn=v_smart_vpn,
186
+ family=install_specification.family.value,
187
+ version=version,
188
+ version_type=install_specification.version_type.value,
189
+ reboot=reboot,
190
+ sync=sync,
191
+ )
192
+ else:
193
+ input = InstallInput(
194
+ v_edge_vpn=v_edge_vpn,
195
+ v_smart_vpn=v_smart_vpn,
196
+ data=[
197
+ InstallData(
198
+ family=install_specification.family.value,
199
+ version=remote_image_details.version_id, # type: ignore
200
+ remote_server_id=remote_image_details.remote_server_id, # type: ignore
201
+ version_id=remote_image_details.version_id, # type: ignore
202
+ )
203
+ ],
204
+ version_type=install_specification.version_type.value,
205
+ reboot=reboot,
206
+ sync=sync,
207
+ )
208
+
150
209
  device_type = install_specification.device_type.value
151
210
  install_payload = InstallActionPayload(
152
211
  action="install", input=input, devices=install_devices, device_type=device_type
@@ -154,7 +213,9 @@ class SoftwareActionAPI:
154
213
 
155
214
  if downgrade_check and devices.first().personality in (Personality.VMANAGE, Personality.EDGE):
156
215
  self._downgrade_check(
157
- install_payload.devices, install_payload.input.version, install_specification.family.value
216
+ install_payload.devices,
217
+ install_payload.input.version, # type: ignore
218
+ install_specification.family.value, # type: ignore
158
219
  )
159
220
 
160
221
  install_action = self.session.endpoints.configuration_device_actions.process_install_operation(
@@ -170,10 +231,10 @@ class SoftwareActionAPI:
170
231
 
171
232
  Args:
172
233
  version_to_upgrade (str): version to upgrade
173
- devices_category (DeviceCategory): devices category
234
+ payload_devices List[InstallDevice]: list of Devices to check downgrade possibility
174
235
 
175
- Returns:
176
- List[str]: list of devices with no permission to downgrade
236
+ Raises:
237
+ ValueError: If for any of the devices upgrade action is denied
177
238
  """
178
239
  incorrect_devices = []
179
240
  devices_versions_repo = self.repository.get_devices_versions_repository()
@@ -382,7 +382,9 @@ class TemplatesAPI:
382
382
  if self.is_created_by_generator(template):
383
383
  debug = False
384
384
  schema = self.get_feature_template_schema(template, debug)
385
- payload = self.generate_feature_template_payload(template, schema, debug).model_dump(by_alias=True)
385
+ payload = self.generate_feature_template_payload(template, schema, debug).model_dump(
386
+ by_alias=True, mode="json"
387
+ )
386
388
  else:
387
389
  payload = json.loads(template.generate_payload(self.session))
388
390
 
@@ -541,7 +543,7 @@ class TemplatesAPI:
541
543
  payload = self.generate_feature_template_payload(template, schema, debug)
542
544
 
543
545
  endpoint = "/dataservice/template/feature"
544
- response = self.session.post(endpoint, json=payload.model_dump(by_alias=True, exclude_none=True))
546
+ response = self.session.post(endpoint, json=payload.model_dump(by_alias=True, exclude_none=True, mode="json"))
545
547
 
546
548
  return response.json()["templateId"]
547
549
 
@@ -557,9 +559,9 @@ class TemplatesAPI:
557
559
  ) # type: ignore
558
560
 
559
561
  fr_template_fields = [FeatureTemplateField(**field) for field in schema["fields"]] # TODO
560
-
562
+ json_dumped_template = template.model_dump(mode="json")
561
563
  # "name"
562
- for i, field in enumerate(fr_template_fields):
564
+ for field in fr_template_fields:
563
565
  value = None
564
566
  priority_order = None
565
567
  # TODO How to discover Device specific variable
@@ -575,16 +577,19 @@ class TemplatesAPI:
575
577
  ):
576
578
  priority_order = get_extra_field(field_value, "priority_order") # type: ignore
577
579
  value = getattr(template, field_name)
580
+ json_dumped_value = json_dumped_template.get(field_name)
578
581
  break
579
582
  if value is None:
580
583
  continue
581
584
 
582
- # print(field.payload_scheme(value))
583
- payload.definition = merge(payload.definition, field.payload_scheme(value, priority_order=priority_order))
585
+ payload.definition = merge(
586
+ payload.definition,
587
+ field.payload_scheme(value, json_dumped_value=json_dumped_value, priority_order=priority_order),
588
+ )
584
589
 
585
590
  if debug:
586
591
  with open(f"payload_{template.type}.json", "w") as f:
587
- f.write(json.dumps(payload.model_dump(by_alias=True), indent=4))
592
+ f.write(json.dumps(payload.model_dump(by_alias=True, mode="json"), indent=4))
588
593
 
589
594
  return payload
590
595
 
@@ -0,0 +1,4 @@
1
+ from pydantic import PlainSerializer
2
+ from typing_extensions import Annotated
3
+
4
+ BoolStr = Annotated[bool, PlainSerializer(lambda x: str(x).lower(), return_type=str, when_used="json-unless-none")]
@@ -29,7 +29,7 @@ class FeatureTemplate(BaseModel, ABC):
29
29
  undefined=DebugUndefined,
30
30
  )
31
31
  template = env.get_template(self.payload_path.name)
32
- output = template.render(self.model_dump())
32
+ output = template.render(self.model_dump(mode="json"))
33
33
 
34
34
  ast = env.parse(output)
35
35
  if meta.find_undeclared_variables(ast):
@@ -89,7 +89,7 @@ class FeatureTemplateField(BaseModel):
89
89
 
90
90
  # value must be JSON serializable, return JSON serializable dict
91
91
  def payload_scheme(
92
- self, value: Any = None, help=None, current_path=None, priority_order=None, vip_type=None
92
+ self, value: Any = None, json_dumped_value: Any = None, priority_order=None, vip_type=None
93
93
  ) -> dict:
94
94
  output: dict = {}
95
95
  rel_output: dict = {}
@@ -119,10 +119,9 @@ class FeatureTemplateField(BaseModel):
119
119
  if self.children:
120
120
  children_output = []
121
121
  for obj in value: # obj is User, atomic value. Loop every child
122
+ obj_json_dump = obj.model_dump(mode="json")
122
123
  child_payload: dict = {}
123
124
  for child in self.children: # Child in schema
124
- if current_path is None:
125
- current_path = []
126
125
  obj: FeatureTemplate # type: ignore
127
126
  model_tuple = next(
128
127
  filter(
@@ -137,14 +136,14 @@ class FeatureTemplateField(BaseModel):
137
136
  )
138
137
  model_field = model_tuple[1]
139
138
  obj_value = getattr(obj, model_tuple[0])
139
+ obj_json_value = obj_json_dump.get(model_tuple[0])
140
140
  po = get_extra_field(model_field, "priority_order")
141
141
  vip_type = get_extra_field(model_field, "vip_type")
142
142
  merge(
143
143
  child_payload,
144
144
  child.payload_scheme(
145
145
  obj_value,
146
- help=output,
147
- current_path=self.dataPath + [self.key],
146
+ json_dumped_value=obj_json_value,
148
147
  priority_order=po,
149
148
  vip_type=vip_type,
150
149
  ),
@@ -154,7 +153,7 @@ class FeatureTemplateField(BaseModel):
154
153
  children_output.append(child_payload)
155
154
  output["vipValue"] = children_output
156
155
  else:
157
- output["vipValue"] = value
156
+ output["vipValue"] = json_dumped_value
158
157
  else:
159
158
  if value is None:
160
159
  return {}
@@ -2,10 +2,10 @@ from enum import Enum
2
2
  from pathlib import Path
3
3
  from typing import ClassVar, List, Optional
4
4
 
5
- from pydantic import ConfigDict, Field
5
+ from pydantic import BaseModel, ConfigDict, Field
6
6
 
7
+ from catalystwan.api.templates.bool_str import BoolStr
7
8
  from catalystwan.api.templates.feature_template import FeatureTemplate
8
- from catalystwan.utils.pydantic_validators import ConvertBoolToStringModel
9
9
 
10
10
  DEFAULT_BFD_COLOR_MULTIPLIER = 7
11
11
  DEFAULT_BFD_DSCP = 48
@@ -39,18 +39,18 @@ class ColorType(str, Enum):
39
39
  PRIVATE6 = "private6"
40
40
 
41
41
 
42
- class Color(ConvertBoolToStringModel):
42
+ class Color(BaseModel):
43
43
  color: ColorType
44
44
  hello_interval: Optional[int] = Field(
45
45
  DEFAULT_BFD_HELLO_INTERVAL, json_schema_extra={"vmanage_key": "hello-interval"}
46
46
  )
47
47
  multiplier: Optional[int] = DEFAULT_BFD_COLOR_MULTIPLIER
48
- pmtu_discovery: Optional[bool] = Field(True, json_schema_extra={"vmanage_key": "pmtu-discovery"})
48
+ pmtu_discovery: Optional[BoolStr] = Field(default=True, json_schema_extra={"vmanage_key": "pmtu-discovery"})
49
49
  dscp: Optional[int] = DEFAULT_BFD_DSCP
50
50
  model_config = ConfigDict(populate_by_name=True)
51
51
 
52
52
 
53
- class CiscoBFDModel(FeatureTemplate, ConvertBoolToStringModel):
53
+ class CiscoBFDModel(FeatureTemplate):
54
54
  model_config = ConfigDict(arbitrary_types_allowed=True, populate_by_name=True)
55
55
 
56
56
  multiplier: Optional[int] = Field(DEFAULT_BFD_MULTIPLIER, json_schema_extra={"data_path": ["app-route"]})
@@ -2,8 +2,9 @@ from enum import Enum
2
2
  from pathlib import Path
3
3
  from typing import ClassVar, List, Optional
4
4
 
5
- from pydantic import BaseModel, ConfigDict, Field, field_validator
5
+ from pydantic import BaseModel, ConfigDict, Field
6
6
 
7
+ from catalystwan.api.templates.bool_str import BoolStr
7
8
  from catalystwan.api.templates.feature_template import FeatureTemplate
8
9
 
9
10
 
@@ -42,16 +43,10 @@ class AddressFamilyType(str, Enum):
42
43
 
43
44
  class AggregateAddress(BaseModel):
44
45
  prefix: str
45
- as_set: Optional[bool] = Field(default=None, json_schema_extra={"vmanage_key": "as-set"})
46
- summary_only: Optional[bool] = Field(default=None, json_schema_extra={"vmanage_key": "summary-only"})
46
+ as_set: Optional[BoolStr] = Field(default=None, json_schema_extra={"vmanage_key": "as-set"})
47
+ summary_only: Optional[BoolStr] = Field(default=None, json_schema_extra={"vmanage_key": "summary-only"})
47
48
  model_config = ConfigDict(populate_by_name=True)
48
49
 
49
- @field_validator("as_set", "summary_only")
50
- @classmethod
51
- def cast_to_str(cls, value):
52
- if value is not None:
53
- return str(value).lower()
54
-
55
50
 
56
51
  class Ipv6AggregateAddress(BaseModel):
57
52
  prefix: str
@@ -95,20 +90,14 @@ class AddressFamily(BaseModel):
95
90
  network: Optional[List[Network]] = None
96
91
  ipv6_network: Optional[List[Ipv6Network]] = Field(default=None, json_schema_extra={"vmanage_key": "ipv6-network"})
97
92
  paths: Optional[int] = Field(default=None, json_schema_extra={"data_path": ["maximum-paths"]})
98
- originate: Optional[bool] = Field(default=None, json_schema_extra={"data_path": ["default-information"]})
93
+ originate: Optional[BoolStr] = Field(default=None, json_schema_extra={"data_path": ["default-information"]})
99
94
  policy_name: Optional[str] = Field(
100
95
  default=None, json_schema_extra={"data_path": ["table-map"], "vmanage_key": "name"}
101
96
  )
102
- filter: Optional[bool] = Field(default=None, json_schema_extra={"data_path": ["table-map"]})
97
+ filter: Optional[BoolStr] = Field(default=None, json_schema_extra={"data_path": ["table-map"]})
103
98
  redistribute: Optional[List[Redistribute]] = None
104
99
  model_config = ConfigDict(populate_by_name=True)
105
100
 
106
- @field_validator("originate", "filter")
107
- @classmethod
108
- def cast_to_str(cls, value):
109
- if value is not None:
110
- return str(value).lower()
111
-
112
101
 
113
102
  class NeighborFamilyType(str, Enum):
114
103
  IPV4_UNICAST = "ipv4-unicast"
@@ -144,21 +133,23 @@ class NeighborAddressFamily(BaseModel):
144
133
  class Neighbor(BaseModel):
145
134
  address: str
146
135
  description: Optional[str] = None
147
- shutdown: Optional[bool] = None
136
+ shutdown: Optional[BoolStr] = None
148
137
  remote_as: int = Field(json_schema_extra={"vmanage_key": "remote-as"})
149
138
  keepalive: Optional[int] = Field(default=None, json_schema_extra={"data_path": ["timers"]})
150
139
  holdtime: Optional[int] = Field(default=None, json_schema_extra={"data_path": ["timers"]})
151
140
  if_name: Optional[str] = Field(
152
141
  default=None, json_schema_extra={"data_path": ["update-source"], "vmanage_key": "if-name"}
153
142
  )
154
- next_hop_self: Optional[bool] = Field(default=None, json_schema_extra={"vmanage_key": "next-hop-self"})
155
- send_community: Optional[bool] = Field(default=None, json_schema_extra={"vmanage_key": "send-community"})
156
- send_ext_community: Optional[bool] = Field(default=None, json_schema_extra={"vmanage_key": "send-ext-community"})
143
+ next_hop_self: Optional[BoolStr] = Field(default=None, json_schema_extra={"vmanage_key": "next-hop-self"})
144
+ send_community: Optional[BoolStr] = Field(default=None, json_schema_extra={"vmanage_key": "send-community"})
145
+ send_ext_community: Optional[BoolStr] = Field(default=None, json_schema_extra={"vmanage_key": "send-ext-community"})
157
146
  ebgp_multihop: Optional[int] = Field(default=None, json_schema_extra={"vmanage_key": "ebgp-multihop"})
158
147
  password: Optional[str] = None
159
- send_label: Optional[bool] = Field(default=None, json_schema_extra={"vmanage_key": "send-label"})
160
- send_label_explicit: Optional[bool] = Field(default=None, json_schema_extra={"vmanage_key": "send-label-explicit"})
161
- as_override: Optional[bool] = Field(default=None, json_schema_extra={"vmanage_key": "as-override"})
148
+ send_label: Optional[BoolStr] = Field(default=None, json_schema_extra={"vmanage_key": "send-label"})
149
+ send_label_explicit: Optional[BoolStr] = Field(
150
+ default=None, json_schema_extra={"vmanage_key": "send-label-explicit"}
151
+ )
152
+ as_override: Optional[BoolStr] = Field(default=None, json_schema_extra={"vmanage_key": "as-override"})
162
153
  as_number: Optional[int] = Field(
163
154
  default=None, json_schema_extra={"data_path": ["allowas-in"], "vmanage_key": "as-number"}
164
155
  )
@@ -167,20 +158,6 @@ class Neighbor(BaseModel):
167
158
  )
168
159
  model_config = ConfigDict(populate_by_name=True)
169
160
 
170
- @field_validator(
171
- "shutdown",
172
- "next_hop_self",
173
- "send_community",
174
- "send_ext_community",
175
- "send_label",
176
- "send_label_explicit",
177
- "as_override",
178
- )
179
- @classmethod
180
- def cast_to_str(cls, value):
181
- if value is not None:
182
- return str(value).lower()
183
-
184
161
 
185
162
  class IPv6NeighborFamilyType(str, Enum):
186
163
  IPV6_UNICAST = "ipv6-unicast"
@@ -203,21 +180,23 @@ class IPv6NeighborAddressFamily(BaseModel):
203
180
  class Ipv6Neighbor(BaseModel):
204
181
  address: str
205
182
  description: Optional[str] = None
206
- shutdown: Optional[bool] = None
183
+ shutdown: Optional[BoolStr] = None
207
184
  remote_as: int = Field(default=None, json_schema_extra={"vmanage_key": "remote-as"})
208
185
  keepalive: Optional[int] = Field(default=None, json_schema_extra={"data_path": ["timers"]})
209
186
  holdtime: Optional[int] = Field(default=None, json_schema_extra={"data_path": ["timers"]})
210
187
  if_name: Optional[str] = Field(
211
188
  default=None, json_schema_extra={"data_path": ["update-source"], "vmanage_key": "if-name"}
212
189
  )
213
- next_hop_self: Optional[bool] = Field(False, json_schema_extra={"vmanage_key": "next-hop-self"})
214
- send_community: Optional[bool] = Field(True, json_schema_extra={"vmanage_key": "send-community"})
215
- send_ext_community: Optional[bool] = Field(True, json_schema_extra={"vmanage_key": "send-ext-community"})
190
+ next_hop_self: Optional[BoolStr] = Field(default=False, json_schema_extra={"vmanage_key": "next-hop-self"})
191
+ send_community: Optional[BoolStr] = Field(default=True, json_schema_extra={"vmanage_key": "send-community"})
192
+ send_ext_community: Optional[BoolStr] = Field(default=True, json_schema_extra={"vmanage_key": "send-ext-community"})
216
193
  ebgp_multihop: Optional[int] = Field(1, json_schema_extra={"vmanage_key": "ebgp-multihop"})
217
194
  password: Optional[str] = None
218
- send_label: Optional[bool] = Field(False, json_schema_extra={"vmanage_key": "send-label"})
219
- send_label_explicit: Optional[bool] = Field(False, json_schema_extra={"vmanage_key": "send-label-explicit"})
220
- as_override: Optional[bool] = Field(False, json_schema_extra={"vmanage_key": "as-override"})
195
+ send_label: Optional[BoolStr] = Field(default=False, json_schema_extra={"vmanage_key": "send-label"})
196
+ send_label_explicit: Optional[BoolStr] = Field(
197
+ default=False, json_schema_extra={"vmanage_key": "send-label-explicit"}
198
+ )
199
+ as_override: Optional[BoolStr] = Field(default=False, json_schema_extra={"vmanage_key": "as-override"})
221
200
  as_number: Optional[int] = Field(
222
201
  default=None, json_schema_extra={"data_path": ["allowas-in"], "vmanage_key": "as-number"}
223
202
  )
@@ -226,26 +205,12 @@ class Ipv6Neighbor(BaseModel):
226
205
  )
227
206
  model_config = ConfigDict(populate_by_name=True)
228
207
 
229
- @field_validator(
230
- "shutdown",
231
- "next_hop_self",
232
- "send_community",
233
- "send_ext_community",
234
- "send_label",
235
- "send_label_explicit",
236
- "as_override",
237
- )
238
- @classmethod
239
- def cast_to_str(cls, value):
240
- if value is not None:
241
- return str(value).lower()
242
-
243
208
 
244
209
  class CiscoBGPModel(FeatureTemplate):
245
210
  model_config = ConfigDict(arbitrary_types_allowed=True, populate_by_name=True)
246
211
 
247
212
  as_num: Optional[str] = Field(default=None, json_schema_extra={"data_path": ["bgp"], "vmanage_key": "as-num"})
248
- shutdown: Optional[bool] = Field(default=None, json_schema_extra={"data_path": ["bgp"]})
213
+ shutdown: Optional[BoolStr] = Field(default=None, json_schema_extra={"data_path": ["bgp"]})
249
214
  router_id: Optional[str] = Field(default=None, json_schema_extra={"data_path": ["bgp"], "vmanage_key": "router-id"})
250
215
  propagate_aspath: Optional[bool] = Field(
251
216
  default=None, json_schema_extra={"data_path": ["bgp"], "vmanage_key": "propagate-aspath"}
@@ -270,14 +235,14 @@ class CiscoBGPModel(FeatureTemplate):
270
235
  always_compare: Optional[bool] = Field(
271
236
  default=None, json_schema_extra={"data_path": ["bgp", "best-path", "med"], "vmanage_key": "always-compare"}
272
237
  )
273
- deterministic: Optional[bool] = Field(default=None, json_schema_extra={"data_path": ["bgp", "best-path", "med"]})
274
- missing_as_worst: Optional[bool] = Field(
238
+ deterministic: Optional[BoolStr] = Field(default=None, json_schema_extra={"data_path": ["bgp", "best-path", "med"]})
239
+ missing_as_worst: Optional[BoolStr] = Field(
275
240
  default=None, json_schema_extra={"data_path": ["bgp", "best-path", "med"], "vmanage_key": "missing-as-worst"}
276
241
  )
277
- compare_router_id: Optional[bool] = Field(
242
+ compare_router_id: Optional[BoolStr] = Field(
278
243
  default=None, json_schema_extra={"data_path": ["bgp", "best-path"], "vmanage_key": "compare-router-id"}
279
244
  )
280
- multipath_relax: Optional[bool] = Field(
245
+ multipath_relax: Optional[BoolStr] = Field(
281
246
  default=None, json_schema_extra={"data_path": ["bgp", "best-path", "as-path"], "vmanage_key": "multipath-relax"}
282
247
  )
283
248
  address_family: Optional[List[AddressFamily]] = Field(
@@ -290,9 +255,3 @@ class CiscoBGPModel(FeatureTemplate):
290
255
 
291
256
  payload_path: ClassVar[Path] = Path(__file__).parent / "DEPRECATED"
292
257
  type: ClassVar[str] = "cisco_bgp"
293
-
294
- @field_validator("shutdown", "deterministic", "missing_as_worst", "compare_router_id", "multipath_relax")
295
- @classmethod
296
- def cast_to_str(cls, value):
297
- if value is not None:
298
- return str(value).lower()