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
@@ -5,13 +5,16 @@ from __future__ import annotations
5
5
  import json
6
6
  import logging
7
7
  from enum import Enum
8
- from typing import TYPE_CHECKING, Any, Optional, Type, overload
8
+ from typing import TYPE_CHECKING, Any, List, Optional, Type, overload
9
9
 
10
10
  from ciscoconfparse import CiscoConfParse # type: ignore
11
+ from typing_extensions import deprecated
11
12
 
12
13
  from catalystwan.api.task_status_api import Task
13
14
  from catalystwan.api.templates.cli_template import CLITemplate
14
15
  from catalystwan.api.templates.device_template.device_template import (
16
+ CreateDeviceInputPayload,
17
+ DeviceInputValues,
15
18
  DeviceSpecificValue,
16
19
  DeviceTemplate,
17
20
  GeneralTemplate,
@@ -19,6 +22,7 @@ from catalystwan.api.templates.device_template.device_template import (
19
22
  from catalystwan.api.templates.feature_template import FeatureTemplate
20
23
  from catalystwan.api.templates.feature_template_field import FeatureTemplateField
21
24
  from catalystwan.api.templates.feature_template_payload import FeatureTemplatePayload
25
+ from catalystwan.api.templates.models.aaa_model import AAAModel
22
26
  from catalystwan.api.templates.models.cisco_aaa_model import CiscoAAAModel
23
27
  from catalystwan.api.templates.models.cisco_banner_model import CiscoBannerModel
24
28
  from catalystwan.api.templates.models.cisco_bfd_model import CiscoBFDModel
@@ -37,12 +41,15 @@ from catalystwan.api.templates.models.cli_template import CliTemplateModel
37
41
  from catalystwan.api.templates.models.omp_vsmart_model import OMPvSmart
38
42
  from catalystwan.api.templates.models.security_vsmart_model import SecurityvSmart
39
43
  from catalystwan.api.templates.models.system_vsmart_model import SystemVsmart
40
- from catalystwan.dataclasses import Device, DeviceTemplateInfo, FeatureTemplateInfo, FeatureTemplatesTypes, TemplateInfo
44
+ from catalystwan.api.templates.models.vpn_vsmart_interface_model import VpnVsmartInterfaceModel
45
+ from catalystwan.api.templates.models.vpn_vsmart_model import VpnVsmartModel
46
+ from catalystwan.dataclasses import Device, FeatureTemplatesTypes
41
47
  from catalystwan.endpoints.configuration_device_template import FeatureToCLIPayload
42
- from catalystwan.exceptions import AttachedError, TemplateNotFoundError
48
+ from catalystwan.exceptions import AttachedError, CatalystwanDeprecationWarning, TemplateNotFoundError
49
+ from catalystwan.models.common import DeviceModel
50
+ from catalystwan.models.templates import DeviceTemplateInformation, FeatureTemplateInformation, TemplateInformation
43
51
  from catalystwan.response import ManagerResponse
44
52
  from catalystwan.typed_list import DataSequence
45
- from catalystwan.utils.device_model import DeviceModel
46
53
  from catalystwan.utils.dict import merge
47
54
  from catalystwan.utils.pydantic_field import get_extra_field
48
55
  from catalystwan.utils.template_type import TemplateType
@@ -74,15 +81,15 @@ class TemplatesAPI:
74
81
  self.session = session
75
82
 
76
83
  @overload
77
- def get(self, template: Type[DeviceTemplate]) -> DataSequence[DeviceTemplateInfo]: # type: ignore
84
+ def get(self, template: Type[DeviceTemplate]) -> DataSequence[DeviceTemplateInformation]:
78
85
  ...
79
86
 
80
87
  @overload
81
- def get(self, template: Type[FeatureTemplate]) -> DataSequence[FeatureTemplateInfo]: # type: ignore
88
+ def get(self, template: Type[FeatureTemplate]) -> DataSequence[FeatureTemplateInformation]:
82
89
  ...
83
90
 
84
91
  @overload
85
- def get(self, template: Type[CLITemplate]) -> DataSequence[TemplateInfo]: # type: ignore
92
+ def get(self, template: Type[CLITemplate]) -> DataSequence[TemplateInformation]:
86
93
  ...
87
94
 
88
95
  def get(self, template):
@@ -100,33 +107,29 @@ class TemplatesAPI:
100
107
  def _get_feature_templates(
101
108
  self,
102
109
  summary: bool = True,
103
- offset: Optional[int] = None,
104
- limit: Optional[int] = None,
105
- ) -> DataSequence[FeatureTemplateInfo]:
110
+ ) -> DataSequence[FeatureTemplateInformation]:
106
111
  """In a multitenant vManage system, this API is only available in the Provider view."""
107
- endpoint = "/dataservice/template/feature"
108
- params = {"summary": summary}
109
-
110
- fr_templates = self.session.get(url=endpoint, params=params)
111
-
112
- return fr_templates.dataseq(FeatureTemplateInfo)
112
+ return self.session.endpoints.configuration_general_template.get_feature_template_list(
113
+ params={"summary": summary}
114
+ )
113
115
 
114
116
  def _get_device_templates(
115
117
  self, feature: DeviceTemplateFeature = DeviceTemplateFeature.ALL
116
- ) -> DataSequence[DeviceTemplateInfo]:
118
+ ) -> DataSequence[DeviceTemplateInformation]:
117
119
  """In a multitenant vManage system, this API is only available in the Provider view."""
