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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (504) hide show
  1. catalystwan/__init__.py +3 -2
  2. catalystwan/api/administration.py +13 -2
  3. catalystwan/api/api_container.py +4 -1
  4. catalystwan/api/builders/__init__.py +14 -0
  5. catalystwan/api/builders/feature_profiles/__init__.py +0 -0
  6. catalystwan/api/builders/feature_profiles/application_priority.py +58 -0
  7. catalystwan/api/builders/feature_profiles/builder_factory.py +59 -0
  8. catalystwan/api/builders/feature_profiles/cli.py +76 -0
  9. catalystwan/api/builders/feature_profiles/mixins.py +44 -0
  10. catalystwan/api/builders/feature_profiles/other.py +79 -0
  11. catalystwan/api/builders/feature_profiles/report.py +155 -0
  12. catalystwan/api/builders/feature_profiles/service.py +248 -0
  13. catalystwan/api/builders/feature_profiles/system.py +80 -0
  14. catalystwan/api/builders/feature_profiles/transport.py +256 -0
  15. catalystwan/api/builders/feature_profiles/uc_voice.py +287 -0
  16. catalystwan/api/config_group_api.py +41 -16
  17. catalystwan/api/configuration_groups/parcel.py +100 -30
  18. catalystwan/api/feature_profile_api.py +2021 -242
  19. catalystwan/api/policy_api.py +470 -116
  20. catalystwan/api/template_api.py +113 -44
  21. catalystwan/api/templates/README.md +61 -47
  22. catalystwan/api/templates/cli_template.py +17 -7
  23. catalystwan/api/templates/device_template/device_template.py +127 -32
  24. catalystwan/api/templates/feature_template.py +3 -3
  25. catalystwan/api/templates/models/aaa_model.py +387 -0
  26. catalystwan/api/templates/models/cisco_aaa_model.py +289 -42
  27. catalystwan/api/templates/models/cisco_banner_model.py +11 -2
  28. catalystwan/api/templates/models/cisco_bfd_model.py +31 -36
  29. catalystwan/api/templates/models/cisco_bgp_model.py +382 -131
  30. catalystwan/api/templates/models/cisco_logging_model.py +80 -43
  31. catalystwan/api/templates/models/cisco_ntp_model.py +34 -15
  32. catalystwan/api/templates/models/cisco_omp_model.py +70 -60
  33. catalystwan/api/templates/models/cisco_ospf.py +143 -74
  34. catalystwan/api/templates/models/cisco_ospfv3.py +217 -95
  35. catalystwan/api/templates/models/cisco_secure_internet_gateway.py +304 -142
  36. catalystwan/api/templates/models/cisco_snmp_model.py +66 -52
  37. catalystwan/api/templates/models/cisco_system.py +238 -129
  38. catalystwan/api/templates/models/cisco_vpn_interface_model.py +632 -275
  39. catalystwan/api/templates/models/cisco_vpn_model.py +433 -270
  40. catalystwan/api/templates/models/cli_template.py +3 -2
  41. catalystwan/api/templates/models/omp_vsmart_model.py +46 -10
  42. catalystwan/api/templates/models/security_vsmart_model.py +11 -8
  43. catalystwan/api/templates/models/supported.py +10 -4
  44. catalystwan/api/templates/models/system_vsmart_model.py +164 -27
  45. catalystwan/api/templates/models/vpn_vsmart_interface_model.py +198 -0
  46. catalystwan/api/templates/models/vpn_vsmart_model.py +124 -0
  47. catalystwan/apigw_auth.py +6 -2
  48. catalystwan/dataclasses.py +2 -53
  49. catalystwan/endpoints/__init__.py +41 -41
  50. catalystwan/endpoints/certificate_management_device.py +4 -0
  51. catalystwan/endpoints/cluster_management.py +27 -7
  52. catalystwan/endpoints/configuration/feature_profile/sdwan/application_priority.py +107 -0
  53. catalystwan/endpoints/configuration/feature_profile/sdwan/cli.py +60 -0
  54. catalystwan/endpoints/configuration/feature_profile/sdwan/dns_security.py +83 -0
  55. catalystwan/endpoints/configuration/feature_profile/sdwan/embedded_security.py +88 -0
  56. catalystwan/endpoints/configuration/feature_profile/sdwan/other.py +62 -0
  57. catalystwan/endpoints/configuration/feature_profile/sdwan/policy_object.py +35 -12
  58. catalystwan/endpoints/configuration/feature_profile/sdwan/service.py +154 -0
  59. catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py +88 -0
  60. catalystwan/endpoints/configuration/feature_profile/sdwan/system.py +164 -11
  61. catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py +93 -0
  62. catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py +144 -26
  63. catalystwan/endpoints/configuration/feature_profile/sdwan/uc_voice.py +77 -0
  64. catalystwan/endpoints/configuration/network_hierarchy.py +32 -0
  65. catalystwan/endpoints/configuration/policy/abstractions.py +49 -0
  66. catalystwan/endpoints/configuration/policy/definition/access_control_list.py +6 -11
  67. catalystwan/endpoints/configuration/policy/definition/access_control_list_ipv6.py +6 -11
  68. catalystwan/endpoints/configuration/policy/definition/aip.py +52 -0
  69. catalystwan/endpoints/configuration/policy/definition/amp.py +52 -0
  70. catalystwan/endpoints/configuration/policy/definition/app_route.py +50 -0
  71. catalystwan/endpoints/configuration/policy/definition/cflowd.py +46 -0
  72. catalystwan/endpoints/configuration/policy/definition/control.py +6 -11
  73. catalystwan/endpoints/configuration/policy/definition/device_access.py +6 -11
  74. catalystwan/endpoints/configuration/policy/definition/device_access_ipv6.py +6 -11
  75. catalystwan/endpoints/configuration/policy/definition/dial_peer.py +57 -0
  76. catalystwan/endpoints/configuration/policy/definition/dns_security.py +50 -0
  77. catalystwan/endpoints/configuration/policy/definition/fxo_port.py +57 -0
  78. catalystwan/endpoints/configuration/policy/definition/fxs_did_port.py +57 -0
  79. catalystwan/endpoints/configuration/policy/definition/fxs_port.py +57 -0
  80. catalystwan/endpoints/configuration/policy/definition/hub_and_spoke.py +6 -11
  81. catalystwan/endpoints/configuration/policy/definition/intrusion_prevention.py +52 -0
  82. catalystwan/endpoints/configuration/policy/definition/mesh.py +2 -11
  83. catalystwan/endpoints/configuration/policy/definition/pri_isdn_port.py +57 -0
  84. catalystwan/endpoints/configuration/policy/definition/qos_map.py +2 -11
  85. catalystwan/endpoints/configuration/policy/definition/rewrite.py +6 -11
  86. catalystwan/endpoints/configuration/policy/definition/route_policy.py +50 -0
  87. catalystwan/endpoints/configuration/policy/definition/rule_set.py +2 -11
  88. catalystwan/endpoints/configuration/policy/definition/security_group.py +6 -11
  89. catalystwan/endpoints/configuration/policy/definition/srst_phone_profile.py +59 -0
  90. catalystwan/endpoints/configuration/policy/definition/ssl_decryption.py +50 -0
  91. catalystwan/endpoints/configuration/policy/definition/ssl_decryption_utd_profile.py +52 -0
  92. catalystwan/endpoints/configuration/policy/definition/traffic_data.py +6 -11
  93. catalystwan/endpoints/configuration/policy/definition/url_filtering.py +50 -0
  94. catalystwan/endpoints/configuration/policy/definition/vpn_membership.py +6 -11
  95. catalystwan/endpoints/configuration/policy/definition/vpn_qos_map.py +50 -0
  96. catalystwan/endpoints/configuration/policy/definition/zone_based_firewall.py +6 -11
  97. catalystwan/endpoints/configuration/policy/list/app.py +3 -16
  98. catalystwan/endpoints/configuration/policy/list/app_probe.py +6 -15
  99. catalystwan/endpoints/configuration/policy/list/as_path.py +3 -16
  100. catalystwan/endpoints/configuration/policy/list/class_map.py +3 -16
  101. catalystwan/endpoints/configuration/policy/list/color.py +3 -16
  102. catalystwan/endpoints/configuration/policy/list/community.py +3 -16
  103. catalystwan/endpoints/configuration/policy/list/data_ipv6_prefix.py +6 -15
  104. catalystwan/endpoints/configuration/policy/list/data_prefix.py +3 -16
  105. catalystwan/endpoints/configuration/policy/list/expanded_community.py +6 -15
  106. catalystwan/endpoints/configuration/policy/list/extended_community.py +52 -0
  107. catalystwan/endpoints/configuration/policy/list/fax_protocol.py +48 -0
  108. catalystwan/endpoints/configuration/policy/list/fqdn.py +3 -16
  109. catalystwan/endpoints/configuration/policy/list/geo_location.py +3 -16
  110. catalystwan/endpoints/configuration/policy/list/identity.py +48 -0
  111. catalystwan/endpoints/configuration/policy/list/ips_signature.py +6 -15
  112. catalystwan/endpoints/configuration/policy/list/ipv6_prefix.py +3 -16
  113. catalystwan/endpoints/configuration/policy/list/local_app.py +3 -16
  114. catalystwan/endpoints/configuration/policy/list/local_domain.py +3 -16
  115. catalystwan/endpoints/configuration/policy/list/media_profile.py +52 -0
  116. catalystwan/endpoints/configuration/policy/list/mirror.py +3 -16
  117. catalystwan/endpoints/configuration/policy/list/modem_pass_through.py +52 -0
  118. catalystwan/endpoints/configuration/policy/list/policer.py +3 -16
  119. catalystwan/endpoints/configuration/policy/list/port.py +3 -16
  120. catalystwan/endpoints/configuration/policy/list/preferred_color_group.py +6 -15
  121. catalystwan/endpoints/configuration/policy/list/prefix.py +4 -16
  122. catalystwan/endpoints/configuration/policy/list/protocol_name.py +6 -15
  123. catalystwan/endpoints/configuration/policy/list/region.py +2 -10
  124. catalystwan/endpoints/configuration/policy/list/scalable_group_tag.py +52 -0
  125. catalystwan/endpoints/configuration/policy/list/site.py +3 -16
  126. catalystwan/endpoints/configuration/policy/list/sla.py +3 -16
  127. catalystwan/endpoints/configuration/policy/list/supervisory_disconnect.py +52 -0
  128. catalystwan/endpoints/configuration/policy/list/threat_grid_api_key.py +52 -0
  129. catalystwan/endpoints/configuration/policy/list/tloc.py +3 -16
  130. catalystwan/endpoints/configuration/policy/list/translation_profile.py +52 -0
  131. catalystwan/endpoints/configuration/policy/list/translation_rules.py +52 -0
  132. catalystwan/endpoints/configuration/policy/list/trunkgroup.py +48 -0
  133. catalystwan/endpoints/configuration/policy/list/umbrella_data.py +52 -0
  134. catalystwan/endpoints/configuration/policy/list/url_allow_list.py +3 -16
  135. catalystwan/endpoints/configuration/policy/list/url_block_list.py +3 -16
  136. catalystwan/endpoints/configuration/policy/list/vpn.py +3 -16
  137. catalystwan/endpoints/configuration/policy/list/zone.py +3 -16
  138. catalystwan/endpoints/configuration/policy/security_template.py +2 -3
  139. catalystwan/endpoints/configuration/policy/voice_template.py +39 -0
  140. catalystwan/endpoints/configuration/policy_group.py +30 -0
  141. catalystwan/endpoints/configuration/software_actions.py +2 -4
  142. catalystwan/endpoints/configuration/topology_group.py +51 -0
  143. catalystwan/endpoints/configuration_dashboard_status.py +2 -2
  144. catalystwan/endpoints/configuration_device_template.py +15 -1
  145. catalystwan/endpoints/configuration_feature_profile.py +8 -11
  146. catalystwan/endpoints/configuration_general_template.py +31 -0
  147. catalystwan/endpoints/configuration_group.py +28 -5
  148. catalystwan/endpoints/configuration_settings.py +90 -1
  149. catalystwan/endpoints/configuration_template_master.py +48 -0
  150. catalystwan/endpoints/endpoints_container.py +79 -19
  151. catalystwan/endpoints/real_time_monitoring/reboot_history.py +1 -3
  152. catalystwan/endpoints/tenant_migration.py +2 -0
  153. catalystwan/exceptions.py +17 -0
  154. catalystwan/integration_tests/base.py +81 -0
  155. catalystwan/integration_tests/feature_profile/sdwan/__init__.py +0 -0
  156. catalystwan/integration_tests/feature_profile/sdwan/policy/__init__.py +0 -0
  157. catalystwan/integration_tests/feature_profile/sdwan/policy/base.py +33 -0
  158. catalystwan/integration_tests/feature_profile/sdwan/policy/test_extended_community.py +33 -0
  159. catalystwan/integration_tests/feature_profile/sdwan/policy/test_security_app_list.py +32 -0
  160. catalystwan/integration_tests/feature_profile/sdwan/test_application_priority.py +433 -0
  161. catalystwan/integration_tests/feature_profile/sdwan/test_cli.py +54 -0
  162. catalystwan/integration_tests/feature_profile/sdwan/test_dns_security.py +106 -0
  163. catalystwan/integration_tests/feature_profile/sdwan/test_other.py +49 -0
  164. catalystwan/integration_tests/feature_profile/sdwan/test_service.py +1078 -0
  165. catalystwan/integration_tests/feature_profile/sdwan/test_sig_security.py +322 -0
  166. catalystwan/integration_tests/feature_profile/sdwan/test_ssl_decryption.py +85 -0
  167. catalystwan/integration_tests/feature_profile/sdwan/test_system.py +368 -0
  168. catalystwan/integration_tests/feature_profile/sdwan/test_tracker.py +127 -0
  169. catalystwan/integration_tests/feature_profile/sdwan/test_transport.py +1698 -0
  170. catalystwan/integration_tests/feature_profile/sdwan/topology/test_topology.py +93 -0
  171. catalystwan/integration_tests/profile_builder/__init__.py +0 -0
  172. catalystwan/integration_tests/profile_builder/test_pb_service.py +197 -0
  173. catalystwan/integration_tests/profile_builder/test_pb_transport.py +226 -0
  174. catalystwan/integration_tests/profile_builder/test_pb_uc_voice.py +277 -0
  175. catalystwan/integration_tests/test_data/__init__.py +117 -0
  176. catalystwan/integration_tests/test_find_template_values.py +7 -18
  177. catalystwan/integration_tests/test_network_hierarchy.py +82 -0
  178. catalystwan/integration_tests/test_settings.py +30 -0
  179. catalystwan/models/common.py +1898 -2
  180. catalystwan/models/configuration/common.py +1 -0
  181. catalystwan/models/configuration/feature_profile/common.py +634 -149
  182. catalystwan/models/configuration/feature_profile/parcel.py +238 -0
  183. catalystwan/models/configuration/feature_profile/sdwan/acl/__init__.py +13 -0
  184. catalystwan/models/configuration/feature_profile/sdwan/acl/ipv4acl.py +298 -0
  185. catalystwan/models/configuration/feature_profile/sdwan/acl/ipv6acl.py +344 -0
  186. catalystwan/models/configuration/feature_profile/sdwan/application_priority/__init__.py +218 -0
  187. catalystwan/models/configuration/feature_profile/sdwan/application_priority/cloud_probe.py +61 -0
  188. catalystwan/models/configuration/feature_profile/sdwan/application_priority/policy_settings.py +31 -0
  189. catalystwan/models/configuration/feature_profile/sdwan/application_priority/qos_policy.py +102 -0
  190. catalystwan/models/configuration/feature_profile/sdwan/application_priority/traffic_policy.py +1057 -0
  191. catalystwan/models/configuration/feature_profile/sdwan/cli/__init__.py +23 -0
  192. catalystwan/models/configuration/feature_profile/sdwan/cli/config.py +18 -0
  193. catalystwan/models/configuration/feature_profile/sdwan/cli/full_config.py +15 -0
  194. catalystwan/models/configuration/feature_profile/sdwan/dns_security/__init__.py +13 -0
  195. catalystwan/models/configuration/feature_profile/sdwan/dns_security/dns.py +110 -0
  196. catalystwan/models/configuration/feature_profile/sdwan/embedded_security/__init__.py +23 -0
  197. catalystwan/models/configuration/feature_profile/sdwan/embedded_security/ngfirewall.py +493 -0
  198. catalystwan/models/configuration/feature_profile/sdwan/embedded_security/policy.py +171 -0
  199. catalystwan/models/configuration/feature_profile/sdwan/other/__init__.py +25 -0
  200. catalystwan/models/configuration/feature_profile/sdwan/other/cybervision.py +44 -0
  201. catalystwan/models/configuration/feature_profile/sdwan/other/thousandeyes.py +147 -0
  202. catalystwan/models/configuration/feature_profile/sdwan/other/ucse.py +110 -0
  203. catalystwan/models/configuration/feature_profile/sdwan/policy_object/__init__.py +62 -48
  204. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/app_probe.py +34 -20
  205. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/application_list.py +8 -6
  206. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/as_path.py +22 -0
  207. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/color_list.py +7 -5
  208. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/data_prefix.py +13 -4
  209. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/expanded_community_list.py +9 -7
  210. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/extended_community.py +34 -0
  211. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/fowarding_class.py +7 -5
  212. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv4_network_object.py +15 -0
  213. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv4_service_object.py +254 -0
  214. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_data_prefix.py +11 -9
  215. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_prefix_list.py +25 -10
  216. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/mirror.py +27 -0
  217. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/network_object_group.py +15 -0
  218. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/object_group.py +15 -0
  219. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/{policier.py → policer.py} +12 -10
  220. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefered_group_color.py +29 -10
  221. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefix_list.py +23 -8
  222. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/service_object_group.py +21 -0
  223. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/sla_class.py +12 -31
  224. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/standard_community.py +16 -10
  225. catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/tloc_list.py +8 -7
  226. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/aip.py +64 -0
  227. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/amp.py +79 -0
  228. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/application_list.py +8 -6
  229. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/data_prefix.py +7 -5
  230. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/fqdn.py +7 -5
  231. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/geolocation_list.py +7 -5
  232. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/identity.py +30 -0
  233. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/intrusion_prevention.py +58 -0
  234. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ips_signature.py +7 -5
  235. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/local_domain.py +7 -5
  236. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/object_group.py +72 -0
  237. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/protocol_list.py +7 -5
  238. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/rule_set.py +137 -0
  239. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/scalable_group_tag.py +26 -0
  240. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/security_port.py +21 -11
  241. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ssl_decryption.py +126 -0
  242. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ssl_decryption_profile.py +165 -0
  243. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url.py +15 -10
  244. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url_filtering.py +148 -0
  245. catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/zone.py +14 -18
  246. catalystwan/models/configuration/feature_profile/sdwan/routing/__init__.py +26 -0
  247. catalystwan/models/configuration/feature_profile/sdwan/routing/bgp.py +609 -0
  248. catalystwan/models/configuration/feature_profile/sdwan/{service → routing}/ospf.py +55 -47
  249. catalystwan/models/configuration/feature_profile/sdwan/{service → routing}/ospfv3.py +74 -72
  250. catalystwan/models/configuration/feature_profile/sdwan/service/__init__.py +91 -0
  251. catalystwan/models/configuration/feature_profile/sdwan/service/appqoe.py +76 -41
  252. catalystwan/models/configuration/feature_profile/sdwan/service/dhcp_server.py +107 -64
  253. catalystwan/models/configuration/feature_profile/sdwan/service/dual_router_ha.py +26 -0
  254. catalystwan/models/configuration/feature_profile/sdwan/service/eigrp.py +39 -42
  255. catalystwan/models/configuration/feature_profile/sdwan/service/lan/common.py +7 -88
  256. catalystwan/models/configuration/feature_profile/sdwan/service/lan/ethernet.py +231 -155
  257. catalystwan/models/configuration/feature_profile/sdwan/service/lan/gre.py +38 -108
  258. catalystwan/models/configuration/feature_profile/sdwan/service/lan/ipsec.py +77 -84
  259. catalystwan/models/configuration/feature_profile/sdwan/service/lan/multilink.py +101 -0
  260. catalystwan/models/configuration/feature_profile/sdwan/service/lan/svi.py +62 -56
  261. catalystwan/models/configuration/feature_profile/sdwan/service/lan/vpn.py +111 -120
  262. catalystwan/models/configuration/feature_profile/sdwan/service/multicast.py +56 -57
  263. catalystwan/models/configuration/feature_profile/sdwan/service/object_tracker.py +15 -21
  264. catalystwan/models/configuration/feature_profile/sdwan/service/route_policy.py +358 -110
  265. catalystwan/models/configuration/feature_profile/sdwan/service/service_chain.py +38 -0
  266. catalystwan/models/configuration/feature_profile/sdwan/service/service_insertion_attachment.py +17 -25
  267. catalystwan/models/configuration/feature_profile/sdwan/service/switchport.py +50 -58
  268. catalystwan/models/configuration/feature_profile/sdwan/service/tracker.py +12 -21
  269. catalystwan/models/configuration/feature_profile/sdwan/service/wireless_lan.py +27 -31
  270. catalystwan/models/configuration/feature_profile/sdwan/sig_security/__init__.py +19 -0
  271. catalystwan/models/configuration/feature_profile/sdwan/sig_security/sig_security.py +379 -0
  272. catalystwan/models/configuration/feature_profile/sdwan/system/__init__.py +59 -0
  273. catalystwan/models/configuration/feature_profile/sdwan/system/aaa.py +58 -10
  274. catalystwan/models/configuration/feature_profile/sdwan/system/banner.py +30 -0
  275. catalystwan/models/configuration/feature_profile/sdwan/system/basic.py +290 -0
  276. catalystwan/models/configuration/feature_profile/sdwan/system/bfd.py +69 -0
  277. catalystwan/models/configuration/feature_profile/sdwan/system/device_access.py +157 -0
  278. catalystwan/models/configuration/feature_profile/sdwan/system/device_access_ipv6.py +157 -0
  279. catalystwan/models/configuration/feature_profile/sdwan/system/global_parcel.py +163 -0
  280. catalystwan/models/configuration/feature_profile/sdwan/system/logging_parcel.py +162 -0
  281. catalystwan/models/configuration/feature_profile/sdwan/system/mrf.py +75 -0
  282. catalystwan/models/configuration/feature_profile/sdwan/system/ntp.py +103 -0
  283. catalystwan/models/configuration/feature_profile/sdwan/system/omp.py +120 -0
  284. catalystwan/models/configuration/feature_profile/sdwan/system/security.py +179 -0
  285. catalystwan/models/configuration/feature_profile/sdwan/system/snmp.py +173 -0
  286. catalystwan/models/configuration/feature_profile/sdwan/topology/__init__.py +29 -0
  287. catalystwan/models/configuration/feature_profile/sdwan/topology/custom_control.py +425 -0
  288. catalystwan/models/configuration/feature_profile/sdwan/topology/hubspoke.py +60 -0
  289. catalystwan/models/configuration/feature_profile/sdwan/topology/mesh.py +23 -0
  290. catalystwan/models/configuration/feature_profile/sdwan/trackers/__init__.py +36 -0
  291. catalystwan/models/configuration/feature_profile/sdwan/trackers/tracker.py +96 -0
  292. catalystwan/models/configuration/feature_profile/sdwan/trackers/tracker_group.py +63 -0
  293. catalystwan/models/configuration/feature_profile/sdwan/transport/__init__.py +93 -0
  294. catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_controller.py +26 -23
  295. catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_profile.py +71 -0
  296. catalystwan/models/configuration/feature_profile/sdwan/transport/gps.py +37 -0
  297. catalystwan/models/configuration/feature_profile/sdwan/transport/management/ethernet.py +121 -0
  298. catalystwan/models/configuration/feature_profile/sdwan/transport/t1e1controller.py +124 -0
  299. catalystwan/models/configuration/feature_profile/sdwan/transport/vpn.py +285 -0
  300. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/cellular.py +173 -0
  301. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/ethernet.py +389 -0
  302. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/gre.py +46 -0
  303. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/ipsec.py +137 -0
  304. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/multilink.py +219 -0
  305. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/protocol_over.py +405 -0
  306. catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/t1e1serial.py +195 -0
  307. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/__init__.py +62 -0
  308. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/analog_interface.py +436 -0
  309. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/call_routing.py +179 -0
  310. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/digital_interface.py +380 -0
  311. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/dsp_farm.py +193 -0
  312. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/media_profile.py +17 -0
  313. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/server_group.py +51 -0
  314. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/srst.py +86 -0
  315. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/supervisory_disconnect.py +69 -0
  316. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/translation_profile.py +42 -0
  317. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/translation_rule.py +31 -0
  318. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/trunk_group.py +26 -0
  319. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/voice_global.py +55 -0
  320. catalystwan/models/configuration/feature_profile/sdwan/uc_voice/voice_tenant.py +40 -0
  321. catalystwan/models/configuration/network_hierarchy/__init__.py +22 -0
  322. catalystwan/models/configuration/network_hierarchy/cflowd.py +120 -0
  323. catalystwan/models/configuration/network_hierarchy/node.py +88 -0
  324. catalystwan/models/configuration/policy_group.py +74 -0
  325. catalystwan/models/configuration/profile_type.py +1 -6
  326. catalystwan/models/configuration/topology_group.py +52 -0
  327. catalystwan/models/policy/__init__.py +275 -69
  328. catalystwan/models/policy/centralized.py +26 -29
  329. catalystwan/models/policy/{definitions → definition}/access_control_list.py +47 -17
  330. catalystwan/models/policy/{definitions → definition}/access_control_list_ipv6.py +42 -18
  331. catalystwan/models/policy/definition/aip.py +60 -0
  332. catalystwan/models/policy/definition/amp.py +65 -0
  333. catalystwan/models/policy/definition/app_route.py +246 -0
  334. catalystwan/models/policy/definition/cflowd.py +95 -0
  335. catalystwan/models/policy/{definitions → definition}/control.py +48 -25
  336. catalystwan/models/policy/{definitions → definition}/device_access.py +22 -11
  337. catalystwan/models/policy/{definitions → definition}/device_access_ipv6.py +20 -11
  338. catalystwan/models/policy/definition/dial_peer.py +60 -0
  339. catalystwan/models/policy/definition/dns_security.py +130 -0
  340. catalystwan/models/policy/definition/fxo_port.py +63 -0
  341. catalystwan/models/policy/definition/fxs_did_port.py +58 -0
  342. catalystwan/models/policy/definition/fxs_port.py +56 -0
  343. catalystwan/models/policy/{definitions → definition}/hub_and_spoke.py +18 -4
  344. catalystwan/models/policy/definition/intrusion_prevention.py +55 -0
  345. catalystwan/models/policy/{definitions → definition}/mesh.py +13 -1
  346. catalystwan/models/policy/definition/pri_isdn_port.py +48 -0
  347. catalystwan/models/policy/{definitions → definition}/qos_map.py +39 -32
  348. catalystwan/models/policy/{definitions → definition}/rewrite.py +12 -2
  349. catalystwan/models/policy/definition/route_policy.py +187 -0
  350. catalystwan/models/policy/{definitions → definition}/rule_set.py +66 -48
  351. catalystwan/models/policy/{definitions → definition}/security_group.py +38 -14
  352. catalystwan/models/policy/definition/srst_phone_profile.py +37 -0
  353. catalystwan/models/policy/definition/ssl_decryption.py +209 -0
  354. catalystwan/models/policy/definition/ssl_decryption_utd_profile.py +87 -0
  355. catalystwan/models/policy/{definitions → definition}/traffic_data.py +184 -61
  356. catalystwan/models/policy/definition/url_filtering.py +70 -0
  357. catalystwan/models/policy/{definitions → definition}/vpn_membership.py +13 -1
  358. catalystwan/models/policy/definition/vpn_qos_map.py +46 -0
  359. catalystwan/models/policy/{definitions → definition}/zone_based_firewall.py +93 -32
  360. catalystwan/models/policy/list/app.py +44 -0
  361. catalystwan/models/policy/list/app_probe.py +42 -0
  362. catalystwan/models/policy/list/as_path.py +30 -0
  363. catalystwan/models/policy/list/class_map.py +30 -0
  364. catalystwan/models/policy/list/color.py +28 -0
  365. catalystwan/models/policy/list/communities.py +83 -0
  366. catalystwan/models/policy/list/data_ipv6_prefix.py +30 -0
  367. catalystwan/models/policy/list/data_prefix.py +30 -0
  368. catalystwan/models/policy/list/fax_protocol.py +45 -0
  369. catalystwan/models/policy/list/fqdn.py +24 -0
  370. catalystwan/models/policy/list/geo_location.py +33 -0
  371. catalystwan/models/policy/list/identity.py +29 -0
  372. catalystwan/models/policy/list/ips_signature.py +27 -0
  373. catalystwan/models/policy/list/ipv6_prefix.py +33 -0
  374. catalystwan/models/policy/list/local_app.py +45 -0
  375. catalystwan/models/policy/list/local_domain.py +36 -0
  376. catalystwan/models/policy/list/media_profile.py +44 -0
  377. catalystwan/models/policy/list/mirror.py +27 -0
  378. catalystwan/models/policy/list/modem_pass_through.py +27 -0
  379. catalystwan/models/policy/list/policer.py +39 -0
  380. catalystwan/models/policy/list/port.py +33 -0
  381. catalystwan/models/policy/list/preferred_color_group.py +82 -0
  382. catalystwan/models/policy/list/prefix.py +33 -0
  383. catalystwan/models/policy/list/protocol_name.py +26 -0
  384. catalystwan/models/policy/list/region.py +45 -0
  385. catalystwan/models/policy/list/scalable_group_tag.py +30 -0
  386. catalystwan/models/policy/list/site.py +34 -0
  387. catalystwan/models/policy/list/sla.py +77 -0
  388. catalystwan/models/policy/list/supervisory_disconnect.py +62 -0
  389. catalystwan/models/policy/list/threat_grid_api_key.py +32 -0
  390. catalystwan/models/policy/list/tloc.py +32 -0
  391. catalystwan/models/policy/list/translation_profile.py +32 -0
  392. catalystwan/models/policy/list/translation_rules.py +29 -0
  393. catalystwan/models/policy/list/trunkgroup.py +56 -0
  394. catalystwan/models/policy/list/umbrella_data.py +30 -0
  395. catalystwan/models/policy/list/url.py +39 -0
  396. catalystwan/models/policy/list/vpn.py +40 -0
  397. catalystwan/models/policy/list/zone.py +46 -0
  398. catalystwan/models/policy/localized.py +34 -16
  399. catalystwan/models/policy/policy.py +13 -9
  400. catalystwan/models/policy/policy_definition.py +673 -173
  401. catalystwan/models/policy/policy_list.py +38 -27
  402. catalystwan/models/policy/security.py +145 -46
  403. catalystwan/models/policy/voice.py +77 -0
  404. catalystwan/models/settings.py +41 -0
  405. catalystwan/models/templates.py +79 -0
  406. catalystwan/response.py +6 -2
  407. catalystwan/session.py +1 -1
  408. catalystwan/tests/builders/test_report.py +60 -0
  409. catalystwan/tests/builders/uc_voice.py +85 -0
  410. catalystwan/tests/models/__init__.py +0 -0
  411. catalystwan/tests/models/test_digital_interface.py +56 -0
  412. catalystwan/tests/templates/definitions/aaa_basic.json +96 -0
  413. catalystwan/tests/templates/definitions/aaa_complex.json +464 -0
  414. catalystwan/tests/templates/definitions/{iuo.json → cisco_aaa.json} +44 -15
  415. catalystwan/tests/templates/definitions/cisco_aaa_complex.json +361 -0
  416. catalystwan/tests/templates/definitions/cisco_logging_complex.json +268 -0
  417. catalystwan/tests/templates/definitions/cisco_ntp_complex.json +143 -0
  418. catalystwan/tests/templates/definitions/cisco_omp_complex.json +175 -0
  419. catalystwan/tests/templates/definitions/cisco_ospf_complex.json +302 -0
  420. catalystwan/tests/templates/definitions/cisco_sig.json +405 -0
  421. catalystwan/tests/templates/definitions/cisco_snmp_complex.json +258 -0
  422. catalystwan/tests/templates/definitions/cisco_system_complex.json +502 -0
  423. catalystwan/tests/templates/definitions/{Basic_Cisco_VPN_Model.json → cisco_vpn_basic.json} +2 -2
  424. catalystwan/tests/templates/definitions/{complex_cisco_vpn.json → cisco_vpn_complex.json} +27 -12
  425. catalystwan/tests/templates/definitions/cisco_vpn_interface_complex.json +821 -0
  426. catalystwan/tests/templates/definitions/omp_vsmart_1.json +26 -0
  427. catalystwan/tests/templates/definitions/{omp_2.json → omp_vsmart_2.json} +16 -2
  428. catalystwan/tests/templates/definitions/{omp_3.json → omp_vsmart_3.json} +16 -2
  429. catalystwan/tests/templates/definitions/omp_vsmart_complex.json +73 -0
  430. catalystwan/tests/templates/definitions/security_vsmart_complex.json +24 -0
  431. catalystwan/tests/templates/definitions/system_vsmart_complex.json +193 -0
  432. catalystwan/tests/templates/definitions/vpn_vsmart_basic.json +17 -0
  433. catalystwan/tests/templates/definitions/vpn_vsmart_complex.json +179 -0
  434. catalystwan/tests/templates/definitions/vpn_vsmart_interface_basic.json +42 -0
  435. catalystwan/tests/templates/definitions/vpn_vsmart_interface_complex.json +208 -0
  436. catalystwan/tests/templates/models/__init__.py +46 -13
  437. catalystwan/tests/templates/models/aaa.py +106 -0
  438. catalystwan/tests/templates/models/cisco_aaa.py +81 -48
  439. catalystwan/tests/templates/models/cisco_banner.py +2 -2
  440. catalystwan/tests/templates/models/cisco_bfd.py +4 -6
  441. catalystwan/tests/templates/models/cisco_logging.py +65 -0
  442. catalystwan/tests/templates/models/cisco_ntp.py +17 -0
  443. catalystwan/tests/templates/models/cisco_omp.py +37 -0
  444. catalystwan/tests/templates/models/cisco_ospf.py +60 -0
  445. catalystwan/tests/templates/models/cisco_secure_internet_gateway.py +95 -0
  446. catalystwan/tests/templates/models/cisco_snmp.py +40 -0
  447. catalystwan/tests/templates/models/cisco_system.py +108 -3
  448. catalystwan/tests/templates/models/cisco_vpn.py +42 -72
  449. catalystwan/tests/templates/models/cisco_vpn_interface.py +200 -0
  450. catalystwan/tests/templates/models/omp_vsmart.py +28 -8
  451. catalystwan/tests/templates/models/security_vsmart.py +11 -0
  452. catalystwan/tests/templates/models/system_vsmart.py +37 -0
  453. catalystwan/tests/templates/models/vpn_vsmart.py +32 -0
  454. catalystwan/tests/templates/models/vpn_vsmart_interface.py +54 -0
  455. catalystwan/tests/templates/schemas/aaa.json +1096 -0
  456. catalystwan/tests/templates/schemas/cedge_aaa.json +1 -1
  457. catalystwan/tests/templates/schemas/cisco_logging.json +577 -0
  458. catalystwan/tests/templates/schemas/cisco_ntp.json +265 -0
  459. catalystwan/tests/templates/schemas/cisco_omp.json +479 -0
  460. catalystwan/tests/templates/schemas/cisco_ospf.json +908 -0
  461. catalystwan/tests/templates/schemas/cisco_secure_internet_gateway.json +1520 -0
  462. catalystwan/tests/templates/schemas/cisco_snmp.json +561 -0
  463. catalystwan/tests/templates/schemas/cisco_system.json +242 -0
  464. catalystwan/tests/templates/schemas/cisco_vpn.json +53 -1
  465. catalystwan/tests/templates/schemas/cisco_vpn_interface.json +3348 -0
  466. catalystwan/tests/templates/schemas/omp-vsmart.json +20 -0
  467. catalystwan/tests/templates/schemas/security-vsmart.json +58 -0
  468. catalystwan/tests/templates/schemas/system-vsmart.json +2585 -0
  469. catalystwan/tests/templates/schemas/vpn-vsmart-interface.json +859 -0
  470. catalystwan/tests/templates/schemas/vpn-vsmart.json +445 -0
  471. catalystwan/tests/templates/test_chose_model.py +6 -10
  472. catalystwan/tests/templates/test_deserialize_model.py +4 -4
  473. catalystwan/tests/templates/test_find_template_values.py +229 -0
  474. catalystwan/tests/templates/test_find_template_values_2.py +193 -0
  475. catalystwan/tests/templates/test_serialize_model.py +1 -2
  476. catalystwan/tests/test_cli_template.py +8 -9
  477. catalystwan/tests/test_endpoints.py +42 -11
  478. catalystwan/tests/test_feature_profile_api.py +282 -0
  479. catalystwan/tests/test_models_common.py +53 -0
  480. catalystwan/tests/test_templates.py +16 -19
  481. catalystwan/utils/feature_template/find_template_values.py +17 -4
  482. catalystwan/utils/model.py +45 -0
  483. catalystwan/utils/persona.py +5 -0
  484. catalystwan/utils/type_check.py +22 -0
  485. catalystwan/workflows/backup_restore_device_templates.py +467 -0
  486. catalystwan/workflows/tenant_migration.py +1 -1
  487. {catalystwan-0.41.2.dist-info → catalystwan-0.41.2.dev0.dist-info}/METADATA +20 -1
  488. catalystwan-0.41.2.dev0.dist-info/RECORD +636 -0
  489. catalystwan/ENDPOINTS.md +0 -611
  490. catalystwan/api/configuration_groups/parcels/cellular_controller.py +0 -33
  491. catalystwan/api/templates/device_template/device_template_payload.json.j2 +0 -19
  492. catalystwan/models/configuration/config_migration.py +0 -36
  493. catalystwan/models/configuration/feature_profile/sdwan/management/vpn.py +0 -26
  494. catalystwan/models/configuration/feature_profile/sdwan/service/acl.py +0 -409
  495. catalystwan/models/configuration/feature_profile/sdwan/service/bgp.py +0 -288
  496. catalystwan/models/policy/lists.py +0 -330
  497. catalystwan/models/policy/lists_entries.py +0 -444
  498. catalystwan/tests/templates/definitions/complex_aaa.json +0 -277
  499. catalystwan/tests/templates/definitions/omp_1.json +0 -11
  500. catalystwan/utils/timezone.py +0 -422
  501. catalystwan-0.41.2.dist-info/RECORD +0 -353
  502. /catalystwan/tests/templates/definitions/{banner_1.json → cisco_banner.json} +0 -0
  503. {catalystwan-0.41.2.dist-info → catalystwan-0.41.2.dev0.dist-info}/LICENSE +0 -0
  504. {catalystwan-0.41.2.dist-info → catalystwan-0.41.2.dev0.dist-info}/WHEEL +0 -0
