catalystwan 0.41.2__py3-none-any.whl → 0.41.2.dev0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (504) hide show
  1. catalystwan/__init__.py +3 -2
  2. catalystwan/api/administration.py +13 -2
  3. catalystwan/api/api_container.py +4 -1
  4. catalystwan/api/builders/__init__.py +14 -0
  5. catalystwan/api/builders/feature_profiles/__init__.py +0 -0
  6. catalystwan/api/builders/feature_profiles/application_priority.py +58 -0
  7. catalystwan/api/builders/feature_profiles/builder_factory.py +59 -0
  8. catalystwan/api/builders/feature_profiles/cli.py +76 -0
  9. catalystwan/api/builders/feature_profiles/mixins.py +44 -0
  10. catalystwan/api/builders/feature_profiles/other.py +79 -0
  11. catalystwan/api/builders/feature_profiles/report.py +155 -0
  12. catalystwan/api/builders/feature_profiles/service.py +248 -0
  13. catalystwan/api/builders/feature_profiles/system.py +80 -0
  14. catalystwan/api/builders/feature_profiles/transport.py +256 -0
  15. catalystwan/api/builders/feature_profiles/uc_voice.py +287 -0
  16. catalystwan/api/config_group_api.py +41 -16
  17. catalystwan/api/configuration_groups/parcel.py +100 -30
  18. catalystwan/api/feature_profile_api.py +2021 -242
  19. catalystwan/api/policy_api.py +470 -116
  20. catalystwan/api/template_api.py +113 -44
  21. catalystwan/api/templates/README.md +61 -47
  22. catalystwan/api/templates/cli_template.py +17 -7
  23. catalystwan/api/templates/device_template/device_template.py +127 -32
  24. catalystwan/api/templates/feature_template.py +3 -3
  25. catalystwan/api/templates/models/aaa_model.py +387 -0
  26. catalystwan/api/templates/models/cisco_aaa_model.py +289 -42
  27. catalystwan/api/templates/models/cisco_banner_model.py +11 -2
  28. catalystwan/api/templates/models/cisco_bfd_model.py +31 -36
  29. catalystwan/api/templates/models/cisco_bgp_model.py +382 -131
  30. catalystwan/api/templates/models/cisco_logging_model.py +80 -43
  31. catalystwan/api/templates/models/cisco_ntp_model.py +34 -15
  32. catalystwan/api/templates/models/cisco_omp_model.py +70 -60
  33. catalystwan/api/templates/models/cisco_ospf.py +143 -74
  34. catalystwan/api/templates/models/cisco_ospfv3.py +217 -95
  35. catalystwan/api/templates/models/cisco_secure_internet_gateway.py +304 -142
  36. catalystwan/api/templates/models/cisco_snmp_model.py +66 -52
  37. catalystwan/api/templates/models/cisco_system.py +238 -129
  38. catalystwan/api/templates/models/cisco_vpn_interface_model.py +632 -275
  39. catalystwan/api/templates/models/cisco_vpn_model.py +433 -270
  40. catalystwan/api/templates/models/cli_template.py +3 -2
  41. catalystwan/api/templates/models/omp_vsmart_model.py +46 -10
  42. catalystwan/api/templates/models/security_vsmart_model.py +11 -8
  43. catalystwan/api/templates/models/supported.py +10 -4
  44. catalystwan/api/templates/models/system_vsmart_model.py +164 -27
  45. catalystwan/api/templates/models/vpn_vsmart_interface_model.py +198 -0
  46. catalystwan/api/templates/models/vpn_vsmart_model.py +124 -0
  47. catalystwan/apigw_auth.py +6 -2
  48. catalystwan/dataclasses.py +2 -53
  49. catalystwan/endpoints/__init__.py +41 -41
  50. catalystwan/endpoints/certificate_management_device.py +4 -0
  51. catalystwan/endpoints/cluster_management.py +27 -7
  52. catalystwan/endpoints/configuration/feature_profile/sdwan/application_priority.py +107 -0
  53. catalystwan/endpoints/configuration/feature_profile/sdwan/cli.py +60 -0
  54. catalystwan/endpoints/configuration/feature_profile/sdwan/dns_security.py +83 -0
  55. catalystwan/endpoints/configuration/feature_profile/sdwan/embedded_security.py +88 -0
  56. catalystwan/endpoints/configuration/feature_profile/sdwan/other.py +62 -0
  57. catalystwan/endpoints/configuration/feature_profile/sdwan/policy_object.py +35 -12
  58. catalystwan/endpoints/configuration/feature_profile/sdwan/service.py +154 -0
  59. catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py +88 -0
  60. catalystwan/endpoints/configuration/feature_profile/sdwan/system.py +164 -11
  61. catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py +93 -0
  62. catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py +144 -26
  63. catalystwan/endpoints/configuration/feature_profile/sdwan/uc_voice.py +77 -0
  64. catalystwan/endpoints/configuration/network_hierarchy.py +32 -0
  65. catalystwan/endpoints/configuration/policy/abstractions.py +49 -0
  66. catalystwan/endpoints/configuration/policy/definition/access_control_list.py +6 -11
  67. catalystwan/endpoints/configuration/policy/definition/access_control_list_ipv6.py +6 -11
  68. catalystwan/endpoints/configuration/policy/definition/aip.py +52 -0
  69. catalystwan/endpoints/configuration/policy/definition/amp.py +52 -0
  70. catalystwan/endpoints/configuration/policy/definition/app_route.py +50 -0
  71. catalystwan/endpoints/configuration/policy/definition/cflowd.py +46 -0
  72. catalystwan/endpoints/configuration/policy/definition/control.py +6 -11
  73. catalystwan/endpoints/configuration/policy/definition/device_access.py +6 -11
  74. catalystwan/endpoints/configuration/policy/definition/device_access_ipv6.py +6 -11
  75. catalystwan/endpoints/configuration/policy/definition/dial_peer.py +57 -0
  76. catalystwan/endpoints/configuration/policy/definition/dns_security.py +50 -0
  77. catalystwan/endpoints/configuration/policy/definition/fxo_port.py +57 -0
  78. catalystwan/endpoints/configuration/policy/definition/fxs_did_port.py +57 -0
  79. catalystwan/endpoints/configuration/policy/definition/fxs_port.py +57 -0
  80. catalystwan/endpoints/configuration/policy/definition/hub_and_spoke.py +6 -11
  81. catalystwan/endpoints/configuration/policy/definition/intrusion_prevention.py +52 -0
  82. catalystwan/endpoints/configuration/policy/definition/mesh.py +2 -11
  83. catalystwan/endpoints/configuration/policy/definition/pri_isdn_port.py +57 -0
  84. catalystwan/endpoints/configuration/policy/definition/qos_map.py +2 -11
  85. catalystwan/endpoints/configuration/policy/definition/rewrite.py +6 -11
  86. catalystwan/endpoints/configuration/policy/definition/route_policy.py +50 -0
  87. catalystwan/endpoints/configuration/policy/definition/rule_set.py +2 -11
  88. catalystwan/endpoints/configuration/policy/definition/security_group.py +6 -11
  89. catalystwan/endpoints/configuration/policy/definition/srst_phone_profile.py +59 -0
  90. catalystwan/endpoints/configuration/policy/definition/ssl_decryption.py +50 -0
  91. catalystwan/endpoints/configuration/policy/definition/ssl_decryption_utd_profile.py +52 -0
  92. catalystwan/endpoints/configuration/policy/definition/traffic_data.py +6 -11
  93. catalystwan/endpoints/configuration/policy/definition/url_filtering.py +50 -0
  94. catalystwan/endpoints/configuration/policy/definition/vpn_membership.py +6 -11
  95. catalystwan/endpoints/configuration/policy/definition/vpn_qos_map.py +50 -0
  96. catalystwan/endpoints/configuration/policy/definition/zone_based_firewall.py +6 -11
  97. catalystwan/endpoints/configuration/policy/list/app.py +3 -16
  98. catalystwan/endpoints/configuration/policy/list/app_probe.py +6 -15
  99. catalystwan/endpoints/configuration/policy/list/as_path.py +3 -16
  100. catalystwan/endpoints/configuration/policy/list/class_map.py +3 -16
  101. catalystwan/endpoints/configuration/policy/list/color.py +3 -16
  102. catalystwan/endpoints/configuration/policy/list/community.py +3 -16
  103. catalystwan/endpoints/configuration/policy/list/data_ipv6_prefix.py +6 -15
  104. catalystwan/endpoints/configuration/policy/list/data_prefix.py +3 -16
  105. catalystwan/endpoints/configuration/policy/list/expanded_community.py +6 -15
  106. catalystwan/endpoints/configuration/policy/list/extended_community.py +52 -0
  107. catalystwan/endpoints/configuration/policy/list/fax_protocol.py +48 -0
  108. catalystwan/endpoints/configuration/policy/list/fqdn.py +3 -16
  109. catalystwan/endpoints/configuration/policy/list/geo_location.py +3 -16
  110. catalystwan/endpoints/configuration/policy/list/identity.py +48 -0
  111. catalystwan/endpoints/configuration/policy/list/ips_signature.py +6 -15
  112. catalystwan/endpoints/configuration/policy/list/ipv6_prefix.py +3 -16
  113. catalystwan/endpoints/configuration/policy/list/local_app.py +3 -16
  114. catalystwan/endpoints/configuration/policy/list/local_domain.py +3 -16
  115. catalystwan/endpoints/configuration/policy/list/media_profile.py +52 -0
  116. catalystwan/endpoints/configuration/policy/list/mirror.py +3 -16
  117. catalystwan/endpoints/configuration/policy/list/modem_pass_through.py +52 -0
  118. catalystwan/endpoints/configuration/policy/list/policer.py +3 -16
  119. catalystwan/endpoints/configuration/policy/list/port.py +3 -16
  120. catalystwan/endpoints/configuration/policy/list/preferred_color_group.py +6 -15
  121. catalystwan/endpoints/configuration/policy/list/prefix.py +4 -16
  122. catalystwan/endpoints/configuration/policy/list/protocol_name.py +6 -15
  123. catalystwan/endpoints/configuration/policy/list/region.py +2 -10
  124. catalystwan/endpoints/configuration/policy/list/scalable_group_tag.py +52 -0
  125. catalystwan/endpoints/configuration/policy/list/site.py +3 -16
  126. catalystwan/endpoints/configuration/policy/list/sla.py +3 -16
  127. catalystwan/endpoints/configuration/policy/list/supervisory_disconnect.py +52 -0
  128. catalystwan/endpoints/configuration/policy/list/threat_grid_api_key.py +52 -0
  129. catalystwan/endpoints/configuration/policy/list/tloc.py +3 -16
  130. catalystwan/endpoints/configuration/policy/list/translation_profile.py +52 -0
  131. catalystwan/endpoints/configuration/policy/list/translation_rules.py +52 -0
  132. catalystwan/endpoints/configuration/policy/list/trunkgroup.py +48 -0
  133. catalystwan/endpoints/configuration/policy/list/umbrella_data.py +52 -0
  134. catalystwan/endpoints/configuration/policy/list/url_allow_list.py +3 -16
  135. catalystwan/endpoints/configuration/policy/list/url_block_list.py +3 -16
  136. catalystwan/endpoints/configuration/policy/list/vpn.py +3 -16
  137. catalystwan/endpoints/configuration/policy/list/zone.py +3 -16
  138. catalystwan/endpoints/configuration/policy/security_template.py +2 -3
  139. catalystwan/endpoints/configuration/policy/voice_template.py +39 -0
  140. catalystwan/endpoints/configuration/policy_group.py +30 -0
  141. catalystwan/endpoints/configuration/software_actions.py +2 -4
  142. catalystwan/endpoints/configuration/topology_group.py +51 -0
  143. catalystwan/endpoints/configuration_dashboard_status.py +2 -2
  144. catalystwan/endpoints/configuration_device_template.py +15 -1
  145. catalystwan/endpoints/configuration_feature_profile.py +8 -11
  146. catalystwan/endpoints/configuration_general_template.py +31 -0
  147. catalystwan/endpoints/configuration_group.py +28 -5
  148. catalystwan/endpoints/configuration_settings.py +90 -1
  149. catalystwan/endpoints/configuration_template_master.py +48 -0
  150. catalystwan/endpoints/endpoints_container.py +79 -19
  151. catalystwan/endpoints/real_time_monitoring/reboot_history.py +1 -3
  152. catalystwan/endpoints/tenant_migration.py +2 -0
  153. catalystwan/exceptions.py +17 -0
  154. catalystwan/integration_tests/base.py +81 -0
  155. catalystwan/integration_tests/feature_profile/sdwan/__init__.py +0 -0
  156. catalystwan/integration_tests/feature_profile/sdwan/policy/__init__.py +0 -0
  157. catalystwan/integration_tests/feature_profile/sdwan/policy/base.py +33 -0
  158. catalystwan/integration_tests/feature_profile/sdwan/policy/test_extended_community.py +33 -0
  159. catalystwan/integration_tests/feature_profile/sdwan/policy/test_security_app_list.py +32 -0
  160. catalystwan/integration_tests/feature_profile/sdwan/test_application_priority.py +433 -0
  161. catalystwan/integration_tests/feature_profile/sdwan/test_cli.py +54 -0
  162. catalystwan/integration_tests/feature_profile/sdwan/test_dns_security.py +106 -0
  163. catalystwan/integration_tests/feature_profile/sdwan/test_other.py +49 -0
  164. catalystwan/integration_tests/feature_profile/sdwan/test_service.py +1078 -0
  165. catalystwan/integration_tests/feature_profile/sdwan/test_sig_security.py +322 -0
  166. catalystwan/integration_tests/feature_profile/sdwan/test_ssl_decryption.py +85 -0
  167. catalystwan/integration_tests/feature_profile/sdwan/test_system.py +368 -0
  168. catalystwan/integration_tests/feature_profile/sdwan/test_tracker.py +127 -0
  169. catalystwan/integration_tests/feature_profile/sdwan/test_transport.py +1698 -0
  170. catalystwan/integration_tests/feature_profile/sdwan/topology/test_topology.py +93 -0
  171. catalystwan/integration_tests/profile_builder/__init__.py +0 -0
  172. catalystwan/integration_tests/profile_builder/test_pb_service.py +197 -0
  173. catalystwan/integration_tests/profile_builder/test_pb_transport.py +226 -0
  174. catalystwan/integration_tests/profile_builder/test_pb_uc_voice.py +277 -0
  175. catalystwan/integration_tests/test_data/__init__.py +117 -0
  176. catalystwan/integration_tests/test_find_template_values.py +7 -18
  177. catalystwan/integration_tests/test_network_hierarchy.py +82 -0
  178. catalystwan/integration_tests/test_settings.py +30 -0
  179. catalystwan/models/common.py +1898 -2
  180. catalystwan/models/configuration/common.py +1 -0
  181. catalystwan/models/configuration/feature_profile/common.py +634 -149
  182. catalystwan/models/configuration/feature_profile/parcel.py +238 -0
  183. catalystwan/models/configuration/feature_profile/sdwan/acl/__init__.py +13 -0
  184. catalystwan/models/configuration/feature_profile/sdwan/acl/ipv4acl.py +298 -0
  185. catalystwan/models/configuration/feature_profile/sdwan/acl/ipv6acl.py +344 -0
  186. catalystwan/models/configuration/feature_profile/sdwan/application_priority/__init__.py +218 -0
  187. catalystwan/models/configuration/feature_profile/sdwan/application_priority/cloud_probe.py +61 -0
  188. catalystwan/models/configuration/feature_profile/sdwan/application_priority/policy_settings.py +31 -0
  189. catalystwan/models/configuration/feature_profile/sdwan/application_priority/qos_policy.py +102 -0
  190. catalystwan/models/configuration/feature_profile/sdwan/application_priority/traffic_policy.py +1057 -0
  191. catalystwan/models/configuration/feature_profile/sdwan/cli/__init__.py +23 -0
  192. catalystwan/models/configuration/feature_profile/sdwan/cli/config.py +18 -0
  193. catalystwan/models/configuration/feature_profile/sdwan/cli/full_config.py +15 -0
  194. catalystwan/models/configuration/feature_profile/sdwan/dns_security/__init__.py +13 -0
  195. catalystwan/models/configuration/feature_profile/sdwan/dns_security/dns.py +110 -0
  196. catalystwan/models/configuration/feature_profile/sdwan/embedded_security/__init__.py +23 -0
  197. catalystwan/models/configuration/feature_profile/sdwan/embedded_security/ngfirewall.py +493 -0
  198. catalystwan/models/configuration/feature_profile/sdwan/embedded_security/policy.py +171 -0
  199. catalystwan/models/configuration/feature_profile/sdwan/other/__init__.py +25 -0
  200. catalystwan/models/configuration/feature_profile/sdwan/other/cybervision.py +44 -0
  201. catalystwan/models/configuration/feature_profile/sdwan/other/thousandeyes.py +147 -0
  202. catalystwan/models/configuration/feature_profile/sdwan/other/ucse.py +110 -0
  203. catalystwan/models/configuration/feature_profile/sdwan/policy_object/__init__.py +62 -48
  204. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/app_probe.py +34 -20
  205. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/application_list.py +8 -6
  206. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/as_path.py +22 -0
  207. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/color_list.py +7 -5
  208. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/data_prefix.py +13 -4
  209. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/expanded_community_list.py +9 -7
  210. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/extended_community.py +34 -0
  211. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/fowarding_class.py +7 -5
  212. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv4_network_object.py +15 -0
  213. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv4_service_object.py +254 -0
  214. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_data_prefix.py +11 -9
  215. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_prefix_list.py +25 -10
  216. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/mirror.py +27 -0
  217. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/network_object_group.py +15 -0
  218. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/object_group.py +15 -0
  219. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/{policier.py → policer.py} +12 -10
  220. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefered_group_color.py +29 -10
  221. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefix_list.py +23 -8
  222. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/service_object_group.py +21 -0
  223. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/sla_class.py +12 -31
  224. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/standard_community.py +16 -10
  225. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/tloc_list.py +8 -7
  226. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/aip.py +64 -0
  227. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/amp.py +79 -0
  228. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/application_list.py +8 -6
  229. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/data_prefix.py +7 -5
  230. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/fqdn.py +7 -5
  231. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/geolocation_list.py +7 -5
  232. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/identity.py +30 -0
  233. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/intrusion_prevention.py +58 -0
  234. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ips_signature.py +7 -5
  235. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/local_domain.py +7 -5
  236. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/object_group.py +72 -0
  237. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/protocol_list.py +7 -5
  238. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/rule_set.py +137 -0
  239. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/scalable_group_tag.py +26 -0
  240. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/security_port.py +21 -11
  241. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ssl_decryption.py +126 -0
  242. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ssl_decryption_profile.py +165 -0
  243. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url.py +15 -10
  244. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url_filtering.py +148 -0
  245. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/zone.py +14 -18
  246. catalystwan/models/configuration/feature_profile/sdwan/routing/__init__.py +26 -0
  247. catalystwan/models/configuration/feature_profile/sdwan/routing/bgp.py +609 -0
  248. catalystwan/models/configuration/feature_profile/sdwan/{service → routing}/ospf.py +55 -47
  249. catalystwan/models/configuration/feature_profile/sdwan/{service → routing}/ospfv3.py +74 -72
  250. catalystwan/models/configuration/feature_profile/sdwan/service/__init__.py +91 -0
  251. catalystwan/models/configuration/feature_profile/sdwan/service/appqoe.py +76 -41
  252. catalystwan/models/configuration/feature_profile/sdwan/service/dhcp_server.py +107 -64
  253. catalystwan/models/configuration/feature_profile/sdwan/service/dual_router_ha.py +26 -0
  254. catalystwan/models/configuration/feature_profile/sdwan/service/eigrp.py +39 -42
  255. catalystwan/models/configuration/feature_profile/sdwan/service/lan/common.py +7 -88
  256. catalystwan/models/configuration/feature_profile/sdwan/service/lan/ethernet.py +231 -155
  257. catalystwan/models/configuration/feature_profile/sdwan/service/lan/gre.py +38 -108
  258. catalystwan/models/configuration/feature_profile/sdwan/service/lan/ipsec.py +77 -84
  259. catalystwan/models/configuration/feature_profile/sdwan/service/lan/multilink.py +101 -0
  260. catalystwan/models/configuration/feature_profile/sdwan/service/lan/svi.py +62 -56
  261. catalystwan/models/configuration/feature_profile/sdwan/service/lan/vpn.py +111 -120
  262. catalystwan/models/configuration/feature_profile/sdwan/service/multicast.py +56 -57
  263. catalystwan/models/configuration/feature_profile/sdwan/service/object_tracker.py +15 -21
  264. catalystwan/models/configuration/feature_profile/sdwan/service/route_policy.py +358 -110
  265. catalystwan/models/configuration/feature_profile/sdwan/service/service_chain.py +38 -0
  266. catalystwan/models/configuration/feature_profile/sdwan/service/service_insertion_attachment.py +17 -25
  267. catalystwan/models/configuration/feature_profile/sdwan/service/switchport.py +50 -58
  268. catalystwan/models/configuration/feature_profile/sdwan/service/tracker.py +12 -21
  269. catalystwan/models/configuration/feature_profile/sdwan/service/wireless_lan.py +27 -31
  270. catalystwan/models/configuration/feature_profile/sdwan/sig_security/__init__.py +19 -0
  271. catalystwan/models/configuration/feature_profile/sdwan/sig_security/sig_security.py +379 -0
  272. catalystwan/models/configuration/feature_profile/sdwan/system/__init__.py +59 -0
  273. catalystwan/models/configuration/feature_profile/sdwan/system/aaa.py +58 -10
  274. catalystwan/models/configuration/feature_profile/sdwan/system/banner.py +30 -0
  275. catalystwan/models/configuration/feature_profile/sdwan/system/basic.py +290 -0
  276. catalystwan/models/configuration/feature_profile/sdwan/system/bfd.py +69 -0
  277. catalystwan/models/configuration/feature_profile/sdwan/system/device_access.py +157 -0
  278. catalystwan/models/configuration/feature_profile/sdwan/system/device_access_ipv6.py +157 -0
  279. catalystwan/models/configuration/feature_profile/sdwan/system/global_parcel.py +163 -0
  280. catalystwan/models/configuration/feature_profile/sdwan/system/logging_parcel.py +162 -0
  281. catalystwan/models/configuration/feature_profile/sdwan/system/mrf.py +75 -0
  282. catalystwan/models/configuration/feature_profile/sdwan/system/ntp.py +103 -0
  283. catalystwan/models/configuration/feature_profile/sdwan/system/omp.py +120 -0
  284. catalystwan/models/configuration/feature_profile/sdwan/system/security.py +179 -0
  285. catalystwan/models/configuration/feature_profile/sdwan/system/snmp.py +173 -0
  286. catalystwan/models/configuration/feature_profile/sdwan/topology/__init__.py +29 -0
  287. catalystwan/models/configuration/feature_profile/sdwan/topology/custom_control.py +425 -0
  288. catalystwan/models/configuration/feature_profile/sdwan/topology/hubspoke.py +60 -0
  289. catalystwan/models/configuration/feature_profile/sdwan/topology/mesh.py +23 -0
  290. catalystwan/models/configuration/feature_profile/sdwan/trackers/__init__.py +36 -0
  291. catalystwan/models/configuration/feature_profile/sdwan/trackers/tracker.py +96 -0
  292. catalystwan/models/configuration/feature_profile/sdwan/trackers/tracker_group.py +63 -0
  293. catalystwan/models/configuration/feature_profile/sdwan/transport/__init__.py +93 -0
  294. catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_controller.py +26 -23
  295. catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_profile.py +71 -0
  296. catalystwan/models/configuration/feature_profile/sdwan/transport/gps.py +37 -0
  297. catalystwan/models/configuration/feature_profile/sdwan/transport/management/ethernet.py +121 -0
  298. catalystwan/models/configuration/feature_profile/sdwan/transport/t1e1controller.py +124 -0
  299. catalystwan/models/configuration/feature_profile/sdwan/transport/vpn.py +285 -0
  300. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/cellular.py +173 -0
  301. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/ethernet.py +389 -0
  302. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/gre.py +46 -0
  303. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/ipsec.py +137 -0
  304. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/multilink.py +219 -0
  305. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/protocol_over.py +405 -0
  306. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/t1e1serial.py +195 -0
  307. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/__init__.py +62 -0
  308. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/analog_interface.py +436 -0
  309. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/call_routing.py +179 -0
  310. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/digital_interface.py +380 -0
  311. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/dsp_farm.py +193 -0
  312. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/media_profile.py +17 -0
  313. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/server_group.py +51 -0
  314. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/srst.py +86 -0
  315. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/supervisory_disconnect.py +69 -0
  316. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/translation_profile.py +42 -0
  317. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/translation_rule.py +31 -0
  318. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/trunk_group.py +26 -0
  319. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/voice_global.py +55 -0
  320. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/voice_tenant.py +40 -0
  321. catalystwan/models/configuration/network_hierarchy/__init__.py +22 -0
  322. catalystwan/models/configuration/network_hierarchy/cflowd.py +120 -0
  323. catalystwan/models/configuration/network_hierarchy/node.py +88 -0
  324. catalystwan/models/configuration/policy_group.py +74 -0
  325. catalystwan/models/configuration/profile_type.py +1 -6
  326. catalystwan/models/configuration/topology_group.py +52 -0
  327. catalystwan/models/policy/__init__.py +275 -69
  328. catalystwan/models/policy/centralized.py +26 -29
  329. catalystwan/models/policy/{definitions → definition}/access_control_list.py +47 -17
  330. catalystwan/models/policy/{definitions → definition}/access_control_list_ipv6.py +42 -18
  331. catalystwan/models/policy/definition/aip.py +60 -0
  332. catalystwan/models/policy/definition/amp.py +65 -0
  333. catalystwan/models/policy/definition/app_route.py +246 -0
  334. catalystwan/models/policy/definition/cflowd.py +95 -0
  335. catalystwan/models/policy/{definitions → definition}/control.py +48 -25
  336. catalystwan/models/policy/{definitions → definition}/device_access.py +22 -11
  337. catalystwan/models/policy/{definitions → definition}/device_access_ipv6.py +20 -11
  338. catalystwan/models/policy/definition/dial_peer.py +60 -0
  339. catalystwan/models/policy/definition/dns_security.py +130 -0
  340. catalystwan/models/policy/definition/fxo_port.py +63 -0
  341. catalystwan/models/policy/definition/fxs_did_port.py +58 -0
  342. catalystwan/models/policy/definition/fxs_port.py +56 -0
  343. catalystwan/models/policy/{definitions → definition}/hub_and_spoke.py +18 -4
  344. catalystwan/models/policy/definition/intrusion_prevention.py +55 -0
  345. catalystwan/models/policy/{definitions → definition}/mesh.py +13 -1
  346. catalystwan/models/policy/definition/pri_isdn_port.py +48 -0
  347. catalystwan/models/policy/{definitions → definition}/qos_map.py +39 -32
  348. catalystwan/models/policy/{definitions → definition}/rewrite.py +12 -2
  349. catalystwan/models/policy/definition/route_policy.py +187 -0
  350. catalystwan/models/policy/{definitions → definition}/rule_set.py +66 -48
  351. catalystwan/models/policy/{definitions → definition}/security_group.py +38 -14
  352. catalystwan/models/policy/definition/srst_phone_profile.py +37 -0
  353. catalystwan/models/policy/definition/ssl_decryption.py +209 -0
  354. catalystwan/models/policy/definition/ssl_decryption_utd_profile.py +87 -0
  355. catalystwan/models/policy/{definitions → definition}/traffic_data.py +184 -61
  356. catalystwan/models/policy/definition/url_filtering.py +70 -0
  357. catalystwan/models/policy/{definitions → definition}/vpn_membership.py +13 -1
  358. catalystwan/models/policy/definition/vpn_qos_map.py +46 -0
  359. catalystwan/models/policy/{definitions → definition}/zone_based_firewall.py +93 -32
  360. catalystwan/models/policy/list/app.py +44 -0
  361. catalystwan/models/policy/list/app_probe.py +42 -0
  362. catalystwan/models/policy/list/as_path.py +30 -0
  363. catalystwan/models/policy/list/class_map.py +30 -0
  364. catalystwan/models/policy/list/color.py +28 -0
  365. catalystwan/models/policy/list/communities.py +83 -0
  366. catalystwan/models/policy/list/data_ipv6_prefix.py +30 -0
  367. catalystwan/models/policy/list/data_prefix.py +30 -0
  368. catalystwan/models/policy/list/fax_protocol.py +45 -0
  369. catalystwan/models/policy/list/fqdn.py +24 -0
  370. catalystwan/models/policy/list/geo_location.py +33 -0
  371. catalystwan/models/policy/list/identity.py +29 -0
  372. catalystwan/models/policy/list/ips_signature.py +27 -0
  373. catalystwan/models/policy/list/ipv6_prefix.py +33 -0
  374. catalystwan/models/policy/list/local_app.py +45 -0
  375. catalystwan/models/policy/list/local_domain.py +36 -0
  376. catalystwan/models/policy/list/media_profile.py +44 -0
  377. catalystwan/models/policy/list/mirror.py +27 -0
  378. catalystwan/models/policy/list/modem_pass_through.py +27 -0
  379. catalystwan/models/policy/list/policer.py +39 -0
  380. catalystwan/models/policy/list/port.py +33 -0
  381. catalystwan/models/policy/list/preferred_color_group.py +82 -0
  382. catalystwan/models/policy/list/prefix.py +33 -0
  383. catalystwan/models/policy/list/protocol_name.py +26 -0
  384. catalystwan/models/policy/list/region.py +45 -0
  385. catalystwan/models/policy/list/scalable_group_tag.py +30 -0
  386. catalystwan/models/policy/list/site.py +34 -0
  387. catalystwan/models/policy/list/sla.py +77 -0
  388. catalystwan/models/policy/list/supervisory_disconnect.py +62 -0
  389. catalystwan/models/policy/list/threat_grid_api_key.py +32 -0
  390. catalystwan/models/policy/list/tloc.py +32 -0
  391. catalystwan/models/policy/list/translation_profile.py +32 -0
  392. catalystwan/models/policy/list/translation_rules.py +29 -0
  393. catalystwan/models/policy/list/trunkgroup.py +56 -0
  394. catalystwan/models/policy/list/umbrella_data.py +30 -0
  395. catalystwan/models/policy/list/url.py +39 -0
  396. catalystwan/models/policy/list/vpn.py +40 -0
  397. catalystwan/models/policy/list/zone.py +46 -0
  398. catalystwan/models/policy/localized.py +34 -16
  399. catalystwan/models/policy/policy.py +13 -9
  400. catalystwan/models/policy/policy_definition.py +673 -173
  401. catalystwan/models/policy/policy_list.py +38 -27
  402. catalystwan/models/policy/security.py +145 -46
  403. catalystwan/models/policy/voice.py +77 -0
  404. catalystwan/models/settings.py +41 -0
  405. catalystwan/models/templates.py +79 -0
  406. catalystwan/response.py +6 -2
  407. catalystwan/session.py +1 -1
  408. catalystwan/tests/builders/test_report.py +60 -0
  409. catalystwan/tests/builders/uc_voice.py +85 -0
  410. catalystwan/tests/models/__init__.py +0 -0
  411. catalystwan/tests/models/test_digital_interface.py +56 -0
  412. catalystwan/tests/templates/definitions/aaa_basic.json +96 -0
  413. catalystwan/tests/templates/definitions/aaa_complex.json +464 -0
  414. catalystwan/tests/templates/definitions/{iuo.json → cisco_aaa.json} +44 -15
  415. catalystwan/tests/templates/definitions/cisco_aaa_complex.json +361 -0
  416. catalystwan/tests/templates/definitions/cisco_logging_complex.json +268 -0
  417. catalystwan/tests/templates/definitions/cisco_ntp_complex.json +143 -0
  418. catalystwan/tests/templates/definitions/cisco_omp_complex.json +175 -0
  419. catalystwan/tests/templates/definitions/cisco_ospf_complex.json +302 -0
  420. catalystwan/tests/templates/definitions/cisco_sig.json +405 -0
  421. catalystwan/tests/templates/definitions/cisco_snmp_complex.json +258 -0
  422. catalystwan/tests/templates/definitions/cisco_system_complex.json +502 -0
  423. catalystwan/tests/templates/definitions/{Basic_Cisco_VPN_Model.json → cisco_vpn_basic.json} +2 -2
  424. catalystwan/tests/templates/definitions/{complex_cisco_vpn.json → cisco_vpn_complex.json} +27 -12
  425. catalystwan/tests/templates/definitions/cisco_vpn_interface_complex.json +821 -0
  426. catalystwan/tests/templates/definitions/omp_vsmart_1.json +26 -0
  427. catalystwan/tests/templates/definitions/{omp_2.json → omp_vsmart_2.json} +16 -2
  428. catalystwan/tests/templates/definitions/{omp_3.json → omp_vsmart_3.json} +16 -2
  429. catalystwan/tests/templates/definitions/omp_vsmart_complex.json +73 -0
  430. catalystwan/tests/templates/definitions/security_vsmart_complex.json +24 -0
  431. catalystwan/tests/templates/definitions/system_vsmart_complex.json +193 -0
  432. catalystwan/tests/templates/definitions/vpn_vsmart_basic.json +17 -0
  433. catalystwan/tests/templates/definitions/vpn_vsmart_complex.json +179 -0
  434. catalystwan/tests/templates/definitions/vpn_vsmart_interface_basic.json +42 -0
  435. catalystwan/tests/templates/definitions/vpn_vsmart_interface_complex.json +208 -0
  436. catalystwan/tests/templates/models/__init__.py +46 -13
  437. catalystwan/tests/templates/models/aaa.py +106 -0
  438. catalystwan/tests/templates/models/cisco_aaa.py +81 -48
  439. catalystwan/tests/templates/models/cisco_banner.py +2 -2
  440. catalystwan/tests/templates/models/cisco_bfd.py +4 -6
  441. catalystwan/tests/templates/models/cisco_logging.py +65 -0
  442. catalystwan/tests/templates/models/cisco_ntp.py +17 -0
  443. catalystwan/tests/templates/models/cisco_omp.py +37 -0
  444. catalystwan/tests/templates/models/cisco_ospf.py +60 -0
  445. catalystwan/tests/templates/models/cisco_secure_internet_gateway.py +95 -0
  446. catalystwan/tests/templates/models/cisco_snmp.py +40 -0
  447. catalystwan/tests/templates/models/cisco_system.py +108 -3
  448. catalystwan/tests/templates/models/cisco_vpn.py +42 -72
  449. catalystwan/tests/templates/models/cisco_vpn_interface.py +200 -0
  450. catalystwan/tests/templates/models/omp_vsmart.py +28 -8
  451. catalystwan/tests/templates/models/security_vsmart.py +11 -0
  452. catalystwan/tests/templates/models/system_vsmart.py +37 -0
  453. catalystwan/tests/templates/models/vpn_vsmart.py +32 -0
  454. catalystwan/tests/templates/models/vpn_vsmart_interface.py +54 -0
  455. catalystwan/tests/templates/schemas/aaa.json +1096 -0
  456. catalystwan/tests/templates/schemas/cedge_aaa.json +1 -1
  457. catalystwan/tests/templates/schemas/cisco_logging.json +577 -0
  458. catalystwan/tests/templates/schemas/cisco_ntp.json +265 -0
  459. catalystwan/tests/templates/schemas/cisco_omp.json +479 -0
  460. catalystwan/tests/templates/schemas/cisco_ospf.json +908 -0
  461. catalystwan/tests/templates/schemas/cisco_secure_internet_gateway.json +1520 -0
  462. catalystwan/tests/templates/schemas/cisco_snmp.json +561 -0
  463. catalystwan/tests/templates/schemas/cisco_system.json +242 -0
  464. catalystwan/tests/templates/schemas/cisco_vpn.json +53 -1
  465. catalystwan/tests/templates/schemas/cisco_vpn_interface.json +3348 -0
  466. catalystwan/tests/templates/schemas/omp-vsmart.json +20 -0
  467. catalystwan/tests/templates/schemas/security-vsmart.json +58 -0
  468. catalystwan/tests/templates/schemas/system-vsmart.json +2585 -0
  469. catalystwan/tests/templates/schemas/vpn-vsmart-interface.json +859 -0
  470. catalystwan/tests/templates/schemas/vpn-vsmart.json +445 -0
  471. catalystwan/tests/templates/test_chose_model.py +6 -10
  472. catalystwan/tests/templates/test_deserialize_model.py +4 -4
  473. catalystwan/tests/templates/test_find_template_values.py +229 -0
  474. catalystwan/tests/templates/test_find_template_values_2.py +193 -0
  475. catalystwan/tests/templates/test_serialize_model.py +1 -2
  476. catalystwan/tests/test_cli_template.py +8 -9
  477. catalystwan/tests/test_endpoints.py +42 -11
  478. catalystwan/tests/test_feature_profile_api.py +282 -0
  479. catalystwan/tests/test_models_common.py +53 -0
  480. catalystwan/tests/test_templates.py +16 -19
  481. catalystwan/utils/feature_template/find_template_values.py +17 -4
  482. catalystwan/utils/model.py +45 -0
  483. catalystwan/utils/persona.py +5 -0
  484. catalystwan/utils/type_check.py +22 -0
  485. catalystwan/workflows/backup_restore_device_templates.py +467 -0
  486. catalystwan/workflows/tenant_migration.py +1 -1
  487. {catalystwan-0.41.2.dist-info → catalystwan-0.41.2.dev0.dist-info}/METADATA +20 -1
  488. catalystwan-0.41.2.dev0.dist-info/RECORD +636 -0
  489. catalystwan/ENDPOINTS.md +0 -611
  490. catalystwan/api/configuration_groups/parcels/cellular_controller.py +0 -33
  491. catalystwan/api/templates/device_template/device_template_payload.json.j2 +0 -19
  492. catalystwan/models/configuration/config_migration.py +0 -36
  493. catalystwan/models/configuration/feature_profile/sdwan/management/vpn.py +0 -26
  494. catalystwan/models/configuration/feature_profile/sdwan/service/acl.py +0 -409
  495. catalystwan/models/configuration/feature_profile/sdwan/service/bgp.py +0 -288
  496. catalystwan/models/policy/lists.py +0 -330
  497. catalystwan/models/policy/lists_entries.py +0 -444
  498. catalystwan/tests/templates/definitions/complex_aaa.json +0 -277
  499. catalystwan/tests/templates/definitions/omp_1.json +0 -11
  500. catalystwan/utils/timezone.py +0 -422
  501. catalystwan-0.41.2.dist-info/RECORD +0 -353
  502. /catalystwan/tests/templates/definitions/{banner_1.json → cisco_banner.json} +0 -0
  503. {catalystwan-0.41.2.dist-info → catalystwan-0.41.2.dev0.dist-info}/LICENSE +0 -0
  504. {catalystwan-0.41.2.dist-info → catalystwan-0.41.2.dev0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,124 @@
1
+ # Copyright 2023 Cisco Systems, Inc. and its affiliates
2
+
3
+ from pathlib import Path
4
+ from typing import ClassVar, List, Literal, Optional
5
+
6
+ from pydantic import ConfigDict, Field
7
+
8
+ from catalystwan.api.templates.bool_str import BoolStr
9
+ from catalystwan.api.templates.feature_template import FeatureTemplate, FeatureTemplateValidator
10
+
11
+ VpnId = Literal["0", "512"]
12
+ Role = Literal["primary", "secondary"]
13
+
14
+
15
+ class Dns(FeatureTemplateValidator):
16
+ dns_addr: Optional[str] = Field(
17
+ default=None, json_schema_extra={"vmanage_key": "dns-addr"}, description="The IP address of the DNS server."
18
+ )
19
+ role: Role = Field(description="The role of the DNS server, either 'PRIMARY' or 'SECONDARY'.")
20
+ model_config = ConfigDict(populate_by_name=True)
21
+
22
+
23
+ class Host(FeatureTemplateValidator):
24
+ hostname: str = Field(..., description="The hostname of the device.")
25
+ ip: List[str] = Field(..., description="A list of IP addresses associated with the hostname.")
26
+
27
+
28
+ class NextHop(FeatureTemplateValidator):
29
+ address: Optional[str] = Field(default=None, description="The IP address of the next hop for the route.")
30
+ distance: Optional[int] = Field(default=1, description="The administrative distance of the next hop.")
31
+
32
+
33
+ class RouteInterface(FeatureTemplateValidator):
34
+ interface_name: str = Field(
35
+ description="The name of the interface used for routing.", json_schema_extra={"vmanage_key": "interface-name"}
36
+ )
37
+ interface_next_hop: Optional[List[NextHop]] = Field(
38
+ default=None,
39
+ description="A list of next hops associated with the interface for routing purposes.",
40
+ json_schema_extra={"vmanage_key": "interface-next-hop", "priority_order": ["address", "distance"]},
41
+ )
42
+ model_config = ConfigDict(populate_by_name=True)
43
+
44
+
45
+ class Routev4(FeatureTemplateValidator):
46
+ prefix: Optional[str] = Field(default=None, description="The IPv4 network prefix for the static route.")
47
+ next_hop: Optional[List[NextHop]] = Field(
48
+ default=None,
49
+ description="A list of IPv4 next hops for the route.",
50
+ json_schema_extra={"vmanage_key": "next-hop", "priority_order": ["address", "distance"]},
51
+ )
52
+ route_interface: Optional[RouteInterface] = Field(
53
+ default=None,
54
+ description="The interface configuration for the IPv4 static route.",
55
+ json_schema_extra={"vmanage_key": "route-interface"},
56
+ )
57
+ null0: Optional[BoolStr] = Field(
58
+ default=None, description="A flag indicating whether to route traffic to null0 for this static route."
59
+ )
60
+ distance: Optional[int] = Field(default=None, description="The administrative distance for the static route.")
61
+ vpn: Optional[int] = Field(
62
+ default=None, description="The VPN instance identifier associated with the static route."
63
+ )
64
+
65
+ model_config = ConfigDict(populate_by_name=True)
66
+
67
+
68
+ class NextHopv6(FeatureTemplateValidator):
69
+ address: str = Field(description="The IPv6 address of the next hop for the route.")
70
+ distance: Optional[int] = Field(default=1, description="The administrative distance of the IPv6 next hop.")
71
+
72
+
73
+ class Routev6(FeatureTemplateValidator):
74
+ prefix: str = Field(description="The IPv6 network prefix for the static route.")
75
+ next_hop: Optional[List[NextHopv6]] = Field(
76
+ default=None,
77
+ description="A list of IPv6 next hops for the route.",
78
+ json_schema_extra={"vmanage_key": "next-hop"},
79
+ )
80
+ null0: Optional[BoolStr] = Field(
81
+ default=None, description="A flag indicating whether to route IPv6 traffic to null0 for this static route."
82
+ )
83
+ distance: Optional[int] = Field(default=1, description="The administrative distance for the static route.")
84
+ vpn: Optional[int] = Field(default=0, description="The VPN instance identifier associated with the static route.")
85
+ model_config = ConfigDict(populate_by_name=True)
86
+
87
+
88
+ class VpnVsmartModel(FeatureTemplate):
89
+ model_config = ConfigDict(arbitrary_types_allowed=True, populate_by_name=True)
90
+ _docs_description: str = "vSmart VPN Feature Template configuration."
91
+
92
+ vpn_id: VpnId = Field(
93
+ description="The unique identifier for the VPN, only 0 and 512 are allowed on vsmart",
94
+ json_schema_extra={"vmanage_key": "vpn-id"},
95
+ )
96
+ name: Optional[str] = Field(
97
+ default=None, description="The name of the VPN.", json_schema_extra={"vmanage_key": "name"}
98
+ )
99
+ dns: Optional[List[Dns]] = Field(
100
+ default=None,
101
+ description="A list of DNS configurations for the VPN instance.",
102
+ )
103
+ host: Optional[List[Host]] = Field(
104
+ default=None,
105
+ description="Static DNS mapping",
106
+ json_schema_extra={"priority_order": ["hostname", "ip"]},
107
+ )
108
+ route_v4: Optional[List[Routev4]] = Field(
109
+ default=None,
110
+ description="A list of IPv4 route configurations within the VPN instance.",
111
+ json_schema_extra={
112
+ "data_path": ["ip"],
113
+ "vmanage_key": "route",
114
+ "priority_order": ["prefix", "next-hop", "next-hop-with-track"],
115
+ },
116
+ )
117
+ route_v6: Optional[List[Routev6]] = Field(
118
+ default=None,
119
+ description="A list of IPv6 route configurations within the VPN instance.",
120
+ json_schema_extra={"data_path": ["ipv6"], "vmanage_key": "route"},
121
+ )
122
+
123
+ payload_path: ClassVar[Path] = Path(__file__).parent / "DEPRECATED"
124
+ type: ClassVar[str] = "vpn-vsmart"
catalystwan/apigw_auth.py CHANGED
@@ -7,10 +7,10 @@ from urllib.parse import urlparse
7
7
  from pydantic import BaseModel, Field, PositiveInt
8
8
  from requests import HTTPError, PreparedRequest, post
9
9
  from requests.auth import AuthBase
10
- from requests.exceptions import JSONDecodeError
10
+ from requests.exceptions import JSONDecodeError, Timeout
11
11
 
12
12
  from catalystwan.abstractions import APIEndpointClient, AuthProtocol
13
- from catalystwan.exceptions import CatalystwanException
13
+ from catalystwan.exceptions import ApiGwAuthTimeout, CatalystwanException
14
14
  from catalystwan.response import auth_response_debug
15
15
 
16
16
  LoginMode = Literal["machine", "user", "session"]
@@ -106,6 +106,8 @@ class ApiGwAuth(AuthBase, AuthProtocol):
106
106
  raise CatalystwanException(
107
107
  f"Problem with connection to ApiGateway login endpoint, ({ex}). Response: ({response.text})"
108
108
  )
109
+ except Timeout as ex:
110
+ raise ApiGwAuthTimeout(f"The request to the API GW login timeout, ({ex}).")
109
111
  except KeyError as ex:
110
112
  raise CatalystwanException(f"Not found token in login response from ApiGateway, ({ex})")
111
113
  else:
@@ -139,6 +141,8 @@ class ApiGwAuth(AuthBase, AuthProtocol):
139
141
  f"Problem with connecting to API GW organization registration endpoint, ({ex}).\
140
142
  Response: ({response.text})"
141
143
  )