118
- endpoint = "/dataservice/template/device"
119
- params = {"feature": feature.value}
120
-
121
- templates = self.session.get(url=endpoint, params=params)
122
- return templates.dataseq(DeviceTemplateInfo)
120
+ return self.session.endpoints.configuration_template_master.get_device_template_list(
121
+ params={"feature": feature.value}
122
+ )
123
123
 
124
124
  def attach(self, name: str, device: Device, timeout_seconds: int = 300, **kwargs):
125
- template_type = self.get(DeviceTemplate).filter(name=name).single_or_default().config_type
126
- if template_type == TemplateType.CLI:
125
+ template_info = self.get(DeviceTemplate).filter(name=name).single_or_default()
126
+ if not template_info:
127
+ raise TemplateNotFoundError(f"Template with name [{name}] does not exists.")
128
+
129
+ if template_info.config_type == TemplateType.CLI.value:
127
130
  return self._attach_cli(name, device, timeout_seconds=timeout_seconds, **kwargs)
128
131
 
129
- if template_type == TemplateType.FEATURE:
132
+ if template_info.config_type == TemplateType.FEATURE.value:
130
133
  return self._attach_feature(name, device, timeout_seconds=timeout_seconds, **kwargs)
131
134
 
132
135
  raise NotImplementedError()
@@ -175,17 +178,19 @@ class TemplatesAPI:
175
178
  }
176
179
 
177
180
  invalid = False
181
+ msg = {}
178
182
  for var in vars:
179
183
  if var.property not in payload["deviceTemplateList"][0]["device"][0]:
180
184
  pointer = payload["deviceTemplateList"][0]["device"][0]
181
185
  if var.property not in kwargs["device_specific_vars"]:
182
186
  invalid = True
187
+ msg[var.property] = "should be provided in attach method as device_specific_vars kwarg."
183
188
  logger.error(f"{var.property} should be provided in attach method as device_specific_vars kwarg.")
184
189
  else:
185
190
  pointer[var.property] = kwargs["device_specific_vars"][var.property] # type: ignore
186
191
 
187
192
  if invalid:
188
- raise TypeError()
193
+ raise TypeError(f"{msg}")
189
194
 
190
195
  endpoint = "/dataservice/template/device/config/attachfeature"
191
196
  logger.info(f"Attaching a template: {name} to the device: {device.hostname}.")
@@ -278,7 +283,7 @@ class TemplatesAPI:
278
283
  def delete(self, template: Type[CLITemplate], name: str) -> bool: # type: ignore
279
284
  ...
280
285
 
281
- def delete(self, template, name):
286
+ def delete(self, template, name) -> bool:
282
287
  status = False
283
288
 
284
289
  if template is FeatureTemplate:
@@ -375,12 +380,15 @@ class TemplatesAPI:
375
380
  if isinstance(template, DeviceTemplate):
376
381
  return self._edit_device_template(template)
377
382
 
383
+ if isinstance(template, CLITemplate):
384
+ return self._edit_cli_template(template, template_info)
385
+
378
386
  raise NotImplementedError()
379
387
 
380
388
  def _edit_device_template(self, template: DeviceTemplate):
