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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (504) hide show
  1. catalystwan/__init__.py +3 -2
  2. catalystwan/api/administration.py +13 -2
  3. catalystwan/api/api_container.py +4 -1
  4. catalystwan/api/builders/__init__.py +14 -0
  5. catalystwan/api/builders/feature_profiles/__init__.py +0 -0
  6. catalystwan/api/builders/feature_profiles/application_priority.py +58 -0
  7. catalystwan/api/builders/feature_profiles/builder_factory.py +59 -0
  8. catalystwan/api/builders/feature_profiles/cli.py +76 -0
  9. catalystwan/api/builders/feature_profiles/mixins.py +44 -0
  10. catalystwan/api/builders/feature_profiles/other.py +79 -0
  11. catalystwan/api/builders/feature_profiles/report.py +155 -0
  12. catalystwan/api/builders/feature_profiles/service.py +248 -0
  13. catalystwan/api/builders/feature_profiles/system.py +80 -0
  14. catalystwan/api/builders/feature_profiles/transport.py +256 -0
  15. catalystwan/api/builders/feature_profiles/uc_voice.py +287 -0
  16. catalystwan/api/config_group_api.py +41 -16
  17. catalystwan/api/configuration_groups/parcel.py +100 -30
  18. catalystwan/api/feature_profile_api.py +2021 -242
  19. catalystwan/api/policy_api.py +470 -116
  20. catalystwan/api/template_api.py +113 -44
  21. catalystwan/api/templates/README.md +61 -47
  22. catalystwan/api/templates/cli_template.py +17 -7
  23. catalystwan/api/templates/device_template/device_template.py +127 -32
  24. catalystwan/api/templates/feature_template.py +3 -3
  25. catalystwan/api/templates/models/aaa_model.py +387 -0
  26. catalystwan/api/templates/models/cisco_aaa_model.py +289 -42
  27. catalystwan/api/templates/models/cisco_banner_model.py +11 -2
  28. catalystwan/api/templates/models/cisco_bfd_model.py +31 -36
  29. catalystwan/api/templates/models/cisco_bgp_model.py +382 -131
  30. catalystwan/api/templates/models/cisco_logging_model.py +80 -43
  31. catalystwan/api/templates/models/cisco_ntp_model.py +34 -15
  32. catalystwan/api/templates/models/cisco_omp_model.py +70 -60
  33. catalystwan/api/templates/models/cisco_ospf.py +143 -74
  34. catalystwan/api/templates/models/cisco_ospfv3.py +217 -95
  35. catalystwan/api/templates/models/cisco_secure_internet_gateway.py +304 -142
  36. catalystwan/api/templates/models/cisco_snmp_model.py +66 -52
  37. catalystwan/api/templates/models/cisco_system.py +238 -129
  38. catalystwan/api/templates/models/cisco_vpn_interface_model.py +632 -275
  39. catalystwan/api/templates/models/cisco_vpn_model.py +433 -270
  40. catalystwan/api/templates/models/cli_template.py +3 -2
  41. catalystwan/api/templates/models/omp_vsmart_model.py +46 -10
  42. catalystwan/api/templates/models/security_vsmart_model.py +11 -8
  43. catalystwan/api/templates/models/supported.py +10 -4
  44. catalystwan/api/templates/models/system_vsmart_model.py +164 -27
  45. catalystwan/api/templates/models/vpn_vsmart_interface_model.py +198 -0
  46. catalystwan/api/templates/models/vpn_vsmart_model.py +124 -0
  47. catalystwan/apigw_auth.py +6 -2
  48. catalystwan/dataclasses.py +2 -53
  49. catalystwan/endpoints/__init__.py +41 -41
  50. catalystwan/endpoints/certificate_management_device.py +4 -0
  51. catalystwan/endpoints/cluster_management.py +27 -7
  52. catalystwan/endpoints/configuration/feature_profile/sdwan/application_priority.py +107 -0
  53. catalystwan/endpoints/configuration/feature_profile/sdwan/cli.py +60 -0
  54. catalystwan/endpoints/configuration/feature_profile/sdwan/dns_security.py +83 -0
  55. catalystwan/endpoints/configuration/feature_profile/sdwan/embedded_security.py +88 -0
  56. catalystwan/endpoints/configuration/feature_profile/sdwan/other.py +62 -0
  57. catalystwan/endpoints/configuration/feature_profile/sdwan/policy_object.py +35 -12
  58. catalystwan/endpoints/configuration/feature_profile/sdwan/service.py +154 -0
  59. catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py +88 -0
  60. catalystwan/endpoints/configuration/feature_profile/sdwan/system.py +164 -11
  61. catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py +93 -0
  62. catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py +144 -26
  63. catalystwan/endpoints/configuration/feature_profile/sdwan/uc_voice.py +77 -0
  64. catalystwan/endpoints/configuration/network_hierarchy.py +32 -0
  65. catalystwan/endpoints/configuration/policy/abstractions.py +49 -0
  66. catalystwan/endpoints/configuration/policy/definition/access_control_list.py +6 -11
  67. catalystwan/endpoints/configuration/policy/definition/access_control_list_ipv6.py +6 -11
  68. catalystwan/endpoints/configuration/policy/definition/aip.py +52 -0
  69. catalystwan/endpoints/configuration/policy/definition/amp.py +52 -0
  70. catalystwan/endpoints/configuration/policy/definition/app_route.py +50 -0
  71. catalystwan/endpoints/configuration/policy/definition/cflowd.py +46 -0
  72. catalystwan/endpoints/configuration/policy/definition/control.py +6 -11
  73. catalystwan/endpoints/configuration/policy/definition/device_access.py +6 -11
  74. catalystwan/endpoints/configuration/policy/definition/device_access_ipv6.py +6 -11
  75. catalystwan/endpoints/configuration/policy/definition/dial_peer.py +57 -0
  76. catalystwan/endpoints/configuration/policy/definition/dns_security.py +50 -0
  77. catalystwan/endpoints/configuration/policy/definition/fxo_port.py +57 -0
  78. catalystwan/endpoints/configuration/policy/definition/fxs_did_port.py +57 -0
  79. catalystwan/endpoints/configuration/policy/definition/fxs_port.py +57 -0
  80. catalystwan/endpoints/configuration/policy/definition/hub_and_spoke.py +6 -11
  81. catalystwan/endpoints/configuration/policy/definition/intrusion_prevention.py +52 -0
  82. catalystwan/endpoints/configuration/policy/definition/mesh.py +2 -11
  83. catalystwan/endpoints/configuration/policy/definition/pri_isdn_port.py +57 -0
  84. catalystwan/endpoints/configuration/policy/definition/qos_map.py +2 -11
  85. catalystwan/endpoints/configuration/policy/definition/rewrite.py +6 -11
  86. catalystwan/endpoints/configuration/policy/definition/route_policy.py +50 -0
  87. catalystwan/endpoints/configuration/policy/definition/rule_set.py +2 -11
  88. catalystwan/endpoints/configuration/policy/definition/security_group.py +6 -11
  89. catalystwan/endpoints/configuration/policy/definition/srst_phone_profile.py +59 -0
  90. catalystwan/endpoints/configuration/policy/definition/ssl_decryption.py +50 -0
  91. catalystwan/endpoints/configuration/policy/definition/ssl_decryption_utd_profile.py +52 -0
  92. catalystwan/endpoints/configuration/policy/definition/traffic_data.py +6 -11
  93. catalystwan/endpoints/configuration/policy/definition/url_filtering.py +50 -0
  94. catalystwan/endpoints/configuration/policy/definition/vpn_membership.py +6 -11
  95. catalystwan/endpoints/configuration/policy/definition/vpn_qos_map.py +50 -0
  96. catalystwan/endpoints/configuration/policy/definition/zone_based_firewall.py +6 -11
  97. catalystwan/endpoints/configuration/policy/list/app.py +3 -16
  98. catalystwan/endpoints/configuration/policy/list/app_probe.py +6 -15
  99. catalystwan/endpoints/configuration/policy/list/as_path.py +3 -16
  100. catalystwan/endpoints/configuration/policy/list/class_map.py +3 -16
  101. catalystwan/endpoints/configuration/policy/list/color.py +3 -16
  102. catalystwan/endpoints/configuration/policy/list/community.py +3 -16
  103. catalystwan/endpoints/configuration/policy/list/data_ipv6_prefix.py +6 -15
  104. catalystwan/endpoints/configuration/policy/list/data_prefix.py +3 -16
  105. catalystwan/endpoints/configuration/policy/list/expanded_community.py +6 -15
  106. catalystwan/endpoints/configuration/policy/list/extended_community.py +52 -0
  107. catalystwan/endpoints/configuration/policy/list/fax_protocol.py +48 -0
  108. catalystwan/endpoints/configuration/policy/list/fqdn.py +3 -16
  109. catalystwan/endpoints/configuration/policy/list/geo_location.py +3 -16
  110. catalystwan/endpoints/configuration/policy/list/identity.py +48 -0
  111. catalystwan/endpoints/configuration/policy/list/ips_signature.py +6 -15
  112. catalystwan/endpoints/configuration/policy/list/ipv6_prefix.py +3 -16
  113. catalystwan/endpoints/configuration/policy/list/local_app.py +3 -16
  114. catalystwan/endpoints/configuration/policy/list/local_domain.py +3 -16
  115. catalystwan/endpoints/configuration/policy/list/media_profile.py +52 -0
  116. catalystwan/endpoints/configuration/policy/list/mirror.py +3 -16
  117. catalystwan/endpoints/configuration/policy/list/modem_pass_through.py +52 -0
  118. catalystwan/endpoints/configuration/policy/list/policer.py +3 -16
  119. catalystwan/endpoints/configuration/policy/list/port.py +3 -16
  120. catalystwan/endpoints/configuration/policy/list/preferred_color_group.py +6 -15
  121. catalystwan/endpoints/configuration/policy/list/prefix.py +4 -16
  122. catalystwan/endpoints/configuration/policy/list/protocol_name.py +6 -15
  123. catalystwan/endpoints/configuration/policy/list/region.py +2 -10
  124. catalystwan/endpoints/configuration/policy/list/scalable_group_tag.py +52 -0
  125. catalystwan/endpoints/configuration/policy/list/site.py +3 -16
  126. catalystwan/endpoints/configuration/policy/list/sla.py +3 -16
  127. catalystwan/endpoints/configuration/policy/list/supervisory_disconnect.py +52 -0
  128. catalystwan/endpoints/configuration/policy/list/threat_grid_api_key.py +52 -0
  129. catalystwan/endpoints/configuration/policy/list/tloc.py +3 -16
  130. catalystwan/endpoints/configuration/policy/list/translation_profile.py +52 -0
  131. catalystwan/endpoints/configuration/policy/list/translation_rules.py +52 -0
  132. catalystwan/endpoints/configuration/policy/list/trunkgroup.py +48 -0
  133. catalystwan/endpoints/configuration/policy/list/umbrella_data.py +52 -0
  134. catalystwan/endpoints/configuration/policy/list/url_allow_list.py +3 -16
  135. catalystwan/endpoints/configuration/policy/list/url_block_list.py +3 -16
  136. catalystwan/endpoints/configuration/policy/list/vpn.py +3 -16
  137. catalystwan/endpoints/configuration/policy/list/zone.py +3 -16
  138. catalystwan/endpoints/configuration/policy/security_template.py +2 -3
  139. catalystwan/endpoints/configuration/policy/voice_template.py +39 -0
  140. catalystwan/endpoints/configuration/policy_group.py +30 -0
  141. catalystwan/endpoints/configuration/software_actions.py +2 -4
  142. catalystwan/endpoints/configuration/topology_group.py +51 -0
  143. catalystwan/endpoints/configuration_dashboard_status.py +2 -2
  144. catalystwan/endpoints/configuration_device_template.py +15 -1
  145. catalystwan/endpoints/configuration_feature_profile.py +8 -11
  146. catalystwan/endpoints/configuration_general_template.py +31 -0
  147. catalystwan/endpoints/configuration_group.py +28 -5
  148. catalystwan/endpoints/configuration_settings.py +90 -1
  149. catalystwan/endpoints/configuration_template_master.py +48 -0
  150. catalystwan/endpoints/endpoints_container.py +79 -19
  151. catalystwan/endpoints/real_time_monitoring/reboot_history.py +1 -3
  152. catalystwan/endpoints/tenant_migration.py +2 -0
  153. catalystwan/exceptions.py +17 -0
  154. catalystwan/integration_tests/base.py +81 -0
  155. catalystwan/integration_tests/feature_profile/sdwan/__init__.py +0 -0
  156. catalystwan/integration_tests/feature_profile/sdwan/policy/__init__.py +0 -0
  157. catalystwan/integration_tests/feature_profile/sdwan/policy/base.py +33 -0
  158. catalystwan/integration_tests/feature_profile/sdwan/policy/test_extended_community.py +33 -0
  159. catalystwan/integration_tests/feature_profile/sdwan/policy/test_security_app_list.py +32 -0
  160. catalystwan/integration_tests/feature_profile/sdwan/test_application_priority.py +433 -0
  161. catalystwan/integration_tests/feature_profile/sdwan/test_cli.py +54 -0
  162. catalystwan/integration_tests/feature_profile/sdwan/test_dns_security.py +106 -0
  163. catalystwan/integration_tests/feature_profile/sdwan/test_other.py +49 -0
  164. catalystwan/integration_tests/feature_profile/sdwan/test_service.py +1078 -0
  165. catalystwan/integration_tests/feature_profile/sdwan/test_sig_security.py +322 -0
  166. catalystwan/integration_tests/feature_profile/sdwan/test_ssl_decryption.py +85 -0
  167. catalystwan/integration_tests/feature_profile/sdwan/test_system.py +368 -0
  168. catalystwan/integration_tests/feature_profile/sdwan/test_tracker.py +127 -0
  169. catalystwan/integration_tests/feature_profile/sdwan/test_transport.py +1698 -0
  170. catalystwan/integration_tests/feature_profile/sdwan/topology/test_topology.py +93 -0
  171. catalystwan/integration_tests/profile_builder/__init__.py +0 -0
  172. catalystwan/integration_tests/profile_builder/test_pb_service.py +197 -0
  173. catalystwan/integration_tests/profile_builder/test_pb_transport.py +226 -0
  174. catalystwan/integration_tests/profile_builder/test_pb_uc_voice.py +277 -0
  175. catalystwan/integration_tests/test_data/__init__.py +117 -0
  176. catalystwan/integration_tests/test_find_template_values.py +7 -18
  177. catalystwan/integration_tests/test_network_hierarchy.py +82 -0
  178. catalystwan/integration_tests/test_settings.py +30 -0
  179. catalystwan/models/common.py +1898 -2
  180. catalystwan/models/configuration/common.py +1 -0
  181. catalystwan/models/configuration/feature_profile/common.py +634 -149
  182. catalystwan/models/configuration/feature_profile/parcel.py +238 -0
  183. catalystwan/models/configuration/feature_profile/sdwan/acl/__init__.py +13 -0
  184. catalystwan/models/configuration/feature_profile/sdwan/acl/ipv4acl.py +298 -0
  185. catalystwan/models/configuration/feature_profile/sdwan/acl/ipv6acl.py +344 -0
  186. catalystwan/models/configuration/feature_profile/sdwan/application_priority/__init__.py +218 -0
  187. catalystwan/models/configuration/feature_profile/sdwan/application_priority/cloud_probe.py +61 -0
  188. catalystwan/models/configuration/feature_profile/sdwan/application_priority/policy_settings.py +31 -0
  189. catalystwan/models/configuration/feature_profile/sdwan/application_priority/qos_policy.py +102 -0
  190. catalystwan/models/configuration/feature_profile/sdwan/application_priority/traffic_policy.py +1057 -0
  191. catalystwan/models/configuration/feature_profile/sdwan/cli/__init__.py +23 -0
  192. catalystwan/models/configuration/feature_profile/sdwan/cli/config.py +18 -0
  193. catalystwan/models/configuration/feature_profile/sdwan/cli/full_config.py +15 -0
  194. catalystwan/models/configuration/feature_profile/sdwan/dns_security/__init__.py +13 -0
  195. catalystwan/models/configuration/feature_profile/sdwan/dns_security/dns.py +110 -0
  196. catalystwan/models/configuration/feature_profile/sdwan/embedded_security/__init__.py +23 -0
  197. catalystwan/models/configuration/feature_profile/sdwan/embedded_security/ngfirewall.py +493 -0
  198. catalystwan/models/configuration/feature_profile/sdwan/embedded_security/policy.py +171 -0
  199. catalystwan/models/configuration/feature_profile/sdwan/other/__init__.py +25 -0
  200. catalystwan/models/configuration/feature_profile/sdwan/other/cybervision.py +44 -0
  201. catalystwan/models/configuration/feature_profile/sdwan/other/thousandeyes.py +147 -0
  202. catalystwan/models/configuration/feature_profile/sdwan/other/ucse.py +110 -0
  203. catalystwan/models/configuration/feature_profile/sdwan/policy_object/__init__.py +62 -48
  204. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/app_probe.py +34 -20
  205. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/application_list.py +8 -6
  206. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/as_path.py +22 -0
  207. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/color_list.py +7 -5
  208. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/data_prefix.py +13 -4
  209. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/expanded_community_list.py +9 -7
  210. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/extended_community.py +34 -0
  211. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/fowarding_class.py +7 -5
  212. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv4_network_object.py +15 -0
  213. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv4_service_object.py +254 -0
  214. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_data_prefix.py +11 -9
  215. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_prefix_list.py +25 -10
  216. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/mirror.py +27 -0
  217. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/network_object_group.py +15 -0
  218. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/object_group.py +15 -0
  219. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/{policier.py → policer.py} +12 -10
  220. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefered_group_color.py +29 -10
  221. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefix_list.py +23 -8
  222. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/service_object_group.py +21 -0
  223. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/sla_class.py +12 -31
  224. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/standard_community.py +16 -10
  225. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/tloc_list.py +8 -7
  226. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/aip.py +64 -0
  227. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/amp.py +79 -0
  228. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/application_list.py +8 -6
  229. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/data_prefix.py +7 -5
  230. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/fqdn.py +7 -5
  231. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/geolocation_list.py +7 -5
  232. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/identity.py +30 -0
  233. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/intrusion_prevention.py +58 -0
  234. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ips_signature.py +7 -5
  235. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/local_domain.py +7 -5
  236. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/object_group.py +72 -0
  237. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/protocol_list.py +7 -5
  238. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/rule_set.py +137 -0
  239. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/scalable_group_tag.py +26 -0
  240. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/security_port.py +21 -11
  241. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ssl_decryption.py +126 -0
  242. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ssl_decryption_profile.py +165 -0
  243. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url.py +15 -10
  244. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url_filtering.py +148 -0
  245. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/zone.py +14 -18
  246. catalystwan/models/configuration/feature_profile/sdwan/routing/__init__.py +26 -0
  247. catalystwan/models/configuration/feature_profile/sdwan/routing/bgp.py +609 -0
  248. catalystwan/models/configuration/feature_profile/sdwan/{service → routing}/ospf.py +55 -47
  249. catalystwan/models/configuration/feature_profile/sdwan/{service → routing}/ospfv3.py +74 -72
  250. catalystwan/models/configuration/feature_profile/sdwan/service/__init__.py +91 -0
  251. catalystwan/models/configuration/feature_profile/sdwan/service/appqoe.py +76 -41
  252. catalystwan/models/configuration/feature_profile/sdwan/service/dhcp_server.py +107 -64
  253. catalystwan/models/configuration/feature_profile/sdwan/service/dual_router_ha.py +26 -0
  254. catalystwan/models/configuration/feature_profile/sdwan/service/eigrp.py +39 -42
  255. catalystwan/models/configuration/feature_profile/sdwan/service/lan/common.py +7 -88
  256. catalystwan/models/configuration/feature_profile/sdwan/service/lan/ethernet.py +231 -155
  257. catalystwan/models/configuration/feature_profile/sdwan/service/lan/gre.py +38 -108
  258. catalystwan/models/configuration/feature_profile/sdwan/service/lan/ipsec.py +77 -84
  259. catalystwan/models/configuration/feature_profile/sdwan/service/lan/multilink.py +101 -0
  260. catalystwan/models/configuration/feature_profile/sdwan/service/lan/svi.py +62 -56
  261. catalystwan/models/configuration/feature_profile/sdwan/service/lan/vpn.py +111 -120
  262. catalystwan/models/configuration/feature_profile/sdwan/service/multicast.py +56 -57
  263. catalystwan/models/configuration/feature_profile/sdwan/service/object_tracker.py +15 -21
  264. catalystwan/models/configuration/feature_profile/sdwan/service/route_policy.py +358 -110
  265. catalystwan/models/configuration/feature_profile/sdwan/service/service_chain.py +38 -0
  266. catalystwan/models/configuration/feature_profile/sdwan/service/service_insertion_attachment.py +17 -25
  267. catalystwan/models/configuration/feature_profile/sdwan/service/switchport.py +50 -58
  268. catalystwan/models/configuration/feature_profile/sdwan/service/tracker.py +12 -21
  269. catalystwan/models/configuration/feature_profile/sdwan/service/wireless_lan.py +27 -31
  270. catalystwan/models/configuration/feature_profile/sdwan/sig_security/__init__.py +19 -0
  271. catalystwan/models/configuration/feature_profile/sdwan/sig_security/sig_security.py +379 -0
  272. catalystwan/models/configuration/feature_profile/sdwan/system/__init__.py +59 -0
  273. catalystwan/models/configuration/feature_profile/sdwan/system/aaa.py +58 -10
  274. catalystwan/models/configuration/feature_profile/sdwan/system/banner.py +30 -0
  275. catalystwan/models/configuration/feature_profile/sdwan/system/basic.py +290 -0
  276. catalystwan/models/configuration/feature_profile/sdwan/system/bfd.py +69 -0
  277. catalystwan/models/configuration/feature_profile/sdwan/system/device_access.py +157 -0
  278. catalystwan/models/configuration/feature_profile/sdwan/system/device_access_ipv6.py +157 -0
  279. catalystwan/models/configuration/feature_profile/sdwan/system/global_parcel.py +163 -0
  280. catalystwan/models/configuration/feature_profile/sdwan/system/logging_parcel.py +162 -0
  281. catalystwan/models/configuration/feature_profile/sdwan/system/mrf.py +75 -0
  282. catalystwan/models/configuration/feature_profile/sdwan/system/ntp.py +103 -0
  283. catalystwan/models/configuration/feature_profile/sdwan/system/omp.py +120 -0
  284. catalystwan/models/configuration/feature_profile/sdwan/system/security.py +179 -0
  285. catalystwan/models/configuration/feature_profile/sdwan/system/snmp.py +173 -0
  286. catalystwan/models/configuration/feature_profile/sdwan/topology/__init__.py +29 -0
  287. catalystwan/models/configuration/feature_profile/sdwan/topology/custom_control.py +425 -0
  288. catalystwan/models/configuration/feature_profile/sdwan/topology/hubspoke.py +60 -0
  289. catalystwan/models/configuration/feature_profile/sdwan/topology/mesh.py +23 -0
  290. catalystwan/models/configuration/feature_profile/sdwan/trackers/__init__.py +36 -0
  291. catalystwan/models/configuration/feature_profile/sdwan/trackers/tracker.py +96 -0
  292. catalystwan/models/configuration/feature_profile/sdwan/trackers/tracker_group.py +63 -0
  293. catalystwan/models/configuration/feature_profile/sdwan/transport/__init__.py +93 -0
  294. catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_controller.py +26 -23
  295. catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_profile.py +71 -0
  296. catalystwan/models/configuration/feature_profile/sdwan/transport/gps.py +37 -0
  297. catalystwan/models/configuration/feature_profile/sdwan/transport/management/ethernet.py +121 -0
  298. catalystwan/models/configuration/feature_profile/sdwan/transport/t1e1controller.py +124 -0
  299. catalystwan/models/configuration/feature_profile/sdwan/transport/vpn.py +285 -0
  300. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/cellular.py +173 -0
  301. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/ethernet.py +389 -0
  302. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/gre.py +46 -0
  303. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/ipsec.py +137 -0
  304. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/multilink.py +219 -0
  305. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/protocol_over.py +405 -0
  306. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/t1e1serial.py +195 -0
  307. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/__init__.py +62 -0
  308. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/analog_interface.py +436 -0
  309. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/call_routing.py +179 -0
  310. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/digital_interface.py +380 -0
  311. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/dsp_farm.py +193 -0
  312. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/media_profile.py +17 -0
  313. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/server_group.py +51 -0
  314. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/srst.py +86 -0
  315. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/supervisory_disconnect.py +69 -0
  316. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/translation_profile.py +42 -0
  317. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/translation_rule.py +31 -0
  318. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/trunk_group.py +26 -0
  319. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/voice_global.py +57 -0
  320. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/voice_tenant.py +40 -0
  321. catalystwan/models/configuration/network_hierarchy/__init__.py +22 -0
  322. catalystwan/models/configuration/network_hierarchy/cflowd.py +120 -0
  323. catalystwan/models/configuration/network_hierarchy/node.py +88 -0
  324. catalystwan/models/configuration/policy_group.py +74 -0
  325. catalystwan/models/configuration/profile_type.py +1 -6
  326. catalystwan/models/configuration/topology_group.py +52 -0
  327. catalystwan/models/policy/__init__.py +275 -69
  328. catalystwan/models/policy/centralized.py +26 -29
  329. catalystwan/models/policy/{definitions → definition}/access_control_list.py +47 -17
  330. catalystwan/models/policy/{definitions → definition}/access_control_list_ipv6.py +42 -18
  331. catalystwan/models/policy/definition/aip.py +60 -0
  332. catalystwan/models/policy/definition/amp.py +65 -0
  333. catalystwan/models/policy/definition/app_route.py +246 -0
  334. catalystwan/models/policy/definition/cflowd.py +95 -0
  335. catalystwan/models/policy/{definitions → definition}/control.py +48 -25
  336. catalystwan/models/policy/{definitions → definition}/device_access.py +22 -11
  337. catalystwan/models/policy/{definitions → definition}/device_access_ipv6.py +20 -11
  338. catalystwan/models/policy/definition/dial_peer.py +60 -0
  339. catalystwan/models/policy/definition/dns_security.py +130 -0
  340. catalystwan/models/policy/definition/fxo_port.py +63 -0
  341. catalystwan/models/policy/definition/fxs_did_port.py +58 -0
  342. catalystwan/models/policy/definition/fxs_port.py +56 -0
  343. catalystwan/models/policy/{definitions → definition}/hub_and_spoke.py +18 -4
  344. catalystwan/models/policy/definition/intrusion_prevention.py +55 -0
  345. catalystwan/models/policy/{definitions → definition}/mesh.py +13 -1
  346. catalystwan/models/policy/definition/pri_isdn_port.py +48 -0
  347. catalystwan/models/policy/{definitions → definition}/qos_map.py +39 -32
  348. catalystwan/models/policy/{definitions → definition}/rewrite.py +12 -2
  349. catalystwan/models/policy/definition/route_policy.py +187 -0
  350. catalystwan/models/policy/{definitions → definition}/rule_set.py +66 -48
  351. catalystwan/models/policy/{definitions → definition}/security_group.py +38 -14
  352. catalystwan/models/policy/definition/srst_phone_profile.py +37 -0
  353. catalystwan/models/policy/definition/ssl_decryption.py +209 -0
  354. catalystwan/models/policy/definition/ssl_decryption_utd_profile.py +87 -0
  355. catalystwan/models/policy/{definitions → definition}/traffic_data.py +184 -61
  356. catalystwan/models/policy/definition/url_filtering.py +70 -0
  357. catalystwan/models/policy/{definitions → definition}/vpn_membership.py +13 -1
  358. catalystwan/models/policy/definition/vpn_qos_map.py +46 -0
  359. catalystwan/models/policy/{definitions → definition}/zone_based_firewall.py +93 -32
  360. catalystwan/models/policy/list/app.py +44 -0
  361. catalystwan/models/policy/list/app_probe.py +42 -0
  362. catalystwan/models/policy/list/as_path.py +30 -0
  363. catalystwan/models/policy/list/class_map.py +30 -0
  364. catalystwan/models/policy/list/color.py +28 -0
  365. catalystwan/models/policy/list/communities.py +83 -0
  366. catalystwan/models/policy/list/data_ipv6_prefix.py +30 -0
  367. catalystwan/models/policy/list/data_prefix.py +30 -0
  368. catalystwan/models/policy/list/fax_protocol.py +45 -0
  369. catalystwan/models/policy/list/fqdn.py +24 -0
  370. catalystwan/models/policy/list/geo_location.py +33 -0
  371. catalystwan/models/policy/list/identity.py +29 -0
  372. catalystwan/models/policy/list/ips_signature.py +27 -0
  373. catalystwan/models/policy/list/ipv6_prefix.py +33 -0
  374. catalystwan/models/policy/list/local_app.py +45 -0
  375. catalystwan/models/policy/list/local_domain.py +36 -0
  376. catalystwan/models/policy/list/media_profile.py +44 -0
  377. catalystwan/models/policy/list/mirror.py +27 -0
  378. catalystwan/models/policy/list/modem_pass_through.py +27 -0
  379. catalystwan/models/policy/list/policer.py +39 -0
  380. catalystwan/models/policy/list/port.py +33 -0
  381. catalystwan/models/policy/list/preferred_color_group.py +82 -0
  382. catalystwan/models/policy/list/prefix.py +33 -0
  383. catalystwan/models/policy/list/protocol_name.py +26 -0
  384. catalystwan/models/policy/list/region.py +45 -0
  385. catalystwan/models/policy/list/scalable_group_tag.py +30 -0
  386. catalystwan/models/policy/list/site.py +34 -0
  387. catalystwan/models/policy/list/sla.py +77 -0
  388. catalystwan/models/policy/list/supervisory_disconnect.py +62 -0
  389. catalystwan/models/policy/list/threat_grid_api_key.py +32 -0
  390. catalystwan/models/policy/list/tloc.py +32 -0
  391. catalystwan/models/policy/list/translation_profile.py +32 -0
  392. catalystwan/models/policy/list/translation_rules.py +29 -0
  393. catalystwan/models/policy/list/trunkgroup.py +56 -0
  394. catalystwan/models/policy/list/umbrella_data.py +30 -0
  395. catalystwan/models/policy/list/url.py +39 -0
  396. catalystwan/models/policy/list/vpn.py +40 -0
  397. catalystwan/models/policy/list/zone.py +46 -0
  398. catalystwan/models/policy/localized.py +34 -16
  399. catalystwan/models/policy/policy.py +13 -9
  400. catalystwan/models/policy/policy_definition.py +673 -173
  401. catalystwan/models/policy/policy_list.py +38 -27
  402. catalystwan/models/policy/security.py +145 -46
  403. catalystwan/models/policy/voice.py +77 -0
  404. catalystwan/models/settings.py +41 -0
  405. catalystwan/models/templates.py +79 -0
  406. catalystwan/response.py +6 -2
  407. catalystwan/session.py +1 -1
  408. catalystwan/tests/builders/test_report.py +60 -0
  409. catalystwan/tests/builders/uc_voice.py +85 -0
  410. catalystwan/tests/models/__init__.py +0 -0
  411. catalystwan/tests/models/test_digital_interface.py +56 -0
  412. catalystwan/tests/templates/definitions/aaa_basic.json +96 -0
  413. catalystwan/tests/templates/definitions/aaa_complex.json +464 -0
  414. catalystwan/tests/templates/definitions/{iuo.json → cisco_aaa.json} +44 -15
  415. catalystwan/tests/templates/definitions/cisco_aaa_complex.json +361 -0
  416. catalystwan/tests/templates/definitions/cisco_logging_complex.json +268 -0
  417. catalystwan/tests/templates/definitions/cisco_ntp_complex.json +143 -0
  418. catalystwan/tests/templates/definitions/cisco_omp_complex.json +175 -0
  419. catalystwan/tests/templates/definitions/cisco_ospf_complex.json +302 -0
  420. catalystwan/tests/templates/definitions/cisco_sig.json +405 -0
  421. catalystwan/tests/templates/definitions/cisco_snmp_complex.json +258 -0
  422. catalystwan/tests/templates/definitions/cisco_system_complex.json +502 -0
  423. catalystwan/tests/templates/definitions/{Basic_Cisco_VPN_Model.json → cisco_vpn_basic.json} +2 -2
  424. catalystwan/tests/templates/definitions/{complex_cisco_vpn.json → cisco_vpn_complex.json} +27 -12
  425. catalystwan/tests/templates/definitions/cisco_vpn_interface_complex.json +821 -0
  426. catalystwan/tests/templates/definitions/omp_vsmart_1.json +26 -0
  427. catalystwan/tests/templates/definitions/{omp_2.json → omp_vsmart_2.json} +16 -2
  428. catalystwan/tests/templates/definitions/{omp_3.json → omp_vsmart_3.json} +16 -2
  429. catalystwan/tests/templates/definitions/omp_vsmart_complex.json +73 -0
  430. catalystwan/tests/templates/definitions/security_vsmart_complex.json +24 -0
  431. catalystwan/tests/templates/definitions/system_vsmart_complex.json +193 -0
  432. catalystwan/tests/templates/definitions/vpn_vsmart_basic.json +17 -0
  433. catalystwan/tests/templates/definitions/vpn_vsmart_complex.json +179 -0
  434. catalystwan/tests/templates/definitions/vpn_vsmart_interface_basic.json +42 -0
  435. catalystwan/tests/templates/definitions/vpn_vsmart_interface_complex.json +208 -0
  436. catalystwan/tests/templates/models/__init__.py +46 -13
  437. catalystwan/tests/templates/models/aaa.py +106 -0
  438. catalystwan/tests/templates/models/cisco_aaa.py +81 -48
  439. catalystwan/tests/templates/models/cisco_banner.py +2 -2
  440. catalystwan/tests/templates/models/cisco_bfd.py +4 -6
  441. catalystwan/tests/templates/models/cisco_logging.py +65 -0
  442. catalystwan/tests/templates/models/cisco_ntp.py +17 -0
  443. catalystwan/tests/templates/models/cisco_omp.py +37 -0
  444. catalystwan/tests/templates/models/cisco_ospf.py +60 -0
  445. catalystwan/tests/templates/models/cisco_secure_internet_gateway.py +95 -0
  446. catalystwan/tests/templates/models/cisco_snmp.py +40 -0
  447. catalystwan/tests/templates/models/cisco_system.py +108 -3
  448. catalystwan/tests/templates/models/cisco_vpn.py +42 -72
  449. catalystwan/tests/templates/models/cisco_vpn_interface.py +200 -0
  450. catalystwan/tests/templates/models/omp_vsmart.py +28 -8
  451. catalystwan/tests/templates/models/security_vsmart.py +11 -0
  452. catalystwan/tests/templates/models/system_vsmart.py +37 -0
  453. catalystwan/tests/templates/models/vpn_vsmart.py +32 -0
  454. catalystwan/tests/templates/models/vpn_vsmart_interface.py +54 -0
  455. catalystwan/tests/templates/schemas/aaa.json +1096 -0
  456. catalystwan/tests/templates/schemas/cedge_aaa.json +1 -1
  457. catalystwan/tests/templates/schemas/cisco_logging.json +577 -0
  458. catalystwan/tests/templates/schemas/cisco_ntp.json +265 -0
  459. catalystwan/tests/templates/schemas/cisco_omp.json +479 -0
  460. catalystwan/tests/templates/schemas/cisco_ospf.json +908 -0
  461. catalystwan/tests/templates/schemas/cisco_secure_internet_gateway.json +1520 -0
  462. catalystwan/tests/templates/schemas/cisco_snmp.json +561 -0
  463. catalystwan/tests/templates/schemas/cisco_system.json +242 -0
  464. catalystwan/tests/templates/schemas/cisco_vpn.json +53 -1
  465. catalystwan/tests/templates/schemas/cisco_vpn_interface.json +3348 -0
  466. catalystwan/tests/templates/schemas/omp-vsmart.json +20 -0
  467. catalystwan/tests/templates/schemas/security-vsmart.json +58 -0
  468. catalystwan/tests/templates/schemas/system-vsmart.json +2585 -0
  469. catalystwan/tests/templates/schemas/vpn-vsmart-interface.json +859 -0
  470. catalystwan/tests/templates/schemas/vpn-vsmart.json +445 -0
  471. catalystwan/tests/templates/test_chose_model.py +6 -10
  472. catalystwan/tests/templates/test_deserialize_model.py +4 -4
  473. catalystwan/tests/templates/test_find_template_values.py +229 -0
  474. catalystwan/tests/templates/test_find_template_values_2.py +193 -0
  475. catalystwan/tests/templates/test_serialize_model.py +1 -2
  476. catalystwan/tests/test_cli_template.py +8 -9
  477. catalystwan/tests/test_endpoints.py +42 -11
  478. catalystwan/tests/test_feature_profile_api.py +282 -0
  479. catalystwan/tests/test_models_common.py +53 -0
  480. catalystwan/tests/test_templates.py +16 -19
  481. catalystwan/utils/feature_template/find_template_values.py +17 -4
  482. catalystwan/utils/model.py +45 -0
  483. catalystwan/utils/persona.py +5 -0
  484. catalystwan/utils/type_check.py +22 -0
  485. catalystwan/workflows/backup_restore_device_templates.py +467 -0
  486. catalystwan/workflows/tenant_migration.py +1 -1
  487. {catalystwan-0.41.2.dist-info → catalystwan-0.41.2.dev1.dist-info}/METADATA +20 -1
  488. catalystwan-0.41.2.dev1.dist-info/RECORD +636 -0
  489. catalystwan/ENDPOINTS.md +0 -611
  490. catalystwan/api/configuration_groups/parcels/cellular_controller.py +0 -33
  491. catalystwan/api/templates/device_template/device_template_payload.json.j2 +0 -19
  492. catalystwan/models/configuration/config_migration.py +0 -36
  493. catalystwan/models/configuration/feature_profile/sdwan/management/vpn.py +0 -26
  494. catalystwan/models/configuration/feature_profile/sdwan/service/acl.py +0 -409
  495. catalystwan/models/configuration/feature_profile/sdwan/service/bgp.py +0 -288
  496. catalystwan/models/policy/lists.py +0 -330
  497. catalystwan/models/policy/lists_entries.py +0 -444
  498. catalystwan/tests/templates/definitions/complex_aaa.json +0 -277
  499. catalystwan/tests/templates/definitions/omp_1.json +0 -11
  500. catalystwan/utils/timezone.py +0 -422
  501. catalystwan-0.41.2.dist-info/RECORD +0 -353
  502. /catalystwan/tests/templates/definitions/{banner_1.json → cisco_banner.json} +0 -0
  503. {catalystwan-0.41.2.dist-info → catalystwan-0.41.2.dev1.dist-info}/LICENSE +0 -0
  504. {catalystwan-0.41.2.dist-info → catalystwan-0.41.2.dev1.dist-info}/WHEEL +0 -0