144
+ except Timeout as ex:
145
+ raise ApiGwAuthTimeout(f"The request to the API GW organization registration timeout, ({ex}).")
142
146
  except Exception as ex:
143
147
  raise CatalystwanException(f"Org registration to API-GW failed: {ex}")
144
148
 
@@ -11,9 +11,9 @@ from catalystwan.utils.alarm_status import Severity
11
11
  from catalystwan.utils.certificate_status import ValidityPeriod
12
12
  from catalystwan.utils.colors import PrintColors
13
13
  from catalystwan.utils.creation_tools import FIELD_NAME, asdict, convert_attributes
14
+ from catalystwan.utils.persona import Persona
14
15
  from catalystwan.utils.personality import Personality
15
16
  from catalystwan.utils.reachability import Reachability
16
- from catalystwan.utils.template_type import TemplateType
17
17
 
18
18
 
19
19
  class DataclassBase:
@@ -252,36 +252,6 @@ class User(DataclassBase):
252
252
  resource_group: Optional[str] = field(default=None, metadata={FIELD_NAME: "resGroupName"})
253
253
 
254
254
 
255
- @define(kw_only=True)
256
- class TemplateInfo(DataclassBase):
257
- last_updated_by: str = field(metadata={FIELD_NAME: "lastUpdatedBy"})
258
- id: str = field(metadata={FIELD_NAME: "templateId"})
259
- factory_default: bool = field(metadata={FIELD_NAME: "factoryDefault"})
260
- name: str = field(metadata={FIELD_NAME: "templateName"})
261
- devices_attached: int = field(metadata={FIELD_NAME: "devicesAttached"})
262
- description: str = field(metadata={FIELD_NAME: "templateDescription"})
263
- last_updated_on: dt.datetime = field(metadata={FIELD_NAME: "lastUpdatedOn"})
264
- resource_group: Optional[str] = field(default=None, metadata={FIELD_NAME: "resourceGroup"})
265
-
266
-
267
- @define(kw_only=True)
268
- class FeatureTemplateInfo(TemplateInfo):
269
- template_type: str = field(metadata={FIELD_NAME: "templateType"})
270
- device_type: List[str] = field(metadata={FIELD_NAME: "deviceType"})
271
- version: str = field(metadata={FIELD_NAME: "templateMinVersion"})
272
- template_definiton: Optional[str] = field(default=None, metadata={FIELD_NAME: "templateDefinition"})
273
-
274
-
275
- @define(kw_only=True)
276
- class DeviceTemplateInfo(TemplateInfo):
277
- device_type: str = field(metadata={FIELD_NAME: "deviceType"})
278
- template_class: str = field(metadata={FIELD_NAME: "templateClass"})
279
- config_type: TemplateType = field(converter=TemplateType, metadata={FIELD_NAME: "configType"})
280
- template_attached: int = field(metadata={FIELD_NAME: "templateAttached"})
281
- draft_mode: Optional[str] = field(default=None, metadata={FIELD_NAME: "draftMode"})
282
- device_role: Optional[str] = field(default=None, metadata={FIELD_NAME: "deviceRole"})
283
-
284
-
285
255
  @define
