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.
- catalystwan/__init__.py +3 -2
- catalystwan/api/administration.py +13 -2
- catalystwan/api/api_container.py +4 -1
- catalystwan/api/builders/__init__.py +14 -0
- catalystwan/api/builders/feature_profiles/__init__.py +0 -0
- catalystwan/api/builders/feature_profiles/application_priority.py +58 -0
- catalystwan/api/builders/feature_profiles/builder_factory.py +59 -0
- catalystwan/api/builders/feature_profiles/cli.py +76 -0
- catalystwan/api/builders/feature_profiles/mixins.py +44 -0
- catalystwan/api/builders/feature_profiles/other.py +79 -0
- catalystwan/api/builders/feature_profiles/report.py +155 -0
- catalystwan/api/builders/feature_profiles/service.py +248 -0
- catalystwan/api/builders/feature_profiles/system.py +80 -0
- catalystwan/api/builders/feature_profiles/transport.py +256 -0
- catalystwan/api/builders/feature_profiles/uc_voice.py +287 -0
- catalystwan/api/config_group_api.py +41 -16
- catalystwan/api/configuration_groups/parcel.py +100 -30
- catalystwan/api/feature_profile_api.py +2021 -242
- catalystwan/api/policy_api.py +470 -116
- catalystwan/api/template_api.py +113 -44
- catalystwan/api/templates/README.md +61 -47
- catalystwan/api/templates/cli_template.py +17 -7
- catalystwan/api/templates/device_template/device_template.py +127 -32
- catalystwan/api/templates/feature_template.py +3 -3
- catalystwan/api/templates/models/aaa_model.py +387 -0
- catalystwan/api/templates/models/cisco_aaa_model.py +289 -42
- catalystwan/api/templates/models/cisco_banner_model.py +11 -2
- catalystwan/api/templates/models/cisco_bfd_model.py +31 -36
- catalystwan/api/templates/models/cisco_bgp_model.py +382 -131
- catalystwan/api/templates/models/cisco_logging_model.py +80 -43
- catalystwan/api/templates/models/cisco_ntp_model.py +34 -15
- catalystwan/api/templates/models/cisco_omp_model.py +70 -60
- catalystwan/api/templates/models/cisco_ospf.py +143 -74
- catalystwan/api/templates/models/cisco_ospfv3.py +217 -95
- catalystwan/api/templates/models/cisco_secure_internet_gateway.py +304 -142
- catalystwan/api/templates/models/cisco_snmp_model.py +66 -52
- catalystwan/api/templates/models/cisco_system.py +238 -129
- catalystwan/api/templates/models/cisco_vpn_interface_model.py +632 -275
- catalystwan/api/templates/models/cisco_vpn_model.py +433 -270
- catalystwan/api/templates/models/cli_template.py +3 -2
- catalystwan/api/templates/models/omp_vsmart_model.py +46 -10
- catalystwan/api/templates/models/security_vsmart_model.py +11 -8
- catalystwan/api/templates/models/supported.py +10 -4
- catalystwan/api/templates/models/system_vsmart_model.py +164 -27
- catalystwan/api/templates/models/vpn_vsmart_interface_model.py +198 -0
- catalystwan/api/templates/models/vpn_vsmart_model.py +124 -0
- catalystwan/apigw_auth.py +6 -2
- catalystwan/dataclasses.py +2 -53
- catalystwan/endpoints/__init__.py +41 -41
- catalystwan/endpoints/certificate_management_device.py +4 -0
- catalystwan/endpoints/cluster_management.py +27 -7
- catalystwan/endpoints/configuration/feature_profile/sdwan/application_priority.py +107 -0
- catalystwan/endpoints/configuration/feature_profile/sdwan/cli.py +60 -0
- catalystwan/endpoints/configuration/feature_profile/sdwan/dns_security.py +83 -0
- catalystwan/endpoints/configuration/feature_profile/sdwan/embedded_security.py +88 -0
- catalystwan/endpoints/configuration/feature_profile/sdwan/other.py +62 -0
- catalystwan/endpoints/configuration/feature_profile/sdwan/policy_object.py +35 -12
- catalystwan/endpoints/configuration/feature_profile/sdwan/service.py +154 -0
- catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py +88 -0
- catalystwan/endpoints/configuration/feature_profile/sdwan/system.py +164 -11
- catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py +93 -0
- catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py +144 -26
- catalystwan/endpoints/configuration/feature_profile/sdwan/uc_voice.py +77 -0
- catalystwan/endpoints/configuration/network_hierarchy.py +32 -0
- catalystwan/endpoints/configuration/policy/abstractions.py +49 -0
- catalystwan/endpoints/configuration/policy/definition/access_control_list.py +6 -11
- catalystwan/endpoints/configuration/policy/definition/access_control_list_ipv6.py +6 -11
- catalystwan/endpoints/configuration/policy/definition/aip.py +52 -0
- catalystwan/endpoints/configuration/policy/definition/amp.py +52 -0
- catalystwan/endpoints/configuration/policy/definition/app_route.py +50 -0
- catalystwan/endpoints/configuration/policy/definition/cflowd.py +46 -0
- catalystwan/endpoints/configuration/policy/definition/control.py +6 -11
- catalystwan/endpoints/configuration/policy/definition/device_access.py +6 -11
- catalystwan/endpoints/configuration/policy/definition/device_access_ipv6.py +6 -11
- catalystwan/endpoints/configuration/policy/definition/dial_peer.py +57 -0
- catalystwan/endpoints/configuration/policy/definition/dns_security.py +50 -0
- catalystwan/endpoints/configuration/policy/definition/fxo_port.py +57 -0
- catalystwan/endpoints/configuration/policy/definition/fxs_did_port.py +57 -0
- catalystwan/endpoints/configuration/policy/definition/fxs_port.py +57 -0
- catalystwan/endpoints/configuration/policy/definition/hub_and_spoke.py +6 -11
- catalystwan/endpoints/configuration/policy/definition/intrusion_prevention.py +52 -0
- catalystwan/endpoints/configuration/policy/definition/mesh.py +2 -11
- catalystwan/endpoints/configuration/policy/definition/pri_isdn_port.py +57 -0
- catalystwan/endpoints/configuration/policy/definition/qos_map.py +2 -11
- catalystwan/endpoints/configuration/policy/definition/rewrite.py +6 -11
- catalystwan/endpoints/configuration/policy/definition/route_policy.py +50 -0
- catalystwan/endpoints/configuration/policy/definition/rule_set.py +2 -11
- catalystwan/endpoints/configuration/policy/definition/security_group.py +6 -11
- catalystwan/endpoints/configuration/policy/definition/srst_phone_profile.py +59 -0
- catalystwan/endpoints/configuration/policy/definition/ssl_decryption.py +50 -0
- catalystwan/endpoints/configuration/policy/definition/ssl_decryption_utd_profile.py +52 -0
- catalystwan/endpoints/configuration/policy/definition/traffic_data.py +6 -11
- catalystwan/endpoints/configuration/policy/definition/url_filtering.py +50 -0
- catalystwan/endpoints/configuration/policy/definition/vpn_membership.py +6 -11
- catalystwan/endpoints/configuration/policy/definition/vpn_qos_map.py +50 -0
- catalystwan/endpoints/configuration/policy/definition/zone_based_firewall.py +6 -11
- catalystwan/endpoints/configuration/policy/list/app.py +3 -16
- catalystwan/endpoints/configuration/policy/list/app_probe.py +6 -15
- catalystwan/endpoints/configuration/policy/list/as_path.py +3 -16
- catalystwan/endpoints/configuration/policy/list/class_map.py +3 -16
- catalystwan/endpoints/configuration/policy/list/color.py +3 -16
- catalystwan/endpoints/configuration/policy/list/community.py +3 -16
- catalystwan/endpoints/configuration/policy/list/data_ipv6_prefix.py +6 -15
- catalystwan/endpoints/configuration/policy/list/data_prefix.py +3 -16
- catalystwan/endpoints/configuration/policy/list/expanded_community.py +6 -15
- catalystwan/endpoints/configuration/policy/list/extended_community.py +52 -0
- catalystwan/endpoints/configuration/policy/list/fax_protocol.py +48 -0
- catalystwan/endpoints/configuration/policy/list/fqdn.py +3 -16
- catalystwan/endpoints/configuration/policy/list/geo_location.py +3 -16
- catalystwan/endpoints/configuration/policy/list/identity.py +48 -0
- catalystwan/endpoints/configuration/policy/list/ips_signature.py +6 -15
- catalystwan/endpoints/configuration/policy/list/ipv6_prefix.py +3 -16
- catalystwan/endpoints/configuration/policy/list/local_app.py +3 -16
- catalystwan/endpoints/configuration/policy/list/local_domain.py +3 -16
- catalystwan/endpoints/configuration/policy/list/media_profile.py +52 -0
- catalystwan/endpoints/configuration/policy/list/mirror.py +3 -16
- catalystwan/endpoints/configuration/policy/list/modem_pass_through.py +52 -0
- catalystwan/endpoints/configuration/policy/list/policer.py +3 -16
- catalystwan/endpoints/configuration/policy/list/port.py +3 -16
- catalystwan/endpoints/configuration/policy/list/preferred_color_group.py +6 -15
- catalystwan/endpoints/configuration/policy/list/prefix.py +4 -16
- catalystwan/endpoints/configuration/policy/list/protocol_name.py +6 -15
- catalystwan/endpoints/configuration/policy/list/region.py +2 -10
- catalystwan/endpoints/configuration/policy/list/scalable_group_tag.py +52 -0
- catalystwan/endpoints/configuration/policy/list/site.py +3 -16
- catalystwan/endpoints/configuration/policy/list/sla.py +3 -16
- catalystwan/endpoints/configuration/policy/list/supervisory_disconnect.py +52 -0
- catalystwan/endpoints/configuration/policy/list/threat_grid_api_key.py +52 -0
- catalystwan/endpoints/configuration/policy/list/tloc.py +3 -16
- catalystwan/endpoints/configuration/policy/list/translation_profile.py +52 -0
- catalystwan/endpoints/configuration/policy/list/translation_rules.py +52 -0
- catalystwan/endpoints/configuration/policy/list/trunkgroup.py +48 -0
- catalystwan/endpoints/configuration/policy/list/umbrella_data.py +52 -0
- catalystwan/endpoints/configuration/policy/list/url_allow_list.py +3 -16
- catalystwan/endpoints/configuration/policy/list/url_block_list.py +3 -16
- catalystwan/endpoints/configuration/policy/list/vpn.py +3 -16
- catalystwan/endpoints/configuration/policy/list/zone.py +3 -16
- catalystwan/endpoints/configuration/policy/security_template.py +2 -3
- catalystwan/endpoints/configuration/policy/voice_template.py +39 -0
- catalystwan/endpoints/configuration/policy_group.py +30 -0
- catalystwan/endpoints/configuration/software_actions.py +2 -4
- catalystwan/endpoints/configuration/topology_group.py +51 -0
- catalystwan/endpoints/configuration_dashboard_status.py +2 -2
- catalystwan/endpoints/configuration_device_template.py +15 -1
- catalystwan/endpoints/configuration_feature_profile.py +8 -11
- catalystwan/endpoints/configuration_general_template.py +31 -0
- catalystwan/endpoints/configuration_group.py +28 -5
- catalystwan/endpoints/configuration_settings.py +90 -1
- catalystwan/endpoints/configuration_template_master.py +48 -0
- catalystwan/endpoints/endpoints_container.py +79 -19
- catalystwan/endpoints/real_time_monitoring/reboot_history.py +1 -3
- catalystwan/endpoints/tenant_migration.py +2 -0
- catalystwan/exceptions.py +17 -0
- catalystwan/integration_tests/base.py +81 -0
- catalystwan/integration_tests/feature_profile/sdwan/__init__.py +0 -0
- catalystwan/integration_tests/feature_profile/sdwan/policy/__init__.py +0 -0
- catalystwan/integration_tests/feature_profile/sdwan/policy/base.py +33 -0
- catalystwan/integration_tests/feature_profile/sdwan/policy/test_extended_community.py +33 -0
- catalystwan/integration_tests/feature_profile/sdwan/policy/test_security_app_list.py +32 -0
- catalystwan/integration_tests/feature_profile/sdwan/test_application_priority.py +433 -0
- catalystwan/integration_tests/feature_profile/sdwan/test_cli.py +54 -0
- catalystwan/integration_tests/feature_profile/sdwan/test_dns_security.py +106 -0
- catalystwan/integration_tests/feature_profile/sdwan/test_other.py +49 -0
- catalystwan/integration_tests/feature_profile/sdwan/test_service.py +1078 -0
- catalystwan/integration_tests/feature_profile/sdwan/test_sig_security.py +322 -0
- catalystwan/integration_tests/feature_profile/sdwan/test_ssl_decryption.py +85 -0
- catalystwan/integration_tests/feature_profile/sdwan/test_system.py +368 -0
- catalystwan/integration_tests/feature_profile/sdwan/test_tracker.py +127 -0
- catalystwan/integration_tests/feature_profile/sdwan/test_transport.py +1698 -0
- catalystwan/integration_tests/feature_profile/sdwan/topology/test_topology.py +93 -0
- catalystwan/integration_tests/profile_builder/__init__.py +0 -0
- catalystwan/integration_tests/profile_builder/test_pb_service.py +197 -0
- catalystwan/integration_tests/profile_builder/test_pb_transport.py +226 -0
- catalystwan/integration_tests/profile_builder/test_pb_uc_voice.py +277 -0
- catalystwan/integration_tests/test_data/__init__.py +117 -0
- catalystwan/integration_tests/test_find_template_values.py +7 -18
- catalystwan/integration_tests/test_network_hierarchy.py +82 -0
- catalystwan/integration_tests/test_settings.py +30 -0
- catalystwan/models/common.py +1898 -2
- catalystwan/models/configuration/common.py +1 -0
- catalystwan/models/configuration/feature_profile/common.py +634 -149
- catalystwan/models/configuration/feature_profile/parcel.py +238 -0
- catalystwan/models/configuration/feature_profile/sdwan/acl/__init__.py +13 -0
- catalystwan/models/configuration/feature_profile/sdwan/acl/ipv4acl.py +298 -0
- catalystwan/models/configuration/feature_profile/sdwan/acl/ipv6acl.py +344 -0
- catalystwan/models/configuration/feature_profile/sdwan/application_priority/__init__.py +218 -0
- catalystwan/models/configuration/feature_profile/sdwan/application_priority/cloud_probe.py +61 -0
- catalystwan/models/configuration/feature_profile/sdwan/application_priority/policy_settings.py +31 -0
- catalystwan/models/configuration/feature_profile/sdwan/application_priority/qos_policy.py +102 -0
- catalystwan/models/configuration/feature_profile/sdwan/application_priority/traffic_policy.py +1057 -0
- catalystwan/models/configuration/feature_profile/sdwan/cli/__init__.py +23 -0
- catalystwan/models/configuration/feature_profile/sdwan/cli/config.py +18 -0
- catalystwan/models/configuration/feature_profile/sdwan/cli/full_config.py +15 -0
- catalystwan/models/configuration/feature_profile/sdwan/dns_security/__init__.py +13 -0
- catalystwan/models/configuration/feature_profile/sdwan/dns_security/dns.py +110 -0
- catalystwan/models/configuration/feature_profile/sdwan/embedded_security/__init__.py +23 -0
- catalystwan/models/configuration/feature_profile/sdwan/embedded_security/ngfirewall.py +493 -0
- catalystwan/models/configuration/feature_profile/sdwan/embedded_security/policy.py +171 -0
- catalystwan/models/configuration/feature_profile/sdwan/other/__init__.py +25 -0
- catalystwan/models/configuration/feature_profile/sdwan/other/cybervision.py +44 -0
- catalystwan/models/configuration/feature_profile/sdwan/other/thousandeyes.py +147 -0
- catalystwan/models/configuration/feature_profile/sdwan/other/ucse.py +110 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/__init__.py +62 -48
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/app_probe.py +34 -20
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/application_list.py +8 -6
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/as_path.py +22 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/color_list.py +7 -5
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/data_prefix.py +13 -4
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/expanded_community_list.py +9 -7
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/extended_community.py +34 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/fowarding_class.py +7 -5
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv4_network_object.py +15 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv4_service_object.py +254 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_data_prefix.py +11 -9
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_prefix_list.py +25 -10
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/mirror.py +27 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/network_object_group.py +15 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/object_group.py +15 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/{policier.py → policer.py} +12 -10
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefered_group_color.py +29 -10
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefix_list.py +23 -8
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/service_object_group.py +21 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/sla_class.py +12 -31
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/standard_community.py +16 -10
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/tloc_list.py +8 -7
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/aip.py +64 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/amp.py +79 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/application_list.py +8 -6
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/data_prefix.py +7 -5
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/fqdn.py +7 -5
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/geolocation_list.py +7 -5
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/identity.py +30 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/intrusion_prevention.py +58 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ips_signature.py +7 -5
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/local_domain.py +7 -5
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/object_group.py +72 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/protocol_list.py +7 -5
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/rule_set.py +137 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/scalable_group_tag.py +26 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/security_port.py +21 -11
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ssl_decryption.py +126 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ssl_decryption_profile.py +165 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url.py +15 -10
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url_filtering.py +148 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/zone.py +14 -18
- catalystwan/models/configuration/feature_profile/sdwan/routing/__init__.py +26 -0
- catalystwan/models/configuration/feature_profile/sdwan/routing/bgp.py +609 -0
- catalystwan/models/configuration/feature_profile/sdwan/{service → routing}/ospf.py +55 -47
- catalystwan/models/configuration/feature_profile/sdwan/{service → routing}/ospfv3.py +74 -72
- catalystwan/models/configuration/feature_profile/sdwan/service/__init__.py +91 -0
- catalystwan/models/configuration/feature_profile/sdwan/service/appqoe.py +76 -41
- catalystwan/models/configuration/feature_profile/sdwan/service/dhcp_server.py +107 -64
- catalystwan/models/configuration/feature_profile/sdwan/service/dual_router_ha.py +26 -0
- catalystwan/models/configuration/feature_profile/sdwan/service/eigrp.py +39 -42
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/common.py +7 -88
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/ethernet.py +231 -155
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/gre.py +38 -108
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/ipsec.py +77 -84
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/multilink.py +101 -0
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/svi.py +62 -56
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/vpn.py +111 -120
- catalystwan/models/configuration/feature_profile/sdwan/service/multicast.py +56 -57
- catalystwan/models/configuration/feature_profile/sdwan/service/object_tracker.py +15 -21
- catalystwan/models/configuration/feature_profile/sdwan/service/route_policy.py +358 -110
- catalystwan/models/configuration/feature_profile/sdwan/service/service_chain.py +38 -0
- catalystwan/models/configuration/feature_profile/sdwan/service/service_insertion_attachment.py +17 -25
- catalystwan/models/configuration/feature_profile/sdwan/service/switchport.py +50 -58
- catalystwan/models/configuration/feature_profile/sdwan/service/tracker.py +12 -21
- catalystwan/models/configuration/feature_profile/sdwan/service/wireless_lan.py +27 -31
- catalystwan/models/configuration/feature_profile/sdwan/sig_security/__init__.py +19 -0
- catalystwan/models/configuration/feature_profile/sdwan/sig_security/sig_security.py +379 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/__init__.py +59 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/aaa.py +58 -10
- catalystwan/models/configuration/feature_profile/sdwan/system/banner.py +30 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/basic.py +290 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/bfd.py +69 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/device_access.py +157 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/device_access_ipv6.py +157 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/global_parcel.py +163 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/logging_parcel.py +162 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/mrf.py +75 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/ntp.py +103 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/omp.py +120 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/security.py +179 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/snmp.py +173 -0
- catalystwan/models/configuration/feature_profile/sdwan/topology/__init__.py +29 -0
- catalystwan/models/configuration/feature_profile/sdwan/topology/custom_control.py +425 -0
- catalystwan/models/configuration/feature_profile/sdwan/topology/hubspoke.py +60 -0
- catalystwan/models/configuration/feature_profile/sdwan/topology/mesh.py +23 -0
- catalystwan/models/configuration/feature_profile/sdwan/trackers/__init__.py +36 -0
- catalystwan/models/configuration/feature_profile/sdwan/trackers/tracker.py +96 -0
- catalystwan/models/configuration/feature_profile/sdwan/trackers/tracker_group.py +63 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/__init__.py +93 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_controller.py +26 -23
- catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_profile.py +71 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/gps.py +37 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/management/ethernet.py +121 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/t1e1controller.py +124 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/vpn.py +285 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/cellular.py +173 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/ethernet.py +389 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/gre.py +46 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/ipsec.py +137 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/multilink.py +219 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/protocol_over.py +405 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/t1e1serial.py +195 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/__init__.py +62 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/analog_interface.py +436 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/call_routing.py +179 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/digital_interface.py +380 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/dsp_farm.py +193 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/media_profile.py +17 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/server_group.py +51 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/srst.py +86 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/supervisory_disconnect.py +69 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/translation_profile.py +42 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/translation_rule.py +31 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/trunk_group.py +26 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/voice_global.py +55 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/voice_tenant.py +40 -0
- catalystwan/models/configuration/network_hierarchy/__init__.py +22 -0
- catalystwan/models/configuration/network_hierarchy/cflowd.py +120 -0
- catalystwan/models/configuration/network_hierarchy/node.py +88 -0
- catalystwan/models/configuration/policy_group.py +74 -0
- catalystwan/models/configuration/profile_type.py +1 -6
- catalystwan/models/configuration/topology_group.py +52 -0
- catalystwan/models/policy/__init__.py +275 -69
- catalystwan/models/policy/centralized.py +26 -29
- catalystwan/models/policy/{definitions → definition}/access_control_list.py +47 -17
- catalystwan/models/policy/{definitions → definition}/access_control_list_ipv6.py +42 -18
- catalystwan/models/policy/definition/aip.py +60 -0
- catalystwan/models/policy/definition/amp.py +65 -0
- catalystwan/models/policy/definition/app_route.py +246 -0
- catalystwan/models/policy/definition/cflowd.py +95 -0
- catalystwan/models/policy/{definitions → definition}/control.py +48 -25
- catalystwan/models/policy/{definitions → definition}/device_access.py +22 -11
- catalystwan/models/policy/{definitions → definition}/device_access_ipv6.py +20 -11
- catalystwan/models/policy/definition/dial_peer.py +60 -0
- catalystwan/models/policy/definition/dns_security.py +130 -0
- catalystwan/models/policy/definition/fxo_port.py +63 -0
- catalystwan/models/policy/definition/fxs_did_port.py +58 -0
- catalystwan/models/policy/definition/fxs_port.py +56 -0
- catalystwan/models/policy/{definitions → definition}/hub_and_spoke.py +18 -4
- catalystwan/models/policy/definition/intrusion_prevention.py +55 -0
- catalystwan/models/policy/{definitions → definition}/mesh.py +13 -1
- catalystwan/models/policy/definition/pri_isdn_port.py +48 -0
- catalystwan/models/policy/{definitions → definition}/qos_map.py +39 -32
- catalystwan/models/policy/{definitions → definition}/rewrite.py +12 -2
- catalystwan/models/policy/definition/route_policy.py +187 -0
- catalystwan/models/policy/{definitions → definition}/rule_set.py +66 -48
- catalystwan/models/policy/{definitions → definition}/security_group.py +38 -14
- catalystwan/models/policy/definition/srst_phone_profile.py +37 -0
- catalystwan/models/policy/definition/ssl_decryption.py +209 -0
- catalystwan/models/policy/definition/ssl_decryption_utd_profile.py +87 -0
- catalystwan/models/policy/{definitions → definition}/traffic_data.py +184 -61
- catalystwan/models/policy/definition/url_filtering.py +70 -0
- catalystwan/models/policy/{definitions → definition}/vpn_membership.py +13 -1
- catalystwan/models/policy/definition/vpn_qos_map.py +46 -0
- catalystwan/models/policy/{definitions → definition}/zone_based_firewall.py +93 -32
- catalystwan/models/policy/list/app.py +44 -0
- catalystwan/models/policy/list/app_probe.py +42 -0
- catalystwan/models/policy/list/as_path.py +30 -0
- catalystwan/models/policy/list/class_map.py +30 -0
- catalystwan/models/policy/list/color.py +28 -0
- catalystwan/models/policy/list/communities.py +83 -0
- catalystwan/models/policy/list/data_ipv6_prefix.py +30 -0
- catalystwan/models/policy/list/data_prefix.py +30 -0
- catalystwan/models/policy/list/fax_protocol.py +45 -0
- catalystwan/models/policy/list/fqdn.py +24 -0
- catalystwan/models/policy/list/geo_location.py +33 -0
- catalystwan/models/policy/list/identity.py +29 -0
- catalystwan/models/policy/list/ips_signature.py +27 -0
- catalystwan/models/policy/list/ipv6_prefix.py +33 -0
- catalystwan/models/policy/list/local_app.py +45 -0
- catalystwan/models/policy/list/local_domain.py +36 -0
- catalystwan/models/policy/list/media_profile.py +44 -0
- catalystwan/models/policy/list/mirror.py +27 -0
- catalystwan/models/policy/list/modem_pass_through.py +27 -0
- catalystwan/models/policy/list/policer.py +39 -0
- catalystwan/models/policy/list/port.py +33 -0
- catalystwan/models/policy/list/preferred_color_group.py +82 -0
- catalystwan/models/policy/list/prefix.py +33 -0
- catalystwan/models/policy/list/protocol_name.py +26 -0
- catalystwan/models/policy/list/region.py +45 -0
- catalystwan/models/policy/list/scalable_group_tag.py +30 -0
- catalystwan/models/policy/list/site.py +34 -0
- catalystwan/models/policy/list/sla.py +77 -0
- catalystwan/models/policy/list/supervisory_disconnect.py +62 -0
- catalystwan/models/policy/list/threat_grid_api_key.py +32 -0
- catalystwan/models/policy/list/tloc.py +32 -0
- catalystwan/models/policy/list/translation_profile.py +32 -0
- catalystwan/models/policy/list/translation_rules.py +29 -0
- catalystwan/models/policy/list/trunkgroup.py +56 -0
- catalystwan/models/policy/list/umbrella_data.py +30 -0
- catalystwan/models/policy/list/url.py +39 -0
- catalystwan/models/policy/list/vpn.py +40 -0
- catalystwan/models/policy/list/zone.py +46 -0
- catalystwan/models/policy/localized.py +34 -16
- catalystwan/models/policy/policy.py +13 -9
- catalystwan/models/policy/policy_definition.py +673 -173
- catalystwan/models/policy/policy_list.py +38 -27
- catalystwan/models/policy/security.py +145 -46
- catalystwan/models/policy/voice.py +77 -0
- catalystwan/models/settings.py +41 -0
- catalystwan/models/templates.py +79 -0
- catalystwan/response.py +6 -2
- catalystwan/session.py +1 -1
- catalystwan/tests/builders/test_report.py +60 -0
- catalystwan/tests/builders/uc_voice.py +85 -0
- catalystwan/tests/models/__init__.py +0 -0
- catalystwan/tests/models/test_digital_interface.py +56 -0
- catalystwan/tests/templates/definitions/aaa_basic.json +96 -0
- catalystwan/tests/templates/definitions/aaa_complex.json +464 -0
- catalystwan/tests/templates/definitions/{iuo.json → cisco_aaa.json} +44 -15
- catalystwan/tests/templates/definitions/cisco_aaa_complex.json +361 -0
- catalystwan/tests/templates/definitions/cisco_logging_complex.json +268 -0
- catalystwan/tests/templates/definitions/cisco_ntp_complex.json +143 -0
- catalystwan/tests/templates/definitions/cisco_omp_complex.json +175 -0
- catalystwan/tests/templates/definitions/cisco_ospf_complex.json +302 -0
- catalystwan/tests/templates/definitions/cisco_sig.json +405 -0
- catalystwan/tests/templates/definitions/cisco_snmp_complex.json +258 -0
- catalystwan/tests/templates/definitions/cisco_system_complex.json +502 -0
- catalystwan/tests/templates/definitions/{Basic_Cisco_VPN_Model.json → cisco_vpn_basic.json} +2 -2
- catalystwan/tests/templates/definitions/{complex_cisco_vpn.json → cisco_vpn_complex.json} +27 -12
- catalystwan/tests/templates/definitions/cisco_vpn_interface_complex.json +821 -0
- catalystwan/tests/templates/definitions/omp_vsmart_1.json +26 -0
- catalystwan/tests/templates/definitions/{omp_2.json → omp_vsmart_2.json} +16 -2
- catalystwan/tests/templates/definitions/{omp_3.json → omp_vsmart_3.json} +16 -2
- catalystwan/tests/templates/definitions/omp_vsmart_complex.json +73 -0
- catalystwan/tests/templates/definitions/security_vsmart_complex.json +24 -0
- catalystwan/tests/templates/definitions/system_vsmart_complex.json +193 -0
- catalystwan/tests/templates/definitions/vpn_vsmart_basic.json +17 -0
- catalystwan/tests/templates/definitions/vpn_vsmart_complex.json +179 -0
- catalystwan/tests/templates/definitions/vpn_vsmart_interface_basic.json +42 -0
- catalystwan/tests/templates/definitions/vpn_vsmart_interface_complex.json +208 -0
- catalystwan/tests/templates/models/__init__.py +46 -13
- catalystwan/tests/templates/models/aaa.py +106 -0
- catalystwan/tests/templates/models/cisco_aaa.py +81 -48
- catalystwan/tests/templates/models/cisco_banner.py +2 -2
- catalystwan/tests/templates/models/cisco_bfd.py +4 -6
- catalystwan/tests/templates/models/cisco_logging.py +65 -0
- catalystwan/tests/templates/models/cisco_ntp.py +17 -0
- catalystwan/tests/templates/models/cisco_omp.py +37 -0
- catalystwan/tests/templates/models/cisco_ospf.py +60 -0
- catalystwan/tests/templates/models/cisco_secure_internet_gateway.py +95 -0
- catalystwan/tests/templates/models/cisco_snmp.py +40 -0
- catalystwan/tests/templates/models/cisco_system.py +108 -3
- catalystwan/tests/templates/models/cisco_vpn.py +42 -72
- catalystwan/tests/templates/models/cisco_vpn_interface.py +200 -0
- catalystwan/tests/templates/models/omp_vsmart.py +28 -8
- catalystwan/tests/templates/models/security_vsmart.py +11 -0
- catalystwan/tests/templates/models/system_vsmart.py +37 -0
- catalystwan/tests/templates/models/vpn_vsmart.py +32 -0
- catalystwan/tests/templates/models/vpn_vsmart_interface.py +54 -0
- catalystwan/tests/templates/schemas/aaa.json +1096 -0
- catalystwan/tests/templates/schemas/cedge_aaa.json +1 -1
- catalystwan/tests/templates/schemas/cisco_logging.json +577 -0
- catalystwan/tests/templates/schemas/cisco_ntp.json +265 -0
- catalystwan/tests/templates/schemas/cisco_omp.json +479 -0
- catalystwan/tests/templates/schemas/cisco_ospf.json +908 -0
- catalystwan/tests/templates/schemas/cisco_secure_internet_gateway.json +1520 -0
- catalystwan/tests/templates/schemas/cisco_snmp.json +561 -0
- catalystwan/tests/templates/schemas/cisco_system.json +242 -0
- catalystwan/tests/templates/schemas/cisco_vpn.json +53 -1
- catalystwan/tests/templates/schemas/cisco_vpn_interface.json +3348 -0
- catalystwan/tests/templates/schemas/omp-vsmart.json +20 -0
- catalystwan/tests/templates/schemas/security-vsmart.json +58 -0
- catalystwan/tests/templates/schemas/system-vsmart.json +2585 -0
- catalystwan/tests/templates/schemas/vpn-vsmart-interface.json +859 -0
- catalystwan/tests/templates/schemas/vpn-vsmart.json +445 -0
- catalystwan/tests/templates/test_chose_model.py +6 -10
- catalystwan/tests/templates/test_deserialize_model.py +4 -4
- catalystwan/tests/templates/test_find_template_values.py +229 -0
- catalystwan/tests/templates/test_find_template_values_2.py +193 -0
- catalystwan/tests/templates/test_serialize_model.py +1 -2
- catalystwan/tests/test_cli_template.py +8 -9
- catalystwan/tests/test_endpoints.py +42 -11
- catalystwan/tests/test_feature_profile_api.py +282 -0
- catalystwan/tests/test_models_common.py +53 -0
- catalystwan/tests/test_templates.py +16 -19
- catalystwan/utils/feature_template/find_template_values.py +17 -4
- catalystwan/utils/model.py +45 -0
- catalystwan/utils/persona.py +5 -0
- catalystwan/utils/type_check.py +22 -0
- catalystwan/workflows/backup_restore_device_templates.py +467 -0
- catalystwan/workflows/tenant_migration.py +1 -1
- {catalystwan-0.41.2.dist-info → catalystwan-0.41.2.dev0.dist-info}/METADATA +20 -1
- catalystwan-0.41.2.dev0.dist-info/RECORD +636 -0
- catalystwan/ENDPOINTS.md +0 -611
- catalystwan/api/configuration_groups/parcels/cellular_controller.py +0 -33
- catalystwan/api/templates/device_template/device_template_payload.json.j2 +0 -19
- catalystwan/models/configuration/config_migration.py +0 -36
- catalystwan/models/configuration/feature_profile/sdwan/management/vpn.py +0 -26
- catalystwan/models/configuration/feature_profile/sdwan/service/acl.py +0 -409
- catalystwan/models/configuration/feature_profile/sdwan/service/bgp.py +0 -288
- catalystwan/models/policy/lists.py +0 -330
- catalystwan/models/policy/lists_entries.py +0 -444
- catalystwan/tests/templates/definitions/complex_aaa.json +0 -277
- catalystwan/tests/templates/definitions/omp_1.json +0 -11
- catalystwan/utils/timezone.py +0 -422
- catalystwan-0.41.2.dist-info/RECORD +0 -353
- /catalystwan/tests/templates/definitions/{banner_1.json → cisco_banner.json} +0 -0
- {catalystwan-0.41.2.dist-info → catalystwan-0.41.2.dev0.dist-info}/LICENSE +0 -0
- {catalystwan-0.41.2.dist-info → catalystwan-0.41.2.dev0.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
# Copyright 2024 Cisco Systems, Inc. and its affiliates
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import logging
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from typing import TYPE_CHECKING, Dict, List, Optional, Union
|
|
7
|
+
from uuid import UUID
|
|
8
|
+
|
|
9
|
+
from catalystwan.api.builders.feature_profiles.report import FeatureProfileBuildReport, handle_create_parcel
|
|
10
|
+
from catalystwan.api.configuration_groups.parcel import as_default
|
|
11
|
+
from catalystwan.api.feature_profile_api import UcVoiceFeatureProfileAPI
|
|
12
|
+
from catalystwan.endpoints.configuration.feature_profile.sdwan.uc_voice import UcVoiceFeatureProfile
|
|
13
|
+
from catalystwan.models.configuration.feature_profile.common import FeatureProfileCreationPayload, RefIdItem
|
|
14
|
+
from catalystwan.models.configuration.feature_profile.sdwan.uc_voice import (
|
|
15
|
+
AnalogInterfaceParcel,
|
|
16
|
+
AnyUcVoiceParcel,
|
|
17
|
+
CallRoutingParcel,
|
|
18
|
+
DigitalInterfaceParcel,
|
|
19
|
+
MediaProfileParcel,
|
|
20
|
+
ServerGroupParcel,
|
|
21
|
+
SrstParcel,
|
|
22
|
+
TranslationProfileParcel,
|
|
23
|
+
TranslationRuleParcel,
|
|
24
|
+
TrunkGroupParcel,
|
|
25
|
+
VoiceGlobalParcel,
|
|
26
|
+
VoiceTenantParcel,
|
|
27
|
+
)
|
|
28
|
+
from catalystwan.models.configuration.feature_profile.sdwan.uc_voice.analog_interface import (
|
|
29
|
+
Association as AnalogInterfaceAssociation,
|
|
30
|
+
)
|
|
31
|
+
from catalystwan.models.configuration.feature_profile.sdwan.uc_voice.call_routing import (
|
|
32
|
+
Association as CallRoutingAssociation,
|
|
33
|
+
)
|
|
34
|
+
from catalystwan.models.configuration.feature_profile.sdwan.uc_voice.digital_interface import (
|
|
35
|
+
Association as DigitalInterfaceAssociation,
|
|
36
|
+
)
|
|
37
|
+
from catalystwan.models.configuration.feature_profile.sdwan.uc_voice.srst import Association as SrstAssociation
|
|
38
|
+
from catalystwan.models.configuration.feature_profile.sdwan.uc_voice.translation_profile import CallType
|
|
39
|
+
|
|
40
|
+
logger = logging.getLogger(__name__)
|
|
41
|
+
|
|
42
|
+
if TYPE_CHECKING:
|
|
43
|
+
from catalystwan.session import ManagerSession
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
ParcelWithAssociations = Union[CallRoutingParcel, DigitalInterfaceParcel, AnalogInterfaceParcel, SrstParcel]
|
|
47
|
+
Association = Union[
|
|
48
|
+
List[DigitalInterfaceAssociation],
|
|
49
|
+
List[AnalogInterfaceAssociation],
|
|
50
|
+
List[CallRoutingAssociation],
|
|
51
|
+
List[SrstAssociation],
|
|
52
|
+
]
|
|
53
|
+
AssociableParcel = Union[
|
|
54
|
+
MediaProfileParcel,
|
|
55
|
+
ServerGroupParcel,
|
|
56
|
+
SrstParcel,
|
|
57
|
+
TranslationProfileParcel,
|
|
58
|
+
TranslationRuleParcel,
|
|
59
|
+
TrunkGroupParcel,
|
|
60
|
+
VoiceGlobalParcel,
|
|
61
|
+
VoiceTenantParcel,
|
|
62
|
+
]
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
@dataclass
|
|
66
|
+
class TranslationProfile:
|
|
67
|
+
tpp: TranslationProfileParcel
|
|
68
|
+
calling: Optional[TranslationRuleParcel] = None
|
|
69
|
+
called: Optional[TranslationRuleParcel] = None
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def is_uuid(uuid: Optional[Union[str, UUID]]) -> bool:
|
|
73
|
+
if isinstance(uuid, UUID) or uuid is None:
|
|
74
|
+
return True
|
|
75
|
+
try:
|
|
76
|
+
UUID(uuid)
|
|
77
|
+
return True
|
|
78
|
+
except ValueError:
|
|
79
|
+
return False
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class UcVoiceFeatureProfileBuilder:
|
|
83
|
+
"""
|
|
84
|
+
A class for building UC Voice feature profiles with a modular approach.
|
|
85
|
+
|
|
86
|
+
This class provides methods to construct, associate, and manage various parcels and
|
|
87
|
+
configurations required for UC Voice feature profiles.
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
ASSOCIABLE_PARCELS = (
|
|
91
|
+
MediaProfileParcel,
|
|
92
|
+
ServerGroupParcel,
|
|
93
|
+
SrstParcel,
|
|
94
|
+
TranslationProfileParcel,
|
|
95
|
+
TranslationRuleParcel,
|
|
96
|
+
TrunkGroupParcel,
|
|
97
|
+
VoiceGlobalParcel,
|
|
98
|
+
VoiceTenantParcel,
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
ASSOCIATON_FIELDS = {
|
|
102
|
+
"media_profile",
|
|
103
|
+
"server_group",
|
|
104
|
+
"translation_profile",
|
|
105
|
+
"trunk_group",
|
|
106
|
+
"voice_tenant",
|
|
107
|
+
"supervisory_disconnect",
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
def __init__(self, session: ManagerSession) -> None:
|
|
111
|
+
"""
|
|
112
|
+
Initializes a new instance of the UC Voice Feature Profile Builder.
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
session (ManagerSession): The session object used for API communication.
|
|
116
|
+
"""
|
|
117
|
+
self._profile: FeatureProfileCreationPayload
|
|
118
|
+
self._api = UcVoiceFeatureProfileAPI(session)
|
|
119
|
+
self._endpoints = UcVoiceFeatureProfile(session)
|
|
120
|
+
self._independent_parcels: List[AnyUcVoiceParcel] = []
|
|
121
|
+
self._associable_parcles: List[AssociableParcel] = []
|
|
122
|
+
self._translation_profiles: Dict[str, TranslationProfile] = dict()
|
|
123
|
+
self._pushed_associable_parcels: Dict[str, UUID] = {} # Maps parcel names to their created UUIDs.
|
|
124
|
+
self._parcels_with_associations: List[ParcelWithAssociations] = []
|
|
125
|
+
|
|
126
|
+
def add_profile_name_and_description(self, feature_profile: FeatureProfileCreationPayload) -> None:
|
|
127
|
+
"""
|
|
128
|
+
Adds a name and description to the feature profile being built.
|
|
129
|
+
|
|
130
|
+
Args:
|
|
131
|
+
feature_profile (FeatureProfileCreationPayload): The feature profile payload containing
|
|
132
|
+
the name and description.
|
|
133
|
+
"""
|
|
134
|
+
self._profile = feature_profile
|
|
135
|
+
|
|
136
|
+
def add_independent_parcel(self, parcel: AnyUcVoiceParcel) -> None:
|
|
137
|
+
"""
|
|
138
|
+
Adds an independent parcel to the feature profile.
|
|
139
|
+
|
|
140
|
+
Args:
|
|
141
|
+
parcel (AnyUcVoiceParcel): The parcel to be added. Parcels are independent configurations
|
|
142
|
+
that do not require associations with other parcels.
|
|
143
|
+
"""
|
|
144
|
+
self._independent_parcels.append(parcel)
|
|
145
|
+
|
|
146
|
+
def add_associable_parcel(self, parcel: AssociableParcel) -> None:
|
|
147
|
+
self._associable_parcles.append(parcel)
|
|
148
|
+
|
|
149
|
+
def add_translation_profile(
|
|
150
|
+
self,
|
|
151
|
+
tpp: TranslationProfileParcel,
|
|
152
|
+
calling: Optional[TranslationRuleParcel] = None,
|
|
153
|
+
called: Optional[TranslationRuleParcel] = None,
|
|
154
|
+
) -> None:
|
|
155
|
+
"""
|
|
156
|
+
Adds a translation profile to the feature profile.
|
|
157
|
+
|
|
158
|
+
Args:
|
|
159
|
+
tpp (TranslationProfileParcel): The main translation profile parcel.
|
|
160
|
+
calling (Optional[TranslationRuleParcel]): The calling rule parcel. Optional.
|
|
161
|
+
called (Optional[TranslationRuleParcel]): The called rule parcel. Optional.
|
|
162
|
+
|
|
163
|
+
Raises:
|
|
164
|
+
ValueError: If neither a calling nor a called rule is provided.
|
|
165
|
+
"""
|
|
166
|
+
if not calling and not called:
|
|
167
|
+
raise ValueError("There must be at least one translation rule to create a translation profile.")
|
|
168
|
+
if tpp.parcel_name in self._translation_profiles:
|
|
169
|
+
logger.warning(f"Translation profile {tpp.parcel_name} was already added.")
|
|
170
|
+
else:
|
|
171
|
+
self._translation_profiles[tpp.parcel_name] = TranslationProfile(tpp=tpp, called=called, calling=calling)
|
|
172
|
+
|
|
173
|
+
def add_parcel_with_associations(self, parcel: ParcelWithAssociations) -> None:
|
|
174
|
+
"""
|
|
175
|
+
Adds a parcel with associations to the feature profile.
|
|
176
|
+
|
|
177
|
+
Args:
|
|
178
|
+
parcel (ParcelWithAssociations): A parcel that includes associations with other entities.
|
|
179
|
+
Associations are relationships between parcels and other resources.
|
|
180
|
+
"""
|
|
181
|
+
self._parcels_with_associations.append(parcel)
|
|
182
|
+
|
|
183
|
+
def build(self) -> FeatureProfileBuildReport:
|
|
184
|
+
"""
|
|
185
|
+
Builds the complete UC Voice feature profile.
|
|
186
|
+
|
|
187
|
+
This method creates the feature profile on the system and processes all added parcels
|
|
188
|
+
and translation profiles, resolving associations as needed.
|
|
189
|
+
|
|
190
|
+
Returns:
|
|
191
|
+
FeatureProfileBuildReport: A report containing the details of the created feature profile.
|
|
192
|
+
"""
|
|
193
|
+
profile_uuid = self._endpoints.create_uc_voice_feature_profile(self._profile).id
|
|
194
|
+
self.build_report = FeatureProfileBuildReport(profile_uuid=profile_uuid, profile_name=self._profile.name)
|
|
195
|
+
|
|
196
|
+
# Create independent parcels
|
|
197
|
+
for ip in self._independent_parcels:
|
|
198
|
+
self._create_parcel(profile_uuid, ip)
|
|
199
|
+
|
|
200
|
+
# Create translation profiles
|
|
201
|
+
for _, tp in self._translation_profiles.items():
|
|
202
|
+
tp_parcel_uuid = self._create_translation_profile(profile_uuid, tp)
|
|
203
|
+
if tp_parcel_uuid:
|
|
204
|
+
self._pushed_associable_parcels[tp.tpp.parcel_name] = tp_parcel_uuid
|
|
205
|
+
|
|
206
|
+
for ap in self._associable_parcles:
|
|
207
|
+
ap_parcel_uuid = self._create_parcel(profile_uuid, ap)
|
|
208
|
+
if ap_parcel_uuid:
|
|
209
|
+
self._pushed_associable_parcels[ap.parcel_name] = ap_parcel_uuid
|
|
210
|
+
|
|
211
|
+
# Create parcels with associations
|
|
212
|
+
for pwa in self._parcels_with_associations:
|
|
213
|
+
if pwa.association:
|
|
214
|
+
self._populate_association(pwa.association)
|
|
215
|
+
self._create_parcel(profile_uuid, pwa)
|
|
216
|
+
|
|
217
|
+
return self.build_report
|
|
218
|
+
|
|
219
|
+
@handle_create_parcel
|
|
220
|
+
def _create_parcel(self, profile_uuid: UUID, parcel: AnyUcVoiceParcel) -> UUID:
|
|
221
|
+
"""
|
|
222
|
+
Internal method to create a parcel.
|
|
223
|
+
|
|
224
|
+
Args:
|
|
225
|
+
profile_uuid (UUID): The UUID of the feature profile being built.
|
|
226
|
+
parcel (AnyUcVoiceParcel): The parcel to create.
|
|
227
|
+
|
|
228
|
+
Returns:
|
|
229
|
+
UUID: The UUID of the created parcel.
|
|
230
|
+
"""
|
|
231
|
+
return self._api.create_parcel(profile_uuid, parcel).id
|
|
232
|
+
|
|
233
|
+
def _create_translation_profile(self, profile_uuid: UUID, tp: TranslationProfile) -> UUID:
|
|
234
|
+
"""
|
|
235
|
+
Internal method to create a translation profile.
|
|
236
|
+
|
|
237
|
+
Args:
|
|
238
|
+
profile_uuid (UUID): The UUID of the feature profile being built.
|
|
239
|
+
tp (TranslationProfile): The translation profile to create.
|
|
240
|
+
|
|
241
|
+
Returns:
|
|
242
|
+
UUID: The UUID of the created translation profile parcel.
|
|
243
|
+
"""
|
|
244
|
+
|
|
245
|
+
def process_parcel(parcel: Optional[TranslationRuleParcel], parcel_type: CallType):
|
|
246
|
+
if not parcel:
|
|
247
|
+
return
|
|
248
|
+
parcel_name = parcel.parcel_name
|
|
249
|
+
if parcel_name in self._pushed_associable_parcels:
|
|
250
|
+
logger.debug(f"Translation rule {parcel_name} was already referenced in other profile.")
|
|
251
|
+
tp.tpp.set_ref_by_call_type(self._pushed_associable_parcels[parcel_name], parcel_type)
|
|
252
|
+
else:
|
|
253
|
+
parcel_uuid = self._create_parcel(profile_uuid, parcel)
|
|
254
|
+
if parcel_uuid:
|
|
255
|
+
tp.tpp.set_ref_by_call_type(parcel_uuid, parcel_type)
|
|
256
|
+
self._pushed_associable_parcels[parcel_name] = parcel_uuid
|
|
257
|
+
|
|
258
|
+
process_parcel(tp.called, "called")
|
|
259
|
+
process_parcel(tp.calling, "calling")
|
|
260
|
+
|
|
261
|
+
return self._create_parcel(profile_uuid, tp.tpp)
|
|
262
|
+
|
|
263
|
+
def _populate_association(self, association: Association) -> None:
|
|
264
|
+
"""
|
|
265
|
+
Resolves associations for a parcel.
|
|
266
|
+
|
|
267
|
+
Updates references in the parcel's associations to use the actual UUIDs of previously
|
|
268
|
+
created parcels.
|
|
269
|
+
|
|
270
|
+
Args:
|
|
271
|
+
association (Association): A list of associations to resolve.
|
|
272
|
+
"""
|
|
273
|
+
for model in association:
|
|
274
|
+
for field_name in self.ASSOCIATON_FIELDS.intersection(model.model_fields_set):
|
|
275
|
+
attr = getattr(model, field_name)
|
|
276
|
+
if isinstance(attr, RefIdItem):
|
|
277
|
+
if is_uuid(attr.ref_id.value) or attr.ref_id.value is None:
|
|
278
|
+
continue
|
|
279
|
+
resolved_uuid = self._pushed_associable_parcels.get(attr.ref_id.value)
|
|
280
|
+
if resolved_uuid:
|
|
281
|
+
attr.ref_id.value = str(resolved_uuid)
|
|
282
|
+
else:
|
|
283
|
+
logger.warning(
|
|
284
|
+
f"Unresolved reference in field '{field_name}' with value '{attr.ref_id.value}' "
|
|
285
|
+
f"for model '{model.__class__.__name__}'. Setting to Default[None]."
|
|
286
|
+
)
|
|
287
|
+
attr.ref_id = as_default(None)
|
|
@@ -2,12 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from typing import TYPE_CHECKING
|
|
5
|
+
from typing import TYPE_CHECKING, Any, Optional, overload
|
|
6
|
+
from uuid import UUID
|
|
7
|
+
|
|
8
|
+
from catalystwan.typed_list import DataSequence
|
|
6
9
|
|
|
7
10
|
if TYPE_CHECKING:
|
|
8
11
|
from catalystwan.session import ManagerSession
|
|
9
12
|
|
|
10
13
|
from catalystwan.endpoints.configuration_group import (
|
|
14
|
+
ConfigGroup,
|
|
11
15
|
ConfigGroupAssociatePayload,
|
|
12
16
|
ConfigGroupCreationPayload,
|
|
13
17
|
ConfigGroupCreationResponse,
|
|
@@ -16,7 +20,6 @@ from catalystwan.endpoints.configuration_group import (
|
|
|
16
20
|
ConfigGroupDisassociateResponse,
|
|
17
21
|
ConfigGroupEditPayload,
|
|
18
22
|
ConfigGroupEditResponse,
|
|
19
|
-
ConfigGroupResponsePayload,
|
|
20
23
|
ConfigGroupVariablesCreatePayload,
|
|
21
24
|
ConfigGroupVariablesCreateResponse,
|
|
22
25
|
ConfigGroupVariablesEditPayload,
|
|
@@ -29,8 +32,8 @@ from catalystwan.endpoints.configuration_group import (
|
|
|
29
32
|
|
|
30
33
|
class ConfigGroupAPI:
|
|
31
34
|
def __init__(self, session: ManagerSession):
|
|
32
|
-
self.
|
|
33
|
-
self.
|
|
35
|
+
self._session = session
|
|
36
|
+
self._endpoints = ConfigurationGroup(session)
|
|
34
37
|
|
|
35
38
|
def associate(self, cg_id: str, device_ids: list) -> None:
|
|
36
39
|
"""
|
|
@@ -43,7 +46,7 @@ class ConfigGroupAPI:
|
|
|
43
46
|
|
|
44
47
|
payload = ConfigGroupAssociatePayload(devices=devices)
|
|
45
48
|
|
|
46
|
-
self.
|
|
49
|
+
self._endpoints.associate(config_group_id=cg_id, payload=payload)
|
|
47
50
|
|
|
48
51
|
def create(self, name: str, description: str, solution: Solution, profile_ids: list) -> ConfigGroupCreationResponse:
|
|
49
52
|
"""
|
|
@@ -57,7 +60,7 @@ class ConfigGroupAPI:
|
|
|
57
60
|
name=name, description=description, solution=solution, profiles=profiles
|
|
58
61
|
)
|
|
59
62
|
|
|
60
|
-
return self.
|
|
63
|
+
return self._endpoints.create_config_group(cg_payload)
|
|
61
64
|
|
|
62
65
|
def create_variables(
|
|
63
66
|
self, cg_id: str, device_ids: list, suggestions: bool = True
|
|
@@ -66,13 +69,13 @@ class ConfigGroupAPI:
|
|
|
66
69
|
Creates device specific variable data in given config-group
|
|
67
70
|
"""
|
|
68
71
|
payload = ConfigGroupVariablesCreatePayload(deviceIds=device_ids, suggestions=suggestions)
|
|
69
|
-
return self.
|
|
72
|
+
return self._endpoints.create_variables(config_group_id=cg_id, payload=payload)
|
|
70
73
|
|
|
71
|
-
def delete(self, cg_id:
|
|
74
|
+
def delete(self, cg_id: UUID) -> None:
|
|
72
75
|
"""
|
|
73
76
|
Deletes existing config-group with given ID
|
|
74
77
|
"""
|
|
75
|
-
self.
|
|
78
|
+
self._endpoints.delete_config_group(cg_id)
|
|
76
79
|
|
|
77
80
|
def deploy(self, cg_id: str, device_ids: list) -> ConfigGroupDeployResponse:
|
|
78
81
|
"""
|
|
@@ -83,7 +86,7 @@ class ConfigGroupAPI:
|
|
|
83
86
|
devices.append(DeviceId(id=device_id))
|
|
84
87
|
|
|
85
88
|
payload = ConfigGroupDeployPayload(devices=devices)
|
|
86
|
-
return self.
|
|
89
|
+
return self._endpoints.deploy(config_group_id=cg_id, payload=payload)
|
|
87
90
|
|
|
88
91
|
def disassociate(self, cg_id: str, device_ids: list) -> ConfigGroupDisassociateResponse:
|
|
89
92
|
"""
|
|
@@ -94,7 +97,7 @@ class ConfigGroupAPI:
|
|
|
94
97
|
devices.append(DeviceId(id=device_id))
|
|
95
98
|
|
|
96
99
|
payload = ConfigGroupAssociatePayload(devices=devices)
|
|
97
|
-
return self.
|
|
100
|
+
return self._endpoints.disassociate(config_group_id=cg_id, payload=payload)
|
|
98
101
|
|
|
99
102
|
def edit(
|
|
100
103
|
self, cg_id: str, name: str, description: str, solution: Solution, profile_ids: list
|
|
@@ -108,13 +111,24 @@ class ConfigGroupAPI:
|
|
|
108
111
|
profiles.append(ProfileId(id=profile_id))
|
|
109
112
|
payload = ConfigGroupEditPayload(name=name, description=description, solution=solution, profiles=profiles)
|
|
110
113
|
|
|
111
|
-
return self.
|
|
114
|
+
return self._endpoints.edit_config_group(config_group_id=cg_id, payload=payload)
|
|
115
|
+
|
|
116
|
+
@overload
|
|
117
|
+
def get(self) -> DataSequence[ConfigGroup]:
|
|
118
|
+
...
|
|
112
119
|
|
|
113
|
-
|
|
120
|
+
@overload
|
|
121
|
+
def get(self, group_id: UUID) -> ConfigGroup:
|
|
122
|
+
...
|
|
123
|
+
|
|
124
|
+
def get(self, group_id: Optional[UUID] = None) -> Any:
|
|
114
125
|
"""
|
|
115
|
-
Gets list of existing config-groups
|
|
126
|
+
Gets list of existing config-groups or single config-group with given ID
|
|
127
|
+
If given ID is not correct return None
|
|
116
128
|
"""
|
|
117
|
-
|
|
129
|
+
if group_id is None:
|
|
130
|
+
return self._endpoints.get()
|
|
131
|
+
return self._endpoints.get().filter(id=group_id).single_or_default()
|
|
118
132
|
|
|
119
133
|
def update_variables(self, cg_id: str, solution: Solution, device_variables: list) -> None:
|
|
120
134
|
"""
|
|
@@ -122,4 +136,15 @@ class ConfigGroupAPI:
|
|
|
122
136
|
"""
|
|
123
137
|
payload = ConfigGroupVariablesEditPayload(solution=solution, devices=device_variables)
|
|
124
138
|
|
|
125
|
-
self.
|
|
139
|
+
self._endpoints.update_variables(config_group_id=cg_id, payload=payload)
|
|
140
|
+
|
|
141
|
+
def delete_all(self) -> None:
|
|
142
|
+
"""
|
|
143
|
+
Deletes all config-group
|
|
144
|
+
"""
|
|
145
|
+
config_groups = self.get()
|
|
146
|
+
for config_group in config_groups:
|
|
147
|
+
if config_group.devices:
|
|
148
|
+
self.disassociate(str(config_group.id), config_group.devices)
|
|
149
|
+
|
|
150
|
+
self.delete(config_group.id)
|
|
@@ -1,15 +1,35 @@
|
|
|
1
|
-
# Copyright
|
|
1
|
+
# Copyright 2024 Cisco Systems, Inc. and its affiliates
|
|
2
|
+
|
|
3
|
+
from typing import Any, Dict, Generic, List, Literal, Optional, Sequence, Tuple, TypeVar
|
|
4
|
+
|
|
5
|
+
from pydantic import (
|
|
6
|
+
AliasPath,
|
|
7
|
+
BaseModel,
|
|
8
|
+
ConfigDict,
|
|
9
|
+
Field,
|
|
10
|
+
PrivateAttr,
|
|
11
|
+
SerializationInfo,
|
|
12
|
+
SerializerFunctionWrapHandler,
|
|
13
|
+
model_serializer,
|
|
14
|
+
)
|
|
15
|
+
from pydantic.alias_generators import to_camel
|
|
16
|
+
from typing_extensions import get_origin
|
|
17
|
+
|
|
18
|
+
from catalystwan.exceptions import CatalystwanException
|
|
19
|
+
from catalystwan.models.common import VersionedField
|
|
2
20
|
|
|
3
|
-
|
|
4
|
-
from typing import Any, Dict, Generic, Literal, Optional, TypeVar, get_origin
|
|
21
|
+
T = TypeVar("T")
|
|
5
22
|
|
|
6
|
-
from pydantic import AliasPath, BaseModel, ConfigDict, Field, PrivateAttr, model_serializer
|
|
7
23
|
|
|
8
|
-
|
|
24
|
+
class _ParcelEntry(BaseModel):
|
|
25
|
+
def __hash__(self) -> int:
|
|
26
|
+
return hash(self.model_dump_json())
|
|
9
27
|
|
|
10
28
|
|
|
11
29
|
class _ParcelBase(BaseModel):
|
|
12
|
-
model_config = ConfigDict(
|
|
30
|
+
model_config = ConfigDict(
|
|
31
|
+
extra="allow", arbitrary_types_allowed=True, populate_by_name=True, json_schema_mode_override="validation"
|
|
32
|
+
)
|
|
13
33
|
parcel_name: str = Field(
|
|
14
34
|
min_length=1,
|
|
15
35
|
max_length=128,
|
|
@@ -24,45 +44,64 @@ class _ParcelBase(BaseModel):
|
|
|
24
44
|
description="Set the parcel description",
|
|
25
45
|
)
|
|
26
46
|
data: Optional[Any] = None
|
|
47
|
+
entries: Optional[Sequence[_ParcelEntry]] = Field(default=None, validation_alias=AliasPath("data", "entries"))
|
|
27
48
|
_parcel_data_key: str = PrivateAttr(default="data")
|
|
28
49
|
|
|
29
50
|
@model_serializer(mode="wrap")
|
|
30
|
-
def envelope_parcel_data(self, handler) -> Dict[str, Any]:
|
|
51
|
+
def envelope_parcel_data(self, handler: SerializerFunctionWrapHandler, info: SerializationInfo) -> Dict[str, Any]:
|
|
52
|
+
"""
|
|
53
|
+
serializes model fields with respect to field validation_alias,
|
|
54
|
+
sub-classing parcel fields can be defined like following:
|
|
55
|
+
>>> entries: List[SecurityZoneListEntry] = Field(default=[], validation_alias=AliasPath("data", "entries"))
|
|
56
|
+
|
|
57
|
+
"data" is default _parcel_data_key which must match validation_alias prefix,
|
|
58
|
+
this attribute can be overriden in sub-class when needed
|
|
59
|
+
"""
|
|
31
60
|
model_dict = handler(self)
|
|
32
61
|
model_dict[self._parcel_data_key] = {}
|
|
33
62
|
remove_keys = []
|
|
63
|
+
replaced_keys: Dict[str, Tuple[str, str]] = {}
|
|
34
64
|
|
|
65
|
+
# enveloping
|
|
35
66
|
for key in model_dict.keys():
|
|
36
67
|
field_info = self.model_fields.get(key)
|
|
37
68
|
if field_info and isinstance(field_info.validation_alias, AliasPath):
|
|
38
69
|
aliases = field_info.validation_alias.convert_to_aliases()
|
|
39
70
|
if aliases and aliases[0] == self._parcel_data_key and len(aliases) == 2:
|
|
40
71
|
model_dict[self._parcel_data_key][aliases[1]] = model_dict[key]
|
|
72
|
+
replaced_keys[key] = (self._parcel_data_key, str(aliases[1]))
|
|
41
73
|
remove_keys.append(key)
|
|
42
74
|
for key in remove_keys:
|
|
43
75
|
del model_dict[key]
|
|
44
|
-
return model_dict
|
|
45
76
|
|
|
77
|
+
# versioned field update
|
|
78
|
+
model_dict = VersionedField.dump(self.model_fields, model_dict, info, replaced_keys)
|
|
46
79
|
|
|
47
|
-
|
|
48
|
-
GLOBAL = "global"
|
|
49
|
-
DEFAULT = "default"
|
|
50
|
-
VARIABLE = "variable"
|
|
80
|
+
return model_dict
|
|
51
81
|
|
|
82
|
+
@classmethod
|
|
83
|
+
def _get_parcel_type(cls) -> str:
|
|
84
|
+
field_info = cls.model_fields.get("type_")
|
|
85
|
+
if field_info is not None:
|
|
86
|
+
return str(field_info.default)
|
|
87
|
+
raise CatalystwanException(f"{cls.__name__} field parcel type is not set.")
|
|
52
88
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
89
|
+
def remove_duplicated_entries(self) -> None:
|
|
90
|
+
if self.entries:
|
|
91
|
+
self.entries = list(set(self.entries))
|
|
56
92
|
|
|
57
93
|
|
|
58
94
|
# https://github.com/pydantic/pydantic/discussions/6090
|
|
59
95
|
# Usage: Global[str](value="test")
|
|
60
|
-
class Global(
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
)
|
|
96
|
+
class Global(BaseModel, Generic[T]):
|
|
97
|
+
model_config = ConfigDict(populate_by_name=True, alias_generator=to_camel)
|
|
98
|
+
option_type: Literal["global"] = "global"
|
|
64
99
|
value: T
|
|
65
100
|
|
|
101
|
+
def __bool__(self) -> bool:
|
|
102
|
+
# if statements use __len__ when __bool__ is not defined
|
|
103
|
+
return True
|
|
104
|
+
|
|
66
105
|
def __len__(self) -> int:
|
|
67
106
|
if isinstance(self.value, (str, list)):
|
|
68
107
|
return len(self.value)
|
|
@@ -78,19 +117,27 @@ class Global(ParcelAttribute, Generic[T]):
|
|
|
78
117
|
return self.value <= other
|
|
79
118
|
return False
|
|
80
119
|
|
|
120
|
+
def __hash__(self) -> int:
|
|
121
|
+
return hash(self.value)
|
|
81
122
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
123
|
+
|
|
124
|
+
class Variable(BaseModel):
|
|
125
|
+
model_config = ConfigDict(populate_by_name=True, alias_generator=to_camel)
|
|
126
|
+
option_type: Literal["variable"] = "variable"
|
|
86
127
|
value: str = Field(pattern=r"^\{\{[.\/\[\]a-zA-Z0-9_-]+\}\}$", min_length=1, max_length=64)
|
|
87
128
|
|
|
88
129
|
|
|
89
|
-
class Default(
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
130
|
+
class Default(BaseModel, Generic[T]):
|
|
131
|
+
model_config = ConfigDict(populate_by_name=True, alias_generator=to_camel)
|
|
132
|
+
option_type: Literal["default"] = "default"
|
|
133
|
+
value: Optional[T] = None
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def as_optional_global(value: Any, generic_alias: Any = None):
|
|
137
|
+
if value is None:
|
|
138
|
+
return None
|
|
139
|
+
|
|
140
|
+
return as_global(value, generic_alias)
|
|
94
141
|
|
|
95
142
|
|
|
96
143
|
def as_global(value: Any, generic_alias: Any = None):
|
|
@@ -104,10 +151,16 @@ def as_global(value: Any, generic_alias: Any = None):
|
|
|
104
151
|
Global[Any]: global option type object
|
|
105
152
|
"""
|
|
106
153
|
if generic_alias is None:
|
|
154
|
+
if isinstance(value, list):
|
|
155
|
+
if len(value) == 0:
|
|
156
|
+
return Global[List](value=list()) # type: ignore
|
|
157
|
+
return Global[List[type(value[0])]](value=value) # type: ignore
|
|
107
158
|
return Global[type(value)](value=value) # type: ignore
|
|
108
159
|
elif get_origin(generic_alias) is Literal:
|
|
109
160
|
return Global[generic_alias](value=value) # type: ignore
|
|
110
|
-
TypeError(
|
|
161
|
+
raise TypeError(
|
|
162
|
+
f"Inappropriate type origin: {generic_alias} {get_origin(generic_alias)} for argument generic_alias"
|
|
163
|
+
)
|
|
111
164
|
|
|
112
165
|
|
|
113
166
|
def as_variable(value: str):
|
|
@@ -119,6 +172,8 @@ def as_variable(value: str):
|
|
|
119
172
|
Returns:
|
|
120
173
|
Variable: variable option type object
|
|
121
174
|
"""
|
|
175
|
+
if not value.startswith("{{") and not value.endswith("}}"):
|
|
176
|
+
value = "{{" + value + "}}"
|
|
122
177
|
return Variable(value=value)
|
|
123
178
|
|
|
124
179
|
|
|
@@ -132,8 +187,23 @@ def as_default(value: Any, generic_alias: Any = None):
|
|
|
132
187
|
Returns:
|
|
133
188
|
Default[Any]: default option type object
|
|
134
189
|
"""
|
|
190
|
+
if value is None:
|
|
191
|
+
return Default[None](value=None)
|
|
135
192
|
if generic_alias is None:
|
|
193
|
+
if isinstance(value, list):
|
|
194
|
+
if len(value) == 0:
|
|
195
|
+
return Default[List](value=list()) # type: ignore
|
|
196
|
+
return Default[List[type(value[0])]](value=value) # type: ignore
|
|
136
197
|
return Default[type(value)](value=value) # type: ignore
|
|
137
198
|
elif get_origin(generic_alias) is Literal:
|
|
138
199
|
return Default[generic_alias](value=value) # type: ignore
|
|
139
|
-
TypeError(
|
|
200
|
+
raise TypeError(
|
|
201
|
+
f"Inappropriate type origin: {generic_alias} {get_origin(generic_alias)} for argument generic_alias"
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def as_optional_global_or_variable(value: Any, generic_alias: Any = None):
|
|
206
|
+
if isinstance(value, str) and value.startswith("{{") and value.endswith("}}"):
|
|
207
|
+
return as_variable(value)
|
|
208
|
+
else:
|
|
209
|
+
return as_optional_global(value, generic_alias)
|