381
389
  self._create_device_template(template, True)
382
390
 
383
- def _edit_feature_template(self, template: FeatureTemplate, data: FeatureTemplateInfo) -> ManagerResponse:
391
+ def _edit_feature_template(self, template: FeatureTemplate, data: FeatureTemplateInformation) -> ManagerResponse:
384
392
  if self.is_created_by_generator(template):
385
393
  debug = False
386
394
  schema = self.get_feature_template_schema(template, debug)
@@ -393,6 +401,11 @@ class TemplatesAPI:
393
401
  response = self.session.put(f"/dataservice/template/feature/{data.id}", json=payload)
394
402
  return response
395
403
 
404
+ def _edit_cli_template(self, template: CLITemplate, data: TemplateInformation) -> ManagerResponse:
405
+ response = self.session.put(f"/dataservice/template/device/{data.id}", json=template.generate_payload())
406
+
407
+ return response
408
+
396
409
  @overload
397
410
  def create(self, template: FeatureTemplate, debug=False) -> str:
398
411
  ...
@@ -437,6 +450,9 @@ class TemplatesAPI:
437
450
  logger.info(f"Template {template.template_name} ({template_type}) was created successfully ({template_id}).")
438
451
  return template_id
439
452
 
453
+ @deprecated(
454
+ "Obsolete way to use Feature Templates - only create_by_generator", category=CatalystwanDeprecationWarning
455
+ )
440
456
  def _create_feature_template(self, template: FeatureTemplate) -> str:
441
457
  payload = template.generate_payload(self.session)
442
458
  response = self.session.post("/dataservice/template/feature", json=json.loads(payload))
@@ -453,8 +469,8 @@ class TemplatesAPI:
453
469
 
454
470
  def _create_device_template(self, device_template: DeviceTemplate, edit: bool = False) -> str:
455
471
  def get_general_template_info(
456
- name: str, fr_templates: DataSequence[FeatureTemplateInfo]
457
- ) -> FeatureTemplateInfo:
472
+ name: str, fr_templates: DataSequence[FeatureTemplateInformation]
473
+ ) -> FeatureTemplateInformation:
458
474
  _template = fr_templates.filter(name=name).single_or_default()
459
475
 
460
476
  if not _template:
@@ -464,19 +480,19 @@ class TemplatesAPI:
464
480
 
465
481
  def parse_general_template(
466
482
  general_template: GeneralTemplate,
467
- fr_templates: DataSequence[FeatureTemplateInfo],
483
+ fr_templates: DataSequence[FeatureTemplateInformation],
468
484
  ) -> GeneralTemplate:
469
- if general_template.subTemplates:
470
- general_template.subTemplates = [
471
- parse_general_template(_t, fr_templates) for _t in general_template.subTemplates
485
+ if general_template.sub_templates:
486
+ general_template.sub_templates = [
487
+ parse_general_template(_t, fr_templates) for _t in general_template.sub_templates
472
488
  ]
473
489
  if general_template.name:
474
490
  info = get_general_template_info(general_template.name, fr_templates)
475
491
  return GeneralTemplate(
476
492
  name=general_template.name,
477
- subTemplates=general_template.subTemplates,
478
- templateId=info.id,
479
- templateType=info.template_type,
493
+ sub_templates=general_template.sub_templates,
494
+ template_id=info.id,
495
+ template_type=info.template_type,
480
496
  )
481
497
  else:
482
498
  return general_template
@@ -494,13 +510,18 @@ class TemplatesAPI:
494
510
  .id
495
511
  )
496
512
  payload = json.loads(device_template.generate_payload())
497
- response = self.session.put(f"/dataservice/template/device/{template_id}", json=payload)
513
+ response = self.session.endpoints.configuration_template_master.edit_template(
514
+ template_id=template_id, payload=payload
515
+ )
516
+ return response
498
517
  else:
499
- endpoint = "/dataservice/template/device/feature/"
500
518
  payload = json.loads(device_template.generate_payload())
501
- response = self.session.post(endpoint, json=payload)
502
-
503
- return response.text
519
+ response = (
520
+ self.session.endpoints.configuration_template_master.create_device_template_from_feature_templates(
521
+ payload=payload
522
+ )
523
+ )
524
+ return response.template_id
504
525
 
505
526
  def is_created_by_generator(self, template: FeatureTemplate) -> bool:
