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
catalystwan/__init__.py CHANGED
@@ -13,7 +13,8 @@ from typing import Callable, Final, List, Optional
13
13
 
14
14
  import urllib3
15
15
 
16
- USER_AGENT = f"{__package__}/{metadata.version(__package__)}"
16
+ PACKAGE_VERSION = metadata.version(__package__)
17
+ USER_AGENT = f"{__package__}/{PACKAGE_VERSION}"
17
18
 
18
19
 
19
20
  def with_proc_info_header(method: Callable[..., str]) -> Callable[..., str]:
@@ -75,7 +76,7 @@ __version__ = metadata.version(__package__)
75
76
  pkg_src_list = list_package_sources()
76
77
 
77
78
 
78
- if environ.get("catalystwan_devel") is not None:
79
+ if environ.get("catalystwan_devel") is not None or environ.get("CATALYSTWAN_DEVEL") is not None:
79
80
  urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
80
81
  catalystwan_logger = logging.getLogger(__name__)
81
82
  logging.config.fileConfig(LOGGING_CONF_DIR, disable_existing_loggers=False)
@@ -1,4 +1,4 @@
1
- # Copyright 2022 Cisco Systems, Inc. and its affiliates
1
+ # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
2
 
3
3
  from __future__ import annotations
4
4
 
@@ -34,6 +34,7 @@ from catalystwan.endpoints.administration_user_and_group import (
34
34
  UserUpdateRequest,
35
35
  )
36
36
  from catalystwan.exceptions import CatalystwanDeprecationWarning, CatalystwanException
37
+ from catalystwan.models.settings import ThreatGridApi
37
38
  from catalystwan.typed_list import DataSequence
38
39
  from catalystwan.utils.creation_tools import asdict, create_dataclass
39
40
 
@@ -384,7 +385,14 @@ class AdministrationSettingsAPI:
384
385
  def update(self, payload: Organization) -> bool:
385
386
  ...
386
387
 
387
- def update(self, payload: Union[Organization, Certificate, Password, Vbond]) -> bool:
388
+ @overload
389
+ def update(self, payload: ThreatGridApi) -> bool:
390
+ ...
391
+
392
+ def update(self, payload: Union[Organization, Certificate, Password, Vbond, ThreatGridApi]) -> bool:
393
+ if isinstance(payload, ThreatGridApi):
394
+ created_threat = self.__update_thread_grid_api(payload)
395
+ return created_threat is not None
388
396
  json_payload = asdict(payload) # type: ignore
389
397
  if isinstance(payload, Organization):
390
398
  response = self.__update_organization(json_payload)
@@ -414,6 +422,9 @@ class AdministrationSettingsAPI:
414
422
  endpoint = "/dataservice/settings/configuration/device"
415
423
  return self.session.post(endpoint, json=payload)
416
424
 
425
+ def __update_thread_grid_api(self, payload: ThreatGridApi) -> DataSequence[ThreatGridApi]:
426
+ return self.session.endpoints.configuration_settings.edit_threat_grid_api_key(payload)
427
+
417
428
  @deprecated(
418
429
  "Use .endpoints.configuration_settings.edit_organizations() instead", category=CatalystwanDeprecationWarning
419
430
  )
@@ -15,10 +15,11 @@ from catalystwan.api.administration import (
15
15
  )
16
16
  from catalystwan.api.alarms_api import AlarmsAPI
17
17
  from catalystwan.api.basic_api import DevicesAPI, DeviceStateAPI
18
+ from catalystwan.api.builders import BuilderAPI
18
19
  from catalystwan.api.config_device_inventory_api import ConfigurationDeviceInventoryAPI
19
20
  from catalystwan.api.config_group_api import ConfigGroupAPI
20
21
  from catalystwan.api.dashboard_api import DashboardAPI
21
- from catalystwan.api.feature_profile_api import SDRoutingFeatureProfilesAPI
22
+ from catalystwan.api.feature_profile_api import SDRoutingFeatureProfilesAPI, SDWANFeatureProfilesAPI
22
23
  from catalystwan.api.logs_api import LogsAPI
23
24
  from catalystwan.api.omp_api import OmpAPI
24
25
  from catalystwan.api.packet_capture_api import PacketCaptureAPI
@@ -68,3 +69,5 @@ class APIContainer:
68
69
  self.sessions = SessionsAPI(session)
