catalystwan 0.41.2.dev9__py3-none-any.whl → 0.41.3__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 (509) hide show
  1. catalystwan/ENDPOINTS.md +611 -0
  2. catalystwan/__init__.py +2 -3
  3. catalystwan/api/administration.py +2 -13
  4. catalystwan/api/api_container.py +1 -4
  5. catalystwan/api/config_group_api.py +16 -41
  6. catalystwan/api/configuration_groups/parcel.py +30 -100
  7. catalystwan/api/configuration_groups/parcels/cellular_controller.py +33 -0
  8. catalystwan/api/feature_profile_api.py +237 -2016
  9. catalystwan/api/policy_api.py +116 -470
  10. catalystwan/api/template_api.py +44 -113
  11. catalystwan/api/templates/README.md +47 -61
  12. catalystwan/api/templates/cli_template.py +7 -17
  13. catalystwan/api/templates/device_template/device_template.py +32 -127
  14. catalystwan/api/templates/device_template/device_template_payload.json.j2 +19 -0
  15. catalystwan/api/templates/feature_template.py +3 -3
  16. catalystwan/api/templates/models/cisco_aaa_model.py +42 -289
  17. catalystwan/api/templates/models/cisco_banner_model.py +2 -11
  18. catalystwan/api/templates/models/cisco_bfd_model.py +36 -31
  19. catalystwan/api/templates/models/cisco_bgp_model.py +131 -382
  20. catalystwan/api/templates/models/cisco_logging_model.py +43 -80
  21. catalystwan/api/templates/models/cisco_ntp_model.py +15 -34
  22. catalystwan/api/templates/models/cisco_omp_model.py +60 -70
  23. catalystwan/api/templates/models/cisco_ospf.py +74 -143
  24. catalystwan/api/templates/models/cisco_ospfv3.py +95 -217
  25. catalystwan/api/templates/models/cisco_secure_internet_gateway.py +142 -304
  26. catalystwan/api/templates/models/cisco_snmp_model.py +52 -66
  27. catalystwan/api/templates/models/cisco_system.py +129 -238
  28. catalystwan/api/templates/models/cisco_vpn_interface_model.py +275 -632
  29. catalystwan/api/templates/models/cisco_vpn_model.py +270 -433
  30. catalystwan/api/templates/models/cli_template.py +2 -3
  31. catalystwan/api/templates/models/omp_vsmart_model.py +10 -46
  32. catalystwan/api/templates/models/security_vsmart_model.py +8 -11
  33. catalystwan/api/templates/models/supported.py +4 -10
  34. catalystwan/api/templates/models/system_vsmart_model.py +27 -164
  35. catalystwan/apigw_auth.py +2 -6
  36. catalystwan/dataclasses.py +53 -2
  37. catalystwan/endpoints/__init__.py +41 -41
  38. catalystwan/endpoints/certificate_management_device.py +0 -4
  39. catalystwan/endpoints/cluster_management.py +9 -30
  40. catalystwan/endpoints/configuration/feature_profile/sdwan/policy_object.py +12 -35
  41. catalystwan/endpoints/configuration/feature_profile/sdwan/system.py +11 -164
  42. catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py +26 -144
  43. catalystwan/endpoints/configuration/policy/definition/access_control_list.py +11 -6
  44. catalystwan/endpoints/configuration/policy/definition/access_control_list_ipv6.py +11 -6
  45. catalystwan/endpoints/configuration/policy/definition/control.py +11 -6
  46. catalystwan/endpoints/configuration/policy/definition/device_access.py +11 -6
  47. catalystwan/endpoints/configuration/policy/definition/device_access_ipv6.py +11 -6
  48. catalystwan/endpoints/configuration/policy/definition/hub_and_spoke.py +11 -6
  49. catalystwan/endpoints/configuration/policy/definition/mesh.py +11 -2
  50. catalystwan/endpoints/configuration/policy/definition/qos_map.py +11 -2
  51. catalystwan/endpoints/configuration/policy/definition/rewrite.py +11 -6
  52. catalystwan/endpoints/configuration/policy/definition/rule_set.py +11 -2
  53. catalystwan/endpoints/configuration/policy/definition/security_group.py +11 -6
  54. catalystwan/endpoints/configuration/policy/definition/traffic_data.py +11 -6
  55. catalystwan/endpoints/configuration/policy/definition/vpn_membership.py +11 -6
  56. catalystwan/endpoints/configuration/policy/definition/zone_based_firewall.py +11 -6
  57. catalystwan/endpoints/configuration/policy/list/app.py +16 -3
  58. catalystwan/endpoints/configuration/policy/list/app_probe.py +15 -6
  59. catalystwan/endpoints/configuration/policy/list/as_path.py +16 -3
  60. catalystwan/endpoints/configuration/policy/list/class_map.py +16 -3
  61. catalystwan/endpoints/configuration/policy/list/color.py +16 -3
  62. catalystwan/endpoints/configuration/policy/list/community.py +16 -3
  63. catalystwan/endpoints/configuration/policy/list/data_ipv6_prefix.py +15 -6
  64. catalystwan/endpoints/configuration/policy/list/data_prefix.py +16 -3
  65. catalystwan/endpoints/configuration/policy/list/expanded_community.py +15 -6
  66. catalystwan/endpoints/configuration/policy/list/fqdn.py +16 -3
  67. catalystwan/endpoints/configuration/policy/list/geo_location.py +16 -3
  68. catalystwan/endpoints/configuration/policy/list/ips_signature.py +15 -6
  69. catalystwan/endpoints/configuration/policy/list/ipv6_prefix.py +16 -3
  70. catalystwan/endpoints/configuration/policy/list/local_app.py +16 -3
  71. catalystwan/endpoints/configuration/policy/list/local_domain.py +16 -3
  72. catalystwan/endpoints/configuration/policy/list/mirror.py +16 -3
  73. catalystwan/endpoints/configuration/policy/list/policer.py +16 -3
  74. catalystwan/endpoints/configuration/policy/list/port.py +16 -3
  75. catalystwan/endpoints/configuration/policy/list/preferred_color_group.py +15 -6
  76. catalystwan/endpoints/configuration/policy/list/prefix.py +16 -4
  77. catalystwan/endpoints/configuration/policy/list/protocol_name.py +15 -6
  78. catalystwan/endpoints/configuration/policy/list/region.py +10 -2
  79. catalystwan/endpoints/configuration/policy/list/site.py +16 -3
  80. catalystwan/endpoints/configuration/policy/list/sla.py +16 -3
  81. catalystwan/endpoints/configuration/policy/list/tloc.py +16 -3
  82. catalystwan/endpoints/configuration/policy/list/url_allow_list.py +16 -3
  83. catalystwan/endpoints/configuration/policy/list/url_block_list.py +16 -3
  84. catalystwan/endpoints/configuration/policy/list/vpn.py +16 -3
  85. catalystwan/endpoints/configuration/policy/list/zone.py +16 -3
  86. catalystwan/endpoints/configuration/policy/security_template.py +3 -2
  87. catalystwan/endpoints/configuration/software_actions.py +4 -2
  88. catalystwan/endpoints/configuration_dashboard_status.py +2 -2
  89. catalystwan/endpoints/configuration_device_template.py +1 -15
  90. catalystwan/endpoints/configuration_feature_profile.py +11 -8
  91. catalystwan/endpoints/configuration_group.py +5 -28
  92. catalystwan/endpoints/configuration_settings.py +1 -90
  93. catalystwan/endpoints/endpoints_container.py +18 -82
  94. catalystwan/endpoints/real_time_monitoring/reboot_history.py +3 -1
  95. catalystwan/endpoints/tenant_migration.py +0 -2
  96. catalystwan/exceptions.py +0 -24
  97. catalystwan/integration_tests/test_find_template_values.py +18 -7
  98. catalystwan/models/common.py +2 -1898
  99. catalystwan/models/configuration/common.py +0 -1
  100. catalystwan/models/configuration/config_migration.py +36 -0
  101. catalystwan/models/configuration/feature_profile/common.py +149 -634
  102. catalystwan/models/configuration/feature_profile/sdwan/management/vpn.py +26 -0
  103. catalystwan/models/configuration/feature_profile/sdwan/policy_object/__init__.py +60 -69
  104. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/app_probe.py +20 -34
  105. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/application_list.py +6 -8
  106. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/color_list.py +5 -7
  107. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/data_prefix.py +4 -13
  108. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/expanded_community_list.py +7 -9
  109. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/fowarding_class.py +5 -7
  110. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_data_prefix.py +9 -11
  111. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_prefix_list.py +10 -25
  112. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/{policer.py → policier.py} +10 -12
  113. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefered_group_color.py +10 -29
  114. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefix_list.py +8 -23
  115. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/sla_class.py +31 -12
  116. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/standard_community.py +10 -16
  117. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/tloc_list.py +7 -8
  118. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/application_list.py +6 -8
  119. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/data_prefix.py +5 -7
  120. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/fqdn.py +5 -7
  121. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/geolocation_list.py +5 -7
  122. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ips_signature.py +5 -7
  123. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/local_domain.py +5 -7
  124. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/protocol_list.py +5 -7
  125. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/security_port.py +11 -21
  126. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url.py +15 -36
  127. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/zone.py +18 -14
  128. catalystwan/models/configuration/feature_profile/sdwan/service/acl.py +409 -0
  129. catalystwan/models/configuration/feature_profile/sdwan/service/appqoe.py +42 -77
  130. catalystwan/models/configuration/feature_profile/sdwan/service/bgp.py +288 -0
  131. catalystwan/models/configuration/feature_profile/sdwan/service/dhcp_server.py +64 -107
  132. catalystwan/models/configuration/feature_profile/sdwan/service/eigrp.py +42 -39
  133. catalystwan/models/configuration/feature_profile/sdwan/service/lan/common.py +88 -7
  134. catalystwan/models/configuration/feature_profile/sdwan/service/lan/ethernet.py +156 -232
  135. catalystwan/models/configuration/feature_profile/sdwan/service/lan/gre.py +108 -38
  136. catalystwan/models/configuration/feature_profile/sdwan/service/lan/ipsec.py +84 -77
  137. catalystwan/models/configuration/feature_profile/sdwan/service/lan/svi.py +56 -62
  138. catalystwan/models/configuration/feature_profile/sdwan/service/lan/vpn.py +121 -112
  139. catalystwan/models/configuration/feature_profile/sdwan/service/multicast.py +57 -56
  140. catalystwan/models/configuration/feature_profile/sdwan/service/object_tracker.py +21 -15
  141. catalystwan/models/configuration/feature_profile/sdwan/{routing → service}/ospf.py +47 -55
  142. catalystwan/models/configuration/feature_profile/sdwan/{routing → service}/ospfv3.py +72 -74
  143. catalystwan/models/configuration/feature_profile/sdwan/service/route_policy.py +110 -358
  144. catalystwan/models/configuration/feature_profile/sdwan/service/service_insertion_attachment.py +25 -17
  145. catalystwan/models/configuration/feature_profile/sdwan/service/switchport.py +58 -50
  146. catalystwan/models/configuration/feature_profile/sdwan/service/tracker.py +21 -12
  147. catalystwan/models/configuration/feature_profile/sdwan/service/wireless_lan.py +31 -27
  148. catalystwan/models/configuration/feature_profile/sdwan/system/aaa.py +10 -58
  149. catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_controller.py +23 -26
  150. catalystwan/models/configuration/profile_type.py +6 -1
  151. catalystwan/models/policy/__init__.py +69 -282
  152. catalystwan/models/policy/centralized.py +29 -26
  153. catalystwan/models/policy/{definition → definitions}/access_control_list.py +17 -47
  154. catalystwan/models/policy/{definition → definitions}/access_control_list_ipv6.py +18 -42
  155. catalystwan/models/policy/{definition → definitions}/control.py +25 -48
  156. catalystwan/models/policy/{definition → definitions}/device_access.py +11 -22
  157. catalystwan/models/policy/{definition → definitions}/device_access_ipv6.py +11 -20
  158. catalystwan/models/policy/{definition → definitions}/hub_and_spoke.py +4 -18
  159. catalystwan/models/policy/{definition → definitions}/mesh.py +1 -13
  160. catalystwan/models/policy/{definition → definitions}/qos_map.py +32 -39
  161. catalystwan/models/policy/{definition → definitions}/rewrite.py +2 -12
  162. catalystwan/models/policy/{definition → definitions}/rule_set.py +48 -66
  163. catalystwan/models/policy/{definition → definitions}/security_group.py +14 -38
  164. catalystwan/models/policy/{definition → definitions}/traffic_data.py +61 -184
  165. catalystwan/models/policy/{definition → definitions}/vpn_membership.py +1 -13
  166. catalystwan/models/policy/{definition → definitions}/zone_based_firewall.py +32 -93
  167. catalystwan/models/policy/lists.py +330 -0
  168. catalystwan/models/policy/lists_entries.py +444 -0
  169. catalystwan/models/policy/localized.py +16 -34
  170. catalystwan/models/policy/policy.py +10 -14
  171. catalystwan/models/policy/policy_definition.py +173 -673
  172. catalystwan/models/policy/policy_list.py +27 -38
  173. catalystwan/models/policy/security.py +46 -145
  174. catalystwan/response.py +2 -6
  175. catalystwan/session.py +1 -1
  176. catalystwan/tests/templates/definitions/{cisco_vpn_basic.json → Basic_Cisco_VPN_Model.json} +2 -2
  177. catalystwan/tests/templates/definitions/complex_aaa.json +277 -0
  178. catalystwan/tests/templates/definitions/{cisco_vpn_complex.json → complex_cisco_vpn.json} +12 -27
  179. catalystwan/tests/templates/definitions/{cisco_aaa.json → iuo.json} +15 -44
  180. catalystwan/tests/templates/definitions/omp_1.json +11 -0
  181. catalystwan/tests/templates/definitions/{omp_vsmart_2.json → omp_2.json} +2 -16
  182. catalystwan/tests/templates/definitions/{omp_vsmart_3.json → omp_3.json} +2 -16
  183. catalystwan/tests/templates/models/__init__.py +13 -46
  184. catalystwan/tests/templates/models/cisco_aaa.py +48 -81
  185. catalystwan/tests/templates/models/cisco_banner.py +2 -2
  186. catalystwan/tests/templates/models/cisco_bfd.py +6 -4
  187. catalystwan/tests/templates/models/cisco_system.py +3 -108
  188. catalystwan/tests/templates/models/cisco_vpn.py +72 -42
  189. catalystwan/tests/templates/models/omp_vsmart.py +8 -28
  190. catalystwan/tests/templates/schemas/cedge_aaa.json +1 -1
  191. catalystwan/tests/templates/schemas/cisco_system.json +0 -242
  192. catalystwan/tests/templates/schemas/cisco_vpn.json +1 -53
  193. catalystwan/tests/templates/schemas/omp-vsmart.json +0 -20
  194. catalystwan/tests/templates/test_chose_model.py +10 -6
  195. catalystwan/tests/templates/test_deserialize_model.py +4 -4
  196. catalystwan/tests/templates/test_find_template_values.py +0 -229
  197. catalystwan/tests/templates/test_serialize_model.py +2 -1
  198. catalystwan/tests/test_cli_template.py +9 -8
  199. catalystwan/tests/test_endpoints.py +11 -42
  200. catalystwan/tests/test_templates.py +19 -16
  201. catalystwan/utils/feature_template/find_template_values.py +9 -22
  202. catalystwan/utils/timezone.py +422 -0
  203. catalystwan/workflows/tenant_migration.py +1 -1
  204. {catalystwan-0.41.2.dev9.dist-info → catalystwan-0.41.3.dist-info}/METADATA +1 -20
  205. catalystwan-0.41.3.dist-info/RECORD +353 -0
  206. catalystwan/api/builders/__init__.py +0 -14
  207. catalystwan/api/builders/feature_profiles/__init__.py +0 -0
  208. catalystwan/api/builders/feature_profiles/application_priority.py +0 -58
  209. catalystwan/api/builders/feature_profiles/builder_factory.py +0 -59
  210. catalystwan/api/builders/feature_profiles/cli.py +0 -76
  211. catalystwan/api/builders/feature_profiles/mixins.py +0 -44
  212. catalystwan/api/builders/feature_profiles/other.py +0 -79
  213. catalystwan/api/builders/feature_profiles/report.py +0 -155
  214. catalystwan/api/builders/feature_profiles/service.py +0 -248
  215. catalystwan/api/builders/feature_profiles/system.py +0 -80
  216. catalystwan/api/builders/feature_profiles/transport.py +0 -256
  217. catalystwan/api/builders/feature_profiles/uc_voice.py +0 -287
  218. catalystwan/api/templates/models/aaa_model.py +0 -387
  219. catalystwan/api/templates/models/vpn_vsmart_interface_model.py +0 -198
  220. catalystwan/api/templates/models/vpn_vsmart_model.py +0 -124
  221. catalystwan/endpoints/configuration/feature_profile/sdwan/application_priority.py +0 -107
  222. catalystwan/endpoints/configuration/feature_profile/sdwan/cli.py +0 -60
  223. catalystwan/endpoints/configuration/feature_profile/sdwan/dns_security.py +0 -83
  224. catalystwan/endpoints/configuration/feature_profile/sdwan/embedded_security.py +0 -88
  225. catalystwan/endpoints/configuration/feature_profile/sdwan/other.py +0 -62
  226. catalystwan/endpoints/configuration/feature_profile/sdwan/service.py +0 -154
  227. catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py +0 -88
  228. catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py +0 -93
  229. catalystwan/endpoints/configuration/feature_profile/sdwan/uc_voice.py +0 -77
  230. catalystwan/endpoints/configuration/network_hierarchy.py +0 -47
  231. catalystwan/endpoints/configuration/packages.py +0 -36
  232. catalystwan/endpoints/configuration/policy/abstractions.py +0 -49
  233. catalystwan/endpoints/configuration/policy/definition/aip.py +0 -52
  234. catalystwan/endpoints/configuration/policy/definition/amp.py +0 -52
  235. catalystwan/endpoints/configuration/policy/definition/app_route.py +0 -50
  236. catalystwan/endpoints/configuration/policy/definition/cflowd.py +0 -46
  237. catalystwan/endpoints/configuration/policy/definition/dial_peer.py +0 -57
  238. catalystwan/endpoints/configuration/policy/definition/dns_security.py +0 -50
  239. catalystwan/endpoints/configuration/policy/definition/fxo_port.py +0 -57
  240. catalystwan/endpoints/configuration/policy/definition/fxs_did_port.py +0 -57
  241. catalystwan/endpoints/configuration/policy/definition/fxs_port.py +0 -57
  242. catalystwan/endpoints/configuration/policy/definition/intrusion_prevention.py +0 -52
  243. catalystwan/endpoints/configuration/policy/definition/pri_isdn_port.py +0 -57
  244. catalystwan/endpoints/configuration/policy/definition/route_policy.py +0 -50
  245. catalystwan/endpoints/configuration/policy/definition/srst_phone_profile.py +0 -59
  246. catalystwan/endpoints/configuration/policy/definition/ssl_decryption.py +0 -50
  247. catalystwan/endpoints/configuration/policy/definition/ssl_decryption_utd_profile.py +0 -52
  248. catalystwan/endpoints/configuration/policy/definition/url_filtering.py +0 -50
  249. catalystwan/endpoints/configuration/policy/definition/vpn_qos_map.py +0 -50
  250. catalystwan/endpoints/configuration/policy/list/extended_community.py +0 -52
  251. catalystwan/endpoints/configuration/policy/list/fax_protocol.py +0 -48
  252. catalystwan/endpoints/configuration/policy/list/identity.py +0 -48
  253. catalystwan/endpoints/configuration/policy/list/media_profile.py +0 -52
  254. catalystwan/endpoints/configuration/policy/list/modem_pass_through.py +0 -52
  255. catalystwan/endpoints/configuration/policy/list/scalable_group_tag.py +0 -52
  256. catalystwan/endpoints/configuration/policy/list/supervisory_disconnect.py +0 -52
  257. catalystwan/endpoints/configuration/policy/list/threat_grid_api_key.py +0 -52
  258. catalystwan/endpoints/configuration/policy/list/translation_profile.py +0 -52
  259. catalystwan/endpoints/configuration/policy/list/translation_rules.py +0 -52
  260. catalystwan/endpoints/configuration/policy/list/trunkgroup.py +0 -48
  261. catalystwan/endpoints/configuration/policy/list/umbrella_data.py +0 -52
  262. catalystwan/endpoints/configuration/policy/voice_template.py +0 -39
  263. catalystwan/endpoints/configuration/policy_group.py +0 -30
  264. catalystwan/endpoints/configuration/topology_group.py +0 -51
  265. catalystwan/endpoints/configuration_general_template.py +0 -31
  266. catalystwan/endpoints/configuration_template_master.py +0 -48
  267. catalystwan/integration_tests/base.py +0 -81
  268. catalystwan/integration_tests/feature_profile/sdwan/__init__.py +0 -0
  269. catalystwan/integration_tests/feature_profile/sdwan/policy/__init__.py +0 -0
  270. catalystwan/integration_tests/feature_profile/sdwan/policy/base.py +0 -33
  271. catalystwan/integration_tests/feature_profile/sdwan/policy/test_extended_community.py +0 -33
  272. catalystwan/integration_tests/feature_profile/sdwan/policy/test_security_app_list.py +0 -32
  273. catalystwan/integration_tests/feature_profile/sdwan/test_application_priority.py +0 -433
  274. catalystwan/integration_tests/feature_profile/sdwan/test_cli.py +0 -54
  275. catalystwan/integration_tests/feature_profile/sdwan/test_dns_security.py +0 -106
  276. catalystwan/integration_tests/feature_profile/sdwan/test_other.py +0 -49
  277. catalystwan/integration_tests/feature_profile/sdwan/test_service.py +0 -1078
  278. catalystwan/integration_tests/feature_profile/sdwan/test_sig_security.py +0 -322
  279. catalystwan/integration_tests/feature_profile/sdwan/test_ssl_decryption.py +0 -85
  280. catalystwan/integration_tests/feature_profile/sdwan/test_system.py +0 -368
  281. catalystwan/integration_tests/feature_profile/sdwan/test_tracker.py +0 -127
  282. catalystwan/integration_tests/feature_profile/sdwan/test_transport.py +0 -1698
  283. catalystwan/integration_tests/feature_profile/sdwan/topology/test_topology.py +0 -93
  284. catalystwan/integration_tests/feature_profile/test_parcel.py +0 -54
  285. catalystwan/integration_tests/profile_builder/__init__.py +0 -0
  286. catalystwan/integration_tests/profile_builder/test_pb_service.py +0 -197
  287. catalystwan/integration_tests/profile_builder/test_pb_transport.py +0 -226
  288. catalystwan/integration_tests/profile_builder/test_pb_uc_voice.py +0 -277
  289. catalystwan/integration_tests/test_data/__init__.py +0 -117
  290. catalystwan/integration_tests/test_network_hierarchy.py +0 -82
  291. catalystwan/integration_tests/test_settings.py +0 -30
  292. catalystwan/models/configuration/feature_profile/parcel.py +0 -245
  293. catalystwan/models/configuration/feature_profile/sdwan/acl/__init__.py +0 -13
  294. catalystwan/models/configuration/feature_profile/sdwan/acl/ipv4acl.py +0 -298
  295. catalystwan/models/configuration/feature_profile/sdwan/acl/ipv6acl.py +0 -344
  296. catalystwan/models/configuration/feature_profile/sdwan/application_priority/__init__.py +0 -218
  297. catalystwan/models/configuration/feature_profile/sdwan/application_priority/cloud_probe.py +0 -61
  298. catalystwan/models/configuration/feature_profile/sdwan/application_priority/policy_settings.py +0 -31
  299. catalystwan/models/configuration/feature_profile/sdwan/application_priority/qos_policy.py +0 -102
  300. catalystwan/models/configuration/feature_profile/sdwan/application_priority/traffic_policy.py +0 -1057
  301. catalystwan/models/configuration/feature_profile/sdwan/cli/__init__.py +0 -23
  302. catalystwan/models/configuration/feature_profile/sdwan/cli/config.py +0 -18
  303. catalystwan/models/configuration/feature_profile/sdwan/cli/full_config.py +0 -15
  304. catalystwan/models/configuration/feature_profile/sdwan/dns_security/__init__.py +0 -13
  305. catalystwan/models/configuration/feature_profile/sdwan/dns_security/dns.py +0 -110
  306. catalystwan/models/configuration/feature_profile/sdwan/embedded_security/__init__.py +0 -23
  307. catalystwan/models/configuration/feature_profile/sdwan/embedded_security/ngfirewall.py +0 -493
  308. catalystwan/models/configuration/feature_profile/sdwan/embedded_security/policy.py +0 -171
  309. catalystwan/models/configuration/feature_profile/sdwan/other/__init__.py +0 -25
  310. catalystwan/models/configuration/feature_profile/sdwan/other/cybervision.py +0 -44
  311. catalystwan/models/configuration/feature_profile/sdwan/other/thousandeyes.py +0 -147
  312. catalystwan/models/configuration/feature_profile/sdwan/other/ucse.py +0 -110
  313. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/as_path.py +0 -22
  314. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/extended_community.py +0 -34
  315. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv4_network_object.py +0 -15
  316. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv4_service_object.py +0 -254
  317. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/mirror.py +0 -27
  318. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/network_object_group.py +0 -15
  319. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/object_group.py +0 -15
  320. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/service_object_group.py +0 -21
  321. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/aip.py +0 -64
  322. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/amp.py +0 -79
  323. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/identity.py +0 -30
  324. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/intrusion_prevention.py +0 -58
  325. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/object_group.py +0 -72
  326. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/rule_set.py +0 -137
  327. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/scalable_group_tag.py +0 -26
  328. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ssl_decryption.py +0 -126
  329. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ssl_decryption_profile.py +0 -165
  330. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url_filtering.py +0 -148
  331. catalystwan/models/configuration/feature_profile/sdwan/routing/__init__.py +0 -26
  332. catalystwan/models/configuration/feature_profile/sdwan/routing/bgp.py +0 -609
  333. catalystwan/models/configuration/feature_profile/sdwan/service/__init__.py +0 -91
  334. catalystwan/models/configuration/feature_profile/sdwan/service/dual_router_ha.py +0 -26
  335. catalystwan/models/configuration/feature_profile/sdwan/service/lan/multilink.py +0 -101
  336. catalystwan/models/configuration/feature_profile/sdwan/service/service_chain.py +0 -38
  337. catalystwan/models/configuration/feature_profile/sdwan/sig_security/__init__.py +0 -19
  338. catalystwan/models/configuration/feature_profile/sdwan/sig_security/sig_security.py +0 -379
  339. catalystwan/models/configuration/feature_profile/sdwan/system/__init__.py +0 -59
  340. catalystwan/models/configuration/feature_profile/sdwan/system/banner.py +0 -30
  341. catalystwan/models/configuration/feature_profile/sdwan/system/basic.py +0 -290
  342. catalystwan/models/configuration/feature_profile/sdwan/system/bfd.py +0 -69
  343. catalystwan/models/configuration/feature_profile/sdwan/system/device_access.py +0 -157
  344. catalystwan/models/configuration/feature_profile/sdwan/system/device_access_ipv6.py +0 -157
  345. catalystwan/models/configuration/feature_profile/sdwan/system/global_parcel.py +0 -163
  346. catalystwan/models/configuration/feature_profile/sdwan/system/logging_parcel.py +0 -162
  347. catalystwan/models/configuration/feature_profile/sdwan/system/mrf.py +0 -75
  348. catalystwan/models/configuration/feature_profile/sdwan/system/ntp.py +0 -103
  349. catalystwan/models/configuration/feature_profile/sdwan/system/omp.py +0 -120
  350. catalystwan/models/configuration/feature_profile/sdwan/system/security.py +0 -179
  351. catalystwan/models/configuration/feature_profile/sdwan/system/snmp.py +0 -173
  352. catalystwan/models/configuration/feature_profile/sdwan/topology/__init__.py +0 -29
  353. catalystwan/models/configuration/feature_profile/sdwan/topology/custom_control.py +0 -425
  354. catalystwan/models/configuration/feature_profile/sdwan/topology/hubspoke.py +0 -60
  355. catalystwan/models/configuration/feature_profile/sdwan/topology/mesh.py +0 -23
  356. catalystwan/models/configuration/feature_profile/sdwan/trackers/__init__.py +0 -36
  357. catalystwan/models/configuration/feature_profile/sdwan/trackers/tracker.py +0 -96
  358. catalystwan/models/configuration/feature_profile/sdwan/trackers/tracker_group.py +0 -63
  359. catalystwan/models/configuration/feature_profile/sdwan/transport/__init__.py +0 -93
  360. catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_profile.py +0 -71
  361. catalystwan/models/configuration/feature_profile/sdwan/transport/gps.py +0 -37
  362. catalystwan/models/configuration/feature_profile/sdwan/transport/management/ethernet.py +0 -121
  363. catalystwan/models/configuration/feature_profile/sdwan/transport/t1e1controller.py +0 -124
  364. catalystwan/models/configuration/feature_profile/sdwan/transport/vpn.py +0 -285
  365. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/cellular.py +0 -173
  366. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/ethernet.py +0 -389
  367. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/gre.py +0 -46
  368. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/ipsec.py +0 -137
  369. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/multilink.py +0 -219
  370. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/protocol_over.py +0 -405
  371. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/t1e1serial.py +0 -195
  372. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/__init__.py +0 -62
  373. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/analog_interface.py +0 -436
  374. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/call_routing.py +0 -179
  375. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/digital_interface.py +0 -380
  376. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/dsp_farm.py +0 -193
  377. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/media_profile.py +0 -17
  378. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/server_group.py +0 -51
  379. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/srst.py +0 -86
  380. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/supervisory_disconnect.py +0 -69
  381. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/translation_profile.py +0 -42
  382. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/translation_rule.py +0 -31
  383. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/trunk_group.py +0 -26
  384. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/voice_global.py +0 -57
  385. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/voice_tenant.py +0 -40
  386. catalystwan/models/configuration/network_hierarchy/__init__.py +0 -24
  387. catalystwan/models/configuration/network_hierarchy/cflowd.py +0 -128
  388. catalystwan/models/configuration/network_hierarchy/node.py +0 -88
  389. catalystwan/models/configuration/network_hierarchy/security_logging.py +0 -91
  390. catalystwan/models/configuration/packages.py +0 -57
  391. catalystwan/models/configuration/policy_group.py +0 -74
  392. catalystwan/models/configuration/topology_group.py +0 -52
  393. catalystwan/models/policy/definition/aip.py +0 -60
  394. catalystwan/models/policy/definition/amp.py +0 -65
  395. catalystwan/models/policy/definition/app_route.py +0 -246
  396. catalystwan/models/policy/definition/cflowd.py +0 -95
  397. catalystwan/models/policy/definition/dial_peer.py +0 -60
  398. catalystwan/models/policy/definition/dns_security.py +0 -130
  399. catalystwan/models/policy/definition/fxo_port.py +0 -63
  400. catalystwan/models/policy/definition/fxs_did_port.py +0 -58
  401. catalystwan/models/policy/definition/fxs_port.py +0 -56
  402. catalystwan/models/policy/definition/intrusion_prevention.py +0 -55
  403. catalystwan/models/policy/definition/pri_isdn_port.py +0 -48
  404. catalystwan/models/policy/definition/route_policy.py +0 -187
  405. catalystwan/models/policy/definition/srst_phone_profile.py +0 -37
  406. catalystwan/models/policy/definition/ssl_decryption.py +0 -209
  407. catalystwan/models/policy/definition/ssl_decryption_utd_profile.py +0 -88
  408. catalystwan/models/policy/definition/url_filtering.py +0 -70
  409. catalystwan/models/policy/definition/vpn_qos_map.py +0 -46
  410. catalystwan/models/policy/list/app.py +0 -44
  411. catalystwan/models/policy/list/app_probe.py +0 -42
  412. catalystwan/models/policy/list/as_path.py +0 -30
  413. catalystwan/models/policy/list/class_map.py +0 -30
  414. catalystwan/models/policy/list/color.py +0 -28
  415. catalystwan/models/policy/list/communities.py +0 -83
  416. catalystwan/models/policy/list/data_ipv6_prefix.py +0 -30
  417. catalystwan/models/policy/list/data_prefix.py +0 -30
  418. catalystwan/models/policy/list/fax_protocol.py +0 -45
  419. catalystwan/models/policy/list/fqdn.py +0 -24
  420. catalystwan/models/policy/list/geo_location.py +0 -33
  421. catalystwan/models/policy/list/identity.py +0 -29
  422. catalystwan/models/policy/list/ips_signature.py +0 -27
  423. catalystwan/models/policy/list/ipv6_prefix.py +0 -33
  424. catalystwan/models/policy/list/local_app.py +0 -45
  425. catalystwan/models/policy/list/local_domain.py +0 -36
  426. catalystwan/models/policy/list/media_profile.py +0 -44
  427. catalystwan/models/policy/list/mirror.py +0 -27
  428. catalystwan/models/policy/list/modem_pass_through.py +0 -27
  429. catalystwan/models/policy/list/policer.py +0 -39
  430. catalystwan/models/policy/list/port.py +0 -33
  431. catalystwan/models/policy/list/preferred_color_group.py +0 -82
  432. catalystwan/models/policy/list/prefix.py +0 -33
  433. catalystwan/models/policy/list/protocol_name.py +0 -26
  434. catalystwan/models/policy/list/region.py +0 -45
  435. catalystwan/models/policy/list/scalable_group_tag.py +0 -30
  436. catalystwan/models/policy/list/site.py +0 -34
  437. catalystwan/models/policy/list/sla.py +0 -77
  438. catalystwan/models/policy/list/supervisory_disconnect.py +0 -62
  439. catalystwan/models/policy/list/threat_grid_api_key.py +0 -32
  440. catalystwan/models/policy/list/tloc.py +0 -32
  441. catalystwan/models/policy/list/translation_profile.py +0 -32
  442. catalystwan/models/policy/list/translation_rules.py +0 -29
  443. catalystwan/models/policy/list/trunkgroup.py +0 -56
  444. catalystwan/models/policy/list/umbrella_data.py +0 -30
  445. catalystwan/models/policy/list/url.py +0 -39
  446. catalystwan/models/policy/list/vpn.py +0 -40
  447. catalystwan/models/policy/list/zone.py +0 -46
  448. catalystwan/models/policy/voice.py +0 -77
  449. catalystwan/models/settings.py +0 -41
  450. catalystwan/models/templates.py +0 -79
  451. catalystwan/tests/builders/test_report.py +0 -60
  452. catalystwan/tests/builders/uc_voice.py +0 -85
  453. catalystwan/tests/models/__init__.py +0 -0
  454. catalystwan/tests/models/configuration/feature_profile/sdwan/policy_object/security/test_url.py +0 -73
  455. catalystwan/tests/models/test_digital_interface.py +0 -56
  456. catalystwan/tests/templates/definitions/aaa_basic.json +0 -96
  457. catalystwan/tests/templates/definitions/aaa_complex.json +0 -464
  458. catalystwan/tests/templates/definitions/cisco_aaa_complex.json +0 -361
  459. catalystwan/tests/templates/definitions/cisco_logging_complex.json +0 -268
  460. catalystwan/tests/templates/definitions/cisco_ntp_complex.json +0 -143
  461. catalystwan/tests/templates/definitions/cisco_omp_complex.json +0 -175
  462. catalystwan/tests/templates/definitions/cisco_ospf_complex.json +0 -302
  463. catalystwan/tests/templates/definitions/cisco_sig.json +0 -405
  464. catalystwan/tests/templates/definitions/cisco_snmp_complex.json +0 -258
  465. catalystwan/tests/templates/definitions/cisco_system_complex.json +0 -502
  466. catalystwan/tests/templates/definitions/cisco_vpn_interface_complex.json +0 -821
  467. catalystwan/tests/templates/definitions/omp_vsmart_1.json +0 -26
  468. catalystwan/tests/templates/definitions/omp_vsmart_complex.json +0 -73
  469. catalystwan/tests/templates/definitions/security_vsmart_complex.json +0 -24
  470. catalystwan/tests/templates/definitions/system_vsmart_complex.json +0 -193
  471. catalystwan/tests/templates/definitions/vpn_vsmart_basic.json +0 -17
  472. catalystwan/tests/templates/definitions/vpn_vsmart_complex.json +0 -179
  473. catalystwan/tests/templates/definitions/vpn_vsmart_interface_basic.json +0 -42
  474. catalystwan/tests/templates/definitions/vpn_vsmart_interface_complex.json +0 -208
  475. catalystwan/tests/templates/models/aaa.py +0 -106
  476. catalystwan/tests/templates/models/cisco_logging.py +0 -65
  477. catalystwan/tests/templates/models/cisco_ntp.py +0 -17
  478. catalystwan/tests/templates/models/cisco_omp.py +0 -37
  479. catalystwan/tests/templates/models/cisco_ospf.py +0 -60
  480. catalystwan/tests/templates/models/cisco_secure_internet_gateway.py +0 -95
  481. catalystwan/tests/templates/models/cisco_snmp.py +0 -40
  482. catalystwan/tests/templates/models/cisco_vpn_interface.py +0 -200
  483. catalystwan/tests/templates/models/security_vsmart.py +0 -11
  484. catalystwan/tests/templates/models/system_vsmart.py +0 -37
  485. catalystwan/tests/templates/models/vpn_vsmart.py +0 -32
  486. catalystwan/tests/templates/models/vpn_vsmart_interface.py +0 -54
  487. catalystwan/tests/templates/schemas/aaa.json +0 -1096
  488. catalystwan/tests/templates/schemas/cisco_logging.json +0 -577
  489. catalystwan/tests/templates/schemas/cisco_ntp.json +0 -265
  490. catalystwan/tests/templates/schemas/cisco_omp.json +0 -479
  491. catalystwan/tests/templates/schemas/cisco_ospf.json +0 -908
  492. catalystwan/tests/templates/schemas/cisco_secure_internet_gateway.json +0 -1520
  493. catalystwan/tests/templates/schemas/cisco_snmp.json +0 -561
  494. catalystwan/tests/templates/schemas/cisco_vpn_interface.json +0 -3348
  495. catalystwan/tests/templates/schemas/security-vsmart.json +0 -58
  496. catalystwan/tests/templates/schemas/system-vsmart.json +0 -2585
  497. catalystwan/tests/templates/schemas/vpn-vsmart-interface.json +0 -859
  498. catalystwan/tests/templates/schemas/vpn-vsmart.json +0 -445
  499. catalystwan/tests/templates/test_find_template_values_2.py +0 -193
  500. catalystwan/tests/test_feature_profile_api.py +0 -282
  501. catalystwan/tests/test_models_common.py +0 -53
  502. catalystwan/utils/model.py +0 -48
  503. catalystwan/utils/persona.py +0 -5
  504. catalystwan/utils/type_check.py +0 -22
  505. catalystwan/workflows/backup_restore_device_templates.py +0 -467
  506. catalystwan-0.41.2.dev9.dist-info/RECORD +0 -641
  507. /catalystwan/tests/templates/definitions/{cisco_banner.json → banner_1.json} +0 -0
  508. {catalystwan-0.41.2.dev9.dist-info → catalystwan-0.41.3.dist-info}/LICENSE +0 -0
  509. {catalystwan-0.41.2.dev9.dist-info → catalystwan-0.41.3.dist-info}/WHEEL +0 -0