@@ -0,0 +1,44 @@
1
+ # Copyright 2025 Cisco Systems, Inc. and its affiliates
2
+ from typing import List, Literal, Optional, Union
3
+
4
+ from pydantic import AliasPath, BaseModel, Field
5
+
6
+ from catalystwan.api.configuration_groups.parcel import Default, Global, Variable, _ParcelBase
7
+ from catalystwan.models.common import SubnetMask
8
+
9
+
10
+ class VirtualApplication(BaseModel):
11
+ capture_interface_i_p: Union[Global[str], Default[None]] = Field(
12
+ validation_alias="captureInterfaceIP", serialization_alias="captureInterfaceIP"
13
+ )
14
+ capture_interface_subnet_mask: Union[Global[SubnetMask], Default[None]] = Field(
15
+ validation_alias="captureInterfaceSubnetMask", serialization_alias="captureInterfaceSubnetMask"
16
+ )
17
+ multiple_erspan_source_interfaces: List[Global[str]] = Field(
18
+ validation_alias="multipleErspanSourceInterfaces",
19
+ serialization_alias="multipleErspanSourceInterfaces",
20
+ description="multipleErspanSourceInterfaces",
21
+ )
22
+ virtual_port_group6_ip: Union[Global[str], Default[None]] = Field(
23
+ validation_alias="virtualPortGroup6Ip", serialization_alias="virtualPortGroup6Ip"
24
+ )
25
+ collection_interface_i_p: Optional[Variable] = Field(
26
+ default=None, validation_alias="collectionInterfaceIP", serialization_alias="collectionInterfaceIP"
27
+ )
28
+ collection_interface_subnet_mask: Optional[Variable] = Field(
29
+ default=None,
30
+ validation_alias="collectionInterfaceSubnetMask",
31
+ serialization_alias="collectionInterfaceSubnetMask",
32
+ )
33
+ cvc_id: Optional[Global[str]] = Field(default=None, validation_alias="cvcId", serialization_alias="cvcId")
34
+ virtual_port_group5_ip: Optional[Variable] = Field(
35
+ default=None, validation_alias="virtualPortGroup5Ip", serialization_alias="virtualPortGroup5Ip"
36
+ )
37
+
38
+
39
+ class CyberVisonParcel(_ParcelBase):
40
+ type_: Literal["cybervision"] = Field(default="cybervision", exclude=True)
41
+ virtual_application: VirtualApplication = Field(
42
+ validation_alias=AliasPath("data", "virtualApplication"),
43
+ description="Virtual application Instance",
44
+ )
@@ -0,0 +1,147 @@
1
+ # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
+ from __future__ import annotations
3
+
4
+ from ipaddress import IPv4Address
5
+ from typing import List, Literal, Optional, Union
6
+
7
+ from pydantic import AliasPath, BaseModel, ConfigDict, Field
8
+
9
+ from catalystwan.api.configuration_groups.parcel import Default, Global, Variable, _ParcelBase, as_global, as_variable
10
+ from catalystwan.models.common import SubnetMask
11
+
12
+ ProxyTypeStatic = Literal["static"]
13
+ ProxyTypePac = Literal["pac"]
14
+ ProxyTypeNone = Literal["none"]
15
+
16
+
17
+ class ProxyConfigStatic(BaseModel):
18
+ """
19
+ Web Proxy Type Config
20
+ """
21
+
22
+ model_config = ConfigDict(
23
+ extra="forbid",
24
+ populate_by_name=True,
25
+ )
26
+ proxy_type: Global[ProxyTypeStatic] = Field(
27
+ default=as_global("static", ProxyTypeStatic),
28
+ frozen=True,
29
+ serialization_alias="proxyType",
30
+ validation_alias="proxyType",
31
+ description="Select Web Proxy Type",
32
+ )
33
+ proxy_host: Union[Global[str], Variable] = Field(
34
+ default=as_variable("{{thousand_eyes_proxyconfig_proxyhost}}"),
35
+ serialization_alias="proxyHost",
36
+ validation_alias="proxyHost",
37
+ description="Set the Proxy Host",
38
+ )
39
+ proxy_port: Union[Global[int], Variable] = Field(
40
+ default=as_variable("{{thousand_eyes_proxyconfig_proxyport}}"),
41
+ serialization_alias="proxyPort",
42
+ validation_alias="proxyPort",
43
+ description="Set the Proxy Port",
44
+ )
45
+
46
+
47
+ class ProxyConfigPac(BaseModel):
48
+ """
49
+ Web Proxy Type Config
50
+ """
51
+
52
+ model_config = ConfigDict(
53
+ extra="forbid",
54
+ populate_by_name=True,
55
+ )
56
+ proxy_type: Global[ProxyTypePac] = Field(
57
+ default=as_global("pac", ProxyTypePac),
58
+ frozen=True,
59
+ serialization_alias="proxyType",
60
+ validation_alias="proxyType",
61
+ description="Select Web Proxy Type",
62
+ )
63
+ pac_url: Union[Global[str], Variable] = Field(
64
+ default=as_variable("{{thousand_eyes_proxyconfig_pacurl}}"),
65
+ serialization_alias="pacUrl",
66
+ validation_alias="pacUrl",
67
+ description="Set the proxy PAC url",
68
+ )
69
+
70
+
71
+ class ProxyConfigNone(BaseModel):
72
+ """
73
+ Web Proxy Type Config
74
+ """
75
+
76
+ model_config = ConfigDict(
77
+ extra="forbid",
78
+ populate_by_name=True,
79
+ )
80
+ proxy_type: Global[ProxyTypeNone] = Field(
81
+ default=as_global("none", ProxyTypeNone),
82
+ frozen=True,
83
+ serialization_alias="proxyType",
84
+ validation_alias="proxyType",
85
+ description="Select Web Proxy Type",
86
+ )
87
+
88
+
89
+ class VirtualApplicationItem(BaseModel):
90
+ model_config = ConfigDict(
91
+ extra="forbid",
92
+ populate_by_name=True,
93
+ )
94
+ token: Union[Global[str], Variable] = Field(
95
+ default=as_variable("{{thousand_eyes_token}}"), description="Set the Account Group Token"
96
+ )
97
+ vpn: Union[Global[int], Variable, Default[None]] = Field(
98
+ default=Default[None](value=None), description="VPN number"
99
+ )
100
+ te_mgmt_ip: Optional[Union[Variable, Global[IPv4Address]]] = Field(
101
+ default=None,
102
+ serialization_alias="teMgmtIp",
103
+ validation_alias="teMgmtIp",
104
+ description="Set the Agent IP Address",
105
+ )
106
+ te_mgmt_subnet_mask: Optional[Union[Variable, Global[SubnetMask]]] = Field(
107
+ default=None,
108
+ serialization_alias="teMgmtSubnetMask",
109
+ validation_alias="teMgmtSubnetMask",
110
+ description="Set the Agent SubnetMask",
111
+ )
112
+ te_vpg_ip: Optional[Union[Variable, Global[IPv4Address]]] = Field(
113
+ default=None,
114
+ serialization_alias="teVpgIp",
115
+ validation_alias="teVpgIp",
116
+ description="Set the Agent default gateway",
117
+ )
118
+ name_server: Union[Global[IPv4Address], Variable, Default[None]] = Field(
119
+ default=Default[None](value=None),
120
+ serialization_alias="nameServer",
121
+ validation_alias="nameServer",
122
+ description="Set the name server",
123
+ )
124
+ hostname: Union[Global[str], Variable, Default[None]] = Field(
125
+ default=Default[None](value=None), description="Set the host name"
126
+ )
127
+ proxy_config: Union[ProxyConfigStatic, ProxyConfigPac, ProxyConfigNone] = Field(
128
+ default_factory=ProxyConfigNone,
129
+ serialization_alias="proxyConfig",
130
+ validation_alias="proxyConfig",
131
+ description="Web Proxy Type Config",
132
+ )
133
+
134
+
135
+ class ThousandEyesParcel(_ParcelBase):
136
+ type_: Literal["thousandeyes"] = Field(default="thousandeyes", exclude=True)
137
+ model_config = ConfigDict(
138
+ extra="forbid",
139
+ populate_by_name=True,
140
+ )
141
+ virtual_application: List[VirtualApplicationItem] = Field(
142
+ default_factory=lambda: [VirtualApplicationItem()],
143
+ validation_alias=AliasPath("data", "virtualApplication"),
144
+ description="Virtual application Instance",
145
+ max_length=1,
146
+ min_length=1,
147
+ )
@@ -0,0 +1,110 @@
1
+ # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
+ from __future__ import annotations
3
+
4
+ from ipaddress import IPv4Address, IPv4Interface
5
+ from typing import List, Literal, Optional, Union
6
+
7
+ from pydantic import AliasPath, BaseModel, ConfigDict, Field
8
+
9
+ from catalystwan.api.configuration_groups.parcel import Default, Global, Variable, _ParcelBase, as_default, as_variable
10
+
11
+ FailOverType = Literal["ge2", "te2"]
12
+ LomType = Literal["ge1", "ge2", "ge3", "te2", "te3", "console", "failover"]
13
+
14
+
15
+ class SharedLom(BaseModel):
16
+ model_config = ConfigDict(
17
+ extra="forbid",
18
+ populate_by_name=True,
19
+ )
20
+ lom_type: Global[LomType] = Field(..., serialization_alias="lomType", validation_alias="lomType")
21
+ fail_over_type: Optional[Global[FailOverType]] = Field(
22
+ default=None, serialization_alias="failOverType", validation_alias="failOverType"
23
+ )
24
+
25
+
26
+ class AccessPort(BaseModel):
27
+ model_config = ConfigDict(
28
+ populate_by_name=True,
29
+ )
30
+ dedicated: Union[Global[bool], Default[bool]] = Field(default=as_default(True), description="Dedicated")
31
+ shared_lom: SharedLom = Field(..., serialization_alias="sharedLom", validation_alias="sharedLom")
32
+
33
+
34
+ class Ip(BaseModel):
35
+ model_config = ConfigDict(
36
+ extra="forbid",
37
+ populate_by_name=True,
38
+ )
39
+ address: Union[Global[str], Global[IPv4Interface], Variable] = Field(
40
+ default=as_variable("{{ipv4Addr}}"), description="Assign IPv4 address"
41
+ )
42
+ default_gateway: Union[Global[IPv4Address], Variable, Default[None]] = Field(
43
+ default=Default[None](value=None),
44
+ serialization_alias="defaultGateway",
45
+ validation_alias="defaultGateway",
46
+ description="Assign default gateway",
47
+ )
48
+
49
+
50
+ class Vlan(BaseModel):
51
+ model_config = ConfigDict(
52
+ populate_by_name=True,
53
+ )
54
+ vlan_id: Union[Global[int], Variable, Default[None]] = Field(
55
+ default=Default[None](value=None),
56
+ serialization_alias="vlanId",
57
+ validation_alias="vlanId",
58
+ description="Assign Vlan Id",
59
+ )
60
+ priority: Union[Global[int], Variable, Default[None]] = Field(
61
+ default=Default[None](value=None), description="Assign priority"
62
+ )
63
+
64
+
65
+ class Imc(BaseModel):
66
+ model_config = ConfigDict(
67
+ populate_by_name=True,
68
+ )
69
+ access_port: AccessPort = Field(..., serialization_alias="access-port", validation_alias="access-port")
70
+ ip: Ip = Field(default_factory=Ip)
71
+ vlan: Optional[Vlan] = None
72
+
73
+
74
+ class InterfaceItem(BaseModel):
75
+ model_config = ConfigDict(
76
+ extra="forbid",
77
+ populate_by_name=True,
78
+ )
79
+ if_name: Union[Global[str], Variable, Default[None]] = Field(
80
+ default=Default[None](value=None),
81
+ serialization_alias="ifName",
82
+ validation_alias="ifName",
83
+ description="Set Inteface name",
84
+ )
85
+ l3: Default[bool] = Field(default=as_default(True), description="L3")
86
+ ucse_interface_vpn: Optional[Union[Global[int], Variable, Default[None]]] = Field(
87
+ default=Default[None](value=None),
88
+ serialization_alias="ucseInterfaceVpn",
89
+ validation_alias="ucseInterfaceVpn",
90
+ description="UCSE Interface VPN",
91
+ )
92
+ address: Optional[Union[Global[str], Global[IPv4Interface], Variable]] = Field(
93
+ default=None, description="Assign IPv4 address"
94
+ )
95
+
96
+
97
+ class UcseParcel(_ParcelBase):
98
+ type_: Literal["ucse"] = Field(default="ucse", exclude=True)
99
+ model_config = ConfigDict(
100
+ extra="forbid",
101
+ populate_by_name=True,
102
+ )
103
+ bay: Global[int] = Field(..., validation_alias=AliasPath("data", "bay"), description="Bay")
104
+ slot: Global[int] = Field(..., validation_alias=AliasPath("data", "slot"), description="Slot")
105
+ imc: Optional[Imc] = Field(default=None, validation_alias=AliasPath("data", "imc"), description="IMC")
106
+ interface: Optional[List[InterfaceItem]] = Field(
107
+ default=None,
108
+ validation_alias=AliasPath("data", "interface"),
109
+ description="Interface name: GigabitEthernet0/<>/<> when present",
110
+ )
@@ -1,24 +1,30 @@
1
1
  # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
