catalystwan 0.41.2.dev9__py3-none-any.whl → 0.41.3__py3-none-any.whl

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