@@ -3,37 +3,28 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import logging
6
- from typing import TYPE_CHECKING, Any, Dict, List, Literal, Optional
7
- from uuid import UUID
6
+ from pathlib import Path
7
+ from typing import TYPE_CHECKING, Final, List
8
8
 
9
+ from jinja2 import DebugUndefined, Environment, FileSystemLoader, meta # type: ignore
9
10
  from pydantic import BaseModel, ConfigDict, Field, field_validator
10
11
 
12
+ from catalystwan.utils.device_model import DeviceModel
13
+
11
14
  if TYPE_CHECKING:
12
15
  from catalystwan.session import ManagerSession
13
16
 
14
17
  logger = logging.getLogger(__name__)
15
18
 
16
19
 
17
- TemplateType = Literal["file", "template"] # file == cli, template == feature
18
-
19
-
20
- def str_to_uuid(s: str) -> Optional[UUID]:
21
- try:
22
- return UUID(s)
23
- except ValueError:
24
- return None
25
-
26
-
27
20
  class GeneralTemplate(BaseModel):
28
- model_config = ConfigDict(arbitrary_types_allowed=True, populate_by_name=True)
21
+ model_config = ConfigDict(arbitrary_types_allowed=True)
29
22
 
30
- name: str = Field(default="")
23
+ name: str = ""
24
+ subTemplates: List[GeneralTemplate] = []
31
25
 