286
256
  class Speedtest(DataclassBase):
287
257
  device_ip: str
@@ -312,7 +282,7 @@ class ServiceConfigurationData(DataclassBase):
312
282
  vmanage_id: str = field(metadata={FIELD_NAME: "vmanageID"})
313
283
  device_ip: str = field(metadata={FIELD_NAME: "deviceIP"}) # consider using ip4 module to verify
314
284
  services: dict = field(metadata={FIELD_NAME: "services"}) # consider using nested dataclasses
315
- persona: str = field(default="COMPUTE_AND_DATA") # TODO Enum
285
+ persona: Persona = field(default="COMPUTE_AND_DATA")
316
286
  username: Optional[str] = field(default=None)
317
287
  password: Optional[str] = field(default=None)
318
288
 
@@ -374,27 +344,6 @@ class TierInfo(DataclassBase):
374
344
  nat_session_limit: Optional[int] = field(default=None, metadata={FIELD_NAME: "natSessionLimit"})
375
345
 
376
346
 
377
- @define(frozen=True)
378
- class FeatureTemplateInformation(DataclassBase):
379
- """Endpoint: /dataservice/template/feature"""
380
-
381
- id: str = field(metadata={FIELD_NAME: "templateId"})
382
- name: str = field(metadata={FIELD_NAME: "templateName"})
383
- description: str = field(metadata={FIELD_NAME: "templateDescription"})
384
- type: str = field(metadata={FIELD_NAME: "templateType"}) # TODO Enum
385
- device_types: List[str] = field(metadata={FIELD_NAME: "deviceType"}) # TODO Enum
386
- last_updated_by: str = field(metadata={FIELD_NAME: "lastUpdatedBy"})
387
- last_updated_on: dt.datetime = field(metadata={FIELD_NAME: "lastUpdatedOn"})
388
- factory_default: bool = field(metadata={FIELD_NAME: "factoryDefault"})
389
- devices_attached: int = field(metadata={FIELD_NAME: "devicesAttached"})
390
- attached_masters: int = field(metadata={FIELD_NAME: "attachedMastersCount"})
391
- version: str = field(metadata={FIELD_NAME: "templateMinVersion"})
392
- config_type: str = field(metadata={FIELD_NAME: "configType"})
393
- created_by: str = field(metadata={FIELD_NAME: "createdBy"})
394
- created_on: dt.datetime = field(metadata={FIELD_NAME: "createdOn"})
395
- resource_group: str = field(metadata={FIELD_NAME: "resourceGroup"})
396
-
397
-
398
347
  @define