@@ -1,23 +1,30 @@
1
1
  # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
2
 
3
- from typing import List, Optional
3
+ from typing import List, Literal, Optional
4
4
 
5
- from pydantic import AliasPath, BaseModel, ConfigDict, Field, model_validator
5
+ from pydantic import AliasPath, BaseModel, ConfigDict, Field, field_validator, model_validator
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
- from catalystwan.models.policy.lists_entries import PathPreference
9
+
10
+ PathPreference = Literal[
11
+ "direct-path",
12
+ "multi-hop-path",
13
+ "all-paths",
14
+ ]
10
15
 
11
16
 
12
17
  class Preference(BaseModel):
13
18
  model_config = ConfigDict(populate_by_name=True)
14
- color_preference: Global[list] = Field(serialization_alias="colorPreference", validation_alias="colorPreference")
19
+ color_preference: Global[List[TLOCColor]] = Field(
20
+ serialization_alias="colorPreference", validation_alias="colorPreference"
21
+ )
15
22
  path_preference: Global[PathPreference] = Field(
16
23
  serialization_alias="pathPreference", validation_alias="pathPreference"
17
24
  )
18
25
 
19
26
 
20
- class PreferredColorGroupEntry(BaseModel):
27
+ class PreferredColorGroupEntry(_ParcelEntry):
21
28
  model_config = ConfigDict(populate_by_name=True)
