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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (504) hide show
  1. catalystwan/__init__.py +3 -2
  2. catalystwan/api/administration.py +13 -2
  3. catalystwan/api/api_container.py +4 -1
  4. catalystwan/api/builders/__init__.py +14 -0
  5. catalystwan/api/builders/feature_profiles/__init__.py +0 -0
  6. catalystwan/api/builders/feature_profiles/application_priority.py +58 -0
  7. catalystwan/api/builders/feature_profiles/builder_factory.py +59 -0
  8. catalystwan/api/builders/feature_profiles/cli.py +76 -0
  9. catalystwan/api/builders/feature_profiles/mixins.py +44 -0
  10. catalystwan/api/builders/feature_profiles/other.py +79 -0
  11. catalystwan/api/builders/feature_profiles/report.py +155 -0
  12. catalystwan/api/builders/feature_profiles/service.py +248 -0
  13. catalystwan/api/builders/feature_profiles/system.py +80 -0
  14. catalystwan/api/builders/feature_profiles/transport.py +256 -0
  15. catalystwan/api/builders/feature_profiles/uc_voice.py +287 -0
  16. catalystwan/api/config_group_api.py +41 -16
  17. catalystwan/api/configuration_groups/parcel.py +100 -30
  18. catalystwan/api/feature_profile_api.py +2021 -242
  19. catalystwan/api/policy_api.py +470 -116
  20. catalystwan/api/template_api.py +113 -44
  21. catalystwan/api/templates/README.md +61 -47
  22. catalystwan/api/templates/cli_template.py +17 -7
  23. catalystwan/api/templates/device_template/device_template.py +127 -32
  24. catalystwan/api/templates/feature_template.py +3 -3
  25. catalystwan/api/templates/models/aaa_model.py +387 -0
  26. catalystwan/api/templates/models/cisco_aaa_model.py +289 -42
  27. catalystwan/api/templates/models/cisco_banner_model.py +11 -2
  28. catalystwan/api/templates/models/cisco_bfd_model.py +31 -36
  29. catalystwan/api/templates/models/cisco_bgp_model.py +382 -131
  30. catalystwan/api/templates/models/cisco_logging_model.py +80 -43
  31. catalystwan/api/templates/models/cisco_ntp_model.py +34 -15
  32. catalystwan/api/templates/models/cisco_omp_model.py +70 -60
  33. catalystwan/api/templates/models/cisco_ospf.py +143 -74
  34. catalystwan/api/templates/models/cisco_ospfv3.py +217 -95
  35. catalystwan/api/templates/models/cisco_secure_internet_gateway.py +304 -142
  36. catalystwan/api/templates/models/cisco_snmp_model.py +66 -52
  37. catalystwan/api/templates/models/cisco_system.py +238 -129
  38. catalystwan/api/templates/models/cisco_vpn_interface_model.py +632 -275
  39. catalystwan/api/templates/models/cisco_vpn_model.py +433 -270
  40. catalystwan/api/templates/models/cli_template.py +3 -2
  41. catalystwan/api/templates/models/omp_vsmart_model.py +46 -10
  42. catalystwan/api/templates/models/security_vsmart_model.py +11 -8
  43. catalystwan/api/templates/models/supported.py +10 -4
  44. catalystwan/api/templates/models/system_vsmart_model.py +164 -27
  45. catalystwan/api/templates/models/vpn_vsmart_interface_model.py +198 -0
  46. catalystwan/api/templates/models/vpn_vsmart_model.py +124 -0
  47. catalystwan/apigw_auth.py +6 -2
  48. catalystwan/dataclasses.py +2 -53
  49. catalystwan/endpoints/__init__.py +41 -41
  50. catalystwan/endpoints/certificate_management_device.py +4 -0
  51. catalystwan/endpoints/cluster_management.py +27 -7
  52. catalystwan/endpoints/configuration/feature_profile/sdwan/application_priority.py +107 -0
  53. catalystwan/endpoints/configuration/feature_profile/sdwan/cli.py +60 -0
  54. catalystwan/endpoints/configuration/feature_profile/sdwan/dns_security.py +83 -0
  55. catalystwan/endpoints/configuration/feature_profile/sdwan/embedded_security.py +88 -0
  56. catalystwan/endpoints/configuration/feature_profile/sdwan/other.py +62 -0
  57. catalystwan/endpoints/configuration/feature_profile/sdwan/policy_object.py +35 -12
  58. catalystwan/endpoints/configuration/feature_profile/sdwan/service.py +154 -0
  59. catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py +88 -0
  60. catalystwan/endpoints/configuration/feature_profile/sdwan/system.py +164 -11
  61. catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py +93 -0
  62. catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py +144 -26
  63. catalystwan/endpoints/configuration/feature_profile/sdwan/uc_voice.py +77 -0
  64. catalystwan/endpoints/configuration/network_hierarchy.py +32 -0
  65. catalystwan/endpoints/configuration/policy/abstractions.py +49 -0
  66. catalystwan/endpoints/configuration/policy/definition/access_control_list.py +6 -11
  67. catalystwan/endpoints/configuration/policy/definition/access_control_list_ipv6.py +6 -11
  68. catalystwan/endpoints/configuration/policy/definition/aip.py +52 -0
  69. catalystwan/endpoints/configuration/policy/definition/amp.py +52 -0
  70. catalystwan/endpoints/configuration/policy/definition/app_route.py +50 -0
  71. catalystwan/endpoints/configuration/policy/definition/cflowd.py +46 -0
  72. catalystwan/endpoints/configuration/policy/definition/control.py +6 -11
  73. catalystwan/endpoints/configuration/policy/definition/device_access.py +6 -11
  74. catalystwan/endpoints/configuration/policy/definition/device_access_ipv6.py +6 -11
  75. catalystwan/endpoints/configuration/policy/definition/dial_peer.py +57 -0
  76. catalystwan/endpoints/configuration/policy/definition/dns_security.py +50 -0
  77. catalystwan/endpoints/configuration/policy/definition/fxo_port.py +57 -0
  78. catalystwan/endpoints/configuration/policy/definition/fxs_did_port.py +57 -0
  79. catalystwan/endpoints/configuration/policy/definition/fxs_port.py +57 -0
  80. catalystwan/endpoints/configuration/policy/definition/hub_and_spoke.py +6 -11
  81. catalystwan/endpoints/configuration/policy/definition/intrusion_prevention.py +52 -0
  82. catalystwan/endpoints/configuration/policy/definition/mesh.py +2 -11
  83. catalystwan/endpoints/configuration/policy/definition/pri_isdn_port.py +57 -0
  84. catalystwan/endpoints/configuration/policy/definition/qos_map.py +2 -11
  85. catalystwan/endpoints/configuration/policy/definition/rewrite.py +6 -11
  86. catalystwan/endpoints/configuration/policy/definition/route_policy.py +50 -0
  87. catalystwan/endpoints/configuration/policy/definition/rule_set.py +2 -11
  88. catalystwan/endpoints/configuration/policy/definition/security_group.py +6 -11
  89. catalystwan/endpoints/configuration/policy/definition/srst_phone_profile.py +59 -0
  90. catalystwan/endpoints/configuration/policy/definition/ssl_decryption.py +50 -0
  91. catalystwan/endpoints/configuration/policy/definition/ssl_decryption_utd_profile.py +52 -0
  92. catalystwan/endpoints/configuration/policy/definition/traffic_data.py +6 -11
  93. catalystwan/endpoints/configuration/policy/definition/url_filtering.py +50 -0
  94. catalystwan/endpoints/configuration/policy/definition/vpn_membership.py +6 -11
  95. catalystwan/endpoints/configuration/policy/definition/vpn_qos_map.py +50 -0
  96. catalystwan/endpoints/configuration/policy/definition/zone_based_firewall.py +6 -11
  97. catalystwan/endpoints/configuration/policy/list/app.py +3 -16
  98. catalystwan/endpoints/configuration/policy/list/app_probe.py +6 -15
  99. catalystwan/endpoints/configuration/policy/list/as_path.py +3 -16
  100. catalystwan/endpoints/configuration/policy/list/class_map.py +3 -16
  101. catalystwan/endpoints/configuration/policy/list/color.py +3 -16
  102. catalystwan/endpoints/configuration/policy/list/community.py +3 -16
  103. catalystwan/endpoints/configuration/policy/list/data_ipv6_prefix.py +6 -15
  104. catalystwan/endpoints/configuration/policy/list/data_prefix.py +3 -16
  105. catalystwan/endpoints/configuration/policy/list/expanded_community.py +6 -15
  106. catalystwan/endpoints/configuration/policy/list/extended_community.py +52 -0
  107. catalystwan/endpoints/configuration/policy/list/fax_protocol.py +48 -0
  108. catalystwan/endpoints/configuration/policy/list/fqdn.py +3 -16
  109. catalystwan/endpoints/configuration/policy/list/geo_location.py +3 -16
  110. catalystwan/endpoints/configuration/policy/list/identity.py +48 -0
  111. catalystwan/endpoints/configuration/policy/list/ips_signature.py +6 -15
  112. catalystwan/endpoints/configuration/policy/list/ipv6_prefix.py +3 -16
  113. catalystwan/endpoints/configuration/policy/list/local_app.py +3 -16
  114. catalystwan/endpoints/configuration/policy/list/local_domain.py +3 -16
  115. catalystwan/endpoints/configuration/policy/list/media_profile.py +52 -0
  116. catalystwan/endpoints/configuration/policy/list/mirror.py +3 -16
  117. catalystwan/endpoints/configuration/policy/list/modem_pass_through.py +52 -0
  118. catalystwan/endpoints/configuration/policy/list/policer.py +3 -16
  119. catalystwan/endpoints/configuration/policy/list/port.py +3 -16
  120. catalystwan/endpoints/configuration/policy/list/preferred_color_group.py +6 -15
  121. catalystwan/endpoints/configuration/policy/list/prefix.py +4 -16
  122. catalystwan/endpoints/configuration/policy/list/protocol_name.py +6 -15
  123. catalystwan/endpoints/configuration/policy/list/region.py +2 -10
  124. catalystwan/endpoints/configuration/policy/list/scalable_group_tag.py +52 -0
  125. catalystwan/endpoints/configuration/policy/list/site.py +3 -16
  126. catalystwan/endpoints/configuration/policy/list/sla.py +3 -16
  127. catalystwan/endpoints/configuration/policy/list/supervisory_disconnect.py +52 -0
  128. catalystwan/endpoints/configuration/policy/list/threat_grid_api_key.py +52 -0
  129. catalystwan/endpoints/configuration/policy/list/tloc.py +3 -16
  130. catalystwan/endpoints/configuration/policy/list/translation_profile.py +52 -0
  131. catalystwan/endpoints/configuration/policy/list/translation_rules.py +52 -0
  132. catalystwan/endpoints/configuration/policy/list/trunkgroup.py +48 -0
  133. catalystwan/endpoints/configuration/policy/list/umbrella_data.py +52 -0
  134. catalystwan/endpoints/configuration/policy/list/url_allow_list.py +3 -16
  135. catalystwan/endpoints/configuration/policy/list/url_block_list.py +3 -16
  136. catalystwan/endpoints/configuration/policy/list/vpn.py +3 -16
  137. catalystwan/endpoints/configuration/policy/list/zone.py +3 -16
  138. catalystwan/endpoints/configuration/policy/security_template.py +2 -3
  139. catalystwan/endpoints/configuration/policy/voice_template.py +39 -0
  140. catalystwan/endpoints/configuration/policy_group.py +30 -0
  141. catalystwan/endpoints/configuration/software_actions.py +2 -4
  142. catalystwan/endpoints/configuration/topology_group.py +51 -0
  143. catalystwan/endpoints/configuration_dashboard_status.py +2 -2
  144. catalystwan/endpoints/configuration_device_template.py +15 -1
  145. catalystwan/endpoints/configuration_feature_profile.py +8 -11
  146. catalystwan/endpoints/configuration_general_template.py +31 -0
  147. catalystwan/endpoints/configuration_group.py +28 -5
  148. catalystwan/endpoints/configuration_settings.py +90 -1
  149. catalystwan/endpoints/configuration_template_master.py +48 -0
  150. catalystwan/endpoints/endpoints_container.py +79 -19
  151. catalystwan/endpoints/real_time_monitoring/reboot_history.py +1 -3
  152. catalystwan/endpoints/tenant_migration.py +2 -0
  153. catalystwan/exceptions.py +17 -0
  154. catalystwan/integration_tests/base.py +81 -0
  155. catalystwan/integration_tests/feature_profile/sdwan/__init__.py +0 -0
  156. catalystwan/integration_tests/feature_profile/sdwan/policy/__init__.py +0 -0
  157. catalystwan/integration_tests/feature_profile/sdwan/policy/base.py +33 -0
  158. catalystwan/integration_tests/feature_profile/sdwan/policy/test_extended_community.py +33 -0
  159. catalystwan/integration_tests/feature_profile/sdwan/policy/test_security_app_list.py +32 -0
  160. catalystwan/integration_tests/feature_profile/sdwan/test_application_priority.py +433 -0
  161. catalystwan/integration_tests/feature_profile/sdwan/test_cli.py +54 -0
  162. catalystwan/integration_tests/feature_profile/sdwan/test_dns_security.py +106 -0
  163. catalystwan/integration_tests/feature_profile/sdwan/test_other.py +49 -0
  164. catalystwan/integration_tests/feature_profile/sdwan/test_service.py +1078 -0
  165. catalystwan/integration_tests/feature_profile/sdwan/test_sig_security.py +322 -0
  166. catalystwan/integration_tests/feature_profile/sdwan/test_ssl_decryption.py +85 -0
  167. catalystwan/integration_tests/feature_profile/sdwan/test_system.py +368 -0
  168. catalystwan/integration_tests/feature_profile/sdwan/test_tracker.py +127 -0
  169. catalystwan/integration_tests/feature_profile/sdwan/test_transport.py +1698 -0
  170. catalystwan/integration_tests/feature_profile/sdwan/topology/test_topology.py +93 -0
  171. catalystwan/integration_tests/profile_builder/__init__.py +0 -0
  172. catalystwan/integration_tests/profile_builder/test_pb_service.py +197 -0
  173. catalystwan/integration_tests/profile_builder/test_pb_transport.py +226 -0
  174. catalystwan/integration_tests/profile_builder/test_pb_uc_voice.py +277 -0
  175. catalystwan/integration_tests/test_data/__init__.py +117 -0
  176. catalystwan/integration_tests/test_find_template_values.py +7 -18
  177. catalystwan/integration_tests/test_network_hierarchy.py +82 -0
  178. catalystwan/integration_tests/test_settings.py +30 -0
  179. catalystwan/models/common.py +1898 -2
  180. catalystwan/models/configuration/common.py +1 -0
  181. catalystwan/models/configuration/feature_profile/common.py +634 -149
  182. catalystwan/models/configuration/feature_profile/parcel.py +238 -0
  183. catalystwan/models/configuration/feature_profile/sdwan/acl/__init__.py +13 -0
  184. catalystwan/models/configuration/feature_profile/sdwan/acl/ipv4acl.py +298 -0
  185. catalystwan/models/configuration/feature_profile/sdwan/acl/ipv6acl.py +344 -0
  186. catalystwan/models/configuration/feature_profile/sdwan/application_priority/__init__.py +218 -0
  187. catalystwan/models/configuration/feature_profile/sdwan/application_priority/cloud_probe.py +61 -0
  188. catalystwan/models/configuration/feature_profile/sdwan/application_priority/policy_settings.py +31 -0
  189. catalystwan/models/configuration/feature_profile/sdwan/application_priority/qos_policy.py +102 -0
  190. catalystwan/models/configuration/feature_profile/sdwan/application_priority/traffic_policy.py +1057 -0
  191. catalystwan/models/configuration/feature_profile/sdwan/cli/__init__.py +23 -0
  192. catalystwan/models/configuration/feature_profile/sdwan/cli/config.py +18 -0
  193. catalystwan/models/configuration/feature_profile/sdwan/cli/full_config.py +15 -0
  194. catalystwan/models/configuration/feature_profile/sdwan/dns_security/__init__.py +13 -0
  195. catalystwan/models/configuration/feature_profile/sdwan/dns_security/dns.py +110 -0
  196. catalystwan/models/configuration/feature_profile/sdwan/embedded_security/__init__.py +23 -0
  197. catalystwan/models/configuration/feature_profile/sdwan/embedded_security/ngfirewall.py +493 -0
  198. catalystwan/models/configuration/feature_profile/sdwan/embedded_security/policy.py +171 -0
  199. catalystwan/models/configuration/feature_profile/sdwan/other/__init__.py +25 -0
  200. catalystwan/models/configuration/feature_profile/sdwan/other/cybervision.py +44 -0
  201. catalystwan/models/configuration/feature_profile/sdwan/other/thousandeyes.py +147 -0
  202. catalystwan/models/configuration/feature_profile/sdwan/other/ucse.py +110 -0
  203. catalystwan/models/configuration/feature_profile/sdwan/policy_object/__init__.py +62 -48
  204. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/app_probe.py +34 -20
  205. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/application_list.py +8 -6
  206. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/as_path.py +22 -0
  207. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/color_list.py +7 -5
  208. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/data_prefix.py +13 -4
  209. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/expanded_community_list.py +9 -7
  210. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/extended_community.py +34 -0
  211. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/fowarding_class.py +7 -5
  212. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv4_network_object.py +15 -0
  213. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv4_service_object.py +254 -0
  214. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_data_prefix.py +11 -9
  215. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_prefix_list.py +25 -10
  216. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/mirror.py +27 -0
  217. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/network_object_group.py +15 -0
  218. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/object_group.py +15 -0
  219. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/{policier.py → policer.py} +12 -10
  220. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefered_group_color.py +29 -10
  221. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefix_list.py +23 -8
  222. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/service_object_group.py +21 -0
  223. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/sla_class.py +12 -31
  224. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/standard_community.py +16 -10
  225. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/tloc_list.py +8 -7
  226. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/aip.py +64 -0
  227. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/amp.py +79 -0
  228. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/application_list.py +8 -6
  229. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/data_prefix.py +7 -5
  230. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/fqdn.py +7 -5
  231. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/geolocation_list.py +7 -5
  232. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/identity.py +30 -0
  233. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/intrusion_prevention.py +58 -0
  234. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ips_signature.py +7 -5
  235. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/local_domain.py +7 -5
  236. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/object_group.py +72 -0
  237. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/protocol_list.py +7 -5
  238. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/rule_set.py +137 -0
  239. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/scalable_group_tag.py +26 -0
  240. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/security_port.py +21 -11
  241. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ssl_decryption.py +126 -0
  242. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ssl_decryption_profile.py +165 -0
  243. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url.py +15 -10
  244. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url_filtering.py +148 -0
  245. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/zone.py +14 -18
  246. catalystwan/models/configuration/feature_profile/sdwan/routing/__init__.py +26 -0
  247. catalystwan/models/configuration/feature_profile/sdwan/routing/bgp.py +609 -0
  248. catalystwan/models/configuration/feature_profile/sdwan/{service → routing}/ospf.py +55 -47
  249. catalystwan/models/configuration/feature_profile/sdwan/{service → routing}/ospfv3.py +74 -72
  250. catalystwan/models/configuration/feature_profile/sdwan/service/__init__.py +91 -0
  251. catalystwan/models/configuration/feature_profile/sdwan/service/appqoe.py +76 -41
  252. catalystwan/models/configuration/feature_profile/sdwan/service/dhcp_server.py +107 -64
  253. catalystwan/models/configuration/feature_profile/sdwan/service/dual_router_ha.py +26 -0
  254. catalystwan/models/configuration/feature_profile/sdwan/service/eigrp.py +39 -42
  255. catalystwan/models/configuration/feature_profile/sdwan/service/lan/common.py +7 -88
  256. catalystwan/models/configuration/feature_profile/sdwan/service/lan/ethernet.py +231 -155
  257. catalystwan/models/configuration/feature_profile/sdwan/service/lan/gre.py +38 -108
  258. catalystwan/models/configuration/feature_profile/sdwan/service/lan/ipsec.py +77 -84
  259. catalystwan/models/configuration/feature_profile/sdwan/service/lan/multilink.py +101 -0
  260. catalystwan/models/configuration/feature_profile/sdwan/service/lan/svi.py +62 -56
  261. catalystwan/models/configuration/feature_profile/sdwan/service/lan/vpn.py +111 -120
  262. catalystwan/models/configuration/feature_profile/sdwan/service/multicast.py +56 -57
  263. catalystwan/models/configuration/feature_profile/sdwan/service/object_tracker.py +15 -21
  264. catalystwan/models/configuration/feature_profile/sdwan/service/route_policy.py +358 -110
  265. catalystwan/models/configuration/feature_profile/sdwan/service/service_chain.py +38 -0
  266. catalystwan/models/configuration/feature_profile/sdwan/service/service_insertion_attachment.py +17 -25
  267. catalystwan/models/configuration/feature_profile/sdwan/service/switchport.py +50 -58
  268. catalystwan/models/configuration/feature_profile/sdwan/service/tracker.py +12 -21
  269. catalystwan/models/configuration/feature_profile/sdwan/service/wireless_lan.py +27 -31
  270. catalystwan/models/configuration/feature_profile/sdwan/sig_security/__init__.py +19 -0
  271. catalystwan/models/configuration/feature_profile/sdwan/sig_security/sig_security.py +379 -0
  272. catalystwan/models/configuration/feature_profile/sdwan/system/__init__.py +59 -0
  273. catalystwan/models/configuration/feature_profile/sdwan/system/aaa.py +58 -10
  274. catalystwan/models/configuration/feature_profile/sdwan/system/banner.py +30 -0
  275. catalystwan/models/configuration/feature_profile/sdwan/system/basic.py +290 -0
  276. catalystwan/models/configuration/feature_profile/sdwan/system/bfd.py +69 -0
  277. catalystwan/models/configuration/feature_profile/sdwan/system/device_access.py +157 -0
  278. catalystwan/models/configuration/feature_profile/sdwan/system/device_access_ipv6.py +157 -0
  279. catalystwan/models/configuration/feature_profile/sdwan/system/global_parcel.py +163 -0
  280. catalystwan/models/configuration/feature_profile/sdwan/system/logging_parcel.py +162 -0
  281. catalystwan/models/configuration/feature_profile/sdwan/system/mrf.py +75 -0
  282. catalystwan/models/configuration/feature_profile/sdwan/system/ntp.py +103 -0
  283. catalystwan/models/configuration/feature_profile/sdwan/system/omp.py +120 -0
  284. catalystwan/models/configuration/feature_profile/sdwan/system/security.py +179 -0
  285. catalystwan/models/configuration/feature_profile/sdwan/system/snmp.py +173 -0
  286. catalystwan/models/configuration/feature_profile/sdwan/topology/__init__.py +29 -0
  287. catalystwan/models/configuration/feature_profile/sdwan/topology/custom_control.py +425 -0
  288. catalystwan/models/configuration/feature_profile/sdwan/topology/hubspoke.py +60 -0
  289. catalystwan/models/configuration/feature_profile/sdwan/topology/mesh.py +23 -0
  290. catalystwan/models/configuration/feature_profile/sdwan/trackers/__init__.py +36 -0
  291. catalystwan/models/configuration/feature_profile/sdwan/trackers/tracker.py +96 -0
  292. catalystwan/models/configuration/feature_profile/sdwan/trackers/tracker_group.py +63 -0
  293. catalystwan/models/configuration/feature_profile/sdwan/transport/__init__.py +93 -0
  294. catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_controller.py +26 -23
  295. catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_profile.py +71 -0
  296. catalystwan/models/configuration/feature_profile/sdwan/transport/gps.py +37 -0
  297. catalystwan/models/configuration/feature_profile/sdwan/transport/management/ethernet.py +121 -0
  298. catalystwan/models/configuration/feature_profile/sdwan/transport/t1e1controller.py +124 -0
  299. catalystwan/models/configuration/feature_profile/sdwan/transport/vpn.py +285 -0
  300. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/cellular.py +173 -0
  301. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/ethernet.py +389 -0
  302. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/gre.py +46 -0
  303. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/ipsec.py +137 -0
  304. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/multilink.py +219 -0
  305. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/protocol_over.py +405 -0
  306. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/t1e1serial.py +195 -0
  307. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/__init__.py +62 -0
  308. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/analog_interface.py +436 -0
  309. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/call_routing.py +179 -0
  310. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/digital_interface.py +380 -0
  311. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/dsp_farm.py +193 -0
  312. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/media_profile.py +17 -0
  313. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/server_group.py +51 -0
  314. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/srst.py +86 -0
  315. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/supervisory_disconnect.py +69 -0
  316. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/translation_profile.py +42 -0
  317. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/translation_rule.py +31 -0
  318. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/trunk_group.py +26 -0
  319. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/voice_global.py +55 -0
  320. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/voice_tenant.py +40 -0
  321. catalystwan/models/configuration/network_hierarchy/__init__.py +22 -0
  322. catalystwan/models/configuration/network_hierarchy/cflowd.py +120 -0
  323. catalystwan/models/configuration/network_hierarchy/node.py +88 -0
  324. catalystwan/models/configuration/policy_group.py +74 -0
  325. catalystwan/models/configuration/profile_type.py +1 -6
  326. catalystwan/models/configuration/topology_group.py +52 -0
  327. catalystwan/models/policy/__init__.py +275 -69
  328. catalystwan/models/policy/centralized.py +26 -29
  329. catalystwan/models/policy/{definitions → definition}/access_control_list.py +47 -17
  330. catalystwan/models/policy/{definitions → definition}/access_control_list_ipv6.py +42 -18
  331. catalystwan/models/policy/definition/aip.py +60 -0
  332. catalystwan/models/policy/definition/amp.py +65 -0
  333. catalystwan/models/policy/definition/app_route.py +246 -0
  334. catalystwan/models/policy/definition/cflowd.py +95 -0
  335. catalystwan/models/policy/{definitions → definition}/control.py +48 -25
  336. catalystwan/models/policy/{definitions → definition}/device_access.py +22 -11
  337. catalystwan/models/policy/{definitions → definition}/device_access_ipv6.py +20 -11
  338. catalystwan/models/policy/definition/dial_peer.py +60 -0
  339. catalystwan/models/policy/definition/dns_security.py +130 -0
  340. catalystwan/models/policy/definition/fxo_port.py +63 -0
  341. catalystwan/models/policy/definition/fxs_did_port.py +58 -0
  342. catalystwan/models/policy/definition/fxs_port.py +56 -0
  343. catalystwan/models/policy/{definitions → definition}/hub_and_spoke.py +18 -4
  344. catalystwan/models/policy/definition/intrusion_prevention.py +55 -0
  345. catalystwan/models/policy/{definitions → definition}/mesh.py +13 -1
  346. catalystwan/models/policy/definition/pri_isdn_port.py +48 -0
  347. catalystwan/models/policy/{definitions → definition}/qos_map.py +39 -32
  348. catalystwan/models/policy/{definitions → definition}/rewrite.py +12 -2
  349. catalystwan/models/policy/definition/route_policy.py +187 -0
  350. catalystwan/models/policy/{definitions → definition}/rule_set.py +66 -48
  351. catalystwan/models/policy/{definitions → definition}/security_group.py +38 -14
  352. catalystwan/models/policy/definition/srst_phone_profile.py +37 -0
  353. catalystwan/models/policy/definition/ssl_decryption.py +209 -0
  354. catalystwan/models/policy/definition/ssl_decryption_utd_profile.py +87 -0
  355. catalystwan/models/policy/{definitions → definition}/traffic_data.py +184 -61
  356. catalystwan/models/policy/definition/url_filtering.py +70 -0
  357. catalystwan/models/policy/{definitions → definition}/vpn_membership.py +13 -1
  358. catalystwan/models/policy/definition/vpn_qos_map.py +46 -0
  359. catalystwan/models/policy/{definitions → definition}/zone_based_firewall.py +93 -32
  360. catalystwan/models/policy/list/app.py +44 -0
  361. catalystwan/models/policy/list/app_probe.py +42 -0
  362. catalystwan/models/policy/list/as_path.py +30 -0
  363. catalystwan/models/policy/list/class_map.py +30 -0
  364. catalystwan/models/policy/list/color.py +28 -0
  365. catalystwan/models/policy/list/communities.py +83 -0
  366. catalystwan/models/policy/list/data_ipv6_prefix.py +30 -0
  367. catalystwan/models/policy/list/data_prefix.py +30 -0
  368. catalystwan/models/policy/list/fax_protocol.py +45 -0
  369. catalystwan/models/policy/list/fqdn.py +24 -0
  370. catalystwan/models/policy/list/geo_location.py +33 -0
  371. catalystwan/models/policy/list/identity.py +29 -0
  372. catalystwan/models/policy/list/ips_signature.py +27 -0
  373. catalystwan/models/policy/list/ipv6_prefix.py +33 -0
  374. catalystwan/models/policy/list/local_app.py +45 -0
  375. catalystwan/models/policy/list/local_domain.py +36 -0
  376. catalystwan/models/policy/list/media_profile.py +44 -0
  377. catalystwan/models/policy/list/mirror.py +27 -0
  378. catalystwan/models/policy/list/modem_pass_through.py +27 -0
  379. catalystwan/models/policy/list/policer.py +39 -0
  380. catalystwan/models/policy/list/port.py +33 -0
  381. catalystwan/models/policy/list/preferred_color_group.py +82 -0
  382. catalystwan/models/policy/list/prefix.py +33 -0
  383. catalystwan/models/policy/list/protocol_name.py +26 -0
  384. catalystwan/models/policy/list/region.py +45 -0
  385. catalystwan/models/policy/list/scalable_group_tag.py +30 -0
  386. catalystwan/models/policy/list/site.py +34 -0
  387. catalystwan/models/policy/list/sla.py +77 -0
  388. catalystwan/models/policy/list/supervisory_disconnect.py +62 -0
  389. catalystwan/models/policy/list/threat_grid_api_key.py +32 -0
  390. catalystwan/models/policy/list/tloc.py +32 -0
  391. catalystwan/models/policy/list/translation_profile.py +32 -0
  392. catalystwan/models/policy/list/translation_rules.py +29 -0
  393. catalystwan/models/policy/list/trunkgroup.py +56 -0
  394. catalystwan/models/policy/list/umbrella_data.py +30 -0
  395. catalystwan/models/policy/list/url.py +39 -0
  396. catalystwan/models/policy/list/vpn.py +40 -0
  397. catalystwan/models/policy/list/zone.py +46 -0
  398. catalystwan/models/policy/localized.py +34 -16
  399. catalystwan/models/policy/policy.py +13 -9
  400. catalystwan/models/policy/policy_definition.py +673 -173
  401. catalystwan/models/policy/policy_list.py +38 -27
  402. catalystwan/models/policy/security.py +145 -46
  403. catalystwan/models/policy/voice.py +77 -0
  404. catalystwan/models/settings.py +41 -0
  405. catalystwan/models/templates.py +79 -0
  406. catalystwan/response.py +6 -2
  407. catalystwan/session.py +1 -1
  408. catalystwan/tests/builders/test_report.py +60 -0
  409. catalystwan/tests/builders/uc_voice.py +85 -0
  410. catalystwan/tests/models/__init__.py +0 -0
  411. catalystwan/tests/models/test_digital_interface.py +56 -0
  412. catalystwan/tests/templates/definitions/aaa_basic.json +96 -0
  413. catalystwan/tests/templates/definitions/aaa_complex.json +464 -0
  414. catalystwan/tests/templates/definitions/{iuo.json → cisco_aaa.json} +44 -15
  415. catalystwan/tests/templates/definitions/cisco_aaa_complex.json +361 -0
  416. catalystwan/tests/templates/definitions/cisco_logging_complex.json +268 -0
  417. catalystwan/tests/templates/definitions/cisco_ntp_complex.json +143 -0
  418. catalystwan/tests/templates/definitions/cisco_omp_complex.json +175 -0
  419. catalystwan/tests/templates/definitions/cisco_ospf_complex.json +302 -0
  420. catalystwan/tests/templates/definitions/cisco_sig.json +405 -0
  421. catalystwan/tests/templates/definitions/cisco_snmp_complex.json +258 -0
  422. catalystwan/tests/templates/definitions/cisco_system_complex.json +502 -0
  423. catalystwan/tests/templates/definitions/{Basic_Cisco_VPN_Model.json → cisco_vpn_basic.json} +2 -2
  424. catalystwan/tests/templates/definitions/{complex_cisco_vpn.json → cisco_vpn_complex.json} +27 -12
  425. catalystwan/tests/templates/definitions/cisco_vpn_interface_complex.json +821 -0
  426. catalystwan/tests/templates/definitions/omp_vsmart_1.json +26 -0
  427. catalystwan/tests/templates/definitions/{omp_2.json → omp_vsmart_2.json} +16 -2
  428. catalystwan/tests/templates/definitions/{omp_3.json → omp_vsmart_3.json} +16 -2
  429. catalystwan/tests/templates/definitions/omp_vsmart_complex.json +73 -0
  430. catalystwan/tests/templates/definitions/security_vsmart_complex.json +24 -0
  431. catalystwan/tests/templates/definitions/system_vsmart_complex.json +193 -0
  432. catalystwan/tests/templates/definitions/vpn_vsmart_basic.json +17 -0
  433. catalystwan/tests/templates/definitions/vpn_vsmart_complex.json +179 -0
  434. catalystwan/tests/templates/definitions/vpn_vsmart_interface_basic.json +42 -0
  435. catalystwan/tests/templates/definitions/vpn_vsmart_interface_complex.json +208 -0
  436. catalystwan/tests/templates/models/__init__.py +46 -13
  437. catalystwan/tests/templates/models/aaa.py +106 -0
  438. catalystwan/tests/templates/models/cisco_aaa.py +81 -48
  439. catalystwan/tests/templates/models/cisco_banner.py +2 -2
  440. catalystwan/tests/templates/models/cisco_bfd.py +4 -6
  441. catalystwan/tests/templates/models/cisco_logging.py +65 -0
  442. catalystwan/tests/templates/models/cisco_ntp.py +17 -0
  443. catalystwan/tests/templates/models/cisco_omp.py +37 -0
  444. catalystwan/tests/templates/models/cisco_ospf.py +60 -0
  445. catalystwan/tests/templates/models/cisco_secure_internet_gateway.py +95 -0
  446. catalystwan/tests/templates/models/cisco_snmp.py +40 -0
  447. catalystwan/tests/templates/models/cisco_system.py +108 -3
  448. catalystwan/tests/templates/models/cisco_vpn.py +42 -72
  449. catalystwan/tests/templates/models/cisco_vpn_interface.py +200 -0
  450. catalystwan/tests/templates/models/omp_vsmart.py +28 -8
  451. catalystwan/tests/templates/models/security_vsmart.py +11 -0
  452. catalystwan/tests/templates/models/system_vsmart.py +37 -0
  453. catalystwan/tests/templates/models/vpn_vsmart.py +32 -0
  454. catalystwan/tests/templates/models/vpn_vsmart_interface.py +54 -0
  455. catalystwan/tests/templates/schemas/aaa.json +1096 -0
  456. catalystwan/tests/templates/schemas/cedge_aaa.json +1 -1
  457. catalystwan/tests/templates/schemas/cisco_logging.json +577 -0
  458. catalystwan/tests/templates/schemas/cisco_ntp.json +265 -0
  459. catalystwan/tests/templates/schemas/cisco_omp.json +479 -0
  460. catalystwan/tests/templates/schemas/cisco_ospf.json +908 -0
  461. catalystwan/tests/templates/schemas/cisco_secure_internet_gateway.json +1520 -0
  462. catalystwan/tests/templates/schemas/cisco_snmp.json +561 -0
  463. catalystwan/tests/templates/schemas/cisco_system.json +242 -0
  464. catalystwan/tests/templates/schemas/cisco_vpn.json +53 -1
  465. catalystwan/tests/templates/schemas/cisco_vpn_interface.json +3348 -0
  466. catalystwan/tests/templates/schemas/omp-vsmart.json +20 -0
  467. catalystwan/tests/templates/schemas/security-vsmart.json +58 -0
  468. catalystwan/tests/templates/schemas/system-vsmart.json +2585 -0
  469. catalystwan/tests/templates/schemas/vpn-vsmart-interface.json +859 -0
  470. catalystwan/tests/templates/schemas/vpn-vsmart.json +445 -0
  471. catalystwan/tests/templates/test_chose_model.py +6 -10
  472. catalystwan/tests/templates/test_deserialize_model.py +4 -4
  473. catalystwan/tests/templates/test_find_template_values.py +229 -0
  474. catalystwan/tests/templates/test_find_template_values_2.py +193 -0
  475. catalystwan/tests/templates/test_serialize_model.py +1 -2
  476. catalystwan/tests/test_cli_template.py +8 -9
  477. catalystwan/tests/test_endpoints.py +42 -11
  478. catalystwan/tests/test_feature_profile_api.py +282 -0
  479. catalystwan/tests/test_models_common.py +53 -0
  480. catalystwan/tests/test_templates.py +16 -19
  481. catalystwan/utils/feature_template/find_template_values.py +17 -4
  482. catalystwan/utils/model.py +45 -0
  483. catalystwan/utils/persona.py +5 -0
  484. catalystwan/utils/type_check.py +22 -0
  485. catalystwan/workflows/backup_restore_device_templates.py +467 -0
  486. catalystwan/workflows/tenant_migration.py +1 -1
  487. {catalystwan-0.41.2.dist-info → catalystwan-0.41.2.dev0.dist-info}/METADATA +20 -1
  488. catalystwan-0.41.2.dev0.dist-info/RECORD +636 -0
  489. catalystwan/ENDPOINTS.md +0 -611
  490. catalystwan/api/configuration_groups/parcels/cellular_controller.py +0 -33
  491. catalystwan/api/templates/device_template/device_template_payload.json.j2 +0 -19
  492. catalystwan/models/configuration/config_migration.py +0 -36
  493. catalystwan/models/configuration/feature_profile/sdwan/management/vpn.py +0 -26
  494. catalystwan/models/configuration/feature_profile/sdwan/service/acl.py +0 -409
  495. catalystwan/models/configuration/feature_profile/sdwan/service/bgp.py +0 -288
  496. catalystwan/models/policy/lists.py +0 -330
  497. catalystwan/models/policy/lists_entries.py +0 -444
  498. catalystwan/tests/templates/definitions/complex_aaa.json +0 -277
  499. catalystwan/tests/templates/definitions/omp_1.json +0 -11
  500. catalystwan/utils/timezone.py +0 -422
  501. catalystwan-0.41.2.dist-info/RECORD +0 -353
  502. /catalystwan/tests/templates/definitions/{banner_1.json → cisco_banner.json} +0 -0
  503. {catalystwan-0.41.2.dist-info → catalystwan-0.41.2.dev0.dist-info}/LICENSE +0 -0
  504. {catalystwan-0.41.2.dist-info → catalystwan-0.41.2.dev0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,282 @@
1
+ # Copyright 2023 Cisco Systems, Inc. and its affiliates
2
+ import unittest
3
+ from unittest.mock import Mock
4
+ from uuid import uuid4
5
+
6
+ from parameterized import parameterized # type: ignore
7
+
8
+ from catalystwan.api.feature_profile_api import (
9
+ ServiceFeatureProfileAPI,
10
+ SystemFeatureProfileAPI,
11
+ TransportFeatureProfileAPI,
12
+ )
13
+ from catalystwan.endpoints.configuration.feature_profile.sdwan.service import ServiceFeatureProfile
14
+ from catalystwan.endpoints.configuration.feature_profile.sdwan.system import SystemFeatureProfile
15
+ from catalystwan.endpoints.configuration.feature_profile.sdwan.transport import TransportFeatureProfile
16
+ from catalystwan.models.configuration.feature_profile.parcel import ParcelAssociationPayload, ParcelCreationResponse
17
+ from catalystwan.models.configuration.feature_profile.sdwan.acl.ipv4acl import Ipv4AclParcel
18
+ from catalystwan.models.configuration.feature_profile.sdwan.acl.ipv6acl import Ipv6AclParcel
19
+ from catalystwan.models.configuration.feature_profile.sdwan.routing import (
20
+ RoutingOspfParcel,
21
+ RoutingOspfv3IPv4Parcel,
22
+ RoutingOspfv3IPv6Parcel,
23
+ )
24
+ from catalystwan.models.configuration.feature_profile.sdwan.service import AppqoeParcel
25
+ from catalystwan.models.configuration.feature_profile.sdwan.service import (
26
+ InterfaceEthernetParcel as LanInterfaceEthernetParcel,
27
+ )
28
+ from catalystwan.models.configuration.feature_profile.sdwan.service import InterfaceGreParcel as LanInterfaceGreParcel
29
+ from catalystwan.models.configuration.feature_profile.sdwan.service import (
30
+ InterfaceIpsecParcel as LanInterfaceIpsecParcel,
31
+ )
32
+ from catalystwan.models.configuration.feature_profile.sdwan.service import InterfaceSviParcel as LanInterfaceSviParcel
33
+ from catalystwan.models.configuration.feature_profile.sdwan.service import (
34
+ LanVpnDhcpServerParcel,
35
+ LanVpnParcel,
36
+ SwitchportParcel,
37
+ )
38
+ from catalystwan.models.configuration.feature_profile.sdwan.service.eigrp import EigrpParcel
39
+ from catalystwan.models.configuration.feature_profile.sdwan.service.multicast import MulticastParcel
40
+ from catalystwan.models.configuration.feature_profile.sdwan.service.route_policy import RoutePolicyParcel
41
+ from catalystwan.models.configuration.feature_profile.sdwan.service.wireless_lan import WirelessLanParcel
42
+ from catalystwan.models.configuration.feature_profile.sdwan.system import (
43
+ AAAParcel,
44
+ BannerParcel,
45
+ BasicParcel,
46
+ BFDParcel,
47
+ GlobalParcel,
48
+ LoggingParcel,
49
+ MRFParcel,
50
+ NtpParcel,
51
+ OMPParcel,
52
+ SecurityParcel,
53
+ SNMPParcel,
54
+ )
55
+ from catalystwan.models.configuration.feature_profile.sdwan.transport import (
56
+ InterfaceDslIPoEParcel,
57
+ InterfaceDslPPPoAParcel,
58
+ InterfaceDslPPPoEParcel,
59
+ InterfaceEthPPPoEParcel,
60
+ )
61
+ from catalystwan.models.configuration.feature_profile.sdwan.transport import InterfaceGreParcel as WanInterfaceGreParcel
62
+ from catalystwan.models.configuration.feature_profile.sdwan.transport import (
63
+ InterfaceIpsecParcel as WanInterfaceIpsecParcel,
64
+ )
65
+ from catalystwan.models.configuration.feature_profile.sdwan.transport import (
66
+ ManagementVpnParcel,
67
+ T1E1ControllerParcel,
68
+ TransportVpnParcel,
69
+ )
70
+ from catalystwan.models.configuration.feature_profile.sdwan.transport.cellular_controller import (
71
+ CellularControllerParcel,
72
+ )
73
+ from catalystwan.models.configuration.feature_profile.sdwan.transport.cellular_profile import CellularProfileParcel
74
+ from catalystwan.models.configuration.feature_profile.sdwan.transport.gps import GpsParcel
75
+ from catalystwan.models.configuration.feature_profile.sdwan.transport.wan.interface.cellular import (
76
+ InterfaceCellularParcel,
77
+ )
78
+
79
+ system_endpoint_mapping = {
80
+ AAAParcel: "aaa",
81
+ BannerParcel: "banner",
82
+ BasicParcel: "basic",
83
+ BFDParcel: "bfd",
84
+ GlobalParcel: "global",
85
+ LoggingParcel: "logging",
86
+ MRFParcel: "mrf",
87
+ NtpParcel: "ntp",
88
+ OMPParcel: "omp",
89
+ SecurityParcel: "security",
90
+ SNMPParcel: "snmp",
91
+ }
92
+
93
+
94
+ class TestSystemFeatureProfileAPI(unittest.TestCase):
95
+ def setUp(self):
96
+ self.profile_uuid = uuid4()
97
+ self.parcel_uuid = uuid4()
98
+ self.mock_session = Mock()
99
+ self.mock_endpoint = Mock(spec=SystemFeatureProfile)
100
+ self.api = SystemFeatureProfileAPI(self.mock_session)
101
+ self.api.endpoint = self.mock_endpoint
102
+
103
+ @parameterized.expand(system_endpoint_mapping.items())
104
+ def test_delete_method_with_valid_arguments(self, parcel, expected_path):
105
+ # Act
106
+ self.api.delete_parcel(self.profile_uuid, parcel, self.parcel_uuid)
107
+
108
+ # Assert
109
+ self.mock_endpoint.delete.assert_called_once_with(self.profile_uuid, expected_path, self.parcel_uuid)
110
+
111
+ @parameterized.expand(system_endpoint_mapping.items())
112
+ def test_get_method_with_valid_arguments(self, parcel, expected_path):
113
+ # Act
114
+ self.api.get_parcel(self.profile_uuid, parcel, self.parcel_uuid)
115
+
116
+ # Assert
117
+ self.mock_endpoint.get_by_id.assert_called_once_with(self.profile_uuid, expected_path, self.parcel_uuid)
118
+
119
+ @parameterized.expand(system_endpoint_mapping.items())
120
+ def test_get_all_method_with_valid_arguments(self, parcel, expected_path):
121
+ # Act
122
+ self.api.get_parcels(self.profile_uuid, parcel)
123
+
124
+ # Assert
125
+ self.mock_endpoint.get_all.assert_called_once_with(self.profile_uuid, expected_path)
126
+
127
+ @parameterized.expand(system_endpoint_mapping.items())
128
+ def test_create_method_with_valid_arguments(self, parcel, expected_path):
129
+ # Act
130
+ self.api.create_parcel(self.profile_uuid, parcel)
131
+
132
+ # Assert
133
+ self.mock_endpoint.create.assert_called_once_with(self.profile_uuid, expected_path, parcel)
134
+
135
+ @parameterized.expand(system_endpoint_mapping.items())
136
+ def test_update_method_with_valid_arguments(self, parcel, expected_path):
137
+ # Act
138
+ self.api.update_parcel(self.profile_uuid, parcel, self.parcel_uuid)
139
+
140
+ # Assert
141
+ self.mock_endpoint.update.assert_called_once_with(self.profile_uuid, expected_path, self.parcel_uuid, parcel)
142
+
143
+
144
+ service_endpoint_mapping = {
145
+ LanVpnDhcpServerParcel: "dhcp-server",
146
+ AppqoeParcel: "appqoe",
147
+ LanVpnParcel: "lan/vpn",
148
+ RoutingOspfParcel: "routing/ospf",
149
+ RoutingOspfv3IPv4Parcel: "routing/ospfv3/ipv4",
150
+ RoutingOspfv3IPv6Parcel: "routing/ospfv3/ipv6",
151
+ RoutePolicyParcel: "route-policy",
152
+ EigrpParcel: "routing/eigrp",
153
+ Ipv6AclParcel: "ipv6-acl",
154
+ Ipv4AclParcel: "ipv4-acl",
155
+ SwitchportParcel: "switchport",
156
+ MulticastParcel: "routing/multicast",
157
+ WirelessLanParcel: "wirelesslan",
158
+ }
159
+
160
+ service_interface_parcels = [
161
+ ("interface/gre", LanInterfaceGreParcel),
162
+ ("interface/svi", LanInterfaceSviParcel),
163
+ ("interface/ethernet", LanInterfaceEthernetParcel),
164
+ ("interface/ipsec", LanInterfaceIpsecParcel),
165
+ ]
166
+
167
+ service_vpn_sub_parcels = [
168
+ (
169
+ "routing/multicast",
170
+ MulticastParcel(
171
+ parcel_name="TestMulticastParcel",
172
+ parcel_description="Test Multicast Parcel",
173
+ ),
174
+ )
175
+ ]
176
+
177
+
178
+ class TestServiceFeatureProfileAPI(unittest.TestCase):
179
+ def setUp(self):
180
+ self.profile_uuid = uuid4()
181
+ self.vpn_uuid = uuid4()
182
+ self.parcel_uuid = uuid4()
183
+ self.mock_session = Mock()
184
+ self.mock_endpoint = Mock(spec=ServiceFeatureProfile)
185
+ self.api = ServiceFeatureProfileAPI(self.mock_session)
186
+ self.api.endpoint = self.mock_endpoint
187
+
188
+ @parameterized.expand(service_endpoint_mapping.items())
189
+ def test_post_method_parcel(self, parcel, parcel_type):
190
+ # Act
191
+ self.api.create_parcel(self.profile_uuid, parcel)
192
+
193
+ # Assert
194
+ self.mock_endpoint.create_service_parcel.assert_called_once_with(self.profile_uuid, parcel_type, parcel)
195
+
196
+ @parameterized.expand(service_interface_parcels)
197
+ def test_post_method_interface_parcel(self, parcel_type, parcel):
198
+ # Act
199
+ self.api.create_parcel(self.profile_uuid, parcel, self.vpn_uuid)
200
+
201
+ # Assert
202
+ self.mock_endpoint.create_lan_vpn_sub_parcel.assert_called_once_with(
203
+ self.profile_uuid, self.vpn_uuid, parcel_type, parcel
204
+ )
205
+
206
+ @parameterized.expand(service_vpn_sub_parcels)
207
+ def test_post_method_create_then_assigin_subparcel(self, parcel_type, parcel):
208
+ # Arrange
209
+ self.mock_endpoint.create_service_parcel.return_value = ParcelCreationResponse(id=self.parcel_uuid)
210
+
211
+ # Act
212
+ self.api.create_parcel(self.profile_uuid, parcel, self.vpn_uuid)
213
+
214
+ # Assert
215
+ self.mock_endpoint.create_service_parcel.assert_called_once_with(self.profile_uuid, parcel_type, parcel)
216
+ self.mock_endpoint.associate_parcel_with_vpn.assert_called_once_with(
217
+ self.profile_uuid,
218
+ self.vpn_uuid,
219
+ parcel_type,
220
+ ParcelAssociationPayload(parcel_id=self.parcel_uuid),
221
+ )
222
+
223
+
224
+ transport_enpoint_mapping = {
225
+ T1E1ControllerParcel: "t1-e1-controller",
226
+ GpsParcel: "gps",
227
+ CellularControllerParcel: "cellular-controller",
228
+ CellularProfileParcel: "cellular-profile",
229
+ ManagementVpnParcel: "management/vpn",
230
+ TransportVpnParcel: "wan/vpn",
231
+ }
232
+
233
+ transport_interface_parcels = [
234
+ ("interface/ipsec", WanInterfaceIpsecParcel),
235
+ ("interface/dsl-ipoe", InterfaceDslIPoEParcel),
236
+ (
237
+ "interface/ethpppoe",
238
+ InterfaceEthPPPoEParcel,
239
+ ),
240
+ (
241
+ "interface/dsl-pppoe",
242
+ InterfaceDslPPPoEParcel,
243
+ ),
244
+ (
245
+ "interface/dsl-pppoa",
246
+ InterfaceDslPPPoAParcel,
247
+ ),
248
+ ("interface/gre", WanInterfaceGreParcel),
249
+ ("interface/cellular", InterfaceCellularParcel),
250
+ ]
251
+
252
+
253
+ class TestTransportFeatureProfileAPI(unittest.TestCase):
254
+ def setUp(self):
255
+ self.profile_uuid = uuid4()
256
+ self.vpn_uuid = uuid4()
257
+ self.parcel_uuid = uuid4()
258
+ self.mock_session = Mock()
259
+ self.mock_endpoint = Mock(spec=TransportFeatureProfile)
260
+ self.api = TransportFeatureProfileAPI(self.mock_session)
261
+ self.api.endpoint = self.mock_endpoint
262
+ parcel_mock = Mock()
263
+ parcel_mock.payload._get_parcel_type.return_value = "wan/vpn"
264
+ self.api._get_vpn_parcel = Mock(return_value=parcel_mock)
265
+
266
+ @parameterized.expand(transport_enpoint_mapping.items())
267
+ def test_post_method_parcel(self, parcel, parcel_type):
268
+ # Act
269
+ self.api.create_parcel(self.profile_uuid, parcel)
270
+
271
+ # Assert
272
+ self.mock_endpoint.create_transport_parcel.assert_called_once_with(self.profile_uuid, parcel_type, parcel)
273
+
274
+ @parameterized.expand(transport_interface_parcels)
275
+ def test_post_method_interface_parcel(self, parcel_type, parcel):
276
+ # Act
277
+ self.api.create_parcel(self.profile_uuid, parcel, self.vpn_uuid)
278
+
279
+ # Assert
280
+ self.mock_endpoint.create_transport_vpn_sub_parcel.assert_called_once_with(
281
+ self.profile_uuid, self.vpn_uuid, parcel_type, parcel
282
+ )
@@ -0,0 +1,53 @@
1
+ # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
+
3
+ import unittest
4
+ from typing import Any, Dict, Set
5
+
6
+ from packaging.version import Version # type: ignore
7
+ from parameterized import parameterized # type: ignore
8
+ from pydantic import BaseModel, ConfigDict, Field, SerializationInfo, SerializerFunctionWrapHandler, model_serializer
9
+ from typing_extensions import Annotated
10
+
11
+ from catalystwan.models.common import VersionedField
12
+
13
+ A = Annotated[
14
+ int, VersionedField(versions=">=1", serialization_alias="a-kebab"), Field(default=0, serialization_alias="aCamel")
15
+ ]
16
+
17
+ B = Annotated[
18
+ float,
19
+ VersionedField(versions=">=2", serialization_alias="b-kebab"),
20
+ ]
21
+
22
+
23
+ class VersionedFieldsModel(BaseModel):
24
+ model_config = ConfigDict(populate_by_name=True)
25
+ a: A
26
+ b: B = Field(default=0.0, serialization_alias="bCamel")
27
+ c: Annotated[bool, VersionedField(versions=">=3", serialization_alias="c-kebab")] = False
28
+
29
+ @model_serializer(mode="wrap")
30
+ def dump(self, handler: SerializerFunctionWrapHandler, info: SerializationInfo) -> Dict[str, Any]:
31
+ return VersionedField.dump(self.model_fields, handler(self), info)
32
+
33
+
34
+ class Payload(BaseModel):
35
+ model_config = ConfigDict(populate_by_name=True)
36
+ data: VersionedFieldsModel
37
+
38
+
39
+ class TestModelsCommonVersionedField(unittest.TestCase):
40
+ def setUp(self):
41
+ self.model = Payload(data=VersionedFieldsModel())
42
+
43
+ @parameterized.expand(
44
+ [
45
+ ("0.9", {"aCamel", "bCamel", "c"}),
46
+ ("1.0", {"a-kebab", "bCamel", "c"}),
47
+ ("2.1", {"a-kebab", "b-kebab", "c"}),
48
+ ("3.0.1", {"a-kebab", "b-kebab", "c-kebab"}),
49
+ ]
50
+ )
51
+ def test_versioned_field_model_serialize(self, version: str, expected_fields: Set[str]):
52
+ data_dict = self.model.model_dump(by_alias=True, context={"api_version": Version(version)}).get("data")
53
+ assert expected_fields == data_dict.keys()
@@ -12,10 +12,9 @@ from catalystwan.api.templates.device_template.device_template import DeviceTemp
12
12
  from catalystwan.api.templates.feature_template import FeatureTemplate
13
13
  from catalystwan.api.templates.models.cisco_aaa_model import CiscoAAAModel
14
14
  from catalystwan.api.templates.payloads.aaa.aaa_model import AAAModel, AuthenticationOrder
15
- from catalystwan.dataclasses import Device, FeatureTemplateInfo, TemplateInfo
15
+ from catalystwan.dataclasses import Device
16
+ from catalystwan.endpoints.configuration_template_master import DeviceTemplateInformation
16
17
  from catalystwan.typed_list import DataSequence
17
- from catalystwan.utils.creation_tools import create_dataclass
18
- from catalystwan.utils.device_model import DeviceModel
19
18
  from catalystwan.utils.personality import Personality
20
19
  from catalystwan.utils.reachability import Reachability
21
20
 
@@ -55,8 +54,8 @@ class TestTemplatesAPI(unittest.TestCase):
55
54
  },