399
348
  class Organization(DataclassBase):
400
349
  name: str = field(metadata={FIELD_NAME: "org"})
@@ -61,11 +61,12 @@ from uuid import UUID
61
61
  from packaging.specifiers import SpecifierSet # type: ignore
62
62
  from packaging.version import Version # type: ignore
63
63
  from pydantic import BaseModel
64
- from typing_extensions import Annotated, get_args, get_origin
64
+ from typing_extensions import get_args, get_origin
65
65
 
66
66
  from catalystwan.abstractions import APIEndpointClient, APIEndpointClientResponse
67
67
  from catalystwan.exceptions import APIEndpointError, APIRequestPayloadTypeError, APIVersionError, APIViewError
68
68
  from catalystwan.typed_list import DataSequence
69
+ from catalystwan.utils.model import resolve_nested_base_model_unions
69
70
  from catalystwan.utils.session_type import SessionType
70
71
 
71
72
  BASE_PATH: Final[str] = "/dataservice"
@@ -75,8 +76,7 @@ logger = logging.getLogger(__name__)
75
76
 
76
77
  @runtime_checkable
77
78
  class CustomPayloadType(Protocol):
78
- def prepared(self) -> PreparedPayload:
79
- ...
79
+ def prepared(self) -> PreparedPayload: ...
80
80
 