69
70
  self.policy = PolicyAPI(session)
70
71
  self.sd_routing_feature_profiles = SDRoutingFeatureProfilesAPI(session)
72
+ self.sdwan_feature_profiles = SDWANFeatureProfilesAPI(session)
73
+ self.builders = BuilderAPI(session)
@@ -0,0 +1,14 @@
1
+ # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
+ from __future__ import annotations
3
+
4
+ from typing import TYPE_CHECKING
5
+
6
+ from catalystwan.api.builders.feature_profiles.builder_factory import FeatureProfileBuilderFactory
7
+
8
+ if TYPE_CHECKING:
9
+ from catalystwan.session import ManagerSession
10
+
11
+
12
+ class BuilderAPI:
13
+ def __init__(self, session: ManagerSession):
14
+ self.feature_profiles = FeatureProfileBuilderFactory(session=session)
File without changes
@@ -0,0 +1,58 @@
1
+ # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
+ from __future__ import annotations
3
+
4
+ import logging
5
+ from typing import TYPE_CHECKING, List
6
+ from uuid import UUID
7
+
8
+ from catalystwan.api.builders.feature_profiles.report import FeatureProfileBuildReport, handle_create_parcel
9
+ from catalystwan.api.feature_profile_api import ApplicationPriorityFeatureProfileAPI
10
+ from catalystwan.models.configuration.feature_profile.common import FeatureProfileCreationPayload
11
+ from catalystwan.models.configuration.feature_profile.sdwan.application_priority import AnyApplicationPriorityParcel
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+ if TYPE_CHECKING:
16
+ from catalystwan.session import ManagerSession
17
+
18
+
19
+ class ApplicationPriorityFeatureProfileBuilder:
20
+ """
21
+ A class for building Application Priority feature profiles.
22
+ """
23
+
24
+ def __init__(self, session: ManagerSession) -> None:
25
+ """
26
+ Args:
27
+ session (ManagerSession): The ManagerSession object used for API communication.
28
+ profile_uuid (UUID): The UUID of the profile.
29
+ """
30
+ self._profile: FeatureProfileCreationPayload
31
+ self._api = ApplicationPriorityFeatureProfileAPI(session)
32
+ self._parcels: List[AnyApplicationPriorityParcel] = []
33
+
34
+ def add_profile_name_and_description(self, feature_profile: FeatureProfileCreationPayload) -> None:
35
+ """
36
+ Adds a name and description to the feature profile.
37
+
38
+ Args:
39
+ feature_profile (FeatureProfileCreationPayload): Payload containing the name and description.
40
+
41
+ Returns:
42
+ None
43
+ """
44
+ self._profile = feature_profile
45
+
46
+ def add_parcel(self, parcel: AnyApplicationPriorityParcel) -> None:
47
+ self._parcels.append(parcel)
48
+
49
+ def build(self) -> FeatureProfileBuildReport:
50
+ profile_uuid = self._api.create_profile(self._profile.name, self._profile.description).id
51
+ self.build_report = FeatureProfileBuildReport(profile_uuid=profile_uuid, profile_name=self._profile.name)
52
+ for parcel in self._parcels:
53
+ self._create_parcel(profile_uuid, parcel)
54
+ return self.build_report
55
+
56
+ @handle_create_parcel
57
+ def _create_parcel(self, profile_uuid: UUID, parcel: AnyApplicationPriorityParcel) -> UUID:
58
+ return self._api.create_parcel(profile_uuid, parcel).id
@@ -0,0 +1,59 @@
1
+ # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
+ from __future__ import annotations
3
+
4
+ from typing import TYPE_CHECKING, Callable, Mapping, Union
5
+
6
+ from catalystwan.api.builders.feature_profiles.application_priority import ApplicationPriorityFeatureProfileBuilder
7
+ from catalystwan.api.builders.feature_profiles.cli import CliFeatureProfileBuilder
8
+ from catalystwan.api.builders.feature_profiles.other import OtherFeatureProfileBuilder
9
+ from catalystwan.api.builders.feature_profiles.service import ServiceFeatureProfileBuilder
10
+ from catalystwan.api.builders.feature_profiles.system import SystemFeatureProfileBuilder
11
+ from catalystwan.api.builders.feature_profiles.transport import TransportAndManagementProfileBuilder
12
+ from catalystwan.api.builders.feature_profiles.uc_voice import UcVoiceFeatureProfileBuilder
13
+ from catalystwan.exceptions import CatalystwanException
14
+ from catalystwan.models.configuration.feature_profile.common import ProfileType
15
+
16
+ if TYPE_CHECKING:
17
+ from catalystwan.session import ManagerSession
18
+
19
+ FeatureProfileBuilder = Union[
20
+ ServiceFeatureProfileBuilder,
21
+ SystemFeatureProfileBuilder,
22
+ OtherFeatureProfileBuilder,
23
+ TransportAndManagementProfileBuilder,
24
+ CliFeatureProfileBuilder,
25
+ ApplicationPriorityFeatureProfileBuilder,
26
+ UcVoiceFeatureProfileBuilder
27
+ ]
28
+
29
+ BUILDER_MAPPING: Mapping[ProfileType, Callable] = {
30
+ "service": ServiceFeatureProfileBuilder,
31
+ "system": SystemFeatureProfileBuilder,
32
+ "other": OtherFeatureProfileBuilder,
33
+ "transport": TransportAndManagementProfileBuilder,
34
+ "cli": CliFeatureProfileBuilder,
35
+ "application-priority": ApplicationPriorityFeatureProfileBuilder,
36
+ "uc-voice": UcVoiceFeatureProfileBuilder,
37
+ }
38
+
39
+
40
+ class FeatureProfileBuilderFactory:
41
+ def __init__(self, session: ManagerSession):
42
+ self.session = session
43
+
44
+ def create_builder(self, profile_type: ProfileType) -> FeatureProfileBuilder:
45
+ """
46
+ Creates a builder for the specified feature profile.
47
+
48
+ Args:
49
+ feature_profile_name (str): The name of the feature profile.
50
+
51
+ Returns:
52
+ FeatureProfileBuilder: The builder for the specified feature profile.
53
+
54
+ Raises:
55
+ CatalystwanException: If the feature profile is not found or has an unsupported type.
56
+ """
57
+ if profile_type not in BUILDER_MAPPING:
58
+ raise CatalystwanException(f"Unsupported builder for type {profile_type}")
59
+ return BUILDER_MAPPING[profile_type](self.session)
@@ -0,0 +1,76 @@
1
+ # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
+ from __future__ import annotations
3
+
4
+ from typing import TYPE_CHECKING, List
5
+ from uuid import UUID
6
+
7
+ from catalystwan.api.builders.feature_profiles.report import FeatureProfileBuildReport, handle_create_parcel
8
+ from catalystwan.api.feature_profile_api import CliFeatureProfileAPI
9
+ from catalystwan.endpoints.configuration.feature_profile.sdwan.cli import CliFeatureProfile
10
+ from catalystwan.models.configuration.feature_profile.common import FeatureProfileCreationPayload
11
+ from catalystwan.models.configuration.feature_profile.sdwan.cli import AnyCliParcel
12
+
13
+ if TYPE_CHECKING:
14
+ from catalystwan.session import ManagerSession
15
+
16
+
17
+ class CliFeatureProfileBuilder:
18
+ """
19
+ A class for building Cli feature profiles.
20
+ """
21
+
22
+ def __init__(self, session: ManagerSession) -> None:
23
+ """
24
+ Initialize a new instance of the Cli class.
25
+
26
+ Args:
27
+ session (ManagerSession): The ManagerSession object used for API communication.
28
+ profile_uuid (UUID): The UUID of the profile.
29
+ """
30
+ self._profile: FeatureProfileCreationPayload
31
+ self._api = CliFeatureProfileAPI(session)
32
+ self._endpoints = CliFeatureProfile(session)
33
+ self._cli_configs: List[AnyCliParcel] = list()
34
+
35
+ def add_profile_name_and_description(self, feature_profile: FeatureProfileCreationPayload) -> None:
36
+ """
37
+ Adds a name and description to the feature profile.
38
+
39
+ Args:
40
+ name (str): The name of the feature profile.
41
+ description (str): The description of the feature profile.
42
+
43
+ Returns:
44
+ None
45
+ """
46
+ self._profile = feature_profile
47
+
48
+ def add_parcel(self, parcel: AnyCliParcel) -> None:
49
+ """
50
+ Adds a parcel to the feature profile.
51
+
52
+ Args:
53
+ parcel (AnyCliParcel): The parcel to add.
54
+
55
+ Returns:
56
+ None
57
+ """
58
+ self._cli_configs.append(parcel)
59
+
60
+ def build(self) -> FeatureProfileBuildReport:
61
+ """
62
+ Builds the feature profile.
63
+
64
+ Returns:
65
+ UUID: The UUID of the created feature profile.
66
+ """
67
+
68
+ profile_uuid = self._endpoints.create_profile(self._profile).id
69
+ self.build_report = FeatureProfileBuildReport(profile_uuid=profile_uuid, profile_name=self._profile.name)
70
+ for config_parcel in self._cli_configs:
71
+ self._create_parcel(profile_uuid, config_parcel)
72
+ return self.build_report
73
+
74
+ @handle_create_parcel
75
+ def _create_parcel(self, profile_uuid: UUID, parcel: AnyCliParcel) -> UUID:
76
+ return self._api.create_parcel(profile_uuid, parcel).id
@@ -0,0 +1,44 @@
1
+ # Copyright 2023 Cisco Systems, Inc. and its affiliates
2
+ from __future__ import annotations
3
+
4
+ from typing import Dict, List, Set, Tuple
5
+ from uuid import UUID
6
+
7
+ from catalystwan.models.configuration.feature_profile.sdwan.trackers import Tracker, TrackerGroup
8
+
9
+
10
+ class TrackerMixin:
11
+ def init_tracker(self) -> None:
12
+ self._shared_trackers: Dict[str, UUID] = {}
13
+ self._trackers: List[Tuple[Set[UUID], Tracker]] = []
14
+ self._tracker_groups: List[Tuple[Set[UUID], TrackerGroup, List[Tracker]]] = []
15
+ self._interface_tag_to_existing_tracker: Dict[UUID, Tuple[UUID, str]] = {}
16
+
17
+ def _create_parcel(self, profile_uuid: UUID, tracker: Tracker | TrackerGroup) -> UUID:
18
+ raise NotImplementedError()
19
+
20
+ def create_trackers(self, profile_uuid: UUID) -> None:
21
+ for tracker_group_tags, tracker_group, trackers in self._tracker_groups:
22
+ trackers_uuids: List[UUID] = []
23
+ for tracker_ in trackers:
24
+ tracker_uuid = self._create_parcel(profile_uuid, tracker_)
25
+ if tracker_uuid:
26
+ trackers_uuids.append(tracker_uuid)
27
+ self._shared_trackers[tracker_.parcel_name] = tracker_uuid
28
+
29
+ for tracker_uuid in trackers_uuids:
30
+ tracker_group.add_ref(tracker_uuid)
31
+
32
+ tracker_group_uuid = self._create_parcel(profile_uuid, tracker_group)
33
+ if tracker_group_uuid:
34
+ for tag in tracker_group_tags:
35
+ self._interface_tag_to_existing_tracker[tag] = tracker_group_uuid, tracker_group._get_parcel_type()
36
+
37
+ for tracker_tags, tracker in self._trackers:
38
+ if tracker.parcel_name in self._shared_trackers:
39
+ created_tracker_uuid = self._shared_trackers[tracker.parcel_name]
40
+ else:
41
+ created_tracker_uuid = self._create_parcel(profile_uuid, tracker)
42
+ if created_tracker_uuid:
43
+ for tag in tracker_tags:
44
+ self._interface_tag_to_existing_tracker[tag] = (created_tracker_uuid, tracker._get_parcel_type())
@@ -0,0 +1,79 @@
1
+ # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
+ from __future__ import annotations
3
+
4
+ import logging
5
+ from typing import TYPE_CHECKING, List
6
+ from uuid import UUID
7
+
8
+ from catalystwan.api.builders.feature_profiles.report import FeatureProfileBuildReport, handle_create_parcel
9
+ from catalystwan.api.feature_profile_api import OtherFeatureProfileAPI
10
+ from catalystwan.endpoints.configuration.feature_profile.sdwan.other import OtherFeatureProfile
11
+ from catalystwan.models.configuration.feature_profile.common import FeatureProfileCreationPayload
12
+ from catalystwan.models.configuration.feature_profile.sdwan.other import AnyOtherParcel
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+ if TYPE_CHECKING:
17
+ from catalystwan.session import ManagerSession
18
+
19
+
20
+ class OtherFeatureProfileBuilder:
21
+ """
22
+ A class for building Other feature profiles.
23
+ """
24
+
25
+ def __init__(self, session: ManagerSession) -> None:
26
+ """
27
+ Initialize a new instance of the Service class.
28
+
29
+ Args:
30
+ session (ManagerSession): The ManagerSession object used for API communication.
31
+ profile_uuid (UUID): The UUID of the profile.
32
+ """
33
+ self._profile: FeatureProfileCreationPayload
34
+ self._api = OtherFeatureProfileAPI(session)
35
+ self._endpoints = OtherFeatureProfile(session)
36
+ self._independent_items: List[AnyOtherParcel] = []
37
+
38
+ def add_profile_name_and_description(self, feature_profile: FeatureProfileCreationPayload) -> None:
39
+ """
40
+ Adds a name and description to the feature profile.
41
+
42
+ Args:
43
+ name (str): The name of the feature profile.
44
+ description (str): The description of the feature profile.
45
+
46
+ Returns:
47
+ None
48
+ """
49
+ self._profile = feature_profile
50
+
51
+ def add_parcel(self, parcel: AnyOtherParcel) -> None:
52
+ """
53
+ Adds a parcel to the feature profile.
54
+
55
+ Args:
56
+ parcel (AnySystemParcel): The parcel to add.
57
+
58
+ Returns:
59
+ None
60
+ """
61
+ self._independent_items.append(parcel)
62
+
63
+ def build(self) -> FeatureProfileBuildReport:
64
+ """
65
+ Builds the feature profile.
66
+
67
+ Returns:
68
+ UUID: The UUID of the created feature profile.
69
+ """
70
+
71
+ profile_uuid = self._endpoints.create_sdwan_other_feature_profile(self._profile).id
72
+ self.build_report = FeatureProfileBuildReport(profile_uuid=profile_uuid, profile_name=self._profile.name)
73
+ for parcel in self._independent_items:
74
+ self._create_parcel(profile_uuid, parcel)
75
+ return self.build_report
76
+
77
+ @handle_create_parcel
78
+ def _create_parcel(self, profile_uuid: UUID, parcel: AnyOtherParcel) -> UUID:
79
+ return self._api.create_parcel(profile_uuid, parcel).id
@@ -0,0 +1,155 @@
1
+ # Copyright 2023 Cisco Systems, Inc. and its affiliates
2
+ import functools
3
+ import logging
4
+ from typing import Any, List, Optional, Tuple, Union
5
+ from uuid import UUID
6
+
7
+ from pydantic import BaseModel, ConfigDict, Field
8
+ from requests import PreparedRequest, Request, Response
9
+
10
+ from catalystwan.exceptions import ManagerErrorInfo, ManagerHTTPError
11
+ from catalystwan.models.configuration.feature_profile.parcel import AnyParcel
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ def handle_create_parcel(func):
17
+ @functools.wraps(func)
18
+ def wrapper(self, profile_uuid: UUID, parcel: AnyParcel, *args, **kwargs) -> Optional[UUID]:
19
+ try:
20
+ uuid = func(self, profile_uuid, parcel, *args, **kwargs)
21
+ self.build_report.add_created_parcel(parcel.parcel_name, uuid)
22
+ return uuid
23
+ except ManagerHTTPError as e:
24
+ self.build_report.add_failed_parcel(
25
+ parcel_name=parcel.parcel_name,
26
+ parcel_type=parcel._get_parcel_type(),
27
+ error=e,
28
+ )
29
+ return None
30
+
31
+ return wrapper
32
+
33
+
34
+ class FailedRequestDetails(BaseModel):
35
+ method: str
36
+ url: str
37
+ body: str
38
+
39
+ @classmethod
40
+ def from_request(cls, request: Union[Request, PreparedRequest, Any]) -> "FailedRequestDetails":
41
+ if isinstance(request, (Request, PreparedRequest)):
42
+ return cls(
43
+ method=str(request.method),
44
+ url=str(request.url),
45
+ body=str(request.body if hasattr(request, "body") else ""),
46
+ )
47
+ return cls.as_empty()
48
+
49
+ @classmethod
50
+ def as_empty(cls) -> "FailedRequestDetails":
51
+ return cls(method="", url="", body="")
52
+
53
+
54
+ class ResponseDetails(BaseModel):
55
+ status_code: int
56
+ reason: str
57
+
58
+ @classmethod
59
+ def from_response(cls, response: Union[Response, Any]) -> "ResponseDetails":
60
+ if isinstance(response, Response):
61
+ return cls(status_code=response.status_code, reason=response.reason)
62
+ return cls.as_empty()
63
+
64
+ @classmethod
65
+ def as_empty(cls) -> "ResponseDetails":
66
+ return cls(status_code=-1, reason="")
67
+
68
+
69
+ class FailedParcel(BaseModel):
70
+ model_config = ConfigDict(populate_by_name=True)
71
+ parcel_name: str = Field(serialization_alias="parcelName", validation_alias="parcelName")
72
+ parcel_type: str = Field(serialization_alias="parcelType", validation_alias="parcelType")
73
+ error_info: Union[ManagerErrorInfo, str] = Field(serialization_alias="errorInfo", validation_alias="errorInfo")
74
+ request_details: Optional[FailedRequestDetails] = Field(
75
+ default=None, serialization_alias="requestDetails", validation_alias="requestDetails"
76
+ )
77
+ response_details: Optional[ResponseDetails] = Field(
78
+ default=None, serialization_alias="responseDetails", validation_alias="responseDetails"
79
+ )
80
+
81
+ @classmethod
82
+ def from_error(
83
+ cls,
84
+ parcel_name: str,
85
+ parcel_type: str,
86
+ error: ManagerHTTPError,
87
+ ):
88
+ return cls(
89
+ parcel_name=parcel_name,
90
+ parcel_type=parcel_type,
91
+ error_info=error.info,
92
+ request_details=FailedRequestDetails.from_request(error.request),
93
+ response_details=ResponseDetails.from_response(error.response),
94
+ )
95
+
96
+
97
+ class FeatureProfileBuildReport(BaseModel):
98
+ model_config = ConfigDict(populate_by_name=True)
99
+ profile_name: str = Field(serialization_alias="profileName", validation_alias="profileName")
100
+ profile_uuid: UUID = Field(serialization_alias="profileUuid", validation_alias="profileUuid")
101
+ created_parcels: List[Tuple[str, UUID]] = Field(
102
+ default_factory=list, serialization_alias="createdParcels", validation_alias="createdParcels"
103
+ )
104
+ failed_parcels: List[FailedParcel] = Field(
105
+ default_factory=list, serialization_alias="failedParcels", validation_alias="failedParcels"
106
+ )
107
+
108
+ def add_created_parcel(self, parcel_name: str, parcel_uuid: UUID) -> None:
109
+ self.created_parcels.append((parcel_name, parcel_uuid))
110
+
111
+ def add_failed_parcel(
112
+ self,
113
+ parcel_name: str,
114
+ parcel_type: str,
115
+ error: ManagerHTTPError,
116
+ ) -> None:
117
+ self.failed_parcels.append(
118
+ FailedParcel.from_error(
119
+ parcel_name=parcel_name,
120
+ parcel_type=parcel_type,
121
+ error=error,
122
+ )
123
+ )
124
+
125
+
126
+ def hande_failed_sub_parcel(build_report: FeatureProfileBuildReport, parent: AnyParcel, subparcel: AnyParcel) -> None:
127
+ parent_failed_to_create_message = (
128
+ f"Parent parcel: {parent.parcel_name} failed to create. This subparcel is dependent on it."
129
+ )
130
+ build_report.failed_parcels.append(
131
+ FailedParcel(
132
+ parcel_name=subparcel.parcel_name,
133
+ parcel_type=subparcel._get_parcel_type(),
134
+ error_info=parent_failed_to_create_message,
135
+ ),
136
+ )
137
+
138
+
139
+ class handle_association_request:
140
+ def __init__(self, build_report: FeatureProfileBuildReport, parcel: AnyParcel) -> None:
141
+ self.build_report = build_report
142
+ self.parcel = parcel
143
+
144
+ def __enter__(self) -> "handle_association_request":
145
+ return self
146
+
147
+ def __exit__(self, exc_type, exc_val, exc_tb):
148
+ if exc_type is not None:
149
+ if issubclass(exc_type, ManagerHTTPError):
150
+ self.build_report.add_failed_parcel(
151
+ parcel_name=self.parcel.parcel_name, parcel_type=self.parcel._get_parcel_type(), error=exc_val
152
+ )
153
+ else:
154
+ logger.exception(exc_val)
155
+ return True