2
 
3
- from typing import List, Mapping, Union
3
+ from typing import List, Union
4
4
 
5
5
  from pydantic import Field
6
6
  from typing_extensions import Annotated
7
7
 
8
8
  from .policy.app_probe import AppProbeMapItem, AppProbeParcel
9
9
  from .policy.application_list import ApplicationFamilyListEntry, ApplicationListEntry, ApplicationListParcel
10
+ from .policy.as_path import AsPathParcel
10
11
  from .policy.color_list import ColorEntry, ColorParcel
11
12
  from .policy.data_prefix import DataPrefixEntry, DataPrefixParcel
12
13
  from .policy.expanded_community_list import ExpandedCommunityParcel
14
+ from .policy.extended_community import ExtendedCommunityParcel
13
15
  from .policy.fowarding_class import FowardingClassParcel, FowardingClassQueueEntry
14
16
  from .policy.ipv6_data_prefix import IPv6DataPrefixEntry, IPv6DataPrefixParcel
15
17
  from .policy.ipv6_prefix_list import IPv6PrefixListEntry, IPv6PrefixListParcel
16
- from .policy.policier import PolicierEntry, PolicierParcel
18
+ from .policy.mirror import MirrorParcel
19
+ from .policy.policer import PolicerEntry, PolicerParcel
17
20
  from .policy.prefered_group_color import Preference, PreferredColorGroupEntry, PreferredColorGroupParcel