81
81
 
82
82
  JSON = Union[str, int, float, bool, None, Dict[str, "JSON"], List["JSON"]]
@@ -113,6 +113,19 @@ class TypeSpecifier:
113
113
  def model_union(cls, models: Sequence[type]) -> TypeSpecifier:
114
114
  return TypeSpecifier(present=True, payload_union_model_types=models)
115
115
 
116
+ @classmethod
117
+ def resolve_nested(cls, annotation: Any, models_types: List[type]) -> List[type]:
118
+ try:
119
+ return resolve_nested_base_model_unions(annotation)
120
+ except TypeError:
121
+ raise APIEndpointError(f"Expected: {PayloadType}")
122
+
123
+ @property
124
+ def payload_model_set(self) -> Optional[Set[type]]:
125
+ if self.payload_union_model_types is not None:
126
+ return set(self.payload_union_model_types)
127
+ return None
128
+
116
129
 
117
130
  @dataclass
118
131
  class APIEndpointRequestMeta:
@@ -161,16 +174,18 @@ class APIEndpoints:
161
174
  """
162
175
 
163
176
  @classmethod
164
- def _prepare_payload(cls, payload: PayloadType, force_json: bool = False) -> PreparedPayload:
177
+ def _prepare_payload(
178
+ cls, payload: PayloadType, force_json: bool = False, context: Dict[str, Any] = {}
179
+ ) -> PreparedPayload:
165
180
  """Helper method to prepare data for sending based on type"""
166
181
  if force_json or isinstance(payload, dict):
167
182
  return PreparedPayload(data=json.dumps(payload), headers={"content-type": "application/json"})
168
183
  if isinstance(payload, (str, bytes)):
169
184
  return PreparedPayload(data=payload)
170
185
  elif isinstance(payload, (BaseModel)):
171
- return cls._prepare_basemodel_payload(payload)
186
+ return cls._prepare_basemodel_payload(payload, context)
172
187
  elif isinstance(payload, Sequence) and not isinstance(payload, (str, bytes)):
173
- return cls._prepare_sequence_payload(payload) # type: ignore[arg-type]
188
+ return cls._prepare_sequence_payload(payload, context) # type: ignore[arg-type]
174
189
  # offender is List[JSON] which is also a Sequence can be ignored as long as force_json is passed correctly
175
190
  elif isinstance(payload, CustomPayloadType):
176
191
  return payload.prepared()
@@ -178,26 +193,27 @@ class APIEndpoints:
178
193
  raise APIRequestPayloadTypeError(payload)
179
194
 
180
195
  @classmethod
181
- def _prepare_basemodel_payload(cls, payload: BaseModel) -> PreparedPayload:
196
+ def _prepare_basemodel_payload(cls, payload: BaseModel, context: Dict[str, Any] = {}) -> PreparedPayload:
182
197
  """Helper method to prepare BaseModel instance for sending"""
183
198
  return PreparedPayload(
184
- data=payload.model_dump_json(exclude_none=True, by_alias=True), headers={"content-type": "application/json"}
199
+ data=payload.model_dump_json(exclude_none=True, by_alias=True, context=context),
200
+ headers={"content-type": "application/json"},
185
201
  )
186
202
 
187
203
  @classmethod
188
- def _prepare_sequence_payload(cls, payload: Iterable[BaseModel]) -> PreparedPayload:
204
+ def _prepare_sequence_payload(cls, payload: Iterable[BaseModel], context: Dict[str, Any] = {}) -> PreparedPayload:
189
205
  """Helper method to prepare sequences for sending"""
190
206
  items = []
191
207
  for item in payload:
192
- items.append(item.model_dump(exclude_none=True, by_alias=True))
208
+ items.append(item.model_dump(exclude_none=True, by_alias=True, context=context))
193
209
  data = json.dumps(items)
194
210
  return PreparedPayload(data=data, headers={"content-type": "application/json"})
195
211
 
196
212
  @classmethod
197
- def _prepare_params(cls, params: RequestParamsType) -> Dict[str, Any]:
213
+ def _prepare_params(cls, params: RequestParamsType, context: Dict[str, Any] = {}) -> Dict[str, Any]:
198
214
  """Helper method to prepare params for sending"""
199
215
  if isinstance(params, BaseModel):
200
- return params.model_dump(exclude_none=True, by_alias=True)
216
+ return params.model_dump(exclude_none=True, by_alias=True, context=context)
201
217
  return params
202
218
 
203
219
  def __init__(self, client: APIEndpointClient):
@@ -215,10 +231,11 @@ class APIEndpoints:
215
231
  ) -> APIEndpointClientResponse:
216
232
  """Prepares and sends request using client protocol"""
217
233
  _kwargs = dict(kwargs)
234
+ context = dict(api_version=self._api_version)
218
235
  if payload is not None:
219
- _kwargs.update(self._prepare_payload(payload, force_json_payload).asdict())
236
+ _kwargs.update(self._prepare_payload(payload, force_json_payload, context).asdict())
220
237
  if params is not None:
221
- _kwargs.update({"params": self._prepare_params(params)})
238
+ _kwargs.update({"params": self._prepare_params(params, context)})
222
239
  return self._client.request(method, self._basepath + url, **_kwargs)
223
240
 
224
241
  @property
@@ -245,9 +262,9 @@ class versions(APIEndpointsDecorator):
245
262
  Logs warning or raises exception when incompatibility found during runtime.
246
263
  """
