catalystwan 0.41.2__py3-none-any.whl → 0.41.2.dev1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +57 -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.dev1.dist-info}/METADATA +20 -1
- catalystwan-0.41.2.dev1.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.dev1.dist-info}/LICENSE +0 -0
- {catalystwan-0.41.2.dist-info → catalystwan-0.41.2.dev1.dist-info}/WHEEL +0 -0
catalystwan/__init__.py
CHANGED
|
@@ -13,7 +13,8 @@ from typing import Callable, Final, List, Optional
|
|
|
13
13
|
|
|
14
14
|
import urllib3
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
PACKAGE_VERSION = metadata.version(__package__)
|
|
17
|
+
USER_AGENT = f"{__package__}/{PACKAGE_VERSION}"
|
|
17
18
|
|
|
18
19
|
|
|
19
20
|
def with_proc_info_header(method: Callable[..., str]) -> Callable[..., str]:
|
|
@@ -75,7 +76,7 @@ __version__ = metadata.version(__package__)
|
|
|
75
76
|
pkg_src_list = list_package_sources()
|
|
76
77
|
|
|
77
78
|
|
|
78
|
-
if environ.get("catalystwan_devel") is not None:
|
|
79
|
+
if environ.get("catalystwan_devel") is not None or environ.get("CATALYSTWAN_DEVEL") is not None:
|
|
79
80
|
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
|
80
81
|
catalystwan_logger = logging.getLogger(__name__)
|
|
81
82
|
logging.config.fileConfig(LOGGING_CONF_DIR, disable_existing_loggers=False)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright
|
|
1
|
+
# Copyright 2024 Cisco Systems, Inc. and its affiliates
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
@@ -34,6 +34,7 @@ from catalystwan.endpoints.administration_user_and_group import (
|
|
|
34
34
|
UserUpdateRequest,
|
|
35
35
|
)
|
|
36
36
|
from catalystwan.exceptions import CatalystwanDeprecationWarning, CatalystwanException
|
|
37
|
+
from catalystwan.models.settings import ThreatGridApi
|
|
37
38
|
from catalystwan.typed_list import DataSequence
|
|
38
39
|
from catalystwan.utils.creation_tools import asdict, create_dataclass
|
|
39
40
|
|
|
@@ -384,7 +385,14 @@ class AdministrationSettingsAPI:
|
|
|
384
385
|
def update(self, payload: Organization) -> bool:
|
|
385
386
|
...
|
|
386
387
|
|
|
387
|
-
|
|
388
|
+
@overload
|
|
389
|
+
def update(self, payload: ThreatGridApi) -> bool:
|
|
390
|
+
...
|
|
391
|
+
|
|
392
|
+
def update(self, payload: Union[Organization, Certificate, Password, Vbond, ThreatGridApi]) -> bool:
|
|
393
|
+
if isinstance(payload, ThreatGridApi):
|
|
394
|
+
created_threat = self.__update_thread_grid_api(payload)
|
|
395
|
+
return created_threat is not None
|
|
388
396
|
json_payload = asdict(payload) # type: ignore
|
|
389
397
|
if isinstance(payload, Organization):
|
|
390
398
|
response = self.__update_organization(json_payload)
|
|
@@ -414,6 +422,9 @@ class AdministrationSettingsAPI:
|
|
|
414
422
|
endpoint = "/dataservice/settings/configuration/device"
|
|
415
423
|
return self.session.post(endpoint, json=payload)
|
|
416
424
|
|
|
425
|
+
def __update_thread_grid_api(self, payload: ThreatGridApi) -> DataSequence[ThreatGridApi]:
|
|
426
|
+
return self.session.endpoints.configuration_settings.edit_threat_grid_api_key(payload)
|
|
427
|
+
|
|
417
428
|
@deprecated(
|
|
418
429
|
"Use .endpoints.configuration_settings.edit_organizations() instead", category=CatalystwanDeprecationWarning
|
|
419
430
|
)
|
catalystwan/api/api_container.py
CHANGED
|
@@ -15,10 +15,11 @@ from catalystwan.api.administration import (
|
|
|
15
15
|
)
|
|
16
16
|
from catalystwan.api.alarms_api import AlarmsAPI
|
|
17
17
|
from catalystwan.api.basic_api import DevicesAPI, DeviceStateAPI
|
|
18
|
+
from catalystwan.api.builders import BuilderAPI
|
|
18
19
|
from catalystwan.api.config_device_inventory_api import ConfigurationDeviceInventoryAPI
|
|
19
20
|
from catalystwan.api.config_group_api import ConfigGroupAPI
|
|
20
21
|
from catalystwan.api.dashboard_api import DashboardAPI
|
|
21
|
-
from catalystwan.api.feature_profile_api import SDRoutingFeatureProfilesAPI
|
|
22
|
+
from catalystwan.api.feature_profile_api import SDRoutingFeatureProfilesAPI, SDWANFeatureProfilesAPI
|
|
22
23
|
from catalystwan.api.logs_api import LogsAPI
|
|
23
24
|
from catalystwan.api.omp_api import OmpAPI
|
|
24
25
|
from catalystwan.api.packet_capture_api import PacketCaptureAPI
|
|
@@ -68,3 +69,5 @@ class APIContainer:
|
|
|
68
69
|
self.sessions = SessionsAPI(session)
|
|
69
70
|
self.policy = PolicyAPI(session)
|
|
70
71
|
self.sd_routing_feature_profiles = SDRoutingFeatureProfilesAPI(session)
|
|
72
|
+
self.sdwan_feature_profiles = SDWANFeatureProfilesAPI(session)
|
|
73
|
+
self.builders = BuilderAPI(session)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Copyright 2024 Cisco Systems, Inc. and its affiliates
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from typing import TYPE_CHECKING
|
|
5
|
+
|
|
6
|
+
from catalystwan.api.builders.feature_profiles.builder_factory import FeatureProfileBuilderFactory
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from catalystwan.session import ManagerSession
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class BuilderAPI:
|
|
13
|
+
def __init__(self, session: ManagerSession):
|
|
14
|
+
self.feature_profiles = FeatureProfileBuilderFactory(session=session)
|
|
File without changes
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Copyright 2024 Cisco Systems, Inc. and its affiliates
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import logging
|
|
5
|
+
from typing import TYPE_CHECKING, List
|
|
6
|
+
from uuid import UUID
|
|
7
|
+
|
|
8
|
+
from catalystwan.api.builders.feature_profiles.report import FeatureProfileBuildReport, handle_create_parcel
|
|
9
|
+
from catalystwan.api.feature_profile_api import ApplicationPriorityFeatureProfileAPI
|
|
10
|
+
from catalystwan.models.configuration.feature_profile.common import FeatureProfileCreationPayload
|
|
11
|
+
from catalystwan.models.configuration.feature_profile.sdwan.application_priority import AnyApplicationPriorityParcel
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from catalystwan.session import ManagerSession
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class ApplicationPriorityFeatureProfileBuilder:
|
|
20
|
+
"""
|
|
21
|
+
A class for building Application Priority feature profiles.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
def __init__(self, session: ManagerSession) -> None:
|
|
25
|
+
"""
|
|
26
|
+
Args:
|
|
27
|
+
session (ManagerSession): The ManagerSession object used for API communication.
|
|
28
|
+
profile_uuid (UUID): The UUID of the profile.
|
|
29
|
+
"""
|
|
30
|
+
self._profile: FeatureProfileCreationPayload
|
|
31
|
+
self._api = ApplicationPriorityFeatureProfileAPI(session)
|
|
32
|
+
self._parcels: List[AnyApplicationPriorityParcel] = []
|
|
33
|
+
|
|
34
|
+
def add_profile_name_and_description(self, feature_profile: FeatureProfileCreationPayload) -> None:
|
|
35
|
+
"""
|
|
36
|
+
Adds a name and description to the feature profile.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
feature_profile (FeatureProfileCreationPayload): Payload containing the name and description.
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
None
|
|
43
|
+
"""
|
|
44
|
+
self._profile = feature_profile
|
|
45
|
+
|
|
46
|
+
def add_parcel(self, parcel: AnyApplicationPriorityParcel) -> None:
|
|
47
|
+
self._parcels.append(parcel)
|
|
48
|
+
|
|
49
|
+
def build(self) -> FeatureProfileBuildReport:
|
|
50
|
+
profile_uuid = self._api.create_profile(self._profile.name, self._profile.description).id
|
|
51
|
+
self.build_report = FeatureProfileBuildReport(profile_uuid=profile_uuid, profile_name=self._profile.name)
|
|
52
|
+
for parcel in self._parcels:
|
|
53
|
+
self._create_parcel(profile_uuid, parcel)
|
|
54
|
+
return self.build_report
|
|
55
|
+
|
|
56
|
+
@handle_create_parcel
|
|
57
|
+
def _create_parcel(self, profile_uuid: UUID, parcel: AnyApplicationPriorityParcel) -> UUID:
|
|
58
|
+
return self._api.create_parcel(profile_uuid, parcel).id
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Copyright 2024 Cisco Systems, Inc. and its affiliates
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from typing import TYPE_CHECKING, Callable, Mapping, Union
|
|
5
|
+
|
|
6
|
+
from catalystwan.api.builders.feature_profiles.application_priority import ApplicationPriorityFeatureProfileBuilder
|
|
7
|
+
from catalystwan.api.builders.feature_profiles.cli import CliFeatureProfileBuilder
|
|
8
|
+
from catalystwan.api.builders.feature_profiles.other import OtherFeatureProfileBuilder
|
|
9
|
+
from catalystwan.api.builders.feature_profiles.service import ServiceFeatureProfileBuilder
|
|
10
|
+
from catalystwan.api.builders.feature_profiles.system import SystemFeatureProfileBuilder
|
|
11
|
+
from catalystwan.api.builders.feature_profiles.transport import TransportAndManagementProfileBuilder
|
|
12
|
+
from catalystwan.api.builders.feature_profiles.uc_voice import UcVoiceFeatureProfileBuilder
|
|
13
|
+
from catalystwan.exceptions import CatalystwanException
|
|
14
|
+
from catalystwan.models.configuration.feature_profile.common import ProfileType
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from catalystwan.session import ManagerSession
|
|
18
|
+
|
|
19
|
+
FeatureProfileBuilder = Union[
|
|
20
|
+
ServiceFeatureProfileBuilder,
|
|
21
|
+
SystemFeatureProfileBuilder,
|
|
22
|
+
OtherFeatureProfileBuilder,
|
|
23
|
+
TransportAndManagementProfileBuilder,
|
|
24
|
+
CliFeatureProfileBuilder,
|
|
25
|
+
ApplicationPriorityFeatureProfileBuilder,
|
|
26
|
+
UcVoiceFeatureProfileBuilder
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
BUILDER_MAPPING: Mapping[ProfileType, Callable] = {
|
|
30
|
+
"service": ServiceFeatureProfileBuilder,
|
|
31
|
+
"system": SystemFeatureProfileBuilder,
|
|
32
|
+
"other": OtherFeatureProfileBuilder,
|
|
33
|
+
"transport": TransportAndManagementProfileBuilder,
|
|
34
|
+
"cli": CliFeatureProfileBuilder,
|
|
35
|
+
"application-priority": ApplicationPriorityFeatureProfileBuilder,
|
|
36
|
+
"uc-voice": UcVoiceFeatureProfileBuilder,
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class FeatureProfileBuilderFactory:
|
|
41
|
+
def __init__(self, session: ManagerSession):
|
|
42
|
+
self.session = session
|
|
43
|
+
|
|
44
|
+
def create_builder(self, profile_type: ProfileType) -> FeatureProfileBuilder:
|
|
45
|
+
"""
|
|
46
|
+
Creates a builder for the specified feature profile.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
feature_profile_name (str): The name of the feature profile.
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
FeatureProfileBuilder: The builder for the specified feature profile.
|
|
53
|
+
|
|
54
|
+
Raises:
|
|
55
|
+
CatalystwanException: If the feature profile is not found or has an unsupported type.
|
|
56
|
+
"""
|
|
57
|
+
if profile_type not in BUILDER_MAPPING:
|
|
58
|
+
raise CatalystwanException(f"Unsupported builder for type {profile_type}")
|
|
59
|
+
return BUILDER_MAPPING[profile_type](self.session)
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Copyright 2024 Cisco Systems, Inc. and its affiliates
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from typing import TYPE_CHECKING, List
|
|
5
|
+
from uuid import UUID
|
|
6
|
+
|
|
7
|
+
from catalystwan.api.builders.feature_profiles.report import FeatureProfileBuildReport, handle_create_parcel
|
|
8
|
+
from catalystwan.api.feature_profile_api import CliFeatureProfileAPI
|
|
9
|
+
from catalystwan.endpoints.configuration.feature_profile.sdwan.cli import CliFeatureProfile
|
|
10
|
+
from catalystwan.models.configuration.feature_profile.common import FeatureProfileCreationPayload
|
|
11
|
+
from catalystwan.models.configuration.feature_profile.sdwan.cli import AnyCliParcel
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from catalystwan.session import ManagerSession
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class CliFeatureProfileBuilder:
|
|
18
|
+
"""
|
|
19
|
+
A class for building Cli feature profiles.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
def __init__(self, session: ManagerSession) -> None:
|
|
23
|
+
"""
|
|
24
|
+
Initialize a new instance of the Cli class.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
session (ManagerSession): The ManagerSession object used for API communication.
|
|
28
|
+
profile_uuid (UUID): The UUID of the profile.
|
|
29
|
+
"""
|
|
30
|
+
self._profile: FeatureProfileCreationPayload
|
|
31
|
+
self._api = CliFeatureProfileAPI(session)
|
|
32
|
+
self._endpoints = CliFeatureProfile(session)
|
|
33
|
+
self._cli_configs: List[AnyCliParcel] = list()
|
|
34
|
+
|
|
35
|
+
def add_profile_name_and_description(self, feature_profile: FeatureProfileCreationPayload) -> None:
|
|
36
|
+
"""
|
|
37
|
+
Adds a name and description to the feature profile.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
name (str): The name of the feature profile.
|
|
41
|
+
description (str): The description of the feature profile.
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
None
|
|
45
|
+
"""
|
|
46
|
+
self._profile = feature_profile
|
|
47
|
+
|
|
48
|
+
def add_parcel(self, parcel: AnyCliParcel) -> None:
|
|
49
|
+
"""
|
|
50
|
+
Adds a parcel to the feature profile.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
parcel (AnyCliParcel): The parcel to add.
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
None
|
|
57
|
+
"""
|
|
58
|
+
self._cli_configs.append(parcel)
|
|
59
|
+
|
|
60
|
+
def build(self) -> FeatureProfileBuildReport:
|
|
61
|
+
"""
|
|
62
|
+
Builds the feature profile.
|
|
63
|
+
|
|
64
|
+
Returns:
|
|
65
|
+
UUID: The UUID of the created feature profile.
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
profile_uuid = self._endpoints.create_profile(self._profile).id
|
|
69
|
+
self.build_report = FeatureProfileBuildReport(profile_uuid=profile_uuid, profile_name=self._profile.name)
|
|
70
|
+
for config_parcel in self._cli_configs:
|
|
71
|
+
self._create_parcel(profile_uuid, config_parcel)
|
|
72
|
+
return self.build_report
|
|
73
|
+
|
|
74
|
+
@handle_create_parcel
|
|
75
|
+
def _create_parcel(self, profile_uuid: UUID, parcel: AnyCliParcel) -> UUID:
|
|
76
|
+
return self._api.create_parcel(profile_uuid, parcel).id
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Copyright 2023 Cisco Systems, Inc. and its affiliates
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from typing import Dict, List, Set, Tuple
|
|
5
|
+
from uuid import UUID
|
|
6
|
+
|
|
7
|
+
from catalystwan.models.configuration.feature_profile.sdwan.trackers import Tracker, TrackerGroup
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class TrackerMixin:
|
|
11
|
+
def init_tracker(self) -> None:
|
|
12
|
+
self._shared_trackers: Dict[str, UUID] = {}
|
|
13
|
+
self._trackers: List[Tuple[Set[UUID], Tracker]] = []
|
|
14
|
+
self._tracker_groups: List[Tuple[Set[UUID], TrackerGroup, List[Tracker]]] = []
|
|
15
|
+
self._interface_tag_to_existing_tracker: Dict[UUID, Tuple[UUID, str]] = {}
|
|
16
|
+
|
|
17
|
+
def _create_parcel(self, profile_uuid: UUID, tracker: Tracker | TrackerGroup) -> UUID:
|
|
18
|
+
raise NotImplementedError()
|
|
19
|
+
|
|
20
|
+
def create_trackers(self, profile_uuid: UUID) -> None:
|
|
21
|
+
for tracker_group_tags, tracker_group, trackers in self._tracker_groups:
|
|
22
|
+
trackers_uuids: List[UUID] = []
|
|
23
|
+
for tracker_ in trackers:
|
|
24
|
+
tracker_uuid = self._create_parcel(profile_uuid, tracker_)
|
|
25
|
+
if tracker_uuid:
|
|
26
|
+
trackers_uuids.append(tracker_uuid)
|
|
27
|
+
self._shared_trackers[tracker_.parcel_name] = tracker_uuid
|
|
28
|
+
|
|
29
|
+
for tracker_uuid in trackers_uuids:
|
|
30
|
+
tracker_group.add_ref(tracker_uuid)
|
|
31
|
+
|
|
32
|
+
tracker_group_uuid = self._create_parcel(profile_uuid, tracker_group)
|
|
33
|
+
if tracker_group_uuid:
|
|
34
|
+
for tag in tracker_group_tags:
|
|
35
|
+
self._interface_tag_to_existing_tracker[tag] = tracker_group_uuid, tracker_group._get_parcel_type()
|
|
36
|
+
|
|
37
|
+
for tracker_tags, tracker in self._trackers:
|
|
38
|
+
if tracker.parcel_name in self._shared_trackers:
|
|
39
|
+
created_tracker_uuid = self._shared_trackers[tracker.parcel_name]
|
|
40
|
+
else:
|
|
41
|
+
created_tracker_uuid = self._create_parcel(profile_uuid, tracker)
|
|
42
|
+
if created_tracker_uuid:
|
|
43
|
+
for tag in tracker_tags:
|
|
44
|
+
self._interface_tag_to_existing_tracker[tag] = (created_tracker_uuid, tracker._get_parcel_type())
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Copyright 2024 Cisco Systems, Inc. and its affiliates
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import logging
|
|
5
|
+
from typing import TYPE_CHECKING, List
|
|
6
|
+
from uuid import UUID
|
|
7
|
+
|
|
8
|
+
from catalystwan.api.builders.feature_profiles.report import FeatureProfileBuildReport, handle_create_parcel
|
|
9
|
+
from catalystwan.api.feature_profile_api import OtherFeatureProfileAPI
|
|
10
|
+
from catalystwan.endpoints.configuration.feature_profile.sdwan.other import OtherFeatureProfile
|
|
11
|
+
from catalystwan.models.configuration.feature_profile.common import FeatureProfileCreationPayload
|
|
12
|
+
from catalystwan.models.configuration.feature_profile.sdwan.other import AnyOtherParcel
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from catalystwan.session import ManagerSession
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class OtherFeatureProfileBuilder:
|
|
21
|
+
"""
|
|
22
|
+
A class for building Other feature profiles.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
def __init__(self, session: ManagerSession) -> None:
|
|
26
|
+
"""
|
|
27
|
+
Initialize a new instance of the Service class.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
session (ManagerSession): The ManagerSession object used for API communication.
|
|
31
|
+
profile_uuid (UUID): The UUID of the profile.
|
|
32
|
+
"""
|
|
33
|
+
self._profile: FeatureProfileCreationPayload
|
|
34
|
+
self._api = OtherFeatureProfileAPI(session)
|
|
35
|
+
self._endpoints = OtherFeatureProfile(session)
|
|
36
|
+
self._independent_items: List[AnyOtherParcel] = []
|
|
37
|
+
|
|
38
|
+
def add_profile_name_and_description(self, feature_profile: FeatureProfileCreationPayload) -> None:
|
|
39
|
+
"""
|
|
40
|
+
Adds a name and description to the feature profile.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
name (str): The name of the feature profile.
|
|
44
|
+
description (str): The description of the feature profile.
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
None
|
|
48
|
+
"""
|
|
49
|
+
self._profile = feature_profile
|
|
50
|
+
|
|
51
|
+
def add_parcel(self, parcel: AnyOtherParcel) -> None:
|
|
52
|
+
"""
|
|
53
|
+
Adds a parcel to the feature profile.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
parcel (AnySystemParcel): The parcel to add.
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
None
|
|
60
|
+
"""
|
|
61
|
+
self._independent_items.append(parcel)
|
|
62
|
+
|
|
63
|
+
def build(self) -> FeatureProfileBuildReport:
|
|
64
|
+
"""
|
|
65
|
+
Builds the feature profile.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
UUID: The UUID of the created feature profile.
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
profile_uuid = self._endpoints.create_sdwan_other_feature_profile(self._profile).id
|
|
72
|
+
self.build_report = FeatureProfileBuildReport(profile_uuid=profile_uuid, profile_name=self._profile.name)
|
|
73
|
+
for parcel in self._independent_items:
|
|
74
|
+
self._create_parcel(profile_uuid, parcel)
|
|
75
|
+
return self.build_report
|
|
76
|
+
|
|
77
|
+
@handle_create_parcel
|
|
78
|
+
def _create_parcel(self, profile_uuid: UUID, parcel: AnyOtherParcel) -> UUID:
|
|
79
|
+
return self._api.create_parcel(profile_uuid, parcel).id
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# Copyright 2023 Cisco Systems, Inc. and its affiliates
|
|
2
|
+
import functools
|
|
3
|
+
import logging
|
|
4
|
+
from typing import Any, List, Optional, Tuple, Union
|
|
5
|
+
from uuid import UUID
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
8
|
+
from requests import PreparedRequest, Request, Response
|
|
9
|
+
|
|
10
|
+
from catalystwan.exceptions import ManagerErrorInfo, ManagerHTTPError
|
|
11
|
+
from catalystwan.models.configuration.feature_profile.parcel import AnyParcel
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def handle_create_parcel(func):
|
|
17
|
+
@functools.wraps(func)
|
|
18
|
+
def wrapper(self, profile_uuid: UUID, parcel: AnyParcel, *args, **kwargs) -> Optional[UUID]:
|
|
19
|
+
try:
|
|
20
|
+
uuid = func(self, profile_uuid, parcel, *args, **kwargs)
|
|
21
|
+
self.build_report.add_created_parcel(parcel.parcel_name, uuid)
|
|
22
|
+
return uuid
|
|
23
|
+
except ManagerHTTPError as e:
|
|
24
|
+
self.build_report.add_failed_parcel(
|
|
25
|
+
parcel_name=parcel.parcel_name,
|
|
26
|
+
parcel_type=parcel._get_parcel_type(),
|
|
27
|
+
error=e,
|
|
28
|
+
)
|
|
29
|
+
return None
|
|
30
|
+
|
|
31
|
+
return wrapper
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class FailedRequestDetails(BaseModel):
|
|
35
|
+
method: str
|
|
36
|
+
url: str
|
|
37
|
+
body: str
|
|
38
|
+
|
|
39
|
+
@classmethod
|
|
40
|
+
def from_request(cls, request: Union[Request, PreparedRequest, Any]) -> "FailedRequestDetails":
|
|
41
|
+
if isinstance(request, (Request, PreparedRequest)):
|
|
42
|
+
return cls(
|
|
43
|
+
method=str(request.method),
|
|
44
|
+
url=str(request.url),
|
|
45
|
+
body=str(request.body if hasattr(request, "body") else ""),
|
|
46
|
+
)
|
|
47
|
+
return cls.as_empty()
|
|
48
|
+
|
|
49
|
+
@classmethod
|
|
50
|
+
def as_empty(cls) -> "FailedRequestDetails":
|
|
51
|
+
return cls(method="", url="", body="")
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class ResponseDetails(BaseModel):
|
|
55
|
+
status_code: int
|
|
56
|
+
reason: str
|
|
57
|
+
|
|
58
|
+
@classmethod
|
|
59
|
+
def from_response(cls, response: Union[Response, Any]) -> "ResponseDetails":
|
|
60
|
+
if isinstance(response, Response):
|
|
61
|
+
return cls(status_code=response.status_code, reason=response.reason)
|
|
62
|
+
return cls.as_empty()
|
|
63
|
+
|
|
64
|
+
@classmethod
|
|
65
|
+
def as_empty(cls) -> "ResponseDetails":
|
|
66
|
+
return cls(status_code=-1, reason="")
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class FailedParcel(BaseModel):
|
|
70
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
71
|
+
parcel_name: str = Field(serialization_alias="parcelName", validation_alias="parcelName")
|
|
72
|
+
parcel_type: str = Field(serialization_alias="parcelType", validation_alias="parcelType")
|
|
73
|
+
error_info: Union[ManagerErrorInfo, str] = Field(serialization_alias="errorInfo", validation_alias="errorInfo")
|
|
74
|
+
request_details: Optional[FailedRequestDetails] = Field(
|
|
75
|
+
default=None, serialization_alias="requestDetails", validation_alias="requestDetails"
|
|
76
|
+
)
|
|
77
|
+
response_details: Optional[ResponseDetails] = Field(
|
|
78
|
+
default=None, serialization_alias="responseDetails", validation_alias="responseDetails"
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
@classmethod
|
|
82
|
+
def from_error(
|
|
83
|
+
cls,
|
|
84
|
+
parcel_name: str,
|
|
85
|
+
parcel_type: str,
|
|
86
|
+
error: ManagerHTTPError,
|
|
87
|
+
):
|
|
88
|
+
return cls(
|
|
89
|
+
parcel_name=parcel_name,
|
|
90
|
+
parcel_type=parcel_type,
|
|
91
|
+
error_info=error.info,
|
|
92
|
+
request_details=FailedRequestDetails.from_request(error.request),
|
|
93
|
+
response_details=ResponseDetails.from_response(error.response),
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class FeatureProfileBuildReport(BaseModel):
|
|
98
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
99
|
+
profile_name: str = Field(serialization_alias="profileName", validation_alias="profileName")
|
|
100
|
+
profile_uuid: UUID = Field(serialization_alias="profileUuid", validation_alias="profileUuid")
|
|
101
|
+
created_parcels: List[Tuple[str, UUID]] = Field(
|
|
102
|
+
default_factory=list, serialization_alias="createdParcels", validation_alias="createdParcels"
|
|
103
|
+
)
|
|
104
|
+
failed_parcels: List[FailedParcel] = Field(
|
|
105
|
+
default_factory=list, serialization_alias="failedParcels", validation_alias="failedParcels"
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
def add_created_parcel(self, parcel_name: str, parcel_uuid: UUID) -> None:
|
|
109
|
+
self.created_parcels.append((parcel_name, parcel_uuid))
|
|
110
|
+
|
|
111
|
+
def add_failed_parcel(
|
|
112
|
+
self,
|
|
113
|
+
parcel_name: str,
|
|
114
|
+
parcel_type: str,
|
|
115
|
+
error: ManagerHTTPError,
|
|
116
|
+
) -> None:
|
|
117
|
+
self.failed_parcels.append(
|
|
118
|
+
FailedParcel.from_error(
|
|
119
|
+
parcel_name=parcel_name,
|
|
120
|
+
parcel_type=parcel_type,
|
|
121
|
+
error=error,
|
|
122
|
+
)
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def hande_failed_sub_parcel(build_report: FeatureProfileBuildReport, parent: AnyParcel, subparcel: AnyParcel) -> None:
|
|
127
|
+
parent_failed_to_create_message = (
|
|
128
|
+
f"Parent parcel: {parent.parcel_name} failed to create. This subparcel is dependent on it."
|
|
129
|
+
)
|
|
130
|
+
build_report.failed_parcels.append(
|
|
131
|
+
FailedParcel(
|
|
132
|
+
parcel_name=subparcel.parcel_name,
|
|
133
|
+
parcel_type=subparcel._get_parcel_type(),
|
|
134
|
+
error_info=parent_failed_to_create_message,
|
|
135
|
+
),
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
class handle_association_request:
|
|
140
|
+
def __init__(self, build_report: FeatureProfileBuildReport, parcel: AnyParcel) -> None:
|
|
141
|
+
self.build_report = build_report
|
|
142
|
+
self.parcel = parcel
|
|
143
|
+
|
|
144
|
+
def __enter__(self) -> "handle_association_request":
|
|
145
|
+
return self
|
|
146
|
+
|
|
147
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
148
|
+
if exc_type is not None:
|
|
149
|
+
if issubclass(exc_type, ManagerHTTPError):
|
|
150
|
+
self.build_report.add_failed_parcel(
|
|
151
|
+
parcel_name=self.parcel.parcel_name, parcel_type=self.parcel._get_parcel_type(), error=exc_val
|
|
152
|
+
)
|
|
153
|
+
else:
|
|
154
|
+
logger.exception(exc_val)
|
|
155
|
+
return True
|