18
21
  from .policy.prefix_list import PrefixListEntry, PrefixListParcel
19
- from .policy.sla_class import FallbackBestTunnel, SLAAppProbeClass, SLAClassCriteria, SLAClassListEntry, SLAClassParcel
22
+ from .policy.service_object_group import ServiceObjectGroupParcel
23
+ from .policy.sla_class import SLAClassListEntry, SLAClassParcel
20
24
  from .policy.standard_community import StandardCommunityEntry, StandardCommunityParcel
21
25
  from .policy.tloc_list import TlocEntry, TlocParcel
26
+ from .security.aip import AdvancedInspectionProfileParcel
27
+ from .security.amp import AdvancedMalwareProtectionParcel
22
28
  from .security.application_list import (
23
29
  SecurityApplicationFamilyListEntry,
24
30
  SecurityApplicationListEntry,
@@ -27,73 +33,65 @@ from .security.application_list import (
27
33
  from .security.data_prefix import SecurityDataPrefixEntry, SecurityDataPrefixParcel
28
34
  from .security.fqdn import FQDNDomainParcel, FQDNListEntry
29
35
  from .security.geolocation_list import GeoLocationListEntry, GeoLocationListParcel
36
+ from .security.identity import IdentityEntry, IdentityParcel
37
+ from .security.intrusion_prevention import IntrusionPreventionParcel
30
38
  from .security.ips_signature import IPSSignatureListEntry, IPSSignatureParcel
31
39
  from .security.local_domain import LocalDomainListEntry, LocalDomainParcel
40
+ from .security.object_group import SecurityObjectGroupEntries, SecurityObjectGroupParcel
32
41
  from .security.protocol_list import ProtocolListEntry, ProtocolListParcel
42
+ from .security.scalable_group_tag import ScalableGroupTagEntry, ScalableGroupTagParcel
33
43
  from .security.security_port import SecurityPortListEntry, SecurityPortParcel
34
- from .security.url import BaseURLListEntry, URLAllowParcel, URLBlockParcel
44
+ from .security.ssl_decryption import SslDecryptionParcel
45
+ from .security.ssl_decryption_profile import SslDecryptionProfileParcel
46
+ from .security.url import BaseURLListEntry, URLAllowParcel, URLBlockParcel, URLParcel
47
+ from .security.url_filtering import UrlFilteringParcel
35
48
  from .security.zone import SecurityZoneListEntry, SecurityZoneListParcel
36
49
 
37
50
  AnyPolicyObjectParcel = Annotated[
38
51
  Union[
52
+ AdvancedInspectionProfileParcel,
53
+ AdvancedMalwareProtectionParcel,
39
54
  AppProbeParcel,
40
55
  ApplicationListParcel,
56
+ AsPathParcel,
41
57
  ColorParcel,
42
58
  DataPrefixParcel,
43
59
  ExpandedCommunityParcel,
60
+ ExtendedCommunityParcel,
61
+ FQDNDomainParcel,
44
62
  FowardingClassParcel,
63
+ GeoLocationListParcel,
64
+ IPSSignatureParcel,
45
65
  IPv6DataPrefixParcel,
46
66
  IPv6PrefixListParcel,
47
- PrefixListParcel,
48
- PolicierParcel,
49
- PreferredColorGroupParcel,
50
- SLAClassParcel,
51
- TlocParcel,
52
- StandardCommunityParcel,
67
+ IdentityParcel,
68
+ IntrusionPreventionParcel,
53
69
  LocalDomainParcel,
54
- FQDNDomainParcel,
55
- IPSSignatureParcel,
56
- URLAllowParcel,
57
- URLBlockParcel,
58
- SecurityPortParcel,
70
+ MirrorParcel,
71
+ PolicerParcel,
72
+ PreferredColorGroupParcel,
73
+ PrefixListParcel,
59
74
  ProtocolListParcel,
60
- GeoLocationListParcel,
61
- SecurityZoneListParcel,
75
+ SLAClassParcel,
76
+ ScalableGroupTagParcel,
62
77
  SecurityApplicationListParcel,
63
78
  SecurityDataPrefixParcel,
79
+ SecurityPortParcel,
80
+ SecurityZoneListParcel,
81
+ ServiceObjectGroupParcel,
82
+ SslDecryptionParcel,
83
+ SslDecryptionProfileParcel,
84
+ StandardCommunityParcel,
85
+ TlocParcel,
86
+ URLParcel,
87
+ UrlFilteringParcel,
64
88
  ],
65
- Field(discriminator="type"),
89
+ Field(discriminator="type_"),
66
90
  ]
67
91
 
68
- POLICY_OBJECT_PAYLOAD_ENDPOINT_MAPPING: Mapping[type, str] = {
69
- AppProbeParcel: "app-probe",
70
- ApplicationListParcel: "app-list",
71
- ColorParcel: "color",
72
- DataPrefixParcel: "data-prefix",
73
- ExpandedCommunityParcel: "expanded-community",
74
- FowardingClassParcel: "class",
75
- IPv6DataPrefixParcel: "data-ipv6-prefix",
76
- IPv6PrefixListParcel: "ipv6-prefix",
77
- PrefixListParcel: "prefix",
78
- PolicierParcel: "policer",
79
- PreferredColorGroupParcel: "preferred-color-group",
80
- SLAClassParcel: "sla-class",
81
- TlocParcel: "tloc",
82
- StandardCommunityParcel: "standard-community",
83
- LocalDomainParcel: "security-localdomain",
84
- FQDNDomainParcel: "security-fqdn",
85
- IPSSignatureParcel: "security-ipssignature",
86
- URLAllowParcel: "security-urllist",
87
- URLBlockParcel: "security-urllist",
88
- SecurityPortParcel: "security-port",
89
- ProtocolListParcel: "security-protocolname",
90
- GeoLocationListParcel: "security-geolocation",
91
- SecurityZoneListParcel: "security-zone",
92
- SecurityApplicationListParcel: "security-localapp",
93
- SecurityDataPrefixParcel: "security-data-ip-prefix",
94
- }
95
-
96
92
  __all__ = (
93
+ "AdvancedInspectionProfileParcel",
94
+ "AdvancedMalwareProtectionParcel",
97
95
  "AnyPolicyObjectParcel",
98
96
  "ApplicationFamilyListEntry",
99
97
  "ApplicationListEntry",
@@ -101,12 +99,14 @@ __all__ = (
101
99
  "AppProbeEntry",
102
100
  "AppProbeMapItem",
103
101
  "AppProbeParcel",
102
+ "AsPathParcel",
104
103
  "BaseURLListEntry",
105
104
  "ColorEntry",
106
105
  "ColorParcel",
107
106
  "DataPrefixEntry",
108
107
  "DataPrefixParcel",
109
108
  "ExpandedCommunityParcel",
109
+ "ExtendedCommunityParcel",
110
110
  "FallbackBestTunnel",
111
111
  "FowardingClassParcel",
112
112
  "FowardingClassQueueEntry",
@@ -114,6 +114,11 @@ __all__ = (
114
114
  "FQDNListEntry",
115
115
  "GeoLocationListEntry",
116
116
  "GeoLocationListParcel",
117
+ "IdentityEntry",
118
+ "IdentityEntry",
119
+ "IdentityParcel",
120
+ "IdentityParcel",
121
+ "IntrusionPreventionParcel",
117
122
  "IPSSignatureListEntry",
118
123
  "IPSSignatureParcel",
119
124
  "IPv6DataPrefixEntry",
@@ -122,8 +127,9 @@ __all__ = (
122
127
  "IPv6PrefixListParcel",
123
128
  "LocalDomainListEntry",
124
129
  "LocalDomainParcel",
125
- "PolicierEntry",
126
- "PolicierParcel",
130
+ "MirrorParcel",
131
+ "PolicerEntry",
132
+ "PolicerParcel",
127
133
  "Preference",
128
134
  "PreferredColorGroupEntry",
129
135
  "PreferredColorGroupParcel",
@@ -131,11 +137,16 @@ __all__ = (
131
137
  "PrefixListParcel",
132
138
  "ProtocolListEntry",
133
139
  "ProtocolListParcel",
140
+ "ScalableGroupTagEntry",
141
+ "ScalableGroupTagParcel",
142
+ "ServiceObjectGroupParcel",
134
143
  "SecurityApplicationFamilyListEntry",
135
144
  "SecurityApplicationListEntry",
136
145
  "SecurityApplicationListParcel",
137
146
  "SecurityDataPrefixEntry",
138
147
  "SecurityDataPrefixParcel",
148
+ "SecurityObjectGroupEntries",
149
+ "SecurityObjectGroupParcel",
139
150
  "SecurityPortListEntry",
140
151
  "SecurityPortParcel",
141
152
  "SecurityZoneListEntry",
@@ -144,12 +155,15 @@ __all__ = (
144
155
  "SLAClassCriteria",
145
156
  "SLAClassListEntry",
146
157
  "SLAClassParcel",
158
+ "SslDecryptionParcel",
159
+ "SslDecryptionProfileParcel",
147
160
  "StandardCommunityEntry",
148
161
  "StandardCommunityParcel",
149
162
  "TlocEntry",
150
163
  "TlocParcel",
151
164
  "URLAllowParcel",
152
165
  "URLBlockParcel",
166
+ "URLParcel",
153
167
  )
154
168
 
155
169
 
@@ -1,42 +1,56 @@
1
1
  # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
2
 
3
- from typing import List
3
+ from typing import List, Literal, Optional, Union
4
+ from uuid import UUID
4
5
 
5
- from pydantic import AliasPath, BaseModel, ConfigDict, Field, field_validator
6
+ from pydantic import AliasPath, BaseModel, ConfigDict, Field
6
7
 
7
- from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase, as_global
8
+ from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase, _ParcelEntry, as_global, as_optional_global
8
9
  from catalystwan.models.common import TLOCColor
10
+ from catalystwan.models.configuration.feature_profile.common import RefIdItem
9
11
 
10
12
 
11
13
  class AppProbeMapItem(BaseModel):
12
14
  color: Global[TLOCColor]
13
- dscp: Global[int]
15
+ dscp: Optional[Global[int]] = Field(default=None)
14
16
 
15
- @field_validator("dscp")
16
- @classmethod
17
- def check_rate(cls, dscp: Global):
18
- assert 0 <= int(dscp.value) <= 63
19
- return dscp
20
17
 
21
-
22
- class AppProbeEntry(BaseModel):
18
+ class AppProbeEntry(_ParcelEntry):
23
19
  model_config = ConfigDict(populate_by_name=True)
24
- map: List[AppProbeMapItem] = Field(default=[])
25
- forwarding_class_name: Global[str] = Field(
26
- serialization_alias="forwardingClass", validation_alias="forwardingClass"
20
+ map: List[AppProbeMapItem] = Field(default_factory=list)
21
+ forwarding_class: Union[Global[str], RefIdItem] = Field(
22
+ validation_alias="forwardingClass",
23
+ serialization_alias="forwardingClass",
24
+ description="RefId option introduced in 20.14",
27
25
  )
28
26
 
29
27
 
30
28
  class AppProbeParcel(_ParcelBase):
31
- entries: List[AppProbeEntry] = Field(default=[], validation_alias=AliasPath("data", "entries"))
29
+ model_config = ConfigDict(populate_by_name=True)
30
+ type_: Literal["app-probe"] = Field(default="app-probe", exclude=True)
31
+ entries: List[AppProbeEntry] = Field(default_factory=list, validation_alias=AliasPath("data", "entries"))
32
+
33
+ def _insert_entry(self, entry: AppProbeEntry) -> None:
34
+ if self.entries:
35
+ self.entries[0] = entry
36
+ else:
37
+ self.entries.append(entry)
38
+
39
+ def set_fowarding_class_name(self, name: str):
40
+ self._insert_entry(
41
+ AppProbeEntry(
42
+ forwarding_class=as_global(name),
43
+ )
44
+ )
32
45
 
33
- def add_fowarding_class(self, forwarding_class_name: str):
34
- self.entries.append(
46
+ def set_fowarding_class_id(self, id: UUID):
47
+ # use only for version >= 20.14
48
+ self._insert_entry(
35
49
  AppProbeEntry(
36
- forwarding_class_name=as_global(forwarding_class_name),
50
+ forwarding_class=RefIdItem.from_uuid(id),
37
51
  )
38
52
  )
39
53
 
40
- def add_map(self, color: TLOCColor, dscp: int):
54
+ def add_map(self, color: TLOCColor, dscp: Optional[int] = None):
41
55
  entry = self.entries[0]
42
- entry.map.append(AppProbeMapItem(color=as_global(color, TLOCColor), dscp=as_global(dscp)))
56
+ entry.map.append(AppProbeMapItem(color=as_global(color, TLOCColor), dscp=as_optional_global(dscp)))
@@ -1,25 +1,27 @@
1
1
  # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
2
 
3
- from typing import List, Union
3
+ from typing import List, Literal, Union
4
4
 
5
- from pydantic import AliasPath, BaseModel, ConfigDict, Field
5
+ from pydantic import AliasPath, ConfigDict, Field
6
6
 
7
- from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase, as_global
7
+ from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase, _ParcelEntry, as_global
8
8
 
9
9
 
10
- class ApplicationListEntry(BaseModel):
10
+ class ApplicationListEntry(_ParcelEntry):
11
11
  model_config = ConfigDict(populate_by_name=True)
12
12
  app_list: Global[str] = Field(serialization_alias="app", validation_alias="app")
13
13
 
14
14
 
15
- class ApplicationFamilyListEntry(BaseModel):
15
+ class ApplicationFamilyListEntry(_ParcelEntry):
16
16
  model_config = ConfigDict(populate_by_name=True)
17
17
  app_list_family: Global[str] = Field(serialization_alias="appFamily", validation_alias="appFamily")
18
18
 
19
19
 
20
20
  class ApplicationListParcel(_ParcelBase):
21
+ model_config = ConfigDict(populate_by_name=True)
22
+ type_: Literal["app-list"] = Field(default="app-list", exclude=True)
21
23
  entries: List[Union[ApplicationListEntry, ApplicationFamilyListEntry]] = Field(
22
- default=[], validation_alias=AliasPath("data", "entries")
24
+ default_factory=list, validation_alias=AliasPath("data", "entries")
23
25
  )
24
26
 
25
27
  def add_application(self, application: str):
@@ -0,0 +1,22 @@
1
+ # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
+
3
+ from typing import List, Literal
4
+
5
+ from pydantic import AliasPath, ConfigDict, Field
6
+
7
+ from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase, _ParcelEntry, as_global
8
+
9
+
10
+ class AsPathEntry(_ParcelEntry):
11
+ model_config = ConfigDict(populate_by_name=True)
12
+ as_path: Global[str] = Field(validation_alias="asPath", serialization_alias="asPath")
13
+
14
+
15
+ class AsPathParcel(_ParcelBase):
16
+ model_config = ConfigDict(populate_by_name=True)
17
+ type_: Literal["as-path"] = Field(default="as-path", exclude=True)
18
+ as_path_list_num: Global[int] = Field(validation_alias=AliasPath("data", "asPathListNum"))
19
+ entries: List[AsPathEntry] = Field(default_factory=list, validation_alias=AliasPath("data", "entries"))
20
+
21
+ def add_as_path(self, as_path: str):
22
+ self.entries.append(AsPathEntry(as_path=as_global(as_path)))
@@ -1,19 +1,21 @@
1
1
  # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
2
 
3
- from typing import List
3
+ from typing import List, Literal
4
4
 
5
- from pydantic import AliasPath, BaseModel, Field
5
+ from pydantic import AliasPath, ConfigDict, Field
6
6
 
7
- from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase, as_global
7
+ from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase, _ParcelEntry, as_global
8
8
  from catalystwan.models.common import TLOCColor
9
9
 
10
10
 
11
- class ColorEntry(BaseModel):
11
+ class ColorEntry(_ParcelEntry):
12
12
  color: Global[TLOCColor]
13
13
 
14
14
 
15
15
  class ColorParcel(_ParcelBase):
16
- entries: List[ColorEntry] = Field(default=[], validation_alias=AliasPath("data", "entries"))
16
+ model_config = ConfigDict(populate_by_name=True)
17
+ type_: Literal["color"] = Field(default="color", exclude=True)
18
+ entries: List[ColorEntry] = Field(default_factory=list, validation_alias=AliasPath("data", "entries"))
17
19
 
18
20
  def add_color(self, color: TLOCColor):
19
21
  self.entries.append(ColorEntry(color=as_global(color, TLOCColor)))