22
29
  primary_preference: Preference = Field(
23
30
  serialization_alias="primaryPreference", validation_alias="primaryPreference"
@@ -35,15 +42,25 @@ class PreferredColorGroupEntry(BaseModel):
35
42
  raise ValueError("Preference Entry has to have a secondary prefrence when assigning tertiary preference.")
36
43
  return self
37
44
 
45
+ @field_validator("secondary_preference", "tertiary_preference", mode="before")
46
+ @classmethod
47
+ def remove_empty_preferences(cls, value):
48
+ """handle a situation when server returns empty json object: '{}'"""
49
+ if not value:
50
+ return None
51
+ return value
52
+
38
53
 
39
54
  class PreferredColorGroupParcel(_ParcelBase):
40
- entries: List[PreferredColorGroupEntry] = Field(default=[], validation_alias=AliasPath("data", "entries"))
55
+ model_config = ConfigDict(populate_by_name=True)
56
+ type_: Literal["preferred-color-group"] = Field(default="preferred-color-group", exclude=True)
57
+ entries: List[PreferredColorGroupEntry] = Field(default_factory=list, validation_alias=AliasPath("data", "entries"))
41
58
 
42
59
  def add_primary(self, color_preference: List[TLOCColor], path_preference: PathPreference):
43
60
  self.entries.append(
44
61
  PreferredColorGroupEntry(
45
62
  primary_preference=Preference(
46
- color_preference=as_global(color_preference),
63
+ color_preference=Global[List[TLOCColor]](value=color_preference),
47
64
  path_preference=as_global(path_preference, PathPreference),
48
65
  ),
49
66
  secondary_preference=None,
@@ -54,11 +71,13 @@ class PreferredColorGroupParcel(_ParcelBase):
54
71
  def add_secondary(self, color_preference: List[TLOCColor], path_preference: PathPreference):
55
72
  preferred_color = self.entries[0]
56
73
  preferred_color.secondary_preference = Preference(
57
- color_preference=as_global(color_preference), path_preference=as_global(path_preference, PathPreference)
74
+ color_preference=Global[List[TLOCColor]](value=color_preference),
75
+ path_preference=as_global(path_preference, PathPreference),
58
76
  )
59
77
 
60
78
  def add_tertiary(self, color_preference: List[TLOCColor], path_preference: PathPreference):
61
79
  preferred_color = self.entries[0]
62
80
  preferred_color.tertiary_preference = Preference(
63
- color_preference=as_global(color_preference), path_preference=as_global(path_preference, PathPreference)
81
+ color_preference=Global[List[TLOCColor]](value=color_preference),
82
+ path_preference=as_global(path_preference, PathPreference),
64
83
  )
@@ -1,26 +1,41 @@
1
1
  # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
2
 
3
3
  from ipaddress import IPv4Address, IPv4Network
4
- from typing import List
4
+ from typing import List, Literal, Optional
5
5
 
6
- from pydantic import AliasPath, BaseModel, ConfigDict, Field
6
+ from pydantic import AliasPath, ConfigDict, Field
7
7
 
8
- from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase, as_global
8
+ from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase, _ParcelEntry
9
+ from catalystwan.models.common import Ipv4GePrefixRangeLen, Ipv4LePrefixRangeLen, Ipv4PrefixLen
9
10
 
10
11
 
11
- class PrefixListEntry(BaseModel):
12
+ class PrefixListEntry(_ParcelEntry):
12
13
  model_config = ConfigDict(populate_by_name=True)
13
14
  ipv4_address: Global[IPv4Address] = Field(serialization_alias="ipv4Address", validation_alias="ipv4Address")
14
- ipv4_prefix_length: Global[int] = Field(serialization_alias="ipv4PrefixLength", validation_alias="ipv4PrefixLength")
15
+ ipv4_prefix_length: Global[Ipv4PrefixLen] = Field(
16
+ serialization_alias="ipv4PrefixLength", validation_alias="ipv4PrefixLength"
17
+ )
18
+ le_range_prefix_length: Optional[Global[Ipv4LePrefixRangeLen]] = Field(
19
+ default=None, serialization_alias="leRangePrefixLength", validation_alias="leRangePrefixLength"
20
+ )
21
+ ge_range_prefix_length: Optional[Global[Ipv4GePrefixRangeLen]] = Field(
22
+ default=None, serialization_alias="geRangePrefixLength", validation_alias="geRangePrefixLength"
23
+ )
15
24
 
16
25
 
17
26
  class PrefixListParcel(_ParcelBase):
27
+ model_config = ConfigDict(populate_by_name=True)
28
+ type_: Literal["prefix"] = Field(default="prefix", exclude=True)
18
29
  entries: List[PrefixListEntry] = Field(default_factory=list, validation_alias=AliasPath("data", "entries"))
19
30
 
20
- def add_prefix(self, ipv4_network: IPv4Network):
31
+ def add_prefix(self, ipv4_network: IPv4Network, le: Optional[int] = None, ge: Optional[int] = None):
32
+ le_ = Global[Ipv4LePrefixRangeLen](value=le) if le is not None else None
33
+ ge_ = Global[Ipv4GePrefixRangeLen](value=ge) if ge is not None else None
21
34
  self.entries.append(
22
35
  PrefixListEntry(
23
- ipv4_address=as_global(ipv4_network.network_address),
24
- ipv4_prefix_length=as_global(ipv4_network.prefixlen),
36
+ ipv4_address=Global[IPv4Address](value=ipv4_network.network_address),
37
+ ipv4_prefix_length=Global[int](value=ipv4_network.prefixlen),
38
+ le_range_prefix_length=le_,
39
+ ge_range_prefix_length=ge_,
25
40
  )
26
41
  )
@@ -0,0 +1,21 @@
1
+ # Copyright 2025 Cisco Systems, Inc. and its affiliates
2
+ from typing import List, Literal, Optional
3
+
4
+ from pydantic import AliasPath, Field
5
+
6
+ from catalystwan.api.configuration_groups.parcel import _ParcelBase, _ParcelEntry
7
+ from catalystwan.models.configuration.feature_profile.common import RefIdItem
8
+
9
+
10
+ class ServiceObjectGrouEntries(_ParcelEntry):
11
+ object_group: Optional[RefIdItem] = Field(
12
+ default=None, validation_alias="objectGroup", serialization_alias="objectGroup"
13
+ )
14
+
15
+
16
+ class ServiceObjectGroupParcel(_ParcelBase):
17
+ type_: Literal["service-object-group"] = Field(default="service-object-group", exclude=True)
18
+ entries: List[ServiceObjectGrouEntries] = Field(
19
+ validation_alias=AliasPath("data", "entries"),
20
+ description="object-group Entries",
21
+ )
@@ -5,25 +5,9 @@ from uuid import UUID
5
5
 
6
6
  from pydantic import AliasPath, BaseModel, ConfigDict, Field, field_validator
7
7
 
8
- from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase, as_global
9
-
10
- SLAClassCriteria = Literal[
11
- "loss",
12
- "latency",
13
- "jitter",
14
- "loss-latency",
15
- "loss-jitter",
16
- "latency-loss",
17
- "latency-jitter",
18
- "jitter-latency",
19
- "jitter-loss",
20
- "loss-latency-jitter",
21
- "loss-jitter-latency",
22
- "latency-loss-jitter",
23
- "latency-jitter-loss",
24
- "jitter-latency-loss",
25
- "jitter-loss-latency",
26
- ]
8
+ from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase, _ParcelEntry, as_global
9
+ from catalystwan.models.common import SLAClassCriteria
10
+ from catalystwan.models.configuration.feature_profile.common import RefIdItem
27
11
 
28
12
 
29
13
  def check_latency_ms(cls, latency: Optional[Global]):
@@ -44,12 +28,6 @@ def check_jitter_ms(cls, jitter: Optional[Global]):
44
28
  return jitter
45
29
 
46
30
 
47
- class SLAAppProbeClass(BaseModel):
48
- model_config = ConfigDict(populate_by_name=True)
49
-
50
- ref_id: Global[UUID] = Field(serialization_alias="refId", validation_alias="refId")
51
-
52
-
53
31
  class FallbackBestTunnel(BaseModel):
54
32
  model_config = ConfigDict(populate_by_name=True)
55
33
 
@@ -95,14 +73,14 @@ class FallbackBestTunnel(BaseModel):
95
73
  raise ValueError(f"Criteria {e} is not in configured criteria {self.criteria.value}")
96
74
 
97
75
 
98
- class SLAClassListEntry(BaseModel):
76
+ class SLAClassListEntry(_ParcelEntry):
99
77
  model_config = ConfigDict(populate_by_name=True)
100
78
 
101
79
  latency: Optional[Global[int]] = None
102
80
  loss: Optional[Global[int]] = None
103
81
  jitter: Optional[Global[int]] = None
104
- app_probe_class: Optional[SLAAppProbeClass] = Field(
105
- validation_alias="appProbeClass", serialization_alias="appProbeClass"
82
+ app_probe_class: Optional[RefIdItem] = Field(
83
+ default=None, validation_alias="appProbeClass", serialization_alias="appProbeClass"
106
84
  )
107
85
  fallback_best_tunnel: Optional[FallbackBestTunnel] = Field(
108
86
  default=None, validation_alias="fallbackBestTunnel", serialization_alias="fallbackBestTunnel"
@@ -115,18 +93,21 @@ class SLAClassListEntry(BaseModel):
115
93
 
116
94
 
117
95
  class SLAClassParcel(_ParcelBase):
118
- entries: List[SLAClassListEntry] = Field(default=[], validation_alias=AliasPath("data", "entries"))
96
+ model_config = ConfigDict(populate_by_name=True)
97
+ type_: Literal["sla-class"] = Field(default="sla-class", exclude=True)
98
+ entries: List[SLAClassListEntry] = Field(default_factory=list, validation_alias=AliasPath("data", "entries"))
119
99
 
120
100
  def add_entry(
121
101
  self,
122
- app_probe_class_id: UUID,
102
+ app_probe_class_id: Optional[UUID] = None,
123
103
  loss: Optional[int] = None,
124
104
  jitter: Optional[int] = None,
125
105
  latency: Optional[int] = None,
126
106
  ):
107
+ ref = RefIdItem(ref_id=as_global(str(app_probe_class_id))) if app_probe_class_id is not None else None
127
108
  self.entries.append(
128
109
  SLAClassListEntry(
129
- app_probe_class=SLAAppProbeClass(ref_id=as_global(app_probe_class_id)),
110
+ app_probe_class=ref,
130
111
  loss=as_global(loss) if loss is not None else None,
131
112
  jitter=as_global(jitter) if jitter is not None else None,
132
113
  latency=as_global(latency) if latency is not None else None,
@@ -1,24 +1,30 @@
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, 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
  from catalystwan.models.common import WellKnownBGPCommunities
9
9
 
10
10
 
11
- class StandardCommunityEntry(BaseModel):
11
+ class StandardCommunityEntry(_ParcelEntry):
12
12
  model_config = ConfigDict(populate_by_name=True)
13
- standard_community: Global[WellKnownBGPCommunities] = Field(
13
+ standard_community: Global[str] = Field(
14
14
  serialization_alias="standardCommunity", validation_alias="standardCommunity"
15
15
  )
16
16
 
17
17
 
18
18
  class StandardCommunityParcel(_ParcelBase):
19
- entries: List[StandardCommunityEntry] = Field(default=[], validation_alias=AliasPath("data", "entries"))
19
+ model_config = ConfigDict(populate_by_name=True)
20
+ type_: Literal["standard-community"] = Field(default="standard-community", exclude=True)
21
+ entries: List[StandardCommunityEntry] = Field(default_factory=list, validation_alias=AliasPath("data", "entries"))
22
+
23
+ def _add_community(self, standard_community: str):
24
+ self.entries.append(StandardCommunityEntry(standard_community=as_global(standard_community)))
25
+
26
+ def add_well_known_community(self, standard_community: WellKnownBGPCommunities):
27
+ self._add_community(standard_community)
20
28
 
21
- def add_community(self, standard_community: WellKnownBGPCommunities):
22
- self.entries.append(
23
- StandardCommunityEntry(standard_community=as_global(standard_community, WellKnownBGPCommunities))
24
- )
29
+ def add_community(self, as_number: int, community_number: int) -> None:
30
+ self._add_community(f"{as_number}:{community_number}")
@@ -1,16 +1,15 @@
1
1
  # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
2
 
3
3
  from ipaddress import IPv4Address
4
- from typing import List, Optional
4
+ from typing import List, Literal, Optional
5
5
 
6
- from pydantic import AliasPath, BaseModel, ConfigDict, Field, field_validator
6
+ from pydantic import AliasPath, ConfigDict, Field, field_validator
7
7
 
8
- from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase, as_global
9
- from catalystwan.models.common import TLOCColor
10
- from catalystwan.models.policy.lists_entries import EncapType
8
+ from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase, _ParcelEntry, as_global
9
+ from catalystwan.models.common import EncapType, TLOCColor
11
10
 
12
11
 
13
- class TlocEntry(BaseModel):
12
+ class TlocEntry(_ParcelEntry):
14
13
  model_config = ConfigDict(populate_by_name=True)
15
14
  tloc: Global[IPv4Address]
16
15
  color: Global[TLOCColor]
@@ -28,7 +27,9 @@ class TlocEntry(BaseModel):
28
27
 
29
28
 
30
29
  class TlocParcel(_ParcelBase):
31
- entries: List[TlocEntry] = Field(default=[], validation_alias=AliasPath("data", "entries"))
30
+ model_config = ConfigDict(populate_by_name=True)
31
+ type_: Literal["tloc"] = Field(default="tloc", exclude=True)
32
+ entries: List[TlocEntry] = Field(default_factory=list, validation_alias=AliasPath("data", "entries"))
32
33
 
33
34
  def add_entry(
34
35
  self, tloc: IPv4Address, color: TLOCColor, encapsulation: EncapType, preference: Optional[str] = None
@@ -0,0 +1,64 @@
1
+ # Copyright 2023 Cisco Systems, Inc. and its affiliates
2
+ # Copyright 2024 Cisco Systems, Inc. and its affiliates
3
+
4
+ from typing import Literal, Optional
5
+ from uuid import UUID
6
+
7
+ from pydantic import AliasPath, ConfigDict, Field
8
+
9
+ from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase
10
+ from catalystwan.models.configuration.feature_profile.common import RefIdItem
11
+
12
+ TlsDecryptionAction = Literal["decrypt", "neverDecrypt", "skipDecrypt"]
13
+
14
+
15
+ class AdvancedInspectionProfileParcel(_ParcelBase):
16
+ model_config = ConfigDict(populate_by_name=True)
17
+ type_: Literal["unified/advanced-inspection-profile"] = Field(
18
+ default="unified/advanced-inspection-profile", exclude=True
19
+ )
20
+ parcel_description: str = Field(
21
+ default="",
22
+ serialization_alias="description",
23
+ validation_alias="description",
24
+ description="Set the parcel description",
25
+ )
26
+ tls_decryption_action: Global[TlsDecryptionAction] = Field(
27
+ default=Global[TlsDecryptionAction](value="skipDecrypt"),
28
+ validation_alias=AliasPath("data", "tlsDecryptionAction"),
29
+ )
30
+ intrusion_prevention: Optional[RefIdItem] = Field(
31
+ default=None, validation_alias=AliasPath("data", "intrusionPrevention")
32
+ )
33
+ url_filtering: Optional[RefIdItem] = Field(default=None, validation_alias=AliasPath("data", "urlFiltering"))
34
+ advanced_malware_protection: Optional[RefIdItem] = Field(
35
+ default=None, validation_alias=AliasPath("data", "advancedMalwareProtection")
36
+ )
37
+ ssl_decryption_profile: Optional[RefIdItem] = Field(
38
+ default=None, validation_alias=AliasPath("data", "sslDecryptionProfile")
39
+ )
40
+
41
+ @classmethod
42
+ def create(
43
+ cls,
44
+ parcel_name: str,
45
+ parcel_description: str,
46
+ tls_decryption_action: TlsDecryptionAction = "skipDecrypt",
47
+ intrusion_prevention: Optional[UUID] = None,
48
+ url_filtering: Optional[UUID] = None,
49
+ advanced_malware_protection: Optional[UUID] = None,
50
+ ssl_decryption_profile: Optional[UUID] = None,
51
+ ) -> "AdvancedInspectionProfileParcel":
52
+ ip = RefIdItem.from_uuid(intrusion_prevention) if intrusion_prevention else None
53
+ uf = RefIdItem.from_uuid(url_filtering) if url_filtering else None
54
+ amp = RefIdItem.from_uuid(advanced_malware_protection) if advanced_malware_protection else None
55
+ sdp = RefIdItem.from_uuid(ssl_decryption_profile) if ssl_decryption_profile else None
56
+ return cls(
57
+ parcel_name=parcel_name,
58
+ parcel_description=parcel_description,
59
+ tls_decryption_action=Global[TlsDecryptionAction](value=tls_decryption_action),
60
+ intrusion_prevention=ip,
61
+ url_filtering=uf,
62
+ advanced_malware_protection=amp,
63
+ ssl_decryption_profile=sdp,
64
+ )
@@ -0,0 +1,79 @@
1
+ # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
+
3
+ from typing import List, Literal, Optional
4
+
5
+ from pydantic import AliasPath, ConfigDict, Field
6
+
7
+ from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase
8
+ from catalystwan.models.common import (
9
+ AmpFileAlertLevel,
10
+ AmpFileAnalysisFileTypes,
11
+ AmpFileAnalysisServer,
12
+ AmpFileReputationServer,
13
+ )
14
+
15
+
16
+ class AdvancedMalwareProtectionParcel(_ParcelBase):
17
+ model_config = ConfigDict(populate_by_name=True)
18
+ type_: Literal["unified/advanced-malware-protection"] = Field(
19
+ default="unified/advanced-malware-protection", exclude=True
20
+ )
21
+ description: str = "advancedMalwareProtection"
22
+ match_all_vpn: Global[Literal[True]] = Field(
23
+ default=Global[Literal[True]](value=True), validation_alias=AliasPath("data", "matchAllVpn")
24
+ )
25
+ file_reputation_cloud_server: Global[AmpFileReputationServer] = Field(
26
+ validation_alias=AliasPath("data", "fileReputationCloudServer")
27
+ )
28
+ file_reputation_est_server: Global[AmpFileReputationServer] = Field(
29
+ validation_alias=AliasPath("data", "fileReputationEstServer")
30
+ )
31
+ file_reputation_alert: Global[AmpFileAlertLevel] = Field(
32
+ default=Global[AmpFileAlertLevel](value="critical"),
33
+ validation_alias=AliasPath("data", "fileReputationAlert"),
34
+ )
35
+ file_analysis_enabled: Global[bool] = Field(
36
+ default=Global[bool](value=False), validation_alias=AliasPath("data", "fileAnalysisEnabled")
37
+ )
38
+ file_analysis_cloud_server: Optional[Global[AmpFileAnalysisServer]] = Field(
39
+ default=None, validation_alias=AliasPath("data", "fileAnalysisCloudServer")
40
+ )
41
+ file_analysis_file_types: Optional[Global[List[AmpFileAnalysisFileTypes]]] = Field(
42
+ default=None, validation_alias=AliasPath("data", "fileAnalysisFileTypes")
43
+ )
44
+ file_analysis_alert: Optional[Global[AmpFileAlertLevel]] = Field(
45
+ default=None, validation_alias=AliasPath("data", "fileAnalysisAlert")
46
+ )
47
+
48
+ @classmethod
49
+ def create(
50
+ cls,
51
+ parcel_name: str,
52
+ parcel_description: str,
53
+ file_reputation_cloud_server: AmpFileReputationServer,
54
+ file_reputation_est_server: AmpFileReputationServer,
55
+ file_reputation_alert: AmpFileAlertLevel,
56
+ file_analysis_enabled: bool = False,
57
+ file_analysis_alert: Optional[AmpFileAlertLevel] = None,
58
+ file_analysis_cloud_server: Optional[AmpFileAnalysisServer] = None,
59
+ file_analysis_file_types: List[AmpFileAnalysisFileTypes] = [],
60
+ ):
61
+ _file_analysis_alert = Global[AmpFileAlertLevel](value=file_analysis_alert) if file_analysis_alert else None
62
+ _file_analysis_cloud_server = (
63
+ Global[AmpFileAnalysisServer](value=file_analysis_cloud_server) if file_analysis_cloud_server else None
64
+ )
65
+ _file_analysis_file_types = (
66
+ Global[List[AmpFileAnalysisFileTypes]](value=file_analysis_file_types) if file_analysis_file_types else None
67
+ )
68
+
69
+ return cls(
70
+ parcel_name=parcel_name,
71
+ parcel_description=parcel_description,
72
+ file_reputation_cloud_server=Global[AmpFileReputationServer](value=file_reputation_cloud_server),
73
+ file_reputation_est_server=Global[AmpFileReputationServer](value=file_reputation_est_server),
74
+ file_analysis_alert=_file_analysis_alert,
75
+ file_analysis_cloud_server=_file_analysis_cloud_server,
76
+ file_reputation_alert=Global[AmpFileAlertLevel](value=file_reputation_alert),
77
+ file_analysis_enabled=Global[bool](value=file_analysis_enabled),
78
+ file_analysis_file_types=_file_analysis_file_types,
79
+ )
@@ -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 SecurityApplicationListEntry(BaseModel):
10
+ class SecurityApplicationListEntry(_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 SecurityApplicationFamilyListEntry(BaseModel):
15
+ class SecurityApplicationFamilyListEntry(_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 SecurityApplicationListParcel(_ParcelBase):
21
+ model_config = ConfigDict(populate_by_name=True)
22
+ type_: Literal["security-localapp"] = Field(default="security-localapp", exclude=True)
21
23
  entries: List[Union[SecurityApplicationFamilyListEntry, SecurityApplicationListEntry]] = 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):
@@ -1,20 +1,22 @@
1
1
  # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
2
 
3
3
  from ipaddress import IPv4Network
4
- from typing import List
4
+ from typing import List, Literal
5
5
 
6
- from pydantic import AliasPath, BaseModel, ConfigDict, Field
6
+ from pydantic import AliasPath, ConfigDict, Field
7
7
 
8
- from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase, as_global
8
+ from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase, _ParcelEntry, as_global
9
9
 
10
10
 
11
- class SecurityDataPrefixEntry(BaseModel):
11
+ class SecurityDataPrefixEntry(_ParcelEntry):
12
12
  model_config = ConfigDict(populate_by_name=True)
13
13
  ip_prefix: Global[IPv4Network] = Field(serialization_alias="ipPrefix", validation_alias="ipPrefix")
14
14
 
15
15
 
16
16
  class SecurityDataPrefixParcel(_ParcelBase):
17
- entries: List[SecurityDataPrefixEntry] = Field(default=[], validation_alias=AliasPath("data", "entries"))
17
+ model_config = ConfigDict(populate_by_name=True)
18
+ type_: Literal["security-data-ip-prefix"] = Field(default="security-data-ip-prefix", exclude=True)
19
+ entries: List[SecurityDataPrefixEntry] = Field(default_factory=list, validation_alias=AliasPath("data", "entries"))
18
20
 
19
21
  def add_prefix(self, ip_prefix: IPv4Network):
20
22
  self.entries.append(SecurityDataPrefixEntry(ip_prefix=as_global(ip_prefix)))
@@ -1,13 +1,13 @@
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, 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 FQDNListEntry(BaseModel):
10
+ class FQDNListEntry(_ParcelEntry):
11
11
  model_config = ConfigDict(populate_by_name=True)
12
12
  pattern: Global[str] = Field(
13
13
  description="Ex: cisco.com, .*cisco.com, .*.cisco.com. Should not start with '*' or '+'"
@@ -15,7 +15,9 @@ class FQDNListEntry(BaseModel):
15
15
 
16
16
 
17
17
  class FQDNDomainParcel(_ParcelBase):
18
- entries: List[FQDNListEntry] = Field(default=[], validation_alias=AliasPath("data", "entries"))
18
+ model_config = ConfigDict(populate_by_name=True)
19
+ type_: Literal["security-fqdn"] = Field(default="security-fqdn", exclude=True)
20
+ entries: List[FQDNListEntry] = Field(default_factory=list, validation_alias=AliasPath("data", "entries"))
19
21
 
20
22
  def from_fqdns(self, fqdns: List[str]):
21
23
  for fqdn in fqdns:
@@ -1,14 +1,14 @@
1
1
  # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
2
 
3
- from typing import List, Optional
3
+ from typing import List, Literal, Optional
4
4
 
5
- from pydantic import AliasPath, BaseModel, Field, model_validator
5
+ from pydantic import AliasPath, ConfigDict, Field, model_validator
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 check_fields_exclusive
9
9
 
10
10
 
11
- class GeoLocationListEntry(BaseModel):
11
+ class GeoLocationListEntry(_ParcelEntry):
12
12
  country: Optional[Global[str]] = Field(default=None, description="ISO-3166 alpha-3 country code eg: FRA")
13
13
  continent: Optional[Global[str]] = Field(
14
14
  default=None, description="One of 2-letter continent codes: AF, NA, OC, AN, AS, EU, SA"
@@ -21,7 +21,9 @@ class GeoLocationListEntry(BaseModel):
21
21
 
22
22
 
23
23
  class GeoLocationListParcel(_ParcelBase):
24
- entries: List[GeoLocationListEntry] = Field(default=[], validation_alias=AliasPath("data", "entries"))
24
+ model_config = ConfigDict(populate_by_name=True)
25
+ type_: Literal["security-geolocation"] = Field(default="security-geolocation", exclude=True)
26
+ entries: List[GeoLocationListEntry] = Field(default_factory=list, validation_alias=AliasPath("data", "entries"))
25
27
 
26
28
  def add_country(self, country: str):
27
29
  self.entries.append(GeoLocationListEntry(country=as_global(country)))
@@ -0,0 +1,30 @@
1
+ # Copyright 2024 Cisco Systems, Inc. and its affiliates
2
+ from typing import List, Literal, Optional
3
+
4
+ from pydantic import AliasPath, Field
5
+
6
+ from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase, _ParcelEntry, as_optional_global
7
+
8
+
9
+ class IdentityEntry(_ParcelEntry):
10
+ user: Optional[Global[str]] = Field(default=None)
11
+ user_group: Optional[Global[str]] = Field(
12
+ default=None, validation_alias="userGroup", serialization_alias="userGroup"
13
+ )
14
+
15
+
16
+ class IdentityParcel(_ParcelBase):
17
+ type_: Literal["security-identity"] = Field(default="security-identity", exclude=True)
18
+ entries: List[IdentityEntry] = Field(
19
+ validation_alias=AliasPath("data", "entries"),
20
+ default_factory=list,
21
+ description="Array of Users and User Groups",
22
+ )
23
+
24
+ def add_entry(self, user: Optional[str] = None, user_group: Optional[str] = None):
25
+ self.entries.append(
26
+ IdentityEntry(
27
+ user=as_optional_global(user),
28
+ user_group=as_optional_global(user_group),
29
+ )
30
+ )