247
264
 
248
- versions_lookup: ClassVar[
249
- Dict[str, SpecifierSet]
250
- ] = {} # maps decorated method instance to it's supported verisions
265
+ versions_lookup: ClassVar[Dict[str, SpecifierSet]] = (
266
+ {}
267
+ ) # maps decorated method instance to it's supported verisions
251
268
 
252
269
  def __init__(self, supported_versions: str, raises: bool = False):
253
270
  self.supported_versions = SpecifierSet(supported_versions)
@@ -337,9 +354,9 @@ class request(APIEndpointsDecorator):
337
354
  """
338
355
 
339
356
  forbidden_url_field_names = {"self", "payload", "params"}
340
- request_lookup: ClassVar[
341
- Dict[str, APIEndpointRequestMeta]
342
- ] = {} # maps decorated method instance to it's meta information
357
+ request_lookup: ClassVar[Dict[str, APIEndpointRequestMeta]] = (
358
+ {}
359
+ ) # maps decorated method instance to it's meta information
343
360
 
344
361
  def __init__(self, http_method: str, url: str, resp_json_key: Optional[str] = None, **kwargs):
345
362
  self.http_method = http_method
@@ -441,27 +458,10 @@ class request(APIEndpointsDecorator):
441
458
  and issubclass(type_args[0], BaseModel)
442
459
  ):
443
460
  return TypeSpecifier(True, type_origin, type_args[0], None, False, is_optional)
444
- # Check if Annnotated[Union[PayloadModelType, ...]], only unions of pydantic models allowed
445
- elif type_origin == Annotated:
446
- if annotated_origin := get_args(annotation):
447
- if (len(annotated_origin) >= 1) and get_origin(annotated_origin[0]) == Union:
448
- if (
449
- (type_args := get_args(annotated_origin[0]))
450
- and all(isclass(t) for t in type_args)
451
- and all(issubclass(t, BaseModel) for t in type_args)
452
- ):
453
- return TypeSpecifier.model_union(models=list(type_args))
454
- # Check if Union[PayloadModelType, ...], only unions of pydantic models allowed
455
- elif type_origin == Union:
456
- if (
457
- (type_args := get_args(annotation))
458
- and all(isclass(t) for t in type_args)
459
- and all(issubclass(t, BaseModel) for t in type_args)
460
- ):
461
- return TypeSpecifier.model_union(models=list(type_args))
462
- raise APIEndpointError(f"Expected: {PayloadType} but found payload {annotation}")
463
- else:
464
- raise APIEndpointError(f"Expected: {PayloadType} but found payload {annotation}")
461
+ else:
462
+ models = TypeSpecifier.resolve_nested(annotation, [])
463
+ return TypeSpecifier.model_union(models)
464
+ raise APIEndpointError(f"'payload' param must be annotated with supported type: {PayloadType}")
465
465
 
466
466
  def check_params(self):
467
467
  """Checks params in decorated method definition
