catalystwan 0.41.2.dev9__py3-none-any.whl → 0.41.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (509) hide show
  1. catalystwan/ENDPOINTS.md +611 -0
  2. catalystwan/__init__.py +2 -3
  3. catalystwan/api/administration.py +2 -13
  4. catalystwan/api/api_container.py +1 -4
  5. catalystwan/api/config_group_api.py +16 -41
  6. catalystwan/api/configuration_groups/parcel.py +30 -100
  7. catalystwan/api/configuration_groups/parcels/cellular_controller.py +33 -0
  8. catalystwan/api/feature_profile_api.py +237 -2016
  9. catalystwan/api/policy_api.py +116 -470
  10. catalystwan/api/template_api.py +44 -113
  11. catalystwan/api/templates/README.md +47 -61
  12. catalystwan/api/templates/cli_template.py +7 -17
  13. catalystwan/api/templates/device_template/device_template.py +32 -127
  14. catalystwan/api/templates/device_template/device_template_payload.json.j2 +19 -0
  15. catalystwan/api/templates/feature_template.py +3 -3
  16. catalystwan/api/templates/models/cisco_aaa_model.py +42 -289
  17. catalystwan/api/templates/models/cisco_banner_model.py +2 -11
  18. catalystwan/api/templates/models/cisco_bfd_model.py +36 -31
  19. catalystwan/api/templates/models/cisco_bgp_model.py +131 -382
  20. catalystwan/api/templates/models/cisco_logging_model.py +43 -80
  21. catalystwan/api/templates/models/cisco_ntp_model.py +15 -34
  22. catalystwan/api/templates/models/cisco_omp_model.py +60 -70
  23. catalystwan/api/templates/models/cisco_ospf.py +74 -143
  24. catalystwan/api/templates/models/cisco_ospfv3.py +95 -217
  25. catalystwan/api/templates/models/cisco_secure_internet_gateway.py +142 -304
  26. catalystwan/api/templates/models/cisco_snmp_model.py +52 -66
  27. catalystwan/api/templates/models/cisco_system.py +129 -238
  28. catalystwan/api/templates/models/cisco_vpn_interface_model.py +275 -632
  29. catalystwan/api/templates/models/cisco_vpn_model.py +270 -433
  30. catalystwan/api/templates/models/cli_template.py +2 -3
  31. catalystwan/api/templates/models/omp_vsmart_model.py +10 -46
  32. catalystwan/api/templates/models/security_vsmart_model.py +8 -11
  33. catalystwan/api/templates/models/supported.py +4 -10
  34. catalystwan/api/templates/models/system_vsmart_model.py +27 -164
  35. catalystwan/apigw_auth.py +2 -6
  36. catalystwan/dataclasses.py +53 -2
  37. catalystwan/endpoints/__init__.py +41 -41
  38. catalystwan/endpoints/certificate_management_device.py +0 -4
  39. catalystwan/endpoints/cluster_management.py +9 -30
  40. catalystwan/endpoints/configuration/feature_profile/sdwan/policy_object.py +12 -35
  41. catalystwan/endpoints/configuration/feature_profile/sdwan/system.py +11 -164
  42. catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py +26 -144
  43. catalystwan/endpoints/configuration/policy/definition/access_control_list.py +11 -6
  44. catalystwan/endpoints/configuration/policy/definition/access_control_list_ipv6.py +11 -6
  45. catalystwan/endpoints/configuration/policy/definition/control.py +11 -6
  46. catalystwan/endpoints/configuration/policy/definition/device_access.py +11 -6
  47. catalystwan/endpoints/configuration/policy/definition/device_access_ipv6.py +11 -6
  48. catalystwan/endpoints/configuration/policy/definition/hub_and_spoke.py +11 -6
  49. catalystwan/endpoints/configuration/policy/definition/mesh.py +11 -2
  50. catalystwan/endpoints/configuration/policy/definition/qos_map.py +11 -2
  51. catalystwan/endpoints/configuration/policy/definition/rewrite.py +11 -6
  52. catalystwan/endpoints/configuration/policy/definition/rule_set.py +11 -2
  53. catalystwan/endpoints/configuration/policy/definition/security_group.py +11 -6
  54. catalystwan/endpoints/configuration/policy/definition/traffic_data.py +11 -6
  55. catalystwan/endpoints/configuration/policy/definition/vpn_membership.py +11 -6
  56. catalystwan/endpoints/configuration/policy/definition/zone_based_firewall.py +11 -6
  57. catalystwan/endpoints/configuration/policy/list/app.py +16 -3
  58. catalystwan/endpoints/configuration/policy/list/app_probe.py +15 -6
  59. catalystwan/endpoints/configuration/policy/list/as_path.py +16 -3
  60. catalystwan/endpoints/configuration/policy/list/class_map.py +16 -3
  61. catalystwan/endpoints/configuration/policy/list/color.py +16 -3
  62. catalystwan/endpoints/configuration/policy/list/community.py +16 -3
  63. catalystwan/endpoints/configuration/policy/list/data_ipv6_prefix.py +15 -6
  64. catalystwan/endpoints/configuration/policy/list/data_prefix.py +16 -3
  65. catalystwan/endpoints/configuration/policy/list/expanded_community.py +15 -6
  66. catalystwan/endpoints/configuration/policy/list/fqdn.py +16 -3
  67. catalystwan/endpoints/configuration/policy/list/geo_location.py +16 -3
  68. catalystwan/endpoints/configuration/policy/list/ips_signature.py +15 -6
  69. catalystwan/endpoints/configuration/policy/list/ipv6_prefix.py +16 -3
  70. catalystwan/endpoints/configuration/policy/list/local_app.py +16 -3
  71. catalystwan/endpoints/configuration/policy/list/local_domain.py +16 -3
  72. catalystwan/endpoints/configuration/policy/list/mirror.py +16 -3
  73. catalystwan/endpoints/configuration/policy/list/policer.py +16 -3
  74. catalystwan/endpoints/configuration/policy/list/port.py +16 -3
  75. catalystwan/endpoints/configuration/policy/list/preferred_color_group.py +15 -6
  76. catalystwan/endpoints/configuration/policy/list/prefix.py +16 -4
  77. catalystwan/endpoints/configuration/policy/list/protocol_name.py +15 -6
  78. catalystwan/endpoints/configuration/policy/list/region.py +10 -2
  79. catalystwan/endpoints/configuration/policy/list/site.py +16 -3
  80. catalystwan/endpoints/configuration/policy/list/sla.py +16 -3
  81. catalystwan/endpoints/configuration/policy/list/tloc.py +16 -3
  82. catalystwan/endpoints/configuration/policy/list/url_allow_list.py +16 -3
  83. catalystwan/endpoints/configuration/policy/list/url_block_list.py +16 -3
  84. catalystwan/endpoints/configuration/policy/list/vpn.py +16 -3
  85. catalystwan/endpoints/configuration/policy/list/zone.py +16 -3
  86. catalystwan/endpoints/configuration/policy/security_template.py +3 -2
  87. catalystwan/endpoints/configuration/software_actions.py +4 -2
  88. catalystwan/endpoints/configuration_dashboard_status.py +2 -2
  89. catalystwan/endpoints/configuration_device_template.py +1 -15
  90. catalystwan/endpoints/configuration_feature_profile.py +11 -8
  91. catalystwan/endpoints/configuration_group.py +5 -28
  92. catalystwan/endpoints/configuration_settings.py +1 -90
  93. catalystwan/endpoints/endpoints_container.py +18 -82
  94. catalystwan/endpoints/real_time_monitoring/reboot_history.py +3 -1
  95. catalystwan/endpoints/tenant_migration.py +0 -2
  96. catalystwan/exceptions.py +0 -24
  97. catalystwan/integration_tests/test_find_template_values.py +18 -7
  98. catalystwan/models/common.py +2 -1898
  99. catalystwan/models/configuration/common.py +0 -1
  100. catalystwan/models/configuration/config_migration.py +36 -0
  101. catalystwan/models/configuration/feature_profile/common.py +149 -634
  102. catalystwan/models/configuration/feature_profile/sdwan/management/vpn.py +26 -0
  103. catalystwan/models/configuration/feature_profile/sdwan/policy_object/__init__.py +60 -69
  104. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/app_probe.py +20 -34
  105. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/application_list.py +6 -8
  106. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/color_list.py +5 -7
  107. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/data_prefix.py +4 -13
  108. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/expanded_community_list.py +7 -9
  109. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/fowarding_class.py +5 -7
  110. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_data_prefix.py +9 -11
  111. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_prefix_list.py +10 -25
  112. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/{policer.py → policier.py} +10 -12
  113. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefered_group_color.py +10 -29
  114. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefix_list.py +8 -23
  115. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/sla_class.py +31 -12
  116. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/standard_community.py +10 -16
  117. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/tloc_list.py +7 -8
  118. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/application_list.py +6 -8
  119. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/data_prefix.py +5 -7
  120. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/fqdn.py +5 -7
  121. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/geolocation_list.py +5 -7
  122. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ips_signature.py +5 -7
  123. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/local_domain.py +5 -7
  124. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/protocol_list.py +5 -7
  125. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/security_port.py +11 -21
  126. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url.py +15 -36
  127. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/zone.py +18 -14
  128. catalystwan/models/configuration/feature_profile/sdwan/service/acl.py +409 -0
  129. catalystwan/models/configuration/feature_profile/sdwan/service/appqoe.py +42 -77
  130. catalystwan/models/configuration/feature_profile/sdwan/service/bgp.py +288 -0
  131. catalystwan/models/configuration/feature_profile/sdwan/service/dhcp_server.py +64 -107
  132. catalystwan/models/configuration/feature_profile/sdwan/service/eigrp.py +42 -39
  133. catalystwan/models/configuration/feature_profile/sdwan/service/lan/common.py +88 -7
  134. catalystwan/models/configuration/feature_profile/sdwan/service/lan/ethernet.py +156 -232
  135. catalystwan/models/configuration/feature_profile/sdwan/service/lan/gre.py +108 -38
  136. catalystwan/models/configuration/feature_profile/sdwan/service/lan/ipsec.py +84 -77
  137. catalystwan/models/configuration/feature_profile/sdwan/service/lan/svi.py +56 -62
  138. catalystwan/models/configuration/feature_profile/sdwan/service/lan/vpn.py +121 -112
  139. catalystwan/models/configuration/feature_profile/sdwan/service/multicast.py +57 -56
  140. catalystwan/models/configuration/feature_profile/sdwan/service/object_tracker.py +21 -15
  141. catalystwan/models/configuration/feature_profile/sdwan/{routing → service}/ospf.py +47 -55
  142. catalystwan/models/configuration/feature_profile/sdwan/{routing → service}/ospfv3.py +72 -74
  143. catalystwan/models/configuration/feature_profile/sdwan/service/route_policy.py +110 -358
  144. catalystwan/models/configuration/feature_profile/sdwan/service/service_insertion_attachment.py +25 -17
  145. catalystwan/models/configuration/feature_profile/sdwan/service/switchport.py +58 -50
  146. catalystwan/models/configuration/feature_profile/sdwan/service/tracker.py +21 -12
  147. catalystwan/models/configuration/feature_profile/sdwan/service/wireless_lan.py +31 -27
  148. catalystwan/models/configuration/feature_profile/sdwan/system/aaa.py +10 -58
  149. catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_controller.py +23 -26
  150. catalystwan/models/configuration/profile_type.py +6 -1
  151. catalystwan/models/policy/__init__.py +69 -282
  152. catalystwan/models/policy/centralized.py +29 -26
  153. catalystwan/models/policy/{definition → definitions}/access_control_list.py +17 -47
  154. catalystwan/models/policy/{definition → definitions}/access_control_list_ipv6.py +18 -42
  155. catalystwan/models/policy/{definition → definitions}/control.py +25 -48
  156. catalystwan/models/policy/{definition → definitions}/device_access.py +11 -22
  157. catalystwan/models/policy/{definition → definitions}/device_access_ipv6.py +11 -20
  158. catalystwan/models/policy/{definition → definitions}/hub_and_spoke.py +4 -18
  159. catalystwan/models/policy/{definition → definitions}/mesh.py +1 -13
  160. catalystwan/models/policy/{definition → definitions}/qos_map.py +32 -39
  161. catalystwan/models/policy/{definition → definitions}/rewrite.py +2 -12
  162. catalystwan/models/policy/{definition → definitions}/rule_set.py +48 -66
  163. catalystwan/models/policy/{definition → definitions}/security_group.py +14 -38
  164. catalystwan/models/policy/{definition → definitions}/traffic_data.py +61 -184
  165. catalystwan/models/policy/{definition → definitions}/vpn_membership.py +1 -13
  166. catalystwan/models/policy/{definition → definitions}/zone_based_firewall.py +32 -93
  167. catalystwan/models/policy/lists.py +330 -0
  168. catalystwan/models/policy/lists_entries.py +444 -0
  169. catalystwan/models/policy/localized.py +16 -34
  170. catalystwan/models/policy/policy.py +10 -14
  171. catalystwan/models/policy/policy_definition.py +173 -673
  172. catalystwan/models/policy/policy_list.py +27 -38
  173. catalystwan/models/policy/security.py +46 -145
  174. catalystwan/response.py +2 -6
  175. catalystwan/session.py +1 -1
  176. catalystwan/tests/templates/definitions/{cisco_vpn_basic.json → Basic_Cisco_VPN_Model.json} +2 -2
  177. catalystwan/tests/templates/definitions/complex_aaa.json +277 -0
  178. catalystwan/tests/templates/definitions/{cisco_vpn_complex.json → complex_cisco_vpn.json} +12 -27
  179. catalystwan/tests/templates/definitions/{cisco_aaa.json → iuo.json} +15 -44
  180. catalystwan/tests/templates/definitions/omp_1.json +11 -0
  181. catalystwan/tests/templates/definitions/{omp_vsmart_2.json → omp_2.json} +2 -16
  182. catalystwan/tests/templates/definitions/{omp_vsmart_3.json → omp_3.json} +2 -16
  183. catalystwan/tests/templates/models/__init__.py +13 -46
  184. catalystwan/tests/templates/models/cisco_aaa.py +48 -81
  185. catalystwan/tests/templates/models/cisco_banner.py +2 -2
  186. catalystwan/tests/templates/models/cisco_bfd.py +6 -4
  187. catalystwan/tests/templates/models/cisco_system.py +3 -108
  188. catalystwan/tests/templates/models/cisco_vpn.py +72 -42
  189. catalystwan/tests/templates/models/omp_vsmart.py +8 -28
  190. catalystwan/tests/templates/schemas/cedge_aaa.json +1 -1
  191. catalystwan/tests/templates/schemas/cisco_system.json +0 -242
  192. catalystwan/tests/templates/schemas/cisco_vpn.json +1 -53
  193. catalystwan/tests/templates/schemas/omp-vsmart.json +0 -20
  194. catalystwan/tests/templates/test_chose_model.py +10 -6
  195. catalystwan/tests/templates/test_deserialize_model.py +4 -4
  196. catalystwan/tests/templates/test_find_template_values.py +0 -229
  197. catalystwan/tests/templates/test_serialize_model.py +2 -1
  198. catalystwan/tests/test_cli_template.py +9 -8
  199. catalystwan/tests/test_endpoints.py +11 -42
  200. catalystwan/tests/test_templates.py +19 -16
  201. catalystwan/utils/feature_template/find_template_values.py +9 -22
  202. catalystwan/utils/timezone.py +422 -0
  203. catalystwan/workflows/tenant_migration.py +1 -1
  204. {catalystwan-0.41.2.dev9.dist-info → catalystwan-0.41.3.dist-info}/METADATA +1 -20
  205. catalystwan-0.41.3.dist-info/RECORD +353 -0
  206. catalystwan/api/builders/__init__.py +0 -14
  207. catalystwan/api/builders/feature_profiles/__init__.py +0 -0
  208. catalystwan/api/builders/feature_profiles/application_priority.py +0 -58
  209. catalystwan/api/builders/feature_profiles/builder_factory.py +0 -59
  210. catalystwan/api/builders/feature_profiles/cli.py +0 -76
  211. catalystwan/api/builders/feature_profiles/mixins.py +0 -44
  212. catalystwan/api/builders/feature_profiles/other.py +0 -79
  213. catalystwan/api/builders/feature_profiles/report.py +0 -155
  214. catalystwan/api/builders/feature_profiles/service.py +0 -248
  215. catalystwan/api/builders/feature_profiles/system.py +0 -80
  216. catalystwan/api/builders/feature_profiles/transport.py +0 -256
  217. catalystwan/api/builders/feature_profiles/uc_voice.py +0 -287
  218. catalystwan/api/templates/models/aaa_model.py +0 -387
  219. catalystwan/api/templates/models/vpn_vsmart_interface_model.py +0 -198
  220. catalystwan/api/templates/models/vpn_vsmart_model.py +0 -124
  221. catalystwan/endpoints/configuration/feature_profile/sdwan/application_priority.py +0 -107
  222. catalystwan/endpoints/configuration/feature_profile/sdwan/cli.py +0 -60
  223. catalystwan/endpoints/configuration/feature_profile/sdwan/dns_security.py +0 -83
  224. catalystwan/endpoints/configuration/feature_profile/sdwan/embedded_security.py +0 -88
  225. catalystwan/endpoints/configuration/feature_profile/sdwan/other.py +0 -62
  226. catalystwan/endpoints/configuration/feature_profile/sdwan/service.py +0 -154
  227. catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py +0 -88
  228. catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py +0 -93
  229. catalystwan/endpoints/configuration/feature_profile/sdwan/uc_voice.py +0 -77
  230. catalystwan/endpoints/configuration/network_hierarchy.py +0 -47
  231. catalystwan/endpoints/configuration/packages.py +0 -36
  232. catalystwan/endpoints/configuration/policy/abstractions.py +0 -49
  233. catalystwan/endpoints/configuration/policy/definition/aip.py +0 -52
  234. catalystwan/endpoints/configuration/policy/definition/amp.py +0 -52
  235. catalystwan/endpoints/configuration/policy/definition/app_route.py +0 -50
  236. catalystwan/endpoints/configuration/policy/definition/cflowd.py +0 -46
  237. catalystwan/endpoints/configuration/policy/definition/dial_peer.py +0 -57
  238. catalystwan/endpoints/configuration/policy/definition/dns_security.py +0 -50
  239. catalystwan/endpoints/configuration/policy/definition/fxo_port.py +0 -57
  240. catalystwan/endpoints/configuration/policy/definition/fxs_did_port.py +0 -57
  241. catalystwan/endpoints/configuration/policy/definition/fxs_port.py +0 -57
  242. catalystwan/endpoints/configuration/policy/definition/intrusion_prevention.py +0 -52
  243. catalystwan/endpoints/configuration/policy/definition/pri_isdn_port.py +0 -57
  244. catalystwan/endpoints/configuration/policy/definition/route_policy.py +0 -50
  245. catalystwan/endpoints/configuration/policy/definition/srst_phone_profile.py +0 -59
  246. catalystwan/endpoints/configuration/policy/definition/ssl_decryption.py +0 -50
  247. catalystwan/endpoints/configuration/policy/definition/ssl_decryption_utd_profile.py +0 -52
  248. catalystwan/endpoints/configuration/policy/definition/url_filtering.py +0 -50
  249. catalystwan/endpoints/configuration/policy/definition/vpn_qos_map.py +0 -50
  250. catalystwan/endpoints/configuration/policy/list/extended_community.py +0 -52
  251. catalystwan/endpoints/configuration/policy/list/fax_protocol.py +0 -48
  252. catalystwan/endpoints/configuration/policy/list/identity.py +0 -48
  253. catalystwan/endpoints/configuration/policy/list/media_profile.py +0 -52
  254. catalystwan/endpoints/configuration/policy/list/modem_pass_through.py +0 -52
  255. catalystwan/endpoints/configuration/policy/list/scalable_group_tag.py +0 -52
  256. catalystwan/endpoints/configuration/policy/list/supervisory_disconnect.py +0 -52
  257. catalystwan/endpoints/configuration/policy/list/threat_grid_api_key.py +0 -52
  258. catalystwan/endpoints/configuration/policy/list/translation_profile.py +0 -52
  259. catalystwan/endpoints/configuration/policy/list/translation_rules.py +0 -52
  260. catalystwan/endpoints/configuration/policy/list/trunkgroup.py +0 -48
  261. catalystwan/endpoints/configuration/policy/list/umbrella_data.py +0 -52
  262. catalystwan/endpoints/configuration/policy/voice_template.py +0 -39
  263. catalystwan/endpoints/configuration/policy_group.py +0 -30
  264. catalystwan/endpoints/configuration/topology_group.py +0 -51
  265. catalystwan/endpoints/configuration_general_template.py +0 -31
  266. catalystwan/endpoints/configuration_template_master.py +0 -48
  267. catalystwan/integration_tests/base.py +0 -81
  268. catalystwan/integration_tests/feature_profile/sdwan/__init__.py +0 -0
  269. catalystwan/integration_tests/feature_profile/sdwan/policy/__init__.py +0 -0
  270. catalystwan/integration_tests/feature_profile/sdwan/policy/base.py +0 -33
  271. catalystwan/integration_tests/feature_profile/sdwan/policy/test_extended_community.py +0 -33
  272. catalystwan/integration_tests/feature_profile/sdwan/policy/test_security_app_list.py +0 -32
  273. catalystwan/integration_tests/feature_profile/sdwan/test_application_priority.py +0 -433
  274. catalystwan/integration_tests/feature_profile/sdwan/test_cli.py +0 -54
  275. catalystwan/integration_tests/feature_profile/sdwan/test_dns_security.py +0 -106
  276. catalystwan/integration_tests/feature_profile/sdwan/test_other.py +0 -49
  277. catalystwan/integration_tests/feature_profile/sdwan/test_service.py +0 -1078
  278. catalystwan/integration_tests/feature_profile/sdwan/test_sig_security.py +0 -322
  279. catalystwan/integration_tests/feature_profile/sdwan/test_ssl_decryption.py +0 -85
  280. catalystwan/integration_tests/feature_profile/sdwan/test_system.py +0 -368
  281. catalystwan/integration_tests/feature_profile/sdwan/test_tracker.py +0 -127
  282. catalystwan/integration_tests/feature_profile/sdwan/test_transport.py +0 -1698
  283. catalystwan/integration_tests/feature_profile/sdwan/topology/test_topology.py +0 -93
  284. catalystwan/integration_tests/feature_profile/test_parcel.py +0 -54
  285. catalystwan/integration_tests/profile_builder/__init__.py +0 -0
  286. catalystwan/integration_tests/profile_builder/test_pb_service.py +0 -197
  287. catalystwan/integration_tests/profile_builder/test_pb_transport.py +0 -226
  288. catalystwan/integration_tests/profile_builder/test_pb_uc_voice.py +0 -277
  289. catalystwan/integration_tests/test_data/__init__.py +0 -117
  290. catalystwan/integration_tests/test_network_hierarchy.py +0 -82
  291. catalystwan/integration_tests/test_settings.py +0 -30
  292. catalystwan/models/configuration/feature_profile/parcel.py +0 -245
  293. catalystwan/models/configuration/feature_profile/sdwan/acl/__init__.py +0 -13
  294. catalystwan/models/configuration/feature_profile/sdwan/acl/ipv4acl.py +0 -298
  295. catalystwan/models/configuration/feature_profile/sdwan/acl/ipv6acl.py +0 -344
  296. catalystwan/models/configuration/feature_profile/sdwan/application_priority/__init__.py +0 -218
  297. catalystwan/models/configuration/feature_profile/sdwan/application_priority/cloud_probe.py +0 -61
  298. catalystwan/models/configuration/feature_profile/sdwan/application_priority/policy_settings.py +0 -31
  299. catalystwan/models/configuration/feature_profile/sdwan/application_priority/qos_policy.py +0 -102
  300. catalystwan/models/configuration/feature_profile/sdwan/application_priority/traffic_policy.py +0 -1057
  301. catalystwan/models/configuration/feature_profile/sdwan/cli/__init__.py +0 -23
  302. catalystwan/models/configuration/feature_profile/sdwan/cli/config.py +0 -18
  303. catalystwan/models/configuration/feature_profile/sdwan/cli/full_config.py +0 -15
  304. catalystwan/models/configuration/feature_profile/sdwan/dns_security/__init__.py +0 -13
  305. catalystwan/models/configuration/feature_profile/sdwan/dns_security/dns.py +0 -110
  306. catalystwan/models/configuration/feature_profile/sdwan/embedded_security/__init__.py +0 -23
  307. catalystwan/models/configuration/feature_profile/sdwan/embedded_security/ngfirewall.py +0 -493
  308. catalystwan/models/configuration/feature_profile/sdwan/embedded_security/policy.py +0 -171
  309. catalystwan/models/configuration/feature_profile/sdwan/other/__init__.py +0 -25
  310. catalystwan/models/configuration/feature_profile/sdwan/other/cybervision.py +0 -44
  311. catalystwan/models/configuration/feature_profile/sdwan/other/thousandeyes.py +0 -147
  312. catalystwan/models/configuration/feature_profile/sdwan/other/ucse.py +0 -110
  313. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/as_path.py +0 -22
  314. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/extended_community.py +0 -34
  315. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv4_network_object.py +0 -15
  316. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv4_service_object.py +0 -254
  317. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/mirror.py +0 -27
  318. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/network_object_group.py +0 -15
  319. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/object_group.py +0 -15
  320. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/service_object_group.py +0 -21
  321. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/aip.py +0 -64
  322. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/amp.py +0 -79
  323. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/identity.py +0 -30
  324. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/intrusion_prevention.py +0 -58
  325. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/object_group.py +0 -72
  326. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/rule_set.py +0 -137
  327. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/scalable_group_tag.py +0 -26
  328. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ssl_decryption.py +0 -126
  329. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ssl_decryption_profile.py +0 -165
  330. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url_filtering.py +0 -148
  331. catalystwan/models/configuration/feature_profile/sdwan/routing/__init__.py +0 -26
  332. catalystwan/models/configuration/feature_profile/sdwan/routing/bgp.py +0 -609
  333. catalystwan/models/configuration/feature_profile/sdwan/service/__init__.py +0 -91
  334. catalystwan/models/configuration/feature_profile/sdwan/service/dual_router_ha.py +0 -26
  335. catalystwan/models/configuration/feature_profile/sdwan/service/lan/multilink.py +0 -101
  336. catalystwan/models/configuration/feature_profile/sdwan/service/service_chain.py +0 -38
  337. catalystwan/models/configuration/feature_profile/sdwan/sig_security/__init__.py +0 -19
  338. catalystwan/models/configuration/feature_profile/sdwan/sig_security/sig_security.py +0 -379
  339. catalystwan/models/configuration/feature_profile/sdwan/system/__init__.py +0 -59
  340. catalystwan/models/configuration/feature_profile/sdwan/system/banner.py +0 -30
  341. catalystwan/models/configuration/feature_profile/sdwan/system/basic.py +0 -290
  342. catalystwan/models/configuration/feature_profile/sdwan/system/bfd.py +0 -69
  343. catalystwan/models/configuration/feature_profile/sdwan/system/device_access.py +0 -157
  344. catalystwan/models/configuration/feature_profile/sdwan/system/device_access_ipv6.py +0 -157
  345. catalystwan/models/configuration/feature_profile/sdwan/system/global_parcel.py +0 -163
  346. catalystwan/models/configuration/feature_profile/sdwan/system/logging_parcel.py +0 -162
  347. catalystwan/models/configuration/feature_profile/sdwan/system/mrf.py +0 -75
  348. catalystwan/models/configuration/feature_profile/sdwan/system/ntp.py +0 -103
  349. catalystwan/models/configuration/feature_profile/sdwan/system/omp.py +0 -120
  350. catalystwan/models/configuration/feature_profile/sdwan/system/security.py +0 -179
  351. catalystwan/models/configuration/feature_profile/sdwan/system/snmp.py +0 -173
  352. catalystwan/models/configuration/feature_profile/sdwan/topology/__init__.py +0 -29
  353. catalystwan/models/configuration/feature_profile/sdwan/topology/custom_control.py +0 -425
  354. catalystwan/models/configuration/feature_profile/sdwan/topology/hubspoke.py +0 -60
  355. catalystwan/models/configuration/feature_profile/sdwan/topology/mesh.py +0 -23
  356. catalystwan/models/configuration/feature_profile/sdwan/trackers/__init__.py +0 -36
  357. catalystwan/models/configuration/feature_profile/sdwan/trackers/tracker.py +0 -96
  358. catalystwan/models/configuration/feature_profile/sdwan/trackers/tracker_group.py +0 -63
  359. catalystwan/models/configuration/feature_profile/sdwan/transport/__init__.py +0 -93
  360. catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_profile.py +0 -71
  361. catalystwan/models/configuration/feature_profile/sdwan/transport/gps.py +0 -37
  362. catalystwan/models/configuration/feature_profile/sdwan/transport/management/ethernet.py +0 -121
  363. catalystwan/models/configuration/feature_profile/sdwan/transport/t1e1controller.py +0 -124
  364. catalystwan/models/configuration/feature_profile/sdwan/transport/vpn.py +0 -285
  365. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/cellular.py +0 -173
  366. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/ethernet.py +0 -389
  367. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/gre.py +0 -46
  368. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/ipsec.py +0 -137
  369. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/multilink.py +0 -219
  370. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/protocol_over.py +0 -405
  371. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/t1e1serial.py +0 -195
  372. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/__init__.py +0 -62
  373. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/analog_interface.py +0 -436
  374. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/call_routing.py +0 -179
  375. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/digital_interface.py +0 -380
  376. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/dsp_farm.py +0 -193
  377. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/media_profile.py +0 -17
  378. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/server_group.py +0 -51
  379. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/srst.py +0 -86
  380. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/supervisory_disconnect.py +0 -69
  381. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/translation_profile.py +0 -42
  382. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/translation_rule.py +0 -31
  383. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/trunk_group.py +0 -26
  384. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/voice_global.py +0 -57
  385. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/voice_tenant.py +0 -40
  386. catalystwan/models/configuration/network_hierarchy/__init__.py +0 -24
  387. catalystwan/models/configuration/network_hierarchy/cflowd.py +0 -128
  388. catalystwan/models/configuration/network_hierarchy/node.py +0 -88
  389. catalystwan/models/configuration/network_hierarchy/security_logging.py +0 -91
  390. catalystwan/models/configuration/packages.py +0 -57
  391. catalystwan/models/configuration/policy_group.py +0 -74
  392. catalystwan/models/configuration/topology_group.py +0 -52
  393. catalystwan/models/policy/definition/aip.py +0 -60
  394. catalystwan/models/policy/definition/amp.py +0 -65
  395. catalystwan/models/policy/definition/app_route.py +0 -246
  396. catalystwan/models/policy/definition/cflowd.py +0 -95
  397. catalystwan/models/policy/definition/dial_peer.py +0 -60
  398. catalystwan/models/policy/definition/dns_security.py +0 -130
  399. catalystwan/models/policy/definition/fxo_port.py +0 -63
  400. catalystwan/models/policy/definition/fxs_did_port.py +0 -58
  401. catalystwan/models/policy/definition/fxs_port.py +0 -56
  402. catalystwan/models/policy/definition/intrusion_prevention.py +0 -55
  403. catalystwan/models/policy/definition/pri_isdn_port.py +0 -48
  404. catalystwan/models/policy/definition/route_policy.py +0 -187
  405. catalystwan/models/policy/definition/srst_phone_profile.py +0 -37
  406. catalystwan/models/policy/definition/ssl_decryption.py +0 -209
  407. catalystwan/models/policy/definition/ssl_decryption_utd_profile.py +0 -88
  408. catalystwan/models/policy/definition/url_filtering.py +0 -70
  409. catalystwan/models/policy/definition/vpn_qos_map.py +0 -46
  410. catalystwan/models/policy/list/app.py +0 -44
  411. catalystwan/models/policy/list/app_probe.py +0 -42
  412. catalystwan/models/policy/list/as_path.py +0 -30
  413. catalystwan/models/policy/list/class_map.py +0 -30
  414. catalystwan/models/policy/list/color.py +0 -28
  415. catalystwan/models/policy/list/communities.py +0 -83
  416. catalystwan/models/policy/list/data_ipv6_prefix.py +0 -30
  417. catalystwan/models/policy/list/data_prefix.py +0 -30
  418. catalystwan/models/policy/list/fax_protocol.py +0 -45
  419. catalystwan/models/policy/list/fqdn.py +0 -24
  420. catalystwan/models/policy/list/geo_location.py +0 -33
  421. catalystwan/models/policy/list/identity.py +0 -29
  422. catalystwan/models/policy/list/ips_signature.py +0 -27
  423. catalystwan/models/policy/list/ipv6_prefix.py +0 -33
  424. catalystwan/models/policy/list/local_app.py +0 -45
  425. catalystwan/models/policy/list/local_domain.py +0 -36
  426. catalystwan/models/policy/list/media_profile.py +0 -44
  427. catalystwan/models/policy/list/mirror.py +0 -27
  428. catalystwan/models/policy/list/modem_pass_through.py +0 -27
  429. catalystwan/models/policy/list/policer.py +0 -39
  430. catalystwan/models/policy/list/port.py +0 -33
  431. catalystwan/models/policy/list/preferred_color_group.py +0 -82
  432. catalystwan/models/policy/list/prefix.py +0 -33
  433. catalystwan/models/policy/list/protocol_name.py +0 -26
  434. catalystwan/models/policy/list/region.py +0 -45
  435. catalystwan/models/policy/list/scalable_group_tag.py +0 -30
  436. catalystwan/models/policy/list/site.py +0 -34
  437. catalystwan/models/policy/list/sla.py +0 -77
  438. catalystwan/models/policy/list/supervisory_disconnect.py +0 -62
  439. catalystwan/models/policy/list/threat_grid_api_key.py +0 -32
  440. catalystwan/models/policy/list/tloc.py +0 -32
  441. catalystwan/models/policy/list/translation_profile.py +0 -32
  442. catalystwan/models/policy/list/translation_rules.py +0 -29
  443. catalystwan/models/policy/list/trunkgroup.py +0 -56
  444. catalystwan/models/policy/list/umbrella_data.py +0 -30
  445. catalystwan/models/policy/list/url.py +0 -39
  446. catalystwan/models/policy/list/vpn.py +0 -40
  447. catalystwan/models/policy/list/zone.py +0 -46
  448. catalystwan/models/policy/voice.py +0 -77
  449. catalystwan/models/settings.py +0 -41
  450. catalystwan/models/templates.py +0 -79
  451. catalystwan/tests/builders/test_report.py +0 -60
  452. catalystwan/tests/builders/uc_voice.py +0 -85
  453. catalystwan/tests/models/__init__.py +0 -0
  454. catalystwan/tests/models/configuration/feature_profile/sdwan/policy_object/security/test_url.py +0 -73
  455. catalystwan/tests/models/test_digital_interface.py +0 -56
  456. catalystwan/tests/templates/definitions/aaa_basic.json +0 -96
  457. catalystwan/tests/templates/definitions/aaa_complex.json +0 -464
  458. catalystwan/tests/templates/definitions/cisco_aaa_complex.json +0 -361
  459. catalystwan/tests/templates/definitions/cisco_logging_complex.json +0 -268
  460. catalystwan/tests/templates/definitions/cisco_ntp_complex.json +0 -143
  461. catalystwan/tests/templates/definitions/cisco_omp_complex.json +0 -175
  462. catalystwan/tests/templates/definitions/cisco_ospf_complex.json +0 -302
  463. catalystwan/tests/templates/definitions/cisco_sig.json +0 -405
  464. catalystwan/tests/templates/definitions/cisco_snmp_complex.json +0 -258
  465. catalystwan/tests/templates/definitions/cisco_system_complex.json +0 -502
  466. catalystwan/tests/templates/definitions/cisco_vpn_interface_complex.json +0 -821
  467. catalystwan/tests/templates/definitions/omp_vsmart_1.json +0 -26
  468. catalystwan/tests/templates/definitions/omp_vsmart_complex.json +0 -73
  469. catalystwan/tests/templates/definitions/security_vsmart_complex.json +0 -24
  470. catalystwan/tests/templates/definitions/system_vsmart_complex.json +0 -193
  471. catalystwan/tests/templates/definitions/vpn_vsmart_basic.json +0 -17
  472. catalystwan/tests/templates/definitions/vpn_vsmart_complex.json +0 -179
  473. catalystwan/tests/templates/definitions/vpn_vsmart_interface_basic.json +0 -42
  474. catalystwan/tests/templates/definitions/vpn_vsmart_interface_complex.json +0 -208
  475. catalystwan/tests/templates/models/aaa.py +0 -106
  476. catalystwan/tests/templates/models/cisco_logging.py +0 -65
  477. catalystwan/tests/templates/models/cisco_ntp.py +0 -17
  478. catalystwan/tests/templates/models/cisco_omp.py +0 -37
  479. catalystwan/tests/templates/models/cisco_ospf.py +0 -60
  480. catalystwan/tests/templates/models/cisco_secure_internet_gateway.py +0 -95
  481. catalystwan/tests/templates/models/cisco_snmp.py +0 -40
  482. catalystwan/tests/templates/models/cisco_vpn_interface.py +0 -200
  483. catalystwan/tests/templates/models/security_vsmart.py +0 -11
  484. catalystwan/tests/templates/models/system_vsmart.py +0 -37
  485. catalystwan/tests/templates/models/vpn_vsmart.py +0 -32
  486. catalystwan/tests/templates/models/vpn_vsmart_interface.py +0 -54
  487. catalystwan/tests/templates/schemas/aaa.json +0 -1096
  488. catalystwan/tests/templates/schemas/cisco_logging.json +0 -577
  489. catalystwan/tests/templates/schemas/cisco_ntp.json +0 -265
  490. catalystwan/tests/templates/schemas/cisco_omp.json +0 -479
  491. catalystwan/tests/templates/schemas/cisco_ospf.json +0 -908
  492. catalystwan/tests/templates/schemas/cisco_secure_internet_gateway.json +0 -1520
  493. catalystwan/tests/templates/schemas/cisco_snmp.json +0 -561
  494. catalystwan/tests/templates/schemas/cisco_vpn_interface.json +0 -3348
  495. catalystwan/tests/templates/schemas/security-vsmart.json +0 -58
  496. catalystwan/tests/templates/schemas/system-vsmart.json +0 -2585
  497. catalystwan/tests/templates/schemas/vpn-vsmart-interface.json +0 -859
  498. catalystwan/tests/templates/schemas/vpn-vsmart.json +0 -445
  499. catalystwan/tests/templates/test_find_template_values_2.py +0 -193
  500. catalystwan/tests/test_feature_profile_api.py +0 -282
  501. catalystwan/tests/test_models_common.py +0 -53
  502. catalystwan/utils/model.py +0 -48
  503. catalystwan/utils/persona.py +0 -5
  504. catalystwan/utils/type_check.py +0 -22
  505. catalystwan/workflows/backup_restore_device_templates.py +0 -467
  506. catalystwan-0.41.2.dev9.dist-info/RECORD +0 -641
  507. /catalystwan/tests/templates/definitions/{cisco_banner.json → banner_1.json} +0 -0
  508. {catalystwan-0.41.2.dev9.dist-info → catalystwan-0.41.3.dist-info}/LICENSE +0 -0
  509. {catalystwan-0.41.2.dev9.dist-info → catalystwan-0.41.3.dist-info}/WHEEL +0 -0