32
- sub_templates: List[GeneralTemplate] = Field(
33
- default=[], serialization_alias="subTemplates", validation_alias="subTemplates"
34
- )
35
- template_id: str = Field(default="", serialization_alias="templateId", validation_alias="templateId")
36
- template_type: str = Field(default="", serialization_alias="templateType", validation_alias="templateType")
26
+ templateId: str = ""
27
+ templateType: str = ""
37
28
 
38
29
 
39
30
  class DeviceTemplate(BaseModel):
@@ -53,67 +44,28 @@ class DeviceTemplate(BaseModel):
53
44
  >>> session.api.templates.create(device_template)
54
45
  """
55
46
 
56
- model_config = ConfigDict(arbitrary_types_allowed=True, populate_by_name=True)
57
-
58
- template_name: str = Field(serialization_alias="templateName", validation_alias="templateName")
59
- template_description: str = Field(serialization_alias="templateDescription", validation_alias="templateDescription")
60
- device_type: str = Field(serialization_alias="deviceType", validation_alias="deviceType")
61
- device_role: str = Field(default="sdwan-edge", serialization_alias="deviceRole", validation_alias="deviceRole")
62
- config_type: Optional[str] = Field(
63
- default="template", serialization_alias="configType", validation_alias="configType"
64
- )
65
- factory_default: Optional[bool] = Field(
66
- default=False, serialization_alias="factoryDefault", validation_alias="factoryDefault"
67
- )
68
- policy_id: str = Field(default="", serialization_alias="policyId", validation_alias="policyId")
69
- feature_template_uid_range: Optional[List] = Field(
70
- default=[], serialization_alias="featureTemplateUidRange", validation_alias="featureTemplateUidRange"
71
- )
72
-
73
- connection_preference_required: Optional[bool] = Field(
74
- default=True,
75
- serialization_alias="connectionPreferenceRequired",
76
- validation_alias="connectionPreferenceRequired",
77
- )
78
- connection_preference: Optional[bool] = Field(
79
- default=True, serialization_alias="connectionPreference", validation_alias="connectionPreference"
80
- )
81
-
82
- general_templates: List[GeneralTemplate] = Field(
83
- default=[], serialization_alias="generalTemplates", validation_alias="generalTemplates"
84
- )
85
- security_policy_id: str = Field(
86
- default="", serialization_alias="securityPolicyId", validation_alias="securityPolicyId"
87
- )
88
- voice_policy_id: Optional[str] = Field(
89
- default=None, serialization_alias="voicePolicyId", validation_alias="voicePolicyId"
90
- )
91
- template_configuration_edited: Optional[str] = Field(
92
- default=None, serialization_alias="templateConfigurationEdited", validation_alias="templateConfigurationEdited"
93
- )
94
- template_configuration: Optional[str] = Field(
95
- default=None, serialization_alias="templateConfiguration", validation_alias="templateConfiguration"
96
- )
97
- rid: Optional[int] = Field(default=None, serialization_alias="@rid", validation_alias="@rid")
98
- cli_type: Optional[str] = Field(default=None, serialization_alias="cliType", validation_alias="cliType")
99
- copy_edited: Optional[bool] = Field(default=None, serialization_alias="copyEdited", validation_alias="copyEdited")
100
-
101
- def get_security_policy_uuid(self) -> Optional[UUID]:
102
- return str_to_uuid(self.security_policy_id)
103
-
104
- def get_policy_uuid(self) -> Optional[UUID]:
105
- return str_to_uuid(self.policy_id)
106
-
107
- def get_voice_policy_uuid(self) -> Optional[UUID]:
108
- if self.voice_policy_id is None:
109
- return None
110
- return str_to_uuid(self.voice_policy_id)
111
-
112
- def has_any_policy(self) -> bool:
113
- return any((self.policy_id, self.security_policy_id, self.voice_policy_id))
47
+ template_name: str = Field(alias="templateName")
48
+ template_description: str = Field(alias="templateDescription")
49
+ general_templates: List[GeneralTemplate] = Field(alias="generalTemplates")
50
+ device_role: str = Field(default="sdwan-edge", alias="deviceRole")
51
+ device_type: DeviceModel = Field(alias="deviceType")
52
+ security_policy_id: str = Field(default="", alias="securityPolicyId")
53
+ policy_id: str = Field(default="", alias="policyId")
114
54
 
115
55
  def generate_payload(self) -> str:
116
- output = self.model_dump_json(by_alias=True)
56
+ env = Environment(
57
+ loader=FileSystemLoader(self.payload_path.parent),
58
+ trim_blocks=True,
59
+ lstrip_blocks=True,
60
+ undefined=DebugUndefined,
61
+ )
62
+ template = env.get_template(self.payload_path.name)
63
+ output = template.render(self.model_dump())
64
+
65
+ ast = env.parse(output)
66
+ if meta.find_undeclared_variables(ast):
67
+ logger.info(meta.find_undeclared_variables(ast))
68
+ raise Exception("There are undeclared variables.")
117
69
  return output
118
70
 
119
71
  @field_validator("general_templates", mode="before")
@@ -127,63 +79,16 @@ class DeviceTemplate(BaseModel):
127
79
  output.append(template)
128
80
  return output
129
81
 
82
+ payload_path: Final[Path] = Path(__file__).parent / "device_template_payload.json.j2"
83
+
130
84
  @classmethod
131
85
  def get(self, name: str, session: ManagerSession) -> DeviceTemplate:
132
86
  device_template = session.api.templates.get(DeviceTemplate).filter(name=name).single_or_default()
133
87
  resp = session.get(f"dataservice/template/device/object/{device_template.id}").json()
134
88
  return DeviceTemplate(**resp)
135
89
 
136
- def associate_feature_template(self, template_type: str, template_uuid: UUID) -> None:
137
- self.general_templates.append(
138
- GeneralTemplate(name="", template_id=str(template_uuid), template_type=template_type)
139
- )
140
-
141
- def associate_security_policy(self, security_policy_uuid: UUID) -> None:
142
- self.security_policy_id = str(security_policy_uuid)
143
-
144
- def associate_policy(self, policy_uuid: UUID) -> None:
145
- self.policy_id = str(policy_uuid)
146
-
147
90
  model_config = ConfigDict(populate_by_name=True, use_enum_values=True)
148
91
 
149
92
 
150
93
  class DeviceSpecificValue(BaseModel):
151
94
  property: str
152
-
153
-
154
- class DeviceTemplateConfigAttached(BaseModel):
155
- model_config = ConfigDict(arbitrary_types_allowed=True, populate_by_name=True)
156
- host_name: Optional[str] = Field(None, serialization_alias="host-name", validation_alias="host-name")
157
- device_ip: Optional[str] = Field(None, serialization_alias="deviceIP", validation_alias="deviceIP")
158
- local_system_ip: Optional[str] = Field(
159
- None, serialization_alias="local-system-ip", validation_alias="local-system-ip"
160
- )
161
- site_id: Optional[str] = Field(None, serialization_alias="site-id", validation_alias="site-id")
162
- device_groups: Optional[List[str]] = Field(
163
- None, serialization_alias="device-groups", validation_alias="device-groups"
164
- )
165
- uuid: Optional[str] = Field(None, serialization_alias="uuid", validation_alias="uuid")
166
- personality: Optional[str] = Field(None, serialization_alias="personality", validation_alias="personality")
167
- config_cloudx_mode: Optional[str] = Field(
168
- None, serialization_alias="configCloudxMode", validation_alias="configCloudxMode"
169
- )
170
-
171
-
172
- class CreateDeviceInputPayload(BaseModel):
173
- model_config = ConfigDict(populate_by_name=True)
174
- template_id: str = Field(serialization_alias="templateId", validation_alias="templateId")
175
- device_ids: List[str] = Field(serialization_alias="deviceIds", validation_alias="deviceIds")
176
- is_edited: bool = Field(serialization_alias="isEdited", validation_alias="isEdited")
177
- is_master_edited: bool = Field(serialization_alias="isMasterEdited", validation_alias="isMasterEdited")
178
-
179
-
180
- class DeviceInputValues(BaseModel):
181
- model_config = ConfigDict(populate_by_name=True, extra="allow")
182
- csv_device_ip: str = Field(validation_alias="csv-deviceIP", serialization_alias="csv-deviceIP")
183
- csv_device_id: str = Field(validation_alias="csv-deviceId", serialization_alias="csv-deviceId")
184
- csv_host_name: str = Field(validation_alias="csv-host-name", serialization_alias="csv-host-name")
185
- csv_status: str = Field(validation_alias="csv-status", serialization_alias="csv-status")
186
-
187
- @property
188
- def values(self) -> Dict[str, Any]:
189
- return self.__pydantic_extra__ or dict()
@@ -0,0 +1,19 @@
1
+ {
2
+ "templateName": "{{ template_name }}",
3
+ "templateDescription": "{{ template_description }}",
4
+ "deviceType": "{{ device_type }}",
5
+ "deviceRole": "{{ device_role }}",
6
+ "configType": "template",
7
+ "factoryDefault": false,
8
+ "policyId": "{{ policy_id }}",
9
+ "featureTemplateUidRange": [],
10
+ "connectionPreferenceRequired": true,
11
+ "connectionPreference": true,
12
+ "generalTemplates": [
13
+ {% for template in general_templates %}
14
+ {{ template | tojson }}
15
+ {% if not loop.last %},{% endif %}
16
+ {% endfor %}
17
+ ],
18
+ "securityPolicyId": "{{ security_policy_id }}"
19
+ }
@@ -11,7 +11,7 @@ from jinja2 import DebugUndefined, Environment, FileSystemLoader, meta # type:
11
11
  from pydantic import BaseModel, model_validator
12
12
 
13
13
  from catalystwan.api.templates.device_variable import DeviceVariable
14
- from catalystwan.models.common import DeviceModel
14
+ from catalystwan.utils.device_model import DeviceModel
15
15
  from catalystwan.utils.dict import FlattenedDictValue, flatten_dict
16
16
  from catalystwan.utils.feature_template.find_template_values import find_template_values
17
17
  from catalystwan.utils.pydantic_field import get_extra_field
@@ -118,7 +118,7 @@ class FeatureTemplate(FeatureTemplateValidator, ABC):
118
118
  template_info = (
119
119
  session.api.templates._get_feature_templates(summary=False).filter(name=name).single_or_default()
120
120
  )
121
- template_definition_as_dict = json.loads(cast(str, template_info.template_definition))
121
+ template_definition_as_dict = json.loads(cast(str, template_info.template_definiton))
122
122
 
123
123
  feature_template_model = choose_model(type_value=template_info.template_type)
124
124
 
@@ -128,6 +128,6 @@ class FeatureTemplate(FeatureTemplateValidator, ABC):
128
128
  return feature_template_model(
129
129
  template_name=template_info.name,
130
130
  template_description=template_info.description,
131
- device_models=[model for model in template_info.device_type],
131
+ device_models=[DeviceModel(model) for model in template_info.device_type],
132
132
  **flattened_values,
133
133
  )
@@ -1,331 +1,84 @@
1
1
  # Copyright 2023 Cisco Systems, Inc. and its affiliates
2
2
 
3
+ from enum import Enum
3
4
  from pathlib import Path
4
- from typing import ClassVar, List, Literal, Optional
5
+ from typing import ClassVar, List, Optional
5
6
 
6
7
  from pydantic import ConfigDict, Field
7
8
 
8
- from catalystwan.api.templates.bool_str import BoolStr
9
9
  from catalystwan.api.templates.feature_template import FeatureTemplate, FeatureTemplateValidator
10
10
 
11
- Privilage = Literal["1", "15"]
12
-
13
- AccountingMethod = Literal["commands", "exec", "network", "system"]
14
-
15
- AuthorizationMethod = Literal["commands"]
16
-
17
- DomainStripping = Literal["yes", "no", "right-to-left"]
18
-
19
- AuthenticationType = Literal["any", "all", "session-key"]
20
-
21
-
22
- class PubkeyChain(FeatureTemplateValidator):
23
- key_string: str = Field(
24
- description="Set the RSA key string",
25
- json_schema_extra={"vmanage_key": "key-string"},
26
- )
27
- key_type: Optional[str] = Field(
28
- default="ssh-rsa",
29
- description="Only RSA is supported",
30
- json_schema_extra={"vmanage_key": "key-type"},
31
- )
32
-
33
11
 
34
12
  class User(FeatureTemplateValidator):
35
- name: str = Field(description="The name of the user")
36
- password: Optional[str] = Field(default=None, description="The password for the user")
37
- secret: Optional[str] = Field(default=None, description="The secret for the user")
38
- privilege: Optional[Privilage] = Field(default="15", description="The privilege level for the user")
39
- pubkey_chain: Optional[List[PubkeyChain]] = Field(
40
- default=None,
41
- description="List of public keys for the user",
42
- json_schema_extra={"vmanage_key": "pubkey-chain"},
43
- )
44
-
45
-
46
- class AccountingRule(FeatureTemplateValidator):
47
- model_config = ConfigDict(populate_by_name=True)
48
-
49
- rule_id: str = Field(
50
- description="Accounting Rule ID",
51
- json_schema_extra={"vmanage_key": "rule-id"},
52
- )
53
- method: AccountingMethod = Field(
54
- description="Configure Accounting Method",
55
- json_schema_extra={"vmanage_key": "method"},
56
- )
57
- level: Optional[Privilage] = Field(
58
- default=None,
59
- description="Privilege level when method is commands",
60
- json_schema_extra={"vmanage_key": "level"},
61
- )
62
- start_stop: Optional[BoolStr] = Field(
63
- default=True,
64
- description="Enable Start-Stop",
65
- json_schema_extra={"vmanage_key": "start-stop"},
66
- )
67
- group: str = Field(
68
- description="List of groups.",
69
- json_schema_extra={"vmanage_key": "group"},
70
- )
71
-
72
-
73
- class AuthorizationRules(FeatureTemplateValidator):
74
- model_config = ConfigDict(populate_by_name=True)
75
-
76
- rule_id: str = Field(
77
- description="Authorization Rule ID",
78
- json_schema_extra={"vmanage_key": "rule-id"},
79
- )
80
- method: AuthorizationMethod = Field(
81
- description="Configure Authorization Method",
82
- json_schema_extra={"vmanage_key": "method"},
83
- )
84
- level: Optional[Privilage] = Field(
85
- default=None,
86
- description="Privilege level when method is commands",
87
- json_schema_extra={"vmanage_key": "level"},
88
- )
89
- group: str = Field(
90
- description="List of groups.",
91
- json_schema_extra={"vmanage_key": "group"},
92
- )
93
- authenticated: Optional[BoolStr] = Field(
94
- default=False,
95
- description="Succeed if user has authenticated",
96
- json_schema_extra={"vmanage_key": "if-authenticated"},
97
- )
13
+ name: str
14
+ password: Optional[str] = None
15
+ secret: Optional[str] = None
16
+ privilege: Optional[str] = None
17
+ pubkey_chain: List[str] = Field(default=[], json_schema_extra={"vmanage_key": "pubkey-chain", "vip_type": "ignore"})
98
18
 
99
19
 
100
20
  class RadiusServer(FeatureTemplateValidator):
101
21
  model_config = ConfigDict(populate_by_name=True, coerce_numbers_to_str=True)
102
22
 
103
- address: str = Field(description="The IP address or hostname of the RADIUS server")
104
- auth_port: int = Field(
105
- default=1812,
106
- json_schema_extra={"vmanage_key": "auth-port"},
107
- description="The authentication port for the RADIUS server",
108
- )
109
- acct_port: int = Field(
110
- default=1813,
111
- json_schema_extra={"vmanage_key": "acct-port"},
112
- description="The accounting port for the RADIUS server",
113
- )
114
- timeout: int = Field(default=5, description="The timeout period in seconds for the RADIUS server")
115
- retransmit: int = Field(default=3, description="The number of retransmit attempts for the RADIUS server")
116
- key: str = Field(description="The key for the RADIUS server")
117
- secret_key: Optional[str] = Field(
118
- default=None,
119
- json_schema_extra={"vmanage_key": "secret-key"},
120
- description="The secret key for the RADIUS server",
121
- )
122
- key_enum: Optional[str] = Field(
123
- default=None,
124
- json_schema_extra={"vmanage_key": "key-enum"},
125
- description="The key enumeration for the RADIUS server",
126
- )
127
- key_type: Optional[str] = Field(
128
- default=None,
129
- json_schema_extra={"vmanage_key": "key-type"},
130
- description="The key type for the RADIUS server",
131
- )
23
+ address: str
24
+ auth_port: int = Field(default=1812, json_schema_extra={"vmanage_key": "auth-port"})
25
+ acct_port: int = Field(default=1813, json_schema_extra={"vmanage_key": "acct-port"})
26
+ timeout: int = Field(default=5)
27
+ retransmit: int = 3
28
+ key: str
29
+ secret_key: Optional[str] = Field(default=None, json_schema_extra={"vmanage_key": "secret-key"})
30
+ key_enum: Optional[str] = Field(default=None, json_schema_extra={"vmanage_key": "key-enum"})
31
+ key_type: Optional[str] = Field(default=None, json_schema_extra={"vmanage_key": "key-type"})
132
32
 
133
33
 
134
34
  class RadiusGroup(FeatureTemplateValidator):
135
35
  model_config = ConfigDict(arbitrary_types_allowed=True, populate_by_name=True)
136
36
 
137
- group_name: str = Field(
138
- json_schema_extra={"vmanage_key": "group-name"},
139
- description="The name of the RADIUS group",
140
- )
141
- vpn: Optional[int] = Field(default=None, description="The VPN ID for the RADIUS group")
142
- source_interface: Optional[str] = Field(
143
- json_schema_extra={"vmanage_key": "source-interface"},
144
- description="The source interface for the RADIUS group",
145
- )
146
- server: List[RadiusServer] = Field(default=[], description="The list of RADIUS servers for the group")
37
+ group_name: str = Field(json_schema_extra={"vmanage_key": "group-name"})
38
+ vpn: Optional[int] = None
39
+ source_interface: Optional[str] = Field(json_schema_extra={"vmanage_key": "source-interface"})
40
+ server: List[RadiusServer] = []
147
41
 
148
42
 
149
- class RadiusVPN(FeatureTemplateValidator):
150
- name: str = Field(
151
- description="VPN ID",
152
- json_schema_extra={
153
- "vmanage_key": "name",
154
- },
155
- )
156
- server_key: str = Field(
157
- description="Specify a RADIUS client server-key",
158
- json_schema_extra={
159
- "vmanage_key": "server-key",
160
- },
161
- ) # needs enryption
162
-
163
-
164
- class RadiusClient(FeatureTemplateValidator):
165
- ip: str = Field(
166
- description="The Client IP",
167
- json_schema_extra={"vmanage_key": "ip"},
168
- )
169
- vpn: List[RadiusVPN] = Field(
170
- description="The VPN Configuration",
171
- json_schema_extra={"vmanage_key": "vpn"},
172
- )
43
+ class DomainStripping(str, Enum):
44
+ YES = "yes"
45
+ NO = "no"
46
+ RIGHT_TO_LEFT = "right-to-left"
173
47
 
174
48
 
175
49
  class TacacsServer(FeatureTemplateValidator):
176
50
  model_config = ConfigDict(populate_by_name=True)
177
51
 
178
- address: str = Field(description="The IP address or hostname of the TACACS+ server")
179
- key: str = Field(description="The key for the TACACS+ server")
180
- port: int = Field(default=49, description="The port for the TACACS+ server")
181
- timeout: int = Field(default=5, description="The timeout period in seconds for the TACACS+ server")
182
- secret_key: Optional[str] = Field(
183
- default=None,
184
- json_schema_extra={"vmanage_key": "secret-key"},
185
- description="The secret key for the TACACS+ server",
186
- )
187
- key_enum: Optional[str] = Field(
188
- default=None,
189
- json_schema_extra={"vmanage_key": "key-enum"},
190
- description="The key enumeration for the TACACS+ server",
191
- )
52
+ address: str
53
+ port: int = 49
54
+ timeout: int = Field(default=5)
55
+ key: str
56
+ secret_key: Optional[str] = Field(default=None, json_schema_extra={"vmanage_key": "secret-key"})
57
+ key_enum: Optional[str] = Field(default=None, json_schema_extra={"vmanage_key": "key-enum"})
192
58
 
193
59
 
194
60
  class TacacsGroup(FeatureTemplateValidator):
195
61
  model_config = ConfigDict(populate_by_name=True)
196
62
 
197
- group_name: str = Field(
198
- json_schema_extra={"vmanage_key": "group-name"},
199
- description="The name of the TACACS+ group",
200
- )
201
- vpn: int = Field(default=0, description="The VPN ID for the TACACS+ group")
202
- source_interface: Optional[str] = Field(
203
- default=None,
204
- json_schema_extra={"vmanage_key": "source-interface"},
205
- description="The source interface for the TACACS+ group",
206
- )
207
- server: List[TacacsServer] = Field(default=[], description="The list of TACACS+ servers for the group")
63
+ group_name: str = Field(json_schema_extra={"vmanage_key": "group-name"})
64
+ vpn: int = 0
65
+ source_interface: Optional[str] = Field(default=None, json_schema_extra={"vmanage_key": "source-interface"})
66
+ server: List[TacacsServer] = []
208
67
 
209
68
 
210
69
  class CiscoAAAModel(FeatureTemplate):
211
70
  model_config = ConfigDict(arbitrary_types_allowed=True, populate_by_name=True)
212
- _docs_description: str = "Cisco AAA Feature Template configuration"
213
71
 
214
- authentication_group: Optional[BoolStr] = Field(
215
- default=False,
216
- json_schema_extra={
217
- "data_path": ["authentication", "dot1x", "default"],
218
- "vmanage_key": "authentication_group",
219
- },
220
- description="Whether to enable the authentication group, GUI equivalent: Authentication Param",
221
- )
222
- accounting_group: Optional[BoolStr] = Field(
223
- default=False,
224
- json_schema_extra={
225
- "data_path": ["accounting", "dot1x", "default", "start-stop"],
226
- "vmanage_key": "accounting_group",
227
- },
228
- description="Whether to enable the accounting group, GUI equivalent: Accounting Param",
229
- )
230
- server_auth_order: str = Field(
231
- default="local",
232
- json_schema_extra={"vmanage_key": "server-auth-order"},
233
- description="ServerGroups authentication order to user access",
234
- ) # example: "local,tacacs-5,radius-4"
235
- user: Optional[List[User]] = Field(default=None, description="List of local user configurations")
236
-
237
- accounting_rules: Optional[List[AccountingRule]] = Field(
238
- default=None,
239
- description="Configure the accounting rules",
240
- json_schema_extra={
241
- "data_path": ["accounting"],
242
- "vmanage_key": "accounting-rule",
243
- },
244
- )
245
-
246
- authorization_console: Optional[BoolStr] = Field(
247
- default=None,
248
- description="For enabling console authorization",
249
- json_schema_extra={
250
- "data_path": ["authorization"],
251
- "vmanage_key": "authorization-console",
252
- },
253
- )
254
- authorization_config_commands: Optional[BoolStr] = Field(
255
- default=None,
256
- description="For configuration mode commands",
257
- json_schema_extra={
258
- "data_path": ["authorization"],
259
- "vmanage_key": "authorization-config-commands",
260
- },
261
- )
262
- authorization_rules: Optional[List[AuthorizationRules]] = Field(
263
- default=None,
264
- description="Configure the accounting rules",
265
- json_schema_extra={
266
- "data_path": ["authorization"],
267
- "vmanage_key": "authorization-rule",
268
- },
269
- )
270
- radius: Optional[List[RadiusGroup]] = Field(default=None, description="List of Radius group configurations")
271
- radius_client: Optional[List[RadiusClient]] = Field(
272
- default=None,
273
- json_schema_extra={
274
- "data_path": ["radius-dynamic-author"],
275
- "vmanage_key": "radius-client",
276
- },
277
- description="Specify a RADIUS client",
278
- )
72
+ user: Optional[List[User]] = None
73
+ authentication_group: bool = Field(default=False, json_schema_extra={"vmanage_key": "authentication_group"})
74
+ accounting_group: bool = True
75
+ radius: Optional[List[RadiusGroup]] = None
279
76
  domain_stripping: Optional[DomainStripping] = Field(
280
- default=None,
281
- json_schema_extra={
282
- "data_path": ["radius-dynamic-author"],
283
- "vmanage_key": "domain-stripping",
284
- },
285
- description="The domain stripping configuration",
286
- )
287
- authentication_type: Optional[AuthenticationType] = Field(
288
- default="any",
289
- json_schema_extra={
290
- "data_path": ["radius-dynamic-author"],
291
- "vmanage_key": "auth-type",
292
- },
293
- description="Authentication Type",
294
- )
295
- port: Optional[int] = Field(
296
- default=1700,
297
- json_schema_extra={
298
- "data_path": ["radius-dynamic-author"],
299
- "vmanage_key": "port",
300
- },
301
- description="Specify Radius Dynamic Author Port",
302
- )
303
- server_key_password: Optional[str] = Field(
304
- default=None,
305
- json_schema_extra={
306
- "data_path": ["radius-dynamic-author"],
307
- "vmanage_key": "rda-server-key",
308
- },
309
- description="Specify a radius dynamic author server-key",
310
- ) # needs encryption
311
-
312
- cts_authorization_list: Optional[str] = Field(
313
- default=None,
314
- json_schema_extra={
315
- "data_path": ["radius-trustsec"],
316
- "vmanage_key": "cts-auth-list",
317
- },
318
- description="Specify a radius dynamic author server-key",
319
- )
320
- radius_trustsec_group: Optional[str] = Field(
321
- default=None,
322
- json_schema_extra={
323
- "data_path": ["radius-trustsec"],
324
- "vmanage_key": "radius-trustsec-group",
325
- },
326
- description="RADIUS trustsec group",
77
+ default=None, json_schema_extra={"vmanage_key": "domain-stripping"}
327
78
  )
328
- tacacs: Optional[List[TacacsGroup]] = Field(default=None, description="List of TACACS group configurations")
79
+ port: int = 1700
80
+ tacacs: Optional[List[TacacsGroup]] = None
81
+ server_auth_order: str = Field(default="local", json_schema_extra={"vmanage_key": "server-auth-order"})
329
82
 
330
83
  payload_path: ClassVar[Path] = Path(__file__).parent / "DEPRECATED"
331
84
  type: ClassVar[str] = "cedge_aaa"
@@ -10,18 +10,9 @@ from catalystwan.api.templates.feature_template import FeatureTemplate
10
10
 
11
11
  class CiscoBannerModel(FeatureTemplate):
12
12
  model_config = ConfigDict(arbitrary_types_allowed=True, populate_by_name=True)
13
- _docs_description: str = "Cisco Banner configuration for login and message of the day (MOTD)"
14
13
 
15
- login_banner: Optional[str] = Field(
16
- default=None,
17
- json_schema_extra={"vmanage_key": "login"},
18
- description="The login banner text displayed before authentication",
19
- )
20
- motd_banner: Optional[str] = Field(
21
- default=None,
22
- json_schema_extra={"vmanage_key": "motd"},
23
- description="The message of the day (MOTD) banner text displayed after successful authentication",
24
- )
14
+ login_banner: Optional[str] = Field(default=None, json_schema_extra={"vmanage_key": "login"})
15
+ motd_banner: Optional[str] = Field(default=None, json_schema_extra={"vmanage_key": "motd"})
25
16
 
26
17
  payload_path: ClassVar[Path] = Path(__file__).parent / "DEPRECATED"
27
18
  type: ClassVar[str] = "cisco_banner"