56
55
  ]
57
56
  self.templates = DataSequence(
58
- TemplateInfo,
59
- [create_dataclass(TemplateInfo, template) for template in self.data_template],
57
+ DeviceTemplateInformation,
58
+ [DeviceTemplateInformation(**template) for template in self.data_template],
60
59
  )
61
60
  self.device_info = Device(
62
61
  personality=Personality.EDGE,
@@ -70,7 +69,7 @@ class TestTemplatesAPI(unittest.TestCase):
70
69
  model="vedge-cloud",
71
70
  status="normal",
72
71
  )
73
- sub_tasks_data = SubTaskData.parse_obj(
72
+ sub_tasks_data = SubTaskData.model_validate(
74
73
  {
75
74
  "status": "Success",
76
75
  "statusId": "success",
@@ -86,12 +85,10 @@ class TestTemplatesAPI(unittest.TestCase):
86
85
  )
87
86
  self.task = TaskResult(result=True, sub_tasks_data=[sub_tasks_data])
88
87
 
89
- @patch("catalystwan.response.ManagerResponse")
90
88
  @patch("catalystwan.session.ManagerSession")
91
- def test_templates_success(self, mock_session, mocked_response):
89
+ def test_templates_success(self, mock_session):
92
90
  # Arrange
93
- mock_session.get.return_value = mocked_response
94
- mocked_response.dataseq.return_value = self.templates
91
+ mock_session.endpoints.configuration_general_template.get_feature_template_list.return_value = self.templates
95
92
 
96
93
  # Act
97
94
  answer = TemplatesAPI(mock_session).get(FeatureTemplate)
@@ -99,18 +96,18 @@ class TestTemplatesAPI(unittest.TestCase):
99
96
  # Assert
100
97
  self.assertEqual(answer, self.templates)
101
98
 
102
- @patch("catalystwan.response.ManagerResponse")
103
99
  @patch("catalystwan.session.ManagerSession")
104
- def test_templates_get(self, mock_session, mocked_response):
100
+ def test_templates_get(self, mock_session):
105
101
  # Arrange
106
- mock_session.get_data.return_value = mocked_response
107
- mocked_response.dataseq.return_value = DataSequence(FeatureTemplateInfo, [])
102
+ mock_session.endpoints.configuration_general_template.get_feature_template_list.return_value = self.templates
108
103
 
109
104
  # Act
110
105
  TemplatesAPI(mock_session).get(FeatureTemplate)
111
106
 
112
107
  # Assert
113
- mock_session.get.assert_called_once_with(url="/dataservice/template/feature", params={"summary": True})
108
+ mock_session.endpoints.configuration_general_template.get_feature_template_list.assert_called_once_with(
109
+ params={"summary": True}
110
+ )
114
111
 
115
112
  @parameterized.expand(
116
113
  [
@@ -130,14 +127,14 @@ class TestTemplatesAPI(unittest.TestCase):
130
127
  DeviceTemplate( # type: ignore
131
128
  template_name="test_device_template",
132
129
  template_description="test_device_template_description",
133
- device_type=DeviceModel.VEDGE_2000,
130
+ device_type="vedge-2000",
134
131
  general_templates=[],
135
132
  ),
136
133
  "device_template_id",
137
134
  ),
138
135
  (
139
136
  CLITemplate( # type: ignore
140
- template_name="test", template_description="test", device_model=DeviceModel.VEDGE
137
+ template_name="test", template_description="test", device_model="vedge-100"
141
138
  ),
142
139
  "cli_id",
143
140
  ),
@@ -193,13 +190,13 @@ class TestTemplatesAPI(unittest.TestCase):
193
190
  DeviceTemplate( # type: ignore
194
191
  template_name="test_device_template",
195
192
  template_description="test_device_template_description",
196
- device_type=DeviceModel.VEDGE_2000,
193
+ device_type="vedge-2000",
197
194
  general_templates=[],
198
195
  ),
199
196
  CLITemplate( # type: ignore
200
197
  template_name="test_cli_template",
201
198
  template_description="test_cli_description",
202
- device_model=DeviceModel.VBOND,
199
+ device_model="vedge-cloud",
203
200
  ),
204
201
  CiscoAAAModel( # type: ignore
205
202
  template_name="test_aaa_model",
@@ -1,9 +1,11 @@
1
1
  # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
-
2
+ import logging
3
3
  from typing import Any, Dict, List, Optional, Union
4
4
 
5
5
  from catalystwan.api.templates.device_variable import DeviceVariable
6
6
 
7
+ logger = logging.getLogger(__name__)
8
+
7
9
 
8
10
  def find_template_values(
9
11
  template_definition: dict,
@@ -41,7 +43,7 @@ def find_template_values(
41
43
  template_value = template_definition.get(target_key_for_template_value)
42
44
 
43
45
  field_key = path[-1]
44
- if value == "variableName":
46
+ if value in ["variableName", "variable"]:
45
47
  # For example this is the current dictionary:
46
48
  # field_key is "dns-addr"
47
49
  # {
@@ -52,7 +54,14 @@ def find_template_values(
52
54
  # }
53
55
  # vipType is "variableName" so we need to return
54
56
  # {"dns-addr": DeviceVariable(name="vpn_dns_primary")}
55
- templated_values[field_key] = DeviceVariable(name=template_definition["vipVariableName"])
57
+ if var_name := template_definition.get("vipVariableName"):
58
+ new_value = DeviceVariable(name=var_name)
59
+ if previous_value := templated_values.get(field_key):
60
+ logger.error(
61
+ f"Overwriting existing value for field: '{field_key}' in templated_values. "
62
+ f"Previous value: {previous_value}, new value: {new_value}."
63
+ )
64
+ templated_values[field_key] = new_value
56
65
  return templated_values
57
66
 
58
67
  if template_value is None:
@@ -93,7 +102,11 @@ def get_nested_dict(d: dict, path: List[str], populate: bool = True):
93
102
  return current_dict
94
103
 
95
104
 
96
- def process_list_value(item: Any, target_key: str = "vipType", target_key_for_template_value: str = "vipValue"):
105
+ def process_list_value(
106
+ item: Any,
107
+ target_key: str = "vipType",
108
+ target_key_for_template_value: str = "vipValue",
109
+ ):
97
110
  if isinstance(item, dict):
98
111
  if target_key in item:
99
112
  if item["vipObjectType"] == "list":
@@ -0,0 +1,45 @@
1
+ # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
+ from functools import lru_cache
3
+ from inspect import isclass
4
+ from typing import Any, List, Optional, Type, Union
5
+
6
+ from pydantic import BaseModel
7
+ from typing_extensions import Annotated, get_args, get_origin
8
+
9
+
10
+ def resolve_nested_base_model_unions(
11
+ annotation: Any, models_types: List[Type[BaseModel]] = list()
12
+ ) -> List[Type[BaseModel]]:
13
+ """given something like AnyParcel produces flat list of BaseModel sub-types present in that union
14
+
15
+ Args:
16
+ annotation (Any): Union of BaseModels (could be Annotated and nested)
17
+ models_types (List[Type[BaseModel]], optional): used internally in recurence
18
+
19
+ Raises:
20
+ TypeError: when contents are not BaseModel (can be Annotated)
21
+
22
+ Returns:
23
+ List[Type[BaseModel]]: flat list of subclasses of BaseModel present in input
24
+ """
25
+
26
+ models_types = list(dict.fromkeys(models_types))
27
+
28
+ if isclass(annotation):
29
+ if issubclass(annotation, BaseModel):
30
+ return [annotation]
31
+
32
+ if get_origin(annotation) in [Annotated, Union]:
33
+ for arg in get_args(annotation):
34
+ models_types.extend(resolve_nested_base_model_unions(arg, models_types))
35
+ return list(dict.fromkeys(models_types))
36
+
37
+ return list()
38
+
39
+
40
+ @lru_cache
41
+ def get_model_type_field(model: Type[BaseModel]) -> Optional[str]:
42
+ if type_field := model.model_fields.get("type"):
43
+ if default_value := type_field.default:
44
+ return str(default_value)
45
+ return None
@@ -0,0 +1,5 @@
1
+ # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
+
3
+ from typing import Literal
4
+
5
+ Persona = Literal["COMPUTE_AND_DATA", "COMPUTE", "DATA"]
@@ -0,0 +1,22 @@
1
+ # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
+ import uuid
3
+
4
+ from pydantic import ValidationError
5
+
6
+ from catalystwan.api.configuration_groups.parcel import Variable
7
+
8
+
9
+ def is_str_uuid(value: str) -> bool:
10
+ try:
11
+ uuid_ = uuid.UUID(value)
12
+ return str(uuid_) == value or uuid_.hex == value
13
+ except ValueError:
14
+ return False
15
+
16
+
17
+ def is_str_variable(value: str) -> bool:
18
+ try:
19
+ Variable(value=value)
20
+ return True
21
+ except ValidationError:
22
+ return False