@@ -0,0 +1,444 @@
1
+ # Copyright 2023 Cisco Systems, Inc. and its affiliates
2
+
3
+ from ipaddress import IPv4Address, IPv4Network, IPv6Network
4
+ from typing import List, Literal, Optional, Set
5
+ from uuid import UUID
6
+
7
+ from pydantic import BaseModel, ConfigDict, Field, IPvAnyAddress, field_validator, model_validator
8
+
9
+ from catalystwan.models.common import InterfaceType, TLOCColor, check_fields_exclusive
10
+
11
+
12
+ def check_jitter_ms(jitter_str: str) -> str:
13
+ assert 1 <= int(jitter_str) <= 1000
14
+ return jitter_str
15
+
16
+
17
+ def check_latency_ms(latency_str: str) -> str:
18
+ assert 1 <= int(latency_str) <= 1000
19
+ return latency_str
20
+
21
+
22
+ def check_loss_percent(loss_str: str) -> str:
23
+ assert 0 <= int(loss_str) <= 100
24
+ return loss_str
25
+
26
+
27
+ PolicerExceedAction = Literal[
28
+ "drop",
29
+ "remark",
30
+ ]
31
+
32
+ EncapType = Literal[
33
+ "ipsec",
34
+ "gre",
35
+ ]
36
+
37
+ PathPreference = Literal[
38
+ "direct-path",
39
+ "multi-hop-path",
40
+ "all-paths",
41
+ ]
42
+
43
+
44
+ class ColorDSCPMap(BaseModel):
45
+ color: TLOCColor
46
+ dscp: int = Field(ge=0, le=63)
47
+
48
+
49
+ class ColorGroupPreference(BaseModel):
50
+ model_config = ConfigDict(populate_by_name=True)
51
+
52
+ color_preference: str = Field(serialization_alias="colorPreference", validation_alias="colorPreference")
53
+ path_preference: PathPreference = Field(serialization_alias="pathPreference", validation_alias="pathPreference")
54
+
55
+ @staticmethod
56
+ def from_color_set_and_path(
57
+ color_preference: Set[TLOCColor], path_preference: PathPreference
58
+ ) -> "ColorGroupPreference":
59
+ return ColorGroupPreference(color_preference=" ".join(color_preference), path_preference=path_preference)
60
+
61
+
62
+ class FallbackBestTunnel(BaseModel):
63
+ model_config = ConfigDict(populate_by_name=True)
64
+
65
+ criteria: str
66
+ jitter_variance: Optional[str] = Field(
67
+ default=None,
68
+ serialization_alias="jitterVariance",
69
+ validation_alias="jitterVariance",
70
+ description="jitter variance in ms",
71
+ )
72
+ latency_variance: Optional[str] = Field(
73
+ default=None,
74
+ serialization_alias="latencyVariance",
75
+ validation_alias="latencyVariance",
76
+ description="latency variance in ms",
77
+ )
78
+ loss_variance: Optional[str] = Field(
79
+ default=None,
80
+ serialization_alias="lossVariance",
81
+ validation_alias="lossVariance",
82
+ description="loss variance as percentage",
83
+ )
84
+ _criteria_priority: List[Literal["jitter", "latency", "loss"]] = []
85
+
86
+ # validators
87
+ _jitter_validator = field_validator("jitter_variance")(check_jitter_ms)
88
+ _latency_validator = field_validator("latency_variance")(check_latency_ms)
89
+ _loss_validator = field_validator("loss_variance")(check_loss_percent)
90
+
91
+ @model_validator(mode="after")
92
+ def check_criteria(self):
93
+ expected_criteria = set()
94
+ if self.jitter_variance is not None:
95
+ expected_criteria.add("jitter")
96
+ if self.latency_variance is not None:
97
+ expected_criteria.add("latency")
98
+ if self.loss_variance is not None:
99
+ expected_criteria.add("loss")
100
+ assert expected_criteria, "At least one variance type needs to be present"
101
+ self._criteria_priority = str(self.criteria).split("-")
102
+ observed_criteria = set(self._criteria_priority)
103
+ assert expected_criteria == observed_criteria
104
+ return self
105
+
106
+ def _update_criteria_field(self) -> None:
107
+ self.criteria = f"{'-'.join(self._criteria_priority)}"
108
+
109
+ def add_jitter_criteria(self, jitter_variance: int) -> None:
110
+ if self.jitter_variance is None:
111
+ self._criteria_priority.append("jitter")
112
+ self.jitter_variance = str(jitter_variance)
113
+ self._update_criteria_field()
114
+ self.check_criteria
115
+
116
+ def add_latency_criteria(self, latency_variance: int) -> None:
117
+ if self.latency_variance is None:
118
+ self._criteria_priority.append("latency")
119
+ self.latency_variance = str(latency_variance)
120
+ self._update_criteria_field()
121
+ self.check_criteria
122
+
123
+ def add_loss_criteria(self, loss_variance: int) -> None:
124
+ if self.loss_variance is None:
125
+ self._criteria_priority.append("loss")
126
+ self.loss_variance = str(loss_variance)
127
+ self._update_criteria_field()
128
+ self.check_criteria
129
+
130
+
131
+ class DataPrefixListEntry(BaseModel):
132
+ model_config = ConfigDict(populate_by_name=True)
133
+
134
+ ip_prefix: IPv4Network = Field(serialization_alias="ipPrefix", validation_alias="ipPrefix")
135
+
136
+
137
+ class SiteListEntry(BaseModel):
138
+ model_config = ConfigDict(populate_by_name=True)
139
+
140
+ site_id: str = Field(serialization_alias="siteId", validation_alias="siteId")
141
+
142
+
143
+ class VPNListEntry(BaseModel):
144
+ vpn: str = Field(description="0-65530 range or single number")
145
+
146
+ @field_validator("vpn")
147
+ @classmethod
148
+ def check_vpn_range(cls, vpns_str: str):
149
+ vpns = [int(vpn) for vpn in vpns_str.split("-")]
150
+ assert len(vpns) <= 2
151
+ for vpn in vpns:
152
+ assert 0 <= vpn <= 65530
153
+ if len(vpns) == 2:
154
+ assert vpns[0] <= vpns[1]
155
+ return vpns_str
156
+
157
+
158
+ class ZoneListEntry(BaseModel):
159
+ vpn: Optional[str] = Field(default=None, description="0-65530 single number")
160
+ interface: Optional[InterfaceType] = None
161
+
162
+ @field_validator("vpn")
163
+ @classmethod
164
+ def check_vpn_range(cls, vpn_str: str):
165
+ assert 0 <= int(vpn_str) <= 65530
166
+ return vpn_str
167
+
168
+ @model_validator(mode="after")
169
+ def check_vpn_xor_interface(self):
170
+ check_fields_exclusive(self.__dict__, {"vpn", "interface"}, True)
171
+ return self
172
+
173
+
174
+ class FQDNListEntry(BaseModel):
175
+ pattern: str
176
+
177
+
178
+ class GeoLocationListEntry(BaseModel):
179
+ country: Optional[str] = Field(default=None, description="ISO-3166 alpha-3 country code eg: FRA")
180
+ continent: Optional[str] = Field(
181
+ default=None, description="One of 2-letter continent codes: AF, NA, OC, AN, AS, EU, SA"
182
+ )
183
+
184
+ @model_validator(mode="after")
185
+ def check_country_xor_continent(self):
186
+ check_fields_exclusive(self.__dict__, {"country", "continent"}, True)
187
+ return self
188
+
189
+
190
+ class PortListEntry(BaseModel):
191
+ port: str
192
+
193
+ @field_validator("port")
194
+ @classmethod
195
+ def check_port_range(cls, port_str: str):
196
+ assert 0 <= int(port_str) <= 65535
197
+ return port_str
198
+
199
+
200
+ class ProtocolNameListEntry(BaseModel):
201
+ model_config = ConfigDict(populate_by_name=True)
202
+
203
+ protocol_name: str = Field(serialization_alias="protocolName", validation_alias="protocolName")
204
+
205
+
206
+ class LocalAppListEntry(BaseModel):
207
+ model_config = ConfigDict(populate_by_name=True)
208
+
209
+ app_family: Optional[str] = Field(default=None, serialization_alias="appFamily", validation_alias="appFamily")
210
+ app: Optional[str] = None
211
+
212
+ @model_validator(mode="after")
213
+ def check_app_xor_appfamily(self):
214
+ check_fields_exclusive(self.__dict__, {"app", "app_family"}, True)
215
+ return self
216
+
217
+
218
+ class AppListEntry(BaseModel):
219
+ model_config = ConfigDict(populate_by_name=True)
220
+
221
+ app_family: Optional[str] = Field(default=None, serialization_alias="appFamily", validation_alias="appFamily")
222
+ app: Optional[str] = None
223
+
224
+ @model_validator(mode="after")
225
+ def check_app_xor_appfamily(self):
226
+ check_fields_exclusive(self.__dict__, {"app", "app_family"}, True)
227
+ return self
228
+
229
+
230
+ class ColorListEntry(BaseModel):
231
+ color: TLOCColor
232
+
233
+
234
+ class DataIPv6PrefixListEntry(BaseModel):
235
+ model_config = ConfigDict(populate_by_name=True)
236
+
237
+ ipv6_prefix: IPv6Network = Field(serialization_alias="ipv6Prefix", validation_alias="ipv6Prefix")
238
+
239
+
240
+ class LocalDomainListEntry(BaseModel):
241
+ model_config = ConfigDict(populate_by_name=True)
242
+
243
+ name_server: str = Field(
244
+ pattern="^[^*+].*",
245
+ serialization_alias="nameServer",
246
+ validation_alias="nameServer",
247
+ max_length=240,
248
+ description="Must be valid std regex."
249
+ "String cannot start with a '*' or a '+', be empty, or be more than 240 characters",
250
+ )
251
+
252
+
253
+ class IPSSignatureListEntry(BaseModel):
254
+ model_config = ConfigDict(populate_by_name=True)
255
+
256
+ generator_id: str = Field(serialization_alias="generatorId", validation_alias="generatorId")
257
+ signature_id: str = Field(serialization_alias="signatureId", validation_alias="signatureId")
258
+
259
+
260
+ class URLListEntry(BaseModel):
261
+ model_config = ConfigDict(populate_by_name=True)
262
+
263
+ pattern: str
264
+
265
+
266
+ class CommunityListEntry(BaseModel):
267
+ model_config = ConfigDict(populate_by_name=True)
268
+
269
+ community: str = Field(description="Example: 1000:10000 or internet or local-AS or no advertise or no-export")
270
+
271
+
272
+ class PolicerListEntry(BaseModel):
273
+ model_config = ConfigDict(populate_by_name=True)
274
+
275
+ burst: str = Field(description="bytes: integer in range 15000-10000000")
276
+ exceed: PolicerExceedAction = "drop"
277
+ rate: str = Field(description="bps: integer in range 8-100000000000")
278
+
279
+ @field_validator("burst")
280
+ @classmethod
281
+ def check_burst(cls, burst_str: str):
282
+ assert 15000 <= int(burst_str) <= 10_000_000
283
+ return burst_str
284
+
285
+ @field_validator("rate")
286
+ @classmethod
287
+ def check_rate(cls, rate_str: str):
288
+ assert 8 <= int(rate_str) <= 100_000_000_000
289
+ return rate_str
290
+
291
+
292
+ class ASPathListEntry(BaseModel):
293
+ model_config = ConfigDict(populate_by_name=True)
294
+
295
+ as_path: str = Field(serialization_alias="asPath", validation_alias="asPath")
296
+
297
+
298
+ class ClassMapListEntry(BaseModel):
299
+ queue: str
300
+
301
+ @field_validator("queue")
302
+ @classmethod
303
+ def check_queue(cls, queue_str: str):
304
+ assert 0 <= int(queue_str) <= 7
305
+ return queue_str
306
+
307
+
308
+ class MirrorListEntry(BaseModel):
309
+ model_config = ConfigDict(populate_by_name=True)
310
+
311
+ remote_dest: IPvAnyAddress = Field(serialization_alias="remoteDest", validation_alias="remoteDest")
312
+ source: IPvAnyAddress
313
+
314
+
315
+ class AppProbeClassListEntry(BaseModel):
316
+ model_config = ConfigDict(populate_by_name=True)
317
+
318
+ forwarding_class: str = Field(serialization_alias="forwardingClass", validation_alias="forwardingClass")
319
+ map: List[ColorDSCPMap] = []
320
+
321
+ def add_color_mapping(self, color: TLOCColor, dscp: int) -> None:
322
+ self.map.append(ColorDSCPMap(color=color, dscp=dscp))
323
+
324
+
325
+ class SLAClassListEntry(BaseModel):
326
+ model_config = ConfigDict(populate_by_name=True)
327
+
328
+ latency: Optional[str] = None
329
+ loss: Optional[str] = None
330
+ jitter: Optional[str] = None
331
+ app_probe_class: Optional[UUID] = Field(serialization_alias="appProbeClass", validation_alias="appProbeClass")
332
+ fallback_best_tunnel: Optional[FallbackBestTunnel] = Field(
333
+ default=None, serialization_alias="fallbackBestTunnel", validation_alias="fallbackBestTunnel"
334
+ )
335
+
336
+ # validators
337
+ _jitter_validator = field_validator("jitter")(check_jitter_ms)
338
+ _latency_validator = field_validator("latency")(check_latency_ms)
339
+ _loss_validator = field_validator("loss")(check_loss_percent)
340
+
341
+ @model_validator(mode="after")
342
+ def check_at_least_one_criteria_is_set(self):
343
+ assert any([self.latency, self.loss, self.jitter])
344
+ return self
345
+
346
+ def add_fallback_jitter_criteria(self, jitter_variance: int) -> None:
347
+ if self.fallback_best_tunnel:
348
+ self.fallback_best_tunnel.add_jitter_criteria(jitter_variance)
349
+ else:
350
+ self.fallback_best_tunnel = FallbackBestTunnel(criteria="jitter", jitter_variance=str(jitter_variance))
351
+
352
+ def add_fallback_latency_criteria(self, latency_variance: int) -> None:
353
+ if self.fallback_best_tunnel:
354
+ self.fallback_best_tunnel.add_latency_criteria(latency_variance)
355
+ else:
356
+ self.fallback_best_tunnel = FallbackBestTunnel(criteria="latency", latency_variance=str(latency_variance))
357
+
358
+ def add_fallback_loss_criteria(self, loss_variance: int) -> None:
359
+ if self.fallback_best_tunnel:
360
+ self.fallback_best_tunnel.add_loss_criteria(loss_variance)
361
+ else:
362
+ self.fallback_best_tunnel = FallbackBestTunnel(criteria="loss", loss_variance=str(loss_variance))
363
+
364
+
365
+ class TLOCListEntry(BaseModel):
366
+ tloc: IPv4Address
367
+ color: TLOCColor
368
+ encap: EncapType
369
+ preference: Optional[str] = None
370
+
371
+ @field_validator("preference")
372
+ @classmethod
373
+ def check_preference(cls, preference_str: str):
374
+ if preference_str is not None:
375
+ assert 0 <= int(preference_str) <= 2**32 - 1
376
+ return preference_str
377
+
378
+
379
+ class PreferredColorGroupListEntry(BaseModel):
380
+ model_config = ConfigDict(populate_by_name=True)
381
+
382
+ primary_preference: ColorGroupPreference = Field(
383
+ serialization_alias="primaryPreference", validation_alias="primaryPreference"
384
+ )
385
+ secondary_preference: Optional[ColorGroupPreference] = Field(
386
+ default=None, serialization_alias="secondaryPreference", validation_alias="secondaryPreference"
387
+ )
388
+ tertiary_preference: Optional[ColorGroupPreference] = Field(
389
+ default=None, serialization_alias="tertiaryPreference", validation_alias="tertiaryPreference"
390
+ )
391
+
392
+ @model_validator(mode="after")
393
+ def check_optional_preferences_order(self):
394
+ assert not (self.secondary_preference is None and self.tertiary_preference is not None)
395
+ return self
396
+
397
+
398
+ class PrefixListEntry(BaseModel):
399
+ model_config = ConfigDict(populate_by_name=True)
400
+
401
+ ip_prefix: IPv4Network = Field(serialization_alias="ipPrefix", validation_alias="ipPrefix")
402
+ ge: Optional[str] = None
403
+ le: Optional[str] = None
404
+
405
+ @field_validator("ge", "le", check_fields=False)
406
+ @classmethod
407
+ def check_ge_and_le(cls, ge_le_str: Optional[str]):
408
+ if ge_le_str is not None:
409
+ assert 0 <= int(ge_le_str) <= 32
410
+ return ge_le_str
411
+
412
+
413
+ class IPv6PrefixListEntry(BaseModel):
414
+ model_config = ConfigDict(populate_by_name=True)
415
+
416
+ ipv6_prefix: IPv6Network = Field(serialization_alias="ipv6Prefix", validation_alias="ipv6Prefix")
417
+ ge: Optional[str] = None
418
+ le: Optional[str] = None
419
+
420
+ @field_validator("ge", "le", check_fields=False)
421
+ @classmethod
422
+ def check_ge_and_le(cls, ge_le_str: Optional[str]):
423
+ if ge_le_str is not None:
424
+ assert 0 <= int(ge_le_str) <= 128
425
+ return ge_le_str
426
+
427
+
428
+ class RegionListEntry(BaseModel):
429
+ model_config = ConfigDict(populate_by_name=True)
430
+
431
+ region_id: str = Field(
432
+ serialization_alias="regionId", validation_alias="regionId", description="Number in range 0-63"
433
+ )
434
+
435
+ @field_validator("region_id")
436
+ @classmethod
437
+ def check_region_id(cls, region_id_str: str):
438
+ regions = [int(region_id) for region_id in region_id_str.split("-")]
439
+ assert len(regions) <= 2
440
+ for region in regions:
441
+ assert 0 <= region <= 63
442
+ if len(regions) == 2:
443
+ assert regions[0] <= regions[1]
444
+ return region_id_str
@@ -1,16 +1,15 @@
1
- # Copyright 2024 Cisco Systems, Inc. and its affiliates
1
+ # Copyright 2023 Cisco Systems, Inc. and its affiliates
2
2
 