506
527
  """Checks if template is created by generator
@@ -508,6 +529,7 @@ class TemplatesAPI:
508
529
  Method will be deleted if every template's payload will be generated dynamically.
509
530
  """
510
531
  ported_templates = (
532
+ AAAModel,
511
533
  CiscoAAAModel,
512
534
  CiscoBFDModel,
513
535
  CiscoBannerModel,
@@ -526,6 +548,8 @@ class TemplatesAPI:
526
548
  CliTemplateModel,
527
549
  CiscoSecureInternetGatewayModel,
528
550
  CiscoOspfv3Model,
551
+ VpnVsmartModel,
552
+ VpnVsmartInterfaceModel,
529
553
  )
530
554
 
531
555
  return isinstance(template, ported_templates)
@@ -556,7 +580,7 @@ class TemplatesAPI:
556
580
  name=template.template_name,
557
581
  description=template.template_description,
558
582
  template_type=template.type,
559
- device_types=[device_model.value for device_model in template.device_models],
583
+ device_types=[device_model for device_model in template.device_models],
560
584
  definition={},
561
585
  ) # type: ignore
562
586
 
@@ -566,6 +590,7 @@ class TemplatesAPI:
566
590
  for field in fr_template_fields:
567
591
  value = None
568
592
  priority_order = None
593
+ json_dumped_value = None
569
594
  # TODO How to discover Device specific variable
570
595
  if field.key in template.device_specific_variables:
571
596
  value = template.device_specific_variables[field.key]
@@ -603,7 +628,7 @@ class TemplatesAPI:
603
628
  available_devices_for_template = [device["name"] for device in template_type.device_models]
604
629
 
605
630
  provided_device_models = [
606
- dev_mod.value if type(dev_mod) is DeviceModel else dev_mod for dev_mod in template.device_models
631
+ dev_mod if type(dev_mod) is DeviceModel else dev_mod for dev_mod in template.device_models
607
632
  ]
608
633
 
609
634
  if not all(dev in available_devices_for_template for dev in provided_device_models):
@@ -698,3 +723,47 @@ class TemplatesAPI:
698
723
  config = CiscoConfParse(response["config"].splitlines())
699
724
  logger.debug(f"Template loaded from {device.hostname}.")
700
725
  return config
726
+
727
+ def get_feature_templates(self) -> DataSequence[FeatureTemplateInformation]:
728
+ endpoint = "/dataservice/template/feature"
729
+ fr_templates = self.session.get(endpoint)
730
+ return fr_templates.dataseq(FeatureTemplateInformation)
731
+
732
+ def get_device_templates(self) -> DataSequence[DeviceTemplateInformation]:
733
+ endpoint = "/dataservice/template/device"
734
+ params = {"feature": "all"}
735
+ templates = self.session.get(url=endpoint, params=params)
736
+ return templates.dataseq(DeviceTemplateInformation)
737
+
738
+ def get_device_template(self, template_id: str) -> DeviceTemplate:
739
+ endpoint = f"/dataservice/template/device/object/{template_id}"
740
+ response = self.session.get(endpoint)
741
+ return DeviceTemplate(**response.json())
742
+
743
+ def get_device_template_attached_devices_variables(self, template_id: str) -> List[DeviceInputValues]:
744
+ """
745
+ Fetches and processes attached device variables for a given device template.
746
+
747
+ Args:
748
+ template_id (str): The ID of the device template.
749
+
750
+ Returns:
751
+ List[DeviceInputValues]: A list of DeviceInputValues objects containing device variables.
752
+ """
753
+ api = self.session.endpoints.configuration_device_template
754
+
755
+ # Fetch attached devices for the template
756
+ attached_devices = api.get_device_config_attached(template_id)
757
+
758
+ # Prepare payload for fetching device variables
759
+ payload = CreateDeviceInputPayload(
760
+ template_id=template_id,
761
+ device_ids=[d.uuid for d in attached_devices if d.uuid],
762
+ is_edited=False,
763
+ is_master_edited=False,
764
+ )
765
+
766
+ # Fetch device variables
767
+ result = api.create_device_input(payload).data
768
+
769
+ return result
@@ -3,10 +3,12 @@
3
3
  ## Feature Template Creation
4
4
 