@@ -135,3 +135,7 @@ class CertificateManagementDevice(APIEndpoints):
135
135
  @post("/certificate/vsmart/list")
136
136
  def send_to_vbond(self) -> CertActionResponse:
137
137
  ...
138
+
139
+ @post("/certificate/install/signedCert")
140
+ def install_signed_cert(self, payload: str) -> CertActionResponse:
141
+ ...
@@ -1,12 +1,13 @@
1
1
  # Copyright 2023 Cisco Systems, Inc. and its affiliates
2
2
 
3
3
  # mypy: disable-error-code="empty-body"
4
- from typing import Literal, Optional
4
+ from typing import Dict, Literal, Optional
5
5
 
6
- from pydantic import BaseModel
6
+ from pydantic import BaseModel, ConfigDict, Field
7
7
 
8
- from catalystwan.endpoints import APIEndpoints, get
8
+ from catalystwan.endpoints import JSON, APIEndpoints, get, post, put
9
9
  from catalystwan.typed_list import DataSequence
10
+ from catalystwan.utils.persona import Persona
10
11
 
11
12
  TenancyModes = Literal["SingleTenant", "MultiTenant"]
12
13
 
@@ -24,12 +25,30 @@ class VManageDetails(BaseModel):
24
25
  status: str
25
26
 
26
27
 
28
+ class ConnectedDevice(BaseModel):
29
+ model_config = ConfigDict(populate_by_name=True)
30
+ uuid: str
31
+ device_id: str = Field(serialization_alias="deviceId", validation_alias="deviceId")
32
+
33
+
34
+ class VManageSetup(BaseModel):
35
+ model_config = ConfigDict(populate_by_name=True)
36
+ vmanage_id: Optional[str] = Field(default=None, serialization_alias="vmanageID", validation_alias="vmanageID")
37
+ device_ip: str = Field(serialization_alias="deviceIP", validation_alias="deviceIP")
38
+ username: str
39
+ password: str
40
+ gen_csr: Optional[bool] = Field(default=None, serialization_alias="genCSR", validation_alias="genCSR")
41
+ persona: Persona
42
+ services: Optional[Dict[str, Dict[str, bool]]] = Field(default=None)
43
+
44
+
27
45
  class ClusterManagement(APIEndpoints):
28
46
  def add_or_update_user_credentials(self):
29
47
  # POST /clusterManagement/userCreds
30
48
  ...
31
49
 
32
- def add_vmanage(self):
50
+ @post("/clusterManagement/setup")
51
+ def add_vmanage(self, payload: VManageSetup) -> JSON:
33
52
  # POST /clusterManagement/setup
34
53
  ...
35
54
 
@@ -41,7 +60,8 @@ class ClusterManagement(APIEndpoints):
41
60
  # POST /clusterManagement/configure
42
61
  ...
43
62
 