3
- from typing import Any, List, Literal, Optional, Union
3
+ from typing import List, Literal, Optional
4
4
  from uuid import UUID
5
5
 
6
- from pydantic import BaseModel, ConfigDict, Field, IPvAnyAddress, model_validator
6
+ from pydantic import BaseModel, ConfigDict, Field, IPvAnyAddress, field_validator
7
7
 
8
8
  from catalystwan.models.policy.policy import AssemblyItemBase, PolicyCreationPayload, PolicyDefinition, PolicyInfo
9
9
 
10
10
  LocalizedPolicySupportedItemType = Literal[
11
11
  "qosMap",
12
12
  "rewriteRule",
13
- "vpnQosMap",
14
13
  "vpnQoSMap",
15
14
  "acl",
16
15
  "aclv6",
@@ -19,15 +18,9 @@ LocalizedPolicySupportedItemType = Literal[
19
18
  "deviceaccesspolicyv6",
20
19
  "deviceAccessPolicyv6",
21
20
  "vedgeRoute",
22
- "vedgeroute",
23
21
  ]
24
22
 
25
23
 
26
- def assert_feature_defintion(definition: Any) -> "LocalizedPolicyDefinition":
27
- assert isinstance(definition, LocalizedPolicyDefinition)
28
- return definition
29
-
30
-
31
24
  class LocalizedPolicySettings(BaseModel):
32
25
  flow_visibility: Optional[bool] = Field(
33
26
  default=None, serialization_alias="flowVisibility", validation_alias="flowVisibility"
@@ -75,25 +68,20 @@ class LocalizedPolicyAssemblyItem(AssemblyItemBase):
75
68
 
76
69
 
77
70
  class LocalizedPolicyDefinition(PolicyDefinition):
78
- assembly: List[LocalizedPolicyAssemblyItem] = []
79
- settings: Optional[LocalizedPolicySettings] = None
71
+ assembly: List[LocalizedPolicyAssemblyItem]
72
+ settings: LocalizedPolicySettings
80
73
 
81
74
 
82
75
  class LocalizedPolicy(PolicyCreationPayload):
83
- policy_definition: Union[LocalizedPolicyDefinition, str] = Field(
76
+ policy_definition: LocalizedPolicyDefinition = Field(
84
77
  default=LocalizedPolicyDefinition(assembly=[], settings=LocalizedPolicySettings()),
85
78
  serialization_alias="policyDefinition",
86
79
  validation_alias="policyDefinition",
87
80
  )
88
- policy_type: Literal["feature", "cli"] = Field(
89
- default="feature", serialization_alias="policyType", validation_alias="policyType"
90
- )
81
+ policy_type: str = Field(default="feature", serialization_alias="policyType", validation_alias="policyType")
91
82
 
92
- def _add_item(self, type: LocalizedPolicySupportedItemType, id: UUID) -> LocalizedPolicyAssemblyItem:
93
- policy_definition = assert_feature_defintion(self.policy_definition)
94
- item = LocalizedPolicyAssemblyItem(type=type, definition_id=id)
95
- policy_definition.assembly.append(item)
96
- return item
83
+ def _add_item(self, type: LocalizedPolicySupportedItemType, id: UUID) -> None:
84
+ self.policy_definition.assembly.append(LocalizedPolicyAssemblyItem(type=type, definition_id=id))
97
85
 
98
86
  def add_qos_map(self, definition_id: UUID) -> None:
99
87
  self._add_item("qosMap", definition_id)
@@ -102,7 +90,7 @@ class LocalizedPolicy(PolicyCreationPayload):
102
90
  self._add_item("rewriteRule", definition_id)
103
91
 
104
92
  def add_vpn_qos_map(self, definition_id: UUID) -> None:
105
- self._add_item("vpnQosMap", definition_id)
93
+ self._add_item("vpnQoSMap", definition_id)
106
94
 
107
95
  def add_access_control_list(self, definition_id: UUID) -> None:
108
96
  self._add_item("acl", definition_id)
@@ -119,21 +107,15 @@ class LocalizedPolicy(PolicyCreationPayload):
119
107
  def add_route_policy(self, definition_id: UUID) -> None:
120
108
  self._add_item("vedgeRoute", definition_id)
121
109
 
122
- def set_definition(self, assembly: List[LocalizedPolicyAssemblyItem], settings: LocalizedPolicySettings) -> None:
123
- self.policy_definition = LocalizedPolicyDefinition(assembly=assembly, settings=settings)
124
-
125
- @model_validator(mode="before")
110
+ @field_validator("policy_definition", mode="before")
126
111
  @classmethod
127
- def try_parse_policy_definition_string(cls, values):
112
+ def try_parse(cls, policy_definition):
128
113
  # this is needed because GET /template/policy/vedge contains string in policyDefinition field
129
114
  # while POST /template/policy/vedge requires a regular object
130
115
  # it makes sense to reuse that model for both requests and present parsed data to the user
131
- if not isinstance(values, dict):
132
- return values
133
- if (policy_definition := values.get("policyDefinition")) and values.get("policyType") != "cli":
134
- if isinstance(policy_definition, str):
135
- values["policyDefinition"] = LocalizedPolicyDefinition.model_validate_json(policy_definition)
136
- return values
116
+ if isinstance(policy_definition, str):
117
+ return LocalizedPolicyDefinition.model_validate_json(policy_definition)
118
+ return policy_definition
137
119
 
138
120
 
139
121
  class LocalizedPolicyInfo(PolicyInfo, LocalizedPolicy):
@@ -142,7 +124,7 @@ class LocalizedPolicyInfo(PolicyInfo, LocalizedPolicy):
142
124
 
143
125
  class LocalizedPolicyEditResponse(BaseModel):
144
126
  master_templates_affected: List[str] = Field(
145
- default_factory=list, serialization_alias="masterTemplatesAffected", validation_alias="masterTemplatesAffected"
127
+ default=[], serialization_alias="masterTemplatesAffected", validation_alias="masterTemplatesAffected"
146
128
  )
147
129
 
148
130
 
@@ -1,21 +1,19 @@
1
1
  # Copyright 2023 Cisco Systems, Inc. and its affiliates
2
2
 
3
3
  import datetime
4
- from typing import Any, List, Literal, Optional, Sequence, Union
4
+ from typing import List, Literal, Optional, Sequence, Union
5
5
  from uuid import UUID
6
6
 
7
7
  from pydantic import BaseModel, ConfigDict, Field
8
8
 
9
- ZoneListId = Union[UUID, Literal["self", "default"]]
10
-
11
9
 
12
10
  class PolicyId(BaseModel):
13
11
  policy_id: UUID = Field(serialization_alias="policyId", validation_alias="policyId")
14
12
 
15
13
 
16
14
  class NGFirewallZoneListEntry(BaseModel):
17
- src_zone_list_id: ZoneListId = Field(serialization_alias="srcZoneListId", validation_alias="srcZoneListId")
18
- dst_zone_list_id: ZoneListId = Field(serialization_alias="dstZoneListId", validation_alias="dstZoneListId")
15
+ src_zone_list_id: UUID = Field(serialization_alias="srcZoneListId", validation_alias="srcZoneListId")
16
+ dst_zone_list_id: UUID = Field(serialization_alias="dstZoneListId", validation_alias="dstZoneListId")
19
17
  model_config = ConfigDict(populate_by_name=True)
20
18
 
21
19
 
@@ -27,19 +25,18 @@ class AssemblyItemBase(BaseModel):
27
25
 
28
26
  class ZoneBasedFWAssemblyItem(AssemblyItemBase):
29
27
  type: Literal["zoneBasedFW"] = "zoneBasedFW"
30
- entries: Optional[List[NGFirewallZoneListEntry]] = None
31
28
 
32
29
 
33
30
  class NGFirewallAssemblyItem(AssemblyItemBase):
34
31
  type: Literal["zoneBasedFW"] = "zoneBasedFW"
35
32
  entries: List[NGFirewallZoneListEntry] = []
36
33
 
37
- def add_zone_pair(self, src_zone_id: ZoneListId, dst_zone_id: ZoneListId):
34
+ def add_zone_pair(self, src_zone_id: UUID, dst_zone_id: UUID):
38
35
  self.entries.append(NGFirewallZoneListEntry(src_zone_list_id=src_zone_id, dst_zone_list_id=dst_zone_id))
39
36
 
40
37
 
41
38
  class DNSSecurityAssemblyItem(AssemblyItemBase):
42
- type: Literal["DNSSecurity", "dnsSecurity"] = "DNSSecurity"
39
+ type: Literal["DNSSecurity"] = "DNSSecurity"
43
40
 
44
41
 
45
42
  class IntrusionPreventionAssemblyItem(AssemblyItemBase):
@@ -50,10 +47,6 @@ class URLFilteringAssemblyItem(AssemblyItemBase):
50
47
  type: Literal["urlFiltering"] = "urlFiltering"
51
48
 
52
49
 
53
- class AdvancedInspectionProfileAssemblyItem(AssemblyItemBase):
54
- type: Literal["advancedInspectionProfile"] = "advancedInspectionProfile"
55
-
56
-
57
50
  class AdvancedMalwareProtectionAssemblyItem(AssemblyItemBase):
58
51
  type: Literal["advancedMalwareProtection"] = "advancedMalwareProtection"
59
52
 
@@ -64,20 +57,23 @@ class SSLDecryptionAssemblyItem(AssemblyItemBase):
64
57
 
65
58
  class PolicyDefinition(BaseModel):
66
59
  assembly: Sequence[AssemblyItemBase] = []
67
- settings: Optional[Any] = None
68
60
 
69
61
 
70
62
  class PolicyCreationPayload(BaseModel):
71
63
  policy_name: str = Field(
72
64
  serialization_alias="policyName",
73
65
  validation_alias="policyName",
74
- pattern="^[a-zA-Z0-9_-]{0,127}$",
66
+ pattern="^[a-zA-Z0-9_-]{1,127}$",
75
67
  description="Can include only alpha-numeric characters, hyphen '-' or underscore '_'; maximum 127 characters",
76
68
  )
77
69
  policy_description: str = Field(
78
70
  default="default description", serialization_alias="policyDescription", validation_alias="policyDescription"
79
71
  )
80
72
  policy_type: str = Field(serialization_alias="policyType", validation_alias="policyType")
73
+ policy_definition: Union[PolicyDefinition, str] = Field(
74
+ serialization_alias="policyDefinition",
75
+ validation_alias="policyDefinition",
76
+ )
81
77
  is_policy_activated: bool = Field(
82
78
  default=False, serialization_alias="isPolicyActivated", validation_alias="isPolicyActivated"
83
79
  )