5
5
  ```python
6
+ from catalystwan.api.templates.models.omp_vsmart_model import OMPvSmart
7
+
6
8
  omp_vsmart = OMPvSmart(
7
9
  name="my_first_template",
8
10
  description="NA",
9
- device_models=[DeviceModel.VSMART]
11
+ device_models=["vsmart"]
10
12
 
11
13
  )
12
14
 
@@ -14,74 +16,86 @@ session.api.templates.create(omp_vsmart)
14
16
  ```
15
17
 
16
18
  ## Add new Feature Template in Cisco Catalyst WAN SDK
17
- These steps will help you to automate feature template creation. We'll explain what to do and why, so everyone will have deep understanding how our templates work. In the example we will try to create `OMP` Feature Template for vSmart.
18
19
 
19
- 1. Get your template type name and version.
20
+ These steps will help you to automate feature template creation. We'll explain what to do and why, so everyone will have deep understanding how our templates work. In the example we will try to create `OMP` Feature Template for vSmart.
21
+
22
+ 1. Get your template type name and version.
20
23
  >Note: display name is not template type name!
24
+
21
25
  - For example, you could extract it from response body. Go to your Manager and create any template which you would like to automate in catalystwan. Send template creation request and check for `templateType` and `templateMinVersion` variable names. `OMP` (display name) for vSmart has `omp-vsmart` template type name.
22
26
 
23
27
  2. With corresponding `templateType` we are able to create new class which implements `FeatureTemplate` interface. Create new file in `catalystwan\api\templates\models\` and copy-paste the code and change name of the class with its type attribute.
24
28
 
25
- ```python
26
- from pathlib import Path
27
- from typing import ClassVar
28
- from pydantic import ConfigDict
29
- from catalystwan.api.templates.feature_template import FeatureTemplate
29
+ ```python
30
+ from pathlib import Path
31
+ from typing import ClassVar
32
+ from pydantic import ConfigDict
33
+ from catalystwan.api.templates.feature_template import FeatureTemplate
34
+
35
+
36
+ class OMPvSmart(FeatureTemplate):
37
+ model_config = ConfigDict(arbitrary_types_allowed=True, populate_by_name=True)
30
38
 
39
+ payload_path: ClassVar[Path] = Path(__file__).parent / "DEPRECATED"
40
+ type: ClassVar[str] = "omp-vsmart"
41
+ ```
31
42
 
32
- class OMPvSmart(FeatureTemplate):
33
- model_config = ConfigDict(arbitrary_types_allowed=True, populate_by_name=True)
34
-
35
- payload_path: ClassVar[Path] = Path(__file__).parent / "DEPRECATED"
36
- type: ClassVar[str] = "omp-vsmart"
37
- ```
38
43
  3. (This step is temporary) Find `is_created_by_generator` method in `template_api` and add your new template class.
39
44
 
40
- ```python
41
- ported_templates = (..., OMPvSmart)
42
- ```
43
- NOTE: This step will be removed once all template payloads will be generated automatically.
45
+ ```python
46
+ ported_templates = (..., OMPvSmart)
47
+ ```
48
+
49
+ NOTE: This step will be removed once all template payloads will be generated automatically.
50
+
44
51
  4. (This step is temporary) Find `available_models` definition in 'supported' and add your new template class.
45
- ```python
46
- available_models = {
47
- (...)
48
- 'omp_vsmart': OMPvSmart
49
- }
50
- ```
51
- NOTE: This step will be removed once all template payloads will be generated dynamically.
52
+
53
+ ```python
54
+ available_models = {
55
+ (...)
56
+ 'omp_vsmart': OMPvSmart
57
+ }
58
+ ```
59
+
60
+ NOTE: This step will be removed once all template payloads will be generated dynamically.
61
+
52
62
  5. We can try to create our first template with default values.
53
- ```python
54
- omp_vsmart = OMPvSmart(
55
- name="my_first_template",
56
- description="NA",
57
- device_models=[DeviceModel.VSMART]
58
- )
59
63
 
60
- session.api.templates.create(omp_vsmart)
61
- ```
62
- If everything went successfuly, we will get similar message
64
+ ```python
65
+ omp_vsmart = OMPvSmart(
66
+ name="my_first_template",
67
+ description="NA",
68
+ device_models=["vsmart"]
69
+ )
63
70
 