44
- def edit_vmanage(self):
63
+ @put("/clusterManagement/setup")
64
+ def edit_vmanage(self, payload: VManageSetup) -> JSON:
45
65
  # PUT /clusterManagement/setup
46
66
  ...
47
67
 
@@ -53,8 +73,8 @@ class ClusterManagement(APIEndpoints):
53
73
  # GET /clusterManagement/iplist/{vmanageID}
54
74
  ...
55
75
 
56
- def get_connected_devices(self):
57
- # GET /clusterManagement/connectedDevices/{vmanageIP}
76
+ @get("/clusterManagement/connectedDevices/{vmanageIP}", "data")
77
+ def get_connected_devices(self, vmanageIP: str) -> DataSequence[ConnectedDevice]:
58
78
  ...
59
79
 
60
80
  def get_connected_devices_per_tenant(self):
@@ -0,0 +1,107 @@
1
+ # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
+
3
+ # mypy: disable-error-code="empty-body"
4
+ from uuid import UUID
5
+
6
+ from catalystwan.endpoints import APIEndpoints, delete, get, post, put, versions
7
+ from catalystwan.models.configuration.feature_profile.common import (
8
+ FeatureProfileCreationPayload,
9
+ FeatureProfileCreationResponse,
10
+ FeatureProfileDetail,
11
+ FeatureProfileEditPayload,
12
+ FeatureProfileInfo,
13
+ GetFeatureProfilesParams,
14
+ )
15
+ from catalystwan.models.configuration.feature_profile.parcel import Parcel, ParcelCreationResponse
16
+ from catalystwan.models.configuration.feature_profile.sdwan.application_priority import AnyApplicationPriorityParcel
17
+ from catalystwan.models.configuration.feature_profile.sdwan.application_priority.policy_settings import (
18
+ PolicySettingsParcel,
19
+ )
20
+ from catalystwan.typed_list import DataSequence
21
+
22
+
23
+ class ApplicationPriorityFeatureProfile(APIEndpoints):
24
+ @versions(supported_versions=(">=20.12"), raises=False)
25
+ @post("/v1/feature-profile/sdwan/application-priority")
26
+ def create_application_priority_feature_profile(
27
+ self, payload: FeatureProfileCreationPayload
28
+ ) -> FeatureProfileCreationResponse:
29
+ ...
30
+
31
+ @versions(supported_versions=(">=20.12"), raises=False)
32
+ @get("/v1/feature-profile/sdwan/application-priority")
33
+ def get_application_priority_feature_profiles(
34
+ self, params: GetFeatureProfilesParams
35
+ ) -> DataSequence[FeatureProfileInfo]:
36
+ ...
37
+
38
+ @versions(supported_versions=(">=20.12"), raises=False)
39
+ @get("/v1/feature-profile/sdwan/application-priority/{profile_id}")
40
+ def get_application_priority_feature_profile(
41
+ self, profile_id: str, params: GetFeatureProfilesParams
42
+ ) -> FeatureProfileDetail:
43
+ ...
44
+
45
+ @versions(supported_versions=(">=20.12"), raises=False)
46
+ @put("/v1/feature-profile/sdwan/application-priority/{profile_id}")
47
+ def edit_application_priority_feature_profile(
48
+ self, profile_id: str, payload: FeatureProfileEditPayload
49
+ ) -> FeatureProfileCreationResponse:
50
+ ...
51
+
52
+ @versions(supported_versions=(">=20.12"), raises=False)
53
+ @delete("/v1/feature-profile/sdwan/application-priority/{profile_id}")
54
+ def delete_application_priority_feature_profile(self, profile_id: str) -> None:
55
+ ...
56
+
57
+ @versions(supported_versions=(">=20.12"), raises=False)
58
+ @post("/v1/feature-profile/sdwan/application-priority/{profile_id}/{application_priority_list_type}")
59
+ def create(
60
+ self, profile_id: UUID, application_priority_list_type: str, payload: AnyApplicationPriorityParcel
61
+ ) -> ParcelCreationResponse:
62
+ ...
63
+
64
+ @versions(supported_versions=(">=20.12"), raises=False)
65
+ @delete(
66
+ "/v1/feature-profile/sdwan/application-priority/{profile_id}/{application_priority_list_type}/{list_object_id}"
67
+ )
68
+ def delete(self, profile_id: UUID, application_priority_list_type: str, list_object_id: UUID) -> None:
69
+ ...
70
+
71
+ @versions(supported_versions=(">=20.12"), raises=False)
72
+ @put(
73
+ "/v1/feature-profile/sdwan/application-priority/{profile_id}/{application_priority_list_type}/{list_object_id}"
74
+ )
75
+ def update(
76
+ self,
77
+ profile_id: UUID,
78
+ application_priority_list_type: str,
79
+ list_object_id: UUID,
80
+ payload: AnyApplicationPriorityParcel,
81
+ ) -> ParcelCreationResponse:
82
+ ...
83
+
84
+ @versions(supported_versions=(">=20.12"), raises=False)
85
+ @get(
86
+ "/v1/feature-profile/sdwan/application-priority/{profile_id}/{application_priority_list_type}/{list_object_id}"
87
+ )
88
+ def get_by_id(self, profile_id: UUID, application_priority_list_type: str, list_object_id: UUID) -> Parcel:
89
+ ...
90
+
91
+ @versions(supported_versions=(">=20.12"), raises=False)
92
+ @get(
93
+ "/v1/feature-profile/sdwan/application-priority/{profile_id}/{application_priority_list_type}",
94
+ resp_json_key="data",
95
+ )
96
+ def get_all(self, profile_id: UUID, application_priority_list_type: str) -> DataSequence[Parcel]:
97
+ ...
98
+
99
+ @versions(supported_versions=(">20.12"), raises=False)
100
+ @post("/v1/feature-profile/sdwan/application-priority/{profile_id}/policy-settings")
101
+ def create_policy_settings(self, profile_id: UUID, payload: PolicySettingsParcel) -> ParcelCreationResponse:
102
+ ...
103
+
104
+ @versions(supported_versions=(">20.12"), raises=False)
105
+ @get("/v1/feature-profile/sdwan/application-priority/{profile_id}/policy-settings/{list_object_id}")
106
+ def get_policy_settings(self, profile_id: UUID, list_object_id: UUID) -> Parcel:
107
+ ...
@@ -0,0 +1,60 @@
1
+ # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
+
3
+ # mypy: disable-error-code="empty-body"
4
+ from typing import Optional
5
+ from uuid import UUID
6
+
7
+ from catalystwan.endpoints import APIEndpoints, delete, get, post, put, versions
8
+ from catalystwan.models.configuration.feature_profile.common import (
9
+ FeatureProfileCreationPayload,
10
+ FeatureProfileCreationResponse,
11
+ FeatureProfileInfo,
12
+ GetFeatureProfilesParams,
13
+ )
14
+ from catalystwan.models.configuration.feature_profile.parcel import Parcel, ParcelCreationResponse
15
+ from catalystwan.models.configuration.feature_profile.sdwan.cli import AnyCliParcel
16
+ from catalystwan.typed_list import DataSequence
17
+
18
+
19
+ class CliFeatureProfile(APIEndpoints):
20
+ @versions(">=20.9")
21
+ @get("/v1/feature-profile/sdwan/cli")
22
+ def get_profiles(self, payload: Optional[GetFeatureProfilesParams]) -> DataSequence[FeatureProfileInfo]:
23
+ ...
24
+
25
+ @versions(">=20.9")
26
+ @post("/v1/feature-profile/sdwan/cli")
27
+ def create_profile(self, payload: FeatureProfileCreationPayload) -> FeatureProfileCreationResponse:
28
+ ...
29
+
30
+ @versions(">=20.9")
31
+ @delete("/v1/feature-profile/sdwan/cli/{profile_id}")
32
+ def delete_profile(self, profile_id: UUID) -> None:
33
+ ...
34
+
35
+ @versions(">=20.9")
36
+ @get("/v1/feature-profile/sdwan/cli/{profile_id}/{parcel_type}")
37
+ def get_all(self, profile_id: UUID, parcel_type: str) -> DataSequence[Parcel[AnyCliParcel]]:
38
+ ...
39
+
40
+ @versions(">=20.9")
41
+ @get("/v1/feature-profile/sdwan/cli/{profile_id}/{parcel_type}/{parcel_id}")
42
+ def get_by_id(self, profile_id: UUID, parcel_type: str, parcel_id: UUID) -> Parcel[AnyCliParcel]:
43
+ ...
44
+
45
+ @versions(">=20.9")
46
+ @post("/v1/feature-profile/sdwan/cli/{profile_id}/{parcel_type}")
47
+ def create(self, profile_id: UUID, parcel_type: str, payload: AnyCliParcel) -> ParcelCreationResponse:
48
+ ...
49
+
50
+ @versions(">=20.9")
51
+ @put("/v1/feature-profile/sdwan/cli/{profile_id}/{parcel_type}/{parcel_id}")
52
+ def update(
53
+ self, profile_id: UUID, parcel_type: str, parcel_id: UUID, payload: AnyCliParcel
54
+ ) -> ParcelCreationResponse:
55
+ ...
56
+
57
+ @versions(">=20.9")
58
+ @delete("/v1/feature-profile/sdwan/cli/{profile_id}/{parcel_type}/{parcel_id}")
59
+ def delete(self, profile_id: UUID, parcel_type: str, parcel_id: UUID) -> None:
60
+ ...