catalystwan 0.41.2__py3-none-any.whl → 0.41.2.dev1__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 +57 -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.dev1.dist-info}/METADATA +20 -1
  488. catalystwan-0.41.2.dev1.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.dev1.dist-info}/LICENSE +0 -0
  504. {catalystwan-0.41.2.dist-info → catalystwan-0.41.2.dev1.dist-info}/WHEEL +0 -0
@@ -0,0 +1,248 @@
1
+ # Copyright 2023 Cisco Systems, Inc. and its affiliates
2
+ from __future__ import annotations
3
+
4
+ import logging
5
+ from collections import defaultdict
6
+ from typing import TYPE_CHECKING, Dict, List, Optional, Set, Tuple, Union
7
+ from uuid import UUID, uuid4
8
+
9
+ from pydantic import Field
10
+ from typing_extensions import Annotated
11
+
12
+ from catalystwan.api.builders.feature_profiles.mixins import TrackerMixin
13
+ from catalystwan.api.builders.feature_profiles.report import (
14
+ FeatureProfileBuildReport,
15
+ hande_failed_sub_parcel,
16
+ handle_association_request,
17
+ handle_create_parcel,
18
+ )
19
+ from catalystwan.api.feature_profile_api import ServiceFeatureProfileAPI
20
+ from catalystwan.endpoints.configuration.feature_profile.sdwan.service import ServiceFeatureProfile
21
+ from catalystwan.models.configuration.feature_profile.common import FeatureProfileCreationPayload
22
+ from catalystwan.models.configuration.feature_profile.parcel import ParcelAssociationPayload
23
+ from catalystwan.models.configuration.feature_profile.sdwan.routing import AnyRoutingParcel
24
+ from catalystwan.models.configuration.feature_profile.sdwan.service import (
25
+ AnyServiceParcel,
26
+ AppqoeParcel,
27
+ InterfaceEthernetParcel,
28
+ InterfaceGreParcel,
29
+ InterfaceIpsecParcel,
30
+ InterfaceSviParcel,
31
+ LanVpnDhcpServerParcel,
32
+ LanVpnParcel,
33
+ )
34
+ from catalystwan.models.configuration.feature_profile.sdwan.service.multicast import MulticastParcel
35
+ from catalystwan.models.configuration.feature_profile.sdwan.trackers import Tracker, TrackerGroup
36
+
37
+ if TYPE_CHECKING:
38
+ from catalystwan.session import ManagerSession
39
+
40
+ logger = logging.getLogger(__name__)
41
+
42
+ IndependedParcels = Annotated[Union[AppqoeParcel, LanVpnDhcpServerParcel], Field(discriminator="type_")]
43
+ DependedVpnSubparcels = Annotated[
44
+ Union[InterfaceGreParcel, InterfaceSviParcel, InterfaceEthernetParcel, InterfaceIpsecParcel, MulticastParcel],
45
+ Field(discriminator="type_"),
46
+ ]
47
+
48
+
49
+ class ServiceFeatureProfileBuilder(TrackerMixin):
50
+ """
51
+ A class for building service feature profiles.
52
+ """
53
+
54
+ def __init__(self, session: ManagerSession):
55
+ """
56
+ Initialize a new instance of the Service class.
57
+
58
+ Args:
59
+ session (ManagerSession): The ManagerSession object used for API communication.
60
+ profile_uuid (UUID): The UUID of the profile.
61
+ """
62
+ self._profile: FeatureProfileCreationPayload
63
+ self._api = ServiceFeatureProfileAPI(session)
64
+ self._endpoints = ServiceFeatureProfile(session)
65
+ self._independent_items: List[IndependedParcels] = []
66
+ self._independent_items_vpns: Dict[UUID, LanVpnParcel] = {}
67
+ self._dependent_items_on_vpns: Dict[UUID, List[Tuple[UUID, DependedVpnSubparcels]]] = defaultdict(list)
68
+ self._dependent_routing_items_on_vpns: Dict[UUID, List[AnyRoutingParcel]] = defaultdict(list)
69
+ self._interfaces_with_attached_dhcp_server: Dict[str, LanVpnDhcpServerParcel] = {}
70
+ # Trackers
71
+ self.init_tracker()
72
+
73
+ def add_profile_name_and_description(self, feature_profile: FeatureProfileCreationPayload) -> None:
74
+ """
75
+ Adds a name and description to the feature profile.
76
+
77
+ Args:
78
+ name (str): The name of the feature profile.
79
+ description (str): The description of the feature profile.
80
+
81
+ Returns:
82
+ None
83
+ """
84
+ self._profile = feature_profile
85
+
86
+ def add_parcel(self, parcel: IndependedParcels) -> None:
87
+ """
88
+ Adds an independent parcel to the builder.
89
+
90
+ Args:
91
+ parcel (IndependedParcels): The independent parcel to add.
92
+
93
+ Returns:
94
+ None
95
+ """
96
+ self._independent_items.append(parcel)
97
+
98
+ def add_parcel_vpn(self, parcel: LanVpnParcel) -> UUID:
99
+ """
100
+ Adds a VPN parcel to the builder.
101
+
102
+ Args:
103
+ parcel (LanVpnParcel): The VPN parcel to add.
104
+
105
+ Returns:
106
+ UUID: The UUID tag of the added VPN parcel.
107
+ """
108
+ vpn_tag = uuid4()
109
+ logger.debug(f"Adding VPN parcel {parcel.parcel_name} with tag {vpn_tag}")
110
+ self._independent_items_vpns[vpn_tag] = parcel
111
+ return vpn_tag
112
+
113
+ def add_parcel_routing_attached(self, vpn_tag: UUID, parcel: AnyRoutingParcel) -> None:
114
+ """
115
+ Adds a routing parcel to the builder.
116
+
117
+ Args:
118
+ vpn_tag (UUID): The UUID of the VPN.
119
+ parcel (AnyServiceParcel): The routing parcel to add.
120
+
121
+ Returns:
122
+ None
123
+ """
124
+ logger.debug(f"Adding routing parcel {parcel.parcel_name} to VPN {vpn_tag}")
125
+ self._dependent_routing_items_on_vpns[vpn_tag].append(parcel)
126
+
127
+ def add_parcel_vpn_subparcel(self, vpn_tag: UUID, parcel: DependedVpnSubparcels) -> UUID:
128
+ """
129
+ Adds an subparcel parcel dependent on a VPN to the builder.
130
+
131
+ Args:
132
+ vpn_tag (UUID): The UUID of the VPN.
133
+ parcel (DependedVpnSubparcels): The interface parcel to add.
134
+
135
+ Returns:
136
+ None
137
+ """
138
+
139
+ subparcel_tag = uuid4()
140
+ logger.debug(f"Adding vpn sub-parcel {parcel.parcel_name} with tag {subparcel_tag}")
141
+ self._dependent_items_on_vpns[vpn_tag].append((subparcel_tag, parcel))
142
+ return subparcel_tag
143
+
144
+ def add_parcel_dhcp_server(self, interface_parcel_name: str, parcel: LanVpnDhcpServerParcel) -> None:
145
+ """
146
+ Adds a DHCP server parcel to the builder.
147
+
148
+ Args:
149
+ interface_tag (UUID): The UUID of the interface.
150
+ parcel (LanVpnDhcpServerParcel): The DHCP server parcel to add.
151
+
152
+ Returns:
153
+ UUID: The UUID tag of the added DHCP server parcel.
154
+ """
155
+ logger.debug(f"Adding DHCP server parcel {parcel.parcel_name} to interface {interface_parcel_name}")
156
+ self._interfaces_with_attached_dhcp_server[interface_parcel_name] = parcel
157
+
158
+ def add_tracker(self, associate_tags: Set[UUID], tracker: Tracker) -> None:
159
+ """
160
+ Adds a tracker parcel to the feature profile.
161
+
162
+ Args:
163
+ associate_tags (Set[UUID]): The UUIDs of the interfaces to which the tracker should be added.
164
+ tracker (Tracker): The tracker parcel to add.
165
+
166
+ Returns:
167
+ None
168
+ """
169
+ self._trackers.append((associate_tags, tracker))
170
+
171
+ def add_tracker_group(self, associate_tags: Set[UUID], group: TrackerGroup, trackers: List[Tracker]) -> None:
172
+ self._tracker_groups.append((associate_tags, group, trackers))
173
+
174
+ def build(self) -> FeatureProfileBuildReport:
175
+ """
176
+ Builds the feature profile by creating parcels for independent items,
177
+ VPNs, and sub-parcels dependent on VPNs.
178
+
179
+ Returns:
180
+ Service feature profile UUID
181
+ """
182
+ profile_uuid = self._endpoints.create_sdwan_service_feature_profile(self._profile).id
183
+ self.build_report = FeatureProfileBuildReport(profile_uuid=profile_uuid, profile_name=self._profile.name)
184
+ for parcel in self._independent_items:
185
+ self._create_parcel(profile_uuid, parcel)
186
+
187
+ self.create_trackers(profile_uuid=profile_uuid)
188
+
189
+ for vpn_tag, vpn_parcel in self._independent_items_vpns.items():
190
+ vpn_uuid = self._create_parcel(profile_uuid, vpn_parcel)
191
+
192
+ for routing_parcel in self._dependent_routing_items_on_vpns[vpn_tag]:
193
+ if vpn_uuid is None:
194
+ hande_failed_sub_parcel(self.build_report, vpn_parcel, routing_parcel)
195
+ else:
196
+ routing_uuid = self._create_parcel(profile_uuid, routing_parcel)
197
+ if not routing_uuid:
198
+ continue
199
+ with handle_association_request(self.build_report, routing_parcel):
200
+ self._endpoints.associate_with_vpn(
201
+ profile_uuid,
202
+ vpn_uuid,
203
+ routing_parcel._get_parcel_type(),
204
+ payload=ParcelAssociationPayload(parcel_id=routing_uuid),
205
+ )
206
+
207
+ for subparcel_tag, sub_parcel in self._dependent_items_on_vpns[vpn_tag]:
208
+ if vpn_uuid is None:
209
+ hande_failed_sub_parcel(self.build_report, vpn_parcel, sub_parcel)
210
+ else:
211
+ parcel_uuid = self._create_parcel(profile_uuid, sub_parcel, vpn_uuid)
212
+ dhcp_server = self._interfaces_with_attached_dhcp_server.get(sub_parcel.parcel_name)
213
+ if parcel_uuid is None and dhcp_server:
214
+ # The parent could not be created
215
+ hande_failed_sub_parcel(self.build_report, sub_parcel, dhcp_server)
216
+ continue
217
+
218
+ if dhcp_server:
219
+ dhcp_server_uuid = self._create_parcel(profile_uuid, dhcp_server)
220
+ if dhcp_server_uuid is not None:
221
+ with handle_association_request(self.build_report, sub_parcel):
222
+ self._endpoints.associate_dhcp_server_with_vpn_interface(
223
+ profile_uuid=profile_uuid,
224
+ vpn_uuid=vpn_uuid,
225
+ interface_parcel_type=sub_parcel._get_parcel_type().replace("lan/vpn/", ""),
226
+ interface_uuid=parcel_uuid,
227
+ payload=ParcelAssociationPayload(parcel_id=dhcp_server_uuid),
228
+ )
229
+
230
+ # Associate tracker with VPN interface if it exists
231
+ if subparcel_tag in self._interface_tag_to_existing_tracker and parcel_uuid:
232
+ tracker_uuid, tracker_type = self._interface_tag_to_existing_tracker[subparcel_tag]
233
+ sub_parcel_type = sub_parcel._get_parcel_type().replace("lan/vpn/", "")
234
+ with handle_association_request(self.build_report, sub_parcel):
235
+ self._endpoints.associate_tracker_with_vpn_interface(
236
+ profile_uuid,
237
+ vpn_uuid,
238
+ sub_parcel_type,
239
+ parcel_uuid,
240
+ tracker_type,
241
+ ParcelAssociationPayload(parcel_id=tracker_uuid),
242
+ )
243
+
244
+ return self.build_report
245
+
246
+ @handle_create_parcel
247
+ def _create_parcel(self, profile_uuid: UUID, parcel: AnyServiceParcel, vpn_uuid: Optional[None] = None) -> UUID:
248
+ return self._api.create_parcel(profile_uuid, parcel, vpn_uuid).id
@@ -0,0 +1,80 @@
1
+ # Copyright 2023 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 SystemFeatureProfileAPI
10
+ from catalystwan.endpoints.configuration.feature_profile.sdwan.system import SystemFeatureProfile
11
+ from catalystwan.models.configuration.feature_profile.common import FeatureProfileCreationPayload
12
+ from catalystwan.models.configuration.feature_profile.sdwan.system import AnySystemParcel
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+ if TYPE_CHECKING:
17
+ from catalystwan.session import ManagerSession
18
+
19
+
20
+ class SystemFeatureProfileBuilder:
21
+ """
22
+ A class for building system 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
+
34
+ self._profile: FeatureProfileCreationPayload
35
+ self._api = SystemFeatureProfileAPI(session)
36
+ self._endpoints = SystemFeatureProfile(session)
37
+ self._independent_items: List[AnySystemParcel] = []
38
+
39
+ def add_profile_name_and_description(self, feature_profile: FeatureProfileCreationPayload) -> None:
40
+ """
41
+ Adds a name and description to the feature profile.
42
+
43
+ Args:
44
+ name (str): The name of the feature profile.
45
+ description (str): The description of the feature profile.
46
+
47
+ Returns:
48
+ None
49
+ """
50
+ self._profile = feature_profile
51
+
52
+ def add_parcel(self, parcel: AnySystemParcel) -> None:
53
+ """
54
+ Adds a parcel to the feature profile.
55
+
56
+ Args:
57
+ parcel (AnySystemParcel): The parcel to add.
58
+
59
+ Returns:
60
+ None
61
+ """
62
+ self._independent_items.append(parcel)
63
+
64
+ def build(self) -> FeatureProfileBuildReport:
65
+ """
66
+ Builds the feature profile.
67
+
68
+ Returns:
69
+ UUID: The UUID of the created feature profile.
70
+ """
71
+
72
+ profile_uuid = self._endpoints.create_sdwan_system_feature_profile(self._profile).id
73
+ self.build_report = FeatureProfileBuildReport(profile_uuid=profile_uuid, profile_name=self._profile.name)
74
+ for parcel in self._independent_items:
75
+ self._create_parcels(profile_uuid, parcel)
76
+ return self.build_report
77
+
78
+ @handle_create_parcel
79
+ def _create_parcels(self, profile_uuid: UUID, parcel: AnySystemParcel) -> UUID:
80
+ return self._api.create_parcel(profile_uuid, parcel).id
@@ -0,0 +1,256 @@
1
+ # Copyright 2023 Cisco Systems, Inc. and its affiliates
2
+ from __future__ import annotations
3
+
4
+ import logging
5
+ from collections import defaultdict
6
+ from typing import TYPE_CHECKING, Dict, List, Optional, Set, Tuple, Union
7
+ from uuid import UUID, uuid4
8
+
9
+ from catalystwan.api.builders.feature_profiles.mixins import TrackerMixin
10
+ from catalystwan.api.builders.feature_profiles.report import (
11
+ FeatureProfileBuildReport,
12
+ hande_failed_sub_parcel,
13
+ handle_association_request,
14
+ handle_create_parcel,
15
+ )
16
+ from catalystwan.api.feature_profile_api import TransportFeatureProfileAPI
17
+ from catalystwan.endpoints.configuration.feature_profile.sdwan.transport import TransportFeatureProfile
18
+ from catalystwan.models.configuration.feature_profile.common import FeatureProfileCreationPayload
19
+ from catalystwan.models.configuration.feature_profile.parcel import ParcelAssociationPayload
20
+ from catalystwan.models.configuration.feature_profile.sdwan.routing import AnyRoutingParcel
21
+ from catalystwan.models.configuration.feature_profile.sdwan.trackers import Tracker, TrackerGroup
22
+ from catalystwan.models.configuration.feature_profile.sdwan.transport import (
23
+ AnyTransportParcel,
24
+ AnyTransportSuperParcel,
25
+ AnyTransportVpnParcel,
26
+ AnyTransportVpnSubParcel,
27
+ )
28
+ from catalystwan.models.configuration.feature_profile.sdwan.transport.cellular_controller import (
29
+ CellularControllerParcel,
30
+ )
31
+ from catalystwan.models.configuration.feature_profile.sdwan.transport.cellular_profile import CellularProfileParcel
32
+ from catalystwan.models.configuration.feature_profile.sdwan.transport.gps import GpsParcel
33
+
34
+ logger = logging.getLogger(__name__)
35
+
36
+ if TYPE_CHECKING:
37
+ from catalystwan.session import ManagerSession
38
+
39
+
40
+ class TransportAndManagementProfileBuilder(TrackerMixin):
41
+ """
42
+ A class for building system feature profiles.
43
+ """
44
+
45
+ def __init__(self, session: ManagerSession) -> None:
46
+ """
47
+ Initialize a new instance of the Service class.
48
+
49
+ Args:
50
+ session (ManagerSession): The ManagerSession object used for API communication.
51
+ profile_uuid (UUID): The UUID of the profile.
52
+ """
53
+ self._profile: FeatureProfileCreationPayload
54
+ self._api = TransportFeatureProfileAPI(session)
55
+ self._endpoints = TransportFeatureProfile(session)
56
+ self._independent_items: List[AnyTransportSuperParcel] = []
57
+ self._independent_items_vpns: Dict[UUID, AnyTransportVpnParcel] = {}
58
+ self._independent_items_cellular_controllers: Dict[UUID, CellularControllerParcel] = {}
59
+ self._dependent_items_on_vpns: Dict[UUID, List[Tuple[UUID, AnyTransportVpnSubParcel]]] = defaultdict(list)
60
+ self._dependent_routing_items_on_vpns: Dict[UUID, List[AnyRoutingParcel]] = defaultdict(list)
61
+ self._dependent_items_on_cellular_controllers: Dict[
62
+ UUID, List[Union[CellularProfileParcel, GpsParcel]]
63
+ ] = defaultdict(list)
64
+ # Trackers
65
+ self.init_tracker()
66
+
67
+ def add_profile_name_and_description(self, feature_profile: FeatureProfileCreationPayload) -> None:
68
+ """
69
+ Adds a name and description to the feature profile.
70
+
71
+ Args:
72
+ name (str): The name of the feature profile.
73
+ description (str): The description of the feature profile.
74
+
75
+ Returns:
76
+ None
77
+ """
78
+ self._profile = feature_profile
79
+
80
+ def add_parcel(self, parcel: AnyTransportSuperParcel) -> None:
81
+ """
82
+ Adds a parcel to the feature profile.
83
+
84
+ Args:
85
+ parcel (AnyTransportSuperParcel): The parcel to add.
86
+
87
+ Returns:
88
+ None
89
+ """
90
+ self._independent_items.append(parcel)
91
+
92
+ def add_parcel_routing_attached(self, vpn_tag: UUID, parcel: AnyRoutingParcel) -> None:
93
+ """
94
+ Adds a routing parcel to the feature profile.
95
+
96
+ Args:
97
+ parcel (AnyRoutingParcel): The parcel to add.
98
+
99
+ Returns:
100
+ None
101
+ """
102
+ logger.debug(f"Attaching routing {parcel.parcel_name} with to VPN with tag {vpn_tag}")
103
+ self._dependent_routing_items_on_vpns[vpn_tag].append(parcel)
104
+
105
+ def add_parcel_vpn(self, parcel: AnyTransportVpnParcel) -> UUID:
106
+ """
107
+ Adds a VPN parcel to the builder.
108
+
109
+ Args:
110
+ parcel (LanVpnParcel): The VPN parcel to add.
111
+
112
+ Returns:
113
+ UUID: The UUID tag of the added VPN parcel.
114
+ """
115
+ vpn_tag = uuid4()
116
+ logger.debug(f"Adding VPN parcel {parcel.parcel_name} with tag {vpn_tag}")
117
+ self._independent_items_vpns[vpn_tag] = parcel
118
+ return vpn_tag
119
+
120
+ def add_parcel_cellular_controller(self, parcel: CellularControllerParcel) -> UUID:
121
+ """
122
+ Adds a cellular controller parcel to the builder.
123
+
124
+ Args:
125
+ parcel (CellularControllerParcel): The cellular controller parcel to add.
126
+
127
+ Returns:
128
+ UUID: The UUID tag of the added cellular controller parcel.
129
+ """
130
+ cellular_controller_tag = uuid4()
131
+ logger.debug(f"Adding cellular controller parcel {parcel.parcel_name} with tag {cellular_controller_tag}")
132
+ self._independent_items_cellular_controllers[cellular_controller_tag] = parcel
133
+ return cellular_controller_tag
134
+
135
+ def add_cellular_controller_subparcel(
136
+ self, cellular_controller_tag: UUID, parcel: Union[CellularProfileParcel, GpsParcel]
137
+ ) -> None:
138
+ """
139
+ Adds a subparcel to the cellular controller parcel.
140
+
141
+ Args:
142
+ cellular_controller_tag (UUID): The UUID of the cellular controller.
143
+ parcel (Union[CellularProfileParcel, GpsParcel]): The subparcel to add.
144
+
145
+ Returns:
146
+ None
147
+ """
148
+ self._dependent_items_on_cellular_controllers[cellular_controller_tag].append(parcel)
149
+
150
+ def add_vpn_subparcel(self, vpn_tag: UUID, parcel: AnyTransportVpnSubParcel) -> UUID:
151
+ """
152
+ Adds a parcel to the feature profile.
153
+
154
+ Args:
155
+ parcel (AnyTransportVpnSubParcel): The parcel to add.
156
+
157
+ Returns:
158
+ None
159
+ """
160
+ subparcel_tag = uuid4()
161
+ logger.debug(f"Adding vpn sub-parcel {parcel.parcel_name} with tag {vpn_tag}")
162
+ self._dependent_items_on_vpns[vpn_tag].append((subparcel_tag, parcel))
163
+ return subparcel_tag
164
+
165
+ def add_tracker(self, associate_tags: Set[UUID], tracker: Tracker) -> None:
166
+ """
167
+ Adds a tracker parcel to the feature profile.
168
+
169
+ Args:
170
+ associate_tags (Set[UUID]): The UUIDs of the interfaces to which the tracker should be added.
171
+ tracker (Tracker): The tracker parcel to add.
172
+
173
+ Returns:
174
+ None
175
+ """
176
+ self._trackers.append((associate_tags, tracker))
177
+
178
+ def add_tracker_group(self, associate_tags: Set[UUID], group: TrackerGroup, trackers: List[Tracker]) -> None:
179
+ self._tracker_groups.append((associate_tags, group, trackers))
180
+
181
+ def build(self) -> FeatureProfileBuildReport:
182
+ """
183
+ Builds the feature profile.
184
+
185
+ Returns:
186
+ UUID: The UUID of the created feature profile.
187
+ """
188
+
189
+ profile_uuid = self._endpoints.create_transport_feature_profile(self._profile).id
190
+ self.build_report = FeatureProfileBuildReport(profile_uuid=profile_uuid, profile_name=self._profile.name)
191
+ for parcel in self._independent_items:
192
+ self._create_parcel(profile_uuid, parcel)
193
+
194
+ self.create_trackers(profile_uuid=profile_uuid)
195
+
196
+ for vpn_tag, vpn_parcel in self._independent_items_vpns.items():
197
+ vpn_uuid = self._create_parcel(profile_uuid, vpn_parcel)
198
+ for vpn_subparcel_tag, vpn_subparcel in self._dependent_items_on_vpns[vpn_tag]:
199
+ if vpn_uuid is None:
200
+ hande_failed_sub_parcel(self.build_report, vpn_parcel, vpn_subparcel)
201
+ else:
202
+ vpn_subparcel_uuid = self._create_parcel(profile_uuid, vpn_subparcel, vpn_uuid)
203
+
204
+ # Associate tracker with VPN interface if it exists
205
+ if vpn_subparcel_tag in self._interface_tag_to_existing_tracker and vpn_subparcel_uuid:
206
+ tracker_uuid, tracker_type = self._interface_tag_to_existing_tracker[vpn_subparcel_tag]
207
+ vpn_subparcel_type = (
208
+ vpn_subparcel._get_parcel_type().replace("wan/vpn/", "").replace("management/vpn/", "")
209
+ )
210
+ with handle_association_request(self.build_report, vpn_subparcel):
211
+ self._endpoints.associate_tracker_with_vpn_interface(
212
+ profile_uuid,
213
+ vpn_uuid,
214
+ vpn_subparcel_type,
215
+ vpn_subparcel_uuid,
216
+ tracker_type,
217
+ ParcelAssociationPayload(parcel_id=tracker_uuid),
218
+ )
219
+
220
+ for routing_parcel in self._dependent_routing_items_on_vpns[vpn_tag]:
221
+ if vpn_uuid is None:
222
+ hande_failed_sub_parcel(self.build_report, vpn_parcel, routing_parcel)
223
+ else:
224
+ routing_uuid = self._create_parcel(profile_uuid, routing_parcel)
225
+ if not routing_uuid:
226
+ continue
227
+ with handle_association_request(self.build_report, routing_parcel):
228
+ self._endpoints.associate_with_vpn(
229
+ profile_uuid,
230
+ vpn_uuid,
231
+ routing_parcel._get_parcel_type(),
232
+ payload=ParcelAssociationPayload(parcel_id=routing_uuid),
233
+ )
234
+
235
+ for cellular_controller_tag, cellular_controller_parcel in self._independent_items_cellular_controllers.items():
236
+ controller_uuid = self._create_parcel(profile_uuid, cellular_controller_parcel)
237
+ for cellular_subparcel in self._dependent_items_on_cellular_controllers[cellular_controller_tag]:
238
+ if controller_uuid is None:
239
+ hande_failed_sub_parcel(self.build_report, cellular_controller_parcel, cellular_subparcel)
240
+ else:
241
+ parcel_uuid = self._create_parcel(profile_uuid, cellular_subparcel)
242
+ if not parcel_uuid:
243
+ continue
244
+ with handle_association_request(self.build_report, cellular_subparcel):
245
+ self._endpoints.associate_with_cellular_controller(
246
+ profile_uuid,
247
+ controller_uuid,
248
+ cellular_subparcel._get_parcel_type(),
249
+ ParcelAssociationPayload(parcel_id=parcel_uuid),
250
+ )
251
+
252
+ return self.build_report
253
+
254
+ @handle_create_parcel
255
+ def _create_parcel(self, profile_uuid: UUID, parcel: AnyTransportParcel, vpn_uuid: Optional[None] = None) -> UUID:
256
+ return self._api.create_parcel(profile_uuid, parcel, vpn_uuid).id