64
- `Template my_first_template (FeatureTemplate) was created successfully (7e56acdd-640e-45dc-9335-87abc697995f).`
71
+ session.api.templates.create(omp_vsmart)
72
+ ```
73
+
74
+ If everything went successfuly, we will get similar message:
75
+
76
+ `Template my_first_template (FeatureTemplate) was created successfully (7e56acdd-640e-45dc-9335-87abc697995f).`
65
77
 
66
78
  6. We can check whether our template is created sucessfully in Manager manually. If there is an error, please create an issue with error and try go to the 7th step.
67
-
68
- ### Customize Feature Template fields.
79
+
80
+ ### Customize Feature Template fields
81
+
69
82
  7. Run below code with already created session and changed corresponding variables.
70
83
 
71
- ```python
72
- # TODO: Use 2nd layer.
73
- import json
84
+ ```python
85
+ # TODO: Use 2nd layer.
86
+ import json
74
87
 
75
88
 
76
- template_type = "omp-vsmart" # Change this value
77
- template_version = "15.0.0" # Change this value
78
- endpoint = f"/dataservice/template/feature/types/definition/{template_type}/{template_version}"
89
+ template_type = "omp-vsmart" # Change this value
90
+ template_version = "15.0.0" # Change this value
91
+ endpoint = f"/dataservice/template/feature/types/definition/{template_type}/{template_version}"
79
92
 
80
- schema = session.get(url=endpoint).json()
93
+ schema = session.get(url=endpoint).json()
81
94
 
82
- with open(f"response_{template_type}.json", "w") as f:
83
- f.write(json.dumps(schema, indent=4))
84
- ```
95
+ with open(f"response_{template_type}.json", "w") as f:
96
+ f.write(json.dumps(schema, indent=4))
97
+ ```
85
98
 
86
99
  8. Open `response_{template_type}.json` file.
100
+
87
101
  9. Find `fields` key. The value should be list of dictionaries. Get every possible key in the dictionary and fill our class with every possible key. You can find the code in `catalystwan\api\templates\models\omp_vsmart_model.py` file.
@@ -13,7 +13,7 @@ from requests.exceptions import HTTPError
13
13
 
14
14
  from catalystwan.dataclasses import Device
15
15
  from catalystwan.exceptions import TemplateTypeError
16
- from catalystwan.utils.device_model import DeviceModel
16
+ from catalystwan.models.common import DeviceModel
17
17
  from catalystwan.utils.template_type import TemplateType
18
18
 
19
19
  logger = logging.getLogger(__name__)
@@ -62,21 +62,31 @@ class CLITemplate:
62
62
  logger.debug(f"Template loaded from {device.hostname}.")
63
63
  return self.config
64
64
 
65
+ def load_from_file(self, file: str) -> CiscoConfParse:
66
+ """Load CLI config from file.
67
+ Args:
68
+ file: The path of the file to be loaded.
69
+ Returns:
70
+ CiscoConfParse: Loaded template.
71
+ """
72
+ self.config = CiscoConfParse(file)
73
+ return self.config
74
+
65
75
  def generate_payload(self) -> dict:
66
76
  config_str = "\n".join(self.config.ioscfg)
67
77
  payload = {
68
78
  "templateName": self.template_name,
69
79
  "templateDescription": self.template_description,
70
- "deviceType": self.device_model.value,
80
+ "deviceType": self.device_model,
71
81
  "templateConfiguration": config_str,
72
82
  "factoryDefault": False,
73
83
  "configType": "file",
74
84
  }
75
85
  if self.device_model not in [
76
- DeviceModel.VEDGE,
77
- DeviceModel.VSMART,
78
- DeviceModel.VMANAGE,
79
- DeviceModel.VBOND,
86
+ "vedge",
87
+ "vsmart",
88
+ "vmanage",
89
+ "vedge-cloud",
80
90
  ]:
81
91
  payload["cliType"] = "device"
82
92
  payload["draftMode"] = False
@@ -100,7 +110,7 @@ class CLITemplate:
100
110
  "templateId": id,
101
111
  "templateName": self.template_name,
102
112
  "templateDescription": self.template_description,
103
- "deviceType": self.device_model.value,
113
+ "deviceType": self.device_model,
104
114
  "templateConfiguration": config_str,
105
115
  "factoryDefault": False,
106
116
  "configType": "file",