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
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
# Copyright 2023 Cisco Systems, Inc. and its affiliates
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import logging
|
|
5
|
+
from collections import defaultdict
|
|
6
|
+
from typing import TYPE_CHECKING, Dict, List, Optional, Set, Tuple, Union
|
|
7
|
+
from uuid import UUID, uuid4
|
|
8
|
+
|
|
9
|
+
from pydantic import Field
|
|
10
|
+
from typing_extensions import Annotated
|
|
11
|
+
|
|
12
|
+
from catalystwan.api.builders.feature_profiles.mixins import TrackerMixin
|
|
13
|
+
from catalystwan.api.builders.feature_profiles.report import (
|
|
14
|
+
FeatureProfileBuildReport,
|
|
15
|
+
hande_failed_sub_parcel,
|
|
16
|
+
handle_association_request,
|
|
17
|
+
handle_create_parcel,
|
|
18
|
+
)
|
|
19
|
+
from catalystwan.api.feature_profile_api import ServiceFeatureProfileAPI
|
|
20
|
+
from catalystwan.endpoints.configuration.feature_profile.sdwan.service import ServiceFeatureProfile
|
|
21
|
+
from catalystwan.models.configuration.feature_profile.common import FeatureProfileCreationPayload
|
|
22
|
+
from catalystwan.models.configuration.feature_profile.parcel import ParcelAssociationPayload
|
|
23
|
+
from catalystwan.models.configuration.feature_profile.sdwan.routing import AnyRoutingParcel
|
|
24
|
+
from catalystwan.models.configuration.feature_profile.sdwan.service import (
|
|
25
|
+
AnyServiceParcel,
|
|
26
|
+
AppqoeParcel,
|
|
27
|
+
InterfaceEthernetParcel,
|
|
28
|
+
InterfaceGreParcel,
|
|
29
|
+
InterfaceIpsecParcel,
|
|
30
|
+
InterfaceSviParcel,
|
|
31
|
+
LanVpnDhcpServerParcel,
|
|
32
|
+
LanVpnParcel,
|
|
33
|
+
)
|
|
34
|
+
from catalystwan.models.configuration.feature_profile.sdwan.service.multicast import MulticastParcel
|
|
35
|
+
from catalystwan.models.configuration.feature_profile.sdwan.trackers import Tracker, TrackerGroup
|
|
36
|
+
|
|
37
|
+
if TYPE_CHECKING:
|
|
38
|
+
from catalystwan.session import ManagerSession
|
|
39
|
+
|
|
40
|
+
logger = logging.getLogger(__name__)
|
|
41
|
+
|
|
42
|
+
IndependedParcels = Annotated[Union[AppqoeParcel, LanVpnDhcpServerParcel], Field(discriminator="type_")]
|
|
43
|
+
DependedVpnSubparcels = Annotated[
|
|
44
|
+
Union[InterfaceGreParcel, InterfaceSviParcel, InterfaceEthernetParcel, InterfaceIpsecParcel, MulticastParcel],
|
|
45
|
+
Field(discriminator="type_"),
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class ServiceFeatureProfileBuilder(TrackerMixin):
|
|
50
|
+
"""
|
|
51
|
+
A class for building service feature profiles.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
def __init__(self, session: ManagerSession):
|
|
55
|
+
"""
|
|
56
|
+
Initialize a new instance of the Service class.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
session (ManagerSession): The ManagerSession object used for API communication.
|
|
60
|
+
profile_uuid (UUID): The UUID of the profile.
|
|
61
|
+
"""
|
|
62
|
+
self._profile: FeatureProfileCreationPayload
|
|
63
|
+
self._api = ServiceFeatureProfileAPI(session)
|
|
64
|
+
self._endpoints = ServiceFeatureProfile(session)
|
|
65
|
+
self._independent_items: List[IndependedParcels] = []
|
|
66
|
+
self._independent_items_vpns: Dict[UUID, LanVpnParcel] = {}
|
|
67
|
+
self._dependent_items_on_vpns: Dict[UUID, List[Tuple[UUID, DependedVpnSubparcels]]] = defaultdict(list)
|
|
68
|
+
self._dependent_routing_items_on_vpns: Dict[UUID, List[AnyRoutingParcel]] = defaultdict(list)
|
|
69
|
+
self._interfaces_with_attached_dhcp_server: Dict[str, LanVpnDhcpServerParcel] = {}
|
|
70
|
+
# Trackers
|
|
71
|
+
self.init_tracker()
|
|
72
|
+
|
|
73
|
+
def add_profile_name_and_description(self, feature_profile: FeatureProfileCreationPayload) -> None:
|
|
74
|
+
"""
|
|
75
|
+
Adds a name and description to the feature profile.
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
name (str): The name of the feature profile.
|
|
79
|
+
description (str): The description of the feature profile.
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
None
|
|
83
|
+
"""
|
|
84
|
+
self._profile = feature_profile
|
|
85
|
+
|
|
86
|
+
def add_parcel(self, parcel: IndependedParcels) -> None:
|
|
87
|
+
"""
|
|
88
|
+
Adds an independent parcel to the builder.
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
parcel (IndependedParcels): The independent parcel to add.
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
None
|
|
95
|
+
"""
|
|
96
|
+
self._independent_items.append(parcel)
|
|
97
|
+
|
|
98
|
+
def add_parcel_vpn(self, parcel: LanVpnParcel) -> UUID:
|
|
99
|
+
"""
|
|
100
|
+
Adds a VPN parcel to the builder.
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
parcel (LanVpnParcel): The VPN parcel to add.
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
UUID: The UUID tag of the added VPN parcel.
|
|
107
|
+
"""
|
|
108
|
+
vpn_tag = uuid4()
|
|
109
|
+
logger.debug(f"Adding VPN parcel {parcel.parcel_name} with tag {vpn_tag}")
|
|
110
|
+
self._independent_items_vpns[vpn_tag] = parcel
|
|
111
|
+
return vpn_tag
|
|
112
|
+
|
|
113
|
+
def add_parcel_routing_attached(self, vpn_tag: UUID, parcel: AnyRoutingParcel) -> None:
|
|
114
|
+
"""
|
|
115
|
+
Adds a routing parcel to the builder.
|
|
116
|
+
|
|
117
|
+
Args:
|
|
118
|
+
vpn_tag (UUID): The UUID of the VPN.
|
|
119
|
+
parcel (AnyServiceParcel): The routing parcel to add.
|
|
120
|
+
|
|
121
|
+
Returns:
|
|
122
|
+
None
|
|
123
|
+
"""
|
|
124
|
+
logger.debug(f"Adding routing parcel {parcel.parcel_name} to VPN {vpn_tag}")
|
|
125
|
+
self._dependent_routing_items_on_vpns[vpn_tag].append(parcel)
|
|
126
|
+
|
|
127
|
+
def add_parcel_vpn_subparcel(self, vpn_tag: UUID, parcel: DependedVpnSubparcels) -> UUID:
|
|
128
|
+
"""
|
|
129
|
+
Adds an subparcel parcel dependent on a VPN to the builder.
|
|
130
|
+
|
|
131
|
+
Args:
|
|
132
|
+
vpn_tag (UUID): The UUID of the VPN.
|
|
133
|
+
parcel (DependedVpnSubparcels): The interface parcel to add.
|
|
134
|
+
|
|
135
|
+
Returns:
|
|
136
|
+
None
|
|
137
|
+
"""
|
|
138
|
+
|
|
139
|
+
subparcel_tag = uuid4()
|
|
140
|
+
logger.debug(f"Adding vpn sub-parcel {parcel.parcel_name} with tag {subparcel_tag}")
|
|
141
|
+
self._dependent_items_on_vpns[vpn_tag].append((subparcel_tag, parcel))
|
|
142
|
+
return subparcel_tag
|
|
143
|
+
|
|
144
|
+
def add_parcel_dhcp_server(self, interface_parcel_name: str, parcel: LanVpnDhcpServerParcel) -> None:
|
|
145
|
+
"""
|
|
146
|
+
Adds a DHCP server parcel to the builder.
|
|
147
|
+
|
|
148
|
+
Args:
|
|
149
|
+
interface_tag (UUID): The UUID of the interface.
|
|
150
|
+
parcel (LanVpnDhcpServerParcel): The DHCP server parcel to add.
|
|
151
|
+
|
|
152
|
+
Returns:
|
|
153
|
+
UUID: The UUID tag of the added DHCP server parcel.
|
|
154
|
+
"""
|
|
155
|
+
logger.debug(f"Adding DHCP server parcel {parcel.parcel_name} to interface {interface_parcel_name}")
|
|
156
|
+
self._interfaces_with_attached_dhcp_server[interface_parcel_name] = parcel
|
|
157
|
+
|
|
158
|
+
def add_tracker(self, associate_tags: Set[UUID], tracker: Tracker) -> None:
|
|
159
|
+
"""
|
|
160
|
+
Adds a tracker parcel to the feature profile.
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
associate_tags (Set[UUID]): The UUIDs of the interfaces to which the tracker should be added.
|
|
164
|
+
tracker (Tracker): The tracker parcel to add.
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
None
|
|
168
|
+
"""
|
|
169
|
+
self._trackers.append((associate_tags, tracker))
|
|
170
|
+
|
|
171
|
+
def add_tracker_group(self, associate_tags: Set[UUID], group: TrackerGroup, trackers: List[Tracker]) -> None:
|
|
172
|
+
self._tracker_groups.append((associate_tags, group, trackers))
|
|
173
|
+
|
|
174
|
+
def build(self) -> FeatureProfileBuildReport:
|
|
175
|
+
"""
|
|
176
|
+
Builds the feature profile by creating parcels for independent items,
|
|
177
|
+
VPNs, and sub-parcels dependent on VPNs.
|
|
178
|
+
|
|
179
|
+
Returns:
|
|
180
|
+
Service feature profile UUID
|
|
181
|
+
"""
|
|
182
|
+
profile_uuid = self._endpoints.create_sdwan_service_feature_profile(self._profile).id
|
|
183
|
+
self.build_report = FeatureProfileBuildReport(profile_uuid=profile_uuid, profile_name=self._profile.name)
|
|
184
|
+
for parcel in self._independent_items:
|
|
185
|
+
self._create_parcel(profile_uuid, parcel)
|
|
186
|
+
|
|
187
|
+
self.create_trackers(profile_uuid=profile_uuid)
|
|
188
|
+
|
|
189
|
+
for vpn_tag, vpn_parcel in self._independent_items_vpns.items():
|
|
190
|
+
vpn_uuid = self._create_parcel(profile_uuid, vpn_parcel)
|
|
191
|
+
|
|
192
|
+
for routing_parcel in self._dependent_routing_items_on_vpns[vpn_tag]:
|
|
193
|
+
if vpn_uuid is None:
|
|
194
|
+
hande_failed_sub_parcel(self.build_report, vpn_parcel, routing_parcel)
|
|
195
|
+
else:
|
|
196
|
+
routing_uuid = self._create_parcel(profile_uuid, routing_parcel)
|
|
197
|
+
if not routing_uuid:
|
|
198
|
+
continue
|
|
199
|
+
with handle_association_request(self.build_report, routing_parcel):
|
|
200
|
+
self._endpoints.associate_with_vpn(
|
|
201
|
+
profile_uuid,
|
|
202
|
+
vpn_uuid,
|
|
203
|
+
routing_parcel._get_parcel_type(),
|
|
204
|
+
payload=ParcelAssociationPayload(parcel_id=routing_uuid),
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
for subparcel_tag, sub_parcel in self._dependent_items_on_vpns[vpn_tag]:
|
|
208
|
+
if vpn_uuid is None:
|
|
209
|
+
hande_failed_sub_parcel(self.build_report, vpn_parcel, sub_parcel)
|
|
210
|
+
else:
|
|
211
|
+
parcel_uuid = self._create_parcel(profile_uuid, sub_parcel, vpn_uuid)
|
|
212
|
+
dhcp_server = self._interfaces_with_attached_dhcp_server.get(sub_parcel.parcel_name)
|
|
213
|
+
if parcel_uuid is None and dhcp_server:
|
|
214
|
+
# The parent could not be created
|
|
215
|
+
hande_failed_sub_parcel(self.build_report, sub_parcel, dhcp_server)
|
|
216
|
+
continue
|
|
217
|
+
|
|
218
|
+
if dhcp_server:
|
|
219
|
+
dhcp_server_uuid = self._create_parcel(profile_uuid, dhcp_server)
|
|
220
|
+
if dhcp_server_uuid is not None:
|
|
221
|
+
with handle_association_request(self.build_report, sub_parcel):
|
|
222
|
+
self._endpoints.associate_dhcp_server_with_vpn_interface(
|
|
223
|
+
profile_uuid=profile_uuid,
|
|
224
|
+
vpn_uuid=vpn_uuid,
|
|
225
|
+
interface_parcel_type=sub_parcel._get_parcel_type().replace("lan/vpn/", ""),
|
|
226
|
+
interface_uuid=parcel_uuid,
|
|
227
|
+
payload=ParcelAssociationPayload(parcel_id=dhcp_server_uuid),
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
# Associate tracker with VPN interface if it exists
|
|
231
|
+
if subparcel_tag in self._interface_tag_to_existing_tracker and parcel_uuid:
|
|
232
|
+
tracker_uuid, tracker_type = self._interface_tag_to_existing_tracker[subparcel_tag]
|
|
233
|
+
sub_parcel_type = sub_parcel._get_parcel_type().replace("lan/vpn/", "")
|
|
234
|
+
with handle_association_request(self.build_report, sub_parcel):
|
|
235
|
+
self._endpoints.associate_tracker_with_vpn_interface(
|
|
236
|
+
profile_uuid,
|
|
237
|
+
vpn_uuid,
|
|
238
|
+
sub_parcel_type,
|
|
239
|
+
parcel_uuid,
|
|
240
|
+
tracker_type,
|
|
241
|
+
ParcelAssociationPayload(parcel_id=tracker_uuid),
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
return self.build_report
|
|
245
|
+
|
|
246
|
+
@handle_create_parcel
|
|
247
|
+
def _create_parcel(self, profile_uuid: UUID, parcel: AnyServiceParcel, vpn_uuid: Optional[None] = None) -> UUID:
|
|
248
|
+
return self._api.create_parcel(profile_uuid, parcel, vpn_uuid).id
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Copyright 2023 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 SystemFeatureProfileAPI
|
|
10
|
+
from catalystwan.endpoints.configuration.feature_profile.sdwan.system import SystemFeatureProfile
|
|
11
|
+
from catalystwan.models.configuration.feature_profile.common import FeatureProfileCreationPayload
|
|
12
|
+
from catalystwan.models.configuration.feature_profile.sdwan.system import AnySystemParcel
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from catalystwan.session import ManagerSession
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class SystemFeatureProfileBuilder:
|
|
21
|
+
"""
|
|
22
|
+
A class for building system 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
|
+
|
|
34
|
+
self._profile: FeatureProfileCreationPayload
|
|
35
|
+
self._api = SystemFeatureProfileAPI(session)
|
|
36
|
+
self._endpoints = SystemFeatureProfile(session)
|
|
37
|
+
self._independent_items: List[AnySystemParcel] = []
|
|
38
|
+
|
|
39
|
+
def add_profile_name_and_description(self, feature_profile: FeatureProfileCreationPayload) -> None:
|
|
40
|
+
"""
|
|
41
|
+
Adds a name and description to the feature profile.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
name (str): The name of the feature profile.
|
|
45
|
+
description (str): The description of the feature profile.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
None
|
|
49
|
+
"""
|
|
50
|
+
self._profile = feature_profile
|
|
51
|
+
|
|
52
|
+
def add_parcel(self, parcel: AnySystemParcel) -> None:
|
|
53
|
+
"""
|
|
54
|
+
Adds a parcel to the feature profile.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
parcel (AnySystemParcel): The parcel to add.
|
|
58
|
+
|
|
59
|
+
Returns:
|
|
60
|
+
None
|
|
61
|
+
"""
|
|
62
|
+
self._independent_items.append(parcel)
|
|
63
|
+
|
|
64
|
+
def build(self) -> FeatureProfileBuildReport:
|
|
65
|
+
"""
|
|
66
|
+
Builds the feature profile.
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
UUID: The UUID of the created feature profile.
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
profile_uuid = self._endpoints.create_sdwan_system_feature_profile(self._profile).id
|
|
73
|
+
self.build_report = FeatureProfileBuildReport(profile_uuid=profile_uuid, profile_name=self._profile.name)
|
|
74
|
+
for parcel in self._independent_items:
|
|
75
|
+
self._create_parcels(profile_uuid, parcel)
|
|
76
|
+
return self.build_report
|
|
77
|
+
|
|
78
|
+
@handle_create_parcel
|
|
79
|
+
def _create_parcels(self, profile_uuid: UUID, parcel: AnySystemParcel) -> UUID:
|
|
80
|
+
return self._api.create_parcel(profile_uuid, parcel).id
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
# Copyright 2023 Cisco Systems, Inc. and its affiliates
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import logging
|
|
5
|
+
from collections import defaultdict
|
|
6
|
+
from typing import TYPE_CHECKING, Dict, List, Optional, Set, Tuple, Union
|
|
7
|
+
from uuid import UUID, uuid4
|
|
8
|
+
|
|
9
|
+
from catalystwan.api.builders.feature_profiles.mixins import TrackerMixin
|
|
10
|
+
from catalystwan.api.builders.feature_profiles.report import (
|
|
11
|
+
FeatureProfileBuildReport,
|
|
12
|
+
hande_failed_sub_parcel,
|
|
13
|
+
handle_association_request,
|
|
14
|
+
handle_create_parcel,
|
|
15
|
+
)
|
|
16
|
+
from catalystwan.api.feature_profile_api import TransportFeatureProfileAPI
|
|
17
|
+
from catalystwan.endpoints.configuration.feature_profile.sdwan.transport import TransportFeatureProfile
|
|
18
|
+
from catalystwan.models.configuration.feature_profile.common import FeatureProfileCreationPayload
|
|
19
|
+
from catalystwan.models.configuration.feature_profile.parcel import ParcelAssociationPayload
|
|
20
|
+
from catalystwan.models.configuration.feature_profile.sdwan.routing import AnyRoutingParcel
|
|
21
|
+
from catalystwan.models.configuration.feature_profile.sdwan.trackers import Tracker, TrackerGroup
|
|
22
|
+
from catalystwan.models.configuration.feature_profile.sdwan.transport import (
|
|
23
|
+
AnyTransportParcel,
|
|
24
|
+
AnyTransportSuperParcel,
|
|
25
|
+
AnyTransportVpnParcel,
|
|
26
|
+
AnyTransportVpnSubParcel,
|
|
27
|
+
)
|
|
28
|
+
from catalystwan.models.configuration.feature_profile.sdwan.transport.cellular_controller import (
|
|
29
|
+
CellularControllerParcel,
|
|
30
|
+
)
|
|
31
|
+
from catalystwan.models.configuration.feature_profile.sdwan.transport.cellular_profile import CellularProfileParcel
|
|
32
|
+
from catalystwan.models.configuration.feature_profile.sdwan.transport.gps import GpsParcel
|
|
33
|
+
|
|
34
|
+
logger = logging.getLogger(__name__)
|
|
35
|
+
|
|
36
|
+
if TYPE_CHECKING:
|
|
37
|
+
from catalystwan.session import ManagerSession
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class TransportAndManagementProfileBuilder(TrackerMixin):
|
|
41
|
+
"""
|
|
42
|
+
A class for building system feature profiles.
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
def __init__(self, session: ManagerSession) -> None:
|
|
46
|
+
"""
|
|
47
|
+
Initialize a new instance of the Service class.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
session (ManagerSession): The ManagerSession object used for API communication.
|
|
51
|
+
profile_uuid (UUID): The UUID of the profile.
|
|
52
|
+
"""
|
|
53
|
+
self._profile: FeatureProfileCreationPayload
|
|
54
|
+
self._api = TransportFeatureProfileAPI(session)
|
|
55
|
+
self._endpoints = TransportFeatureProfile(session)
|
|
56
|
+
self._independent_items: List[AnyTransportSuperParcel] = []
|
|
57
|
+
self._independent_items_vpns: Dict[UUID, AnyTransportVpnParcel] = {}
|
|
58
|
+
self._independent_items_cellular_controllers: Dict[UUID, CellularControllerParcel] = {}
|
|
59
|
+
self._dependent_items_on_vpns: Dict[UUID, List[Tuple[UUID, AnyTransportVpnSubParcel]]] = defaultdict(list)
|
|
60
|
+
self._dependent_routing_items_on_vpns: Dict[UUID, List[AnyRoutingParcel]] = defaultdict(list)
|
|
61
|
+
self._dependent_items_on_cellular_controllers: Dict[
|
|
62
|
+
UUID, List[Union[CellularProfileParcel, GpsParcel]]
|
|
63
|
+
] = defaultdict(list)
|
|
64
|
+
# Trackers
|
|
65
|
+
self.init_tracker()
|
|
66
|
+
|
|
67
|
+
def add_profile_name_and_description(self, feature_profile: FeatureProfileCreationPayload) -> None:
|
|
68
|
+
"""
|
|
69
|
+
Adds a name and description to the feature profile.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
name (str): The name of the feature profile.
|
|
73
|
+
description (str): The description of the feature profile.
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
None
|
|
77
|
+
"""
|
|
78
|
+
self._profile = feature_profile
|
|
79
|
+
|
|
80
|
+
def add_parcel(self, parcel: AnyTransportSuperParcel) -> None:
|
|
81
|
+
"""
|
|
82
|
+
Adds a parcel to the feature profile.
|
|
83
|
+
|
|
84
|
+
Args:
|
|
85
|
+
parcel (AnyTransportSuperParcel): The parcel to add.
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
None
|
|
89
|
+
"""
|
|
90
|
+
self._independent_items.append(parcel)
|
|
91
|
+
|
|
92
|
+
def add_parcel_routing_attached(self, vpn_tag: UUID, parcel: AnyRoutingParcel) -> None:
|
|
93
|
+
"""
|
|
94
|
+
Adds a routing parcel to the feature profile.
|
|
95
|
+
|
|
96
|
+
Args:
|
|
97
|
+
parcel (AnyRoutingParcel): The parcel to add.
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
None
|
|
101
|
+
"""
|
|
102
|
+
logger.debug(f"Attaching routing {parcel.parcel_name} with to VPN with tag {vpn_tag}")
|
|
103
|
+
self._dependent_routing_items_on_vpns[vpn_tag].append(parcel)
|
|
104
|
+
|
|
105
|
+
def add_parcel_vpn(self, parcel: AnyTransportVpnParcel) -> UUID:
|
|
106
|
+
"""
|
|
107
|
+
Adds a VPN parcel to the builder.
|
|
108
|
+
|
|
109
|
+
Args:
|
|
110
|
+
parcel (LanVpnParcel): The VPN parcel to add.
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
UUID: The UUID tag of the added VPN parcel.
|
|
114
|
+
"""
|
|
115
|
+
vpn_tag = uuid4()
|
|
116
|
+
logger.debug(f"Adding VPN parcel {parcel.parcel_name} with tag {vpn_tag}")
|
|
117
|
+
self._independent_items_vpns[vpn_tag] = parcel
|
|
118
|
+
return vpn_tag
|
|
119
|
+
|
|
120
|
+
def add_parcel_cellular_controller(self, parcel: CellularControllerParcel) -> UUID:
|
|
121
|
+
"""
|
|
122
|
+
Adds a cellular controller parcel to the builder.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
parcel (CellularControllerParcel): The cellular controller parcel to add.
|
|
126
|
+
|
|
127
|
+
Returns:
|
|
128
|
+
UUID: The UUID tag of the added cellular controller parcel.
|
|
129
|
+
"""
|
|
130
|
+
cellular_controller_tag = uuid4()
|
|
131
|
+
logger.debug(f"Adding cellular controller parcel {parcel.parcel_name} with tag {cellular_controller_tag}")
|
|
132
|
+
self._independent_items_cellular_controllers[cellular_controller_tag] = parcel
|
|
133
|
+
return cellular_controller_tag
|
|
134
|
+
|
|
135
|
+
def add_cellular_controller_subparcel(
|
|
136
|
+
self, cellular_controller_tag: UUID, parcel: Union[CellularProfileParcel, GpsParcel]
|
|
137
|
+
) -> None:
|
|
138
|
+
"""
|
|
139
|
+
Adds a subparcel to the cellular controller parcel.
|
|
140
|
+
|
|
141
|
+
Args:
|
|
142
|
+
cellular_controller_tag (UUID): The UUID of the cellular controller.
|
|
143
|
+
parcel (Union[CellularProfileParcel, GpsParcel]): The subparcel to add.
|
|
144
|
+
|
|
145
|
+
Returns:
|
|
146
|
+
None
|
|
147
|
+
"""
|
|
148
|
+
self._dependent_items_on_cellular_controllers[cellular_controller_tag].append(parcel)
|
|
149
|
+
|
|
150
|
+
def add_vpn_subparcel(self, vpn_tag: UUID, parcel: AnyTransportVpnSubParcel) -> UUID:
|
|
151
|
+
"""
|
|
152
|
+
Adds a parcel to the feature profile.
|
|
153
|
+
|
|
154
|
+
Args:
|
|
155
|
+
parcel (AnyTransportVpnSubParcel): The parcel to add.
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
None
|
|
159
|
+
"""
|
|
160
|
+
subparcel_tag = uuid4()
|
|
161
|
+
logger.debug(f"Adding vpn sub-parcel {parcel.parcel_name} with tag {vpn_tag}")
|
|
162
|
+
self._dependent_items_on_vpns[vpn_tag].append((subparcel_tag, parcel))
|
|
163
|
+
return subparcel_tag
|
|
164
|
+
|
|
165
|
+
def add_tracker(self, associate_tags: Set[UUID], tracker: Tracker) -> None:
|
|
166
|
+
"""
|
|
167
|
+
Adds a tracker parcel to the feature profile.
|
|
168
|
+
|
|
169
|
+
Args:
|
|
170
|
+
associate_tags (Set[UUID]): The UUIDs of the interfaces to which the tracker should be added.
|
|
171
|
+
tracker (Tracker): The tracker parcel to add.
|
|
172
|
+
|
|
173
|
+
Returns:
|
|
174
|
+
None
|
|
175
|
+
"""
|
|
176
|
+
self._trackers.append((associate_tags, tracker))
|
|
177
|
+
|
|
178
|
+
def add_tracker_group(self, associate_tags: Set[UUID], group: TrackerGroup, trackers: List[Tracker]) -> None:
|
|
179
|
+
self._tracker_groups.append((associate_tags, group, trackers))
|
|
180
|
+
|
|
181
|
+
def build(self) -> FeatureProfileBuildReport:
|
|
182
|
+
"""
|
|
183
|
+
Builds the feature profile.
|
|
184
|
+
|
|
185
|
+
Returns:
|
|
186
|
+
UUID: The UUID of the created feature profile.
|
|
187
|
+
"""
|
|
188
|
+
|
|
189
|
+
profile_uuid = self._endpoints.create_transport_feature_profile(self._profile).id
|
|
190
|
+
self.build_report = FeatureProfileBuildReport(profile_uuid=profile_uuid, profile_name=self._profile.name)
|
|
191
|
+
for parcel in self._independent_items:
|
|
192
|
+
self._create_parcel(profile_uuid, parcel)
|
|
193
|
+
|
|
194
|
+
self.create_trackers(profile_uuid=profile_uuid)
|
|
195
|
+
|
|
196
|
+
for vpn_tag, vpn_parcel in self._independent_items_vpns.items():
|
|
197
|
+
vpn_uuid = self._create_parcel(profile_uuid, vpn_parcel)
|
|
198
|
+
for vpn_subparcel_tag, vpn_subparcel in self._dependent_items_on_vpns[vpn_tag]:
|
|
199
|
+
if vpn_uuid is None:
|
|
200
|
+
hande_failed_sub_parcel(self.build_report, vpn_parcel, vpn_subparcel)
|
|
201
|
+
else:
|
|
202
|
+
vpn_subparcel_uuid = self._create_parcel(profile_uuid, vpn_subparcel, vpn_uuid)
|
|
203
|
+
|
|
204
|
+
# Associate tracker with VPN interface if it exists
|
|
205
|
+
if vpn_subparcel_tag in self._interface_tag_to_existing_tracker and vpn_subparcel_uuid:
|
|
206
|
+
tracker_uuid, tracker_type = self._interface_tag_to_existing_tracker[vpn_subparcel_tag]
|
|
207
|
+
vpn_subparcel_type = (
|
|
208
|
+
vpn_subparcel._get_parcel_type().replace("wan/vpn/", "").replace("management/vpn/", "")
|
|
209
|
+
)
|
|
210
|
+
with handle_association_request(self.build_report, vpn_subparcel):
|
|
211
|
+
self._endpoints.associate_tracker_with_vpn_interface(
|
|
212
|
+
profile_uuid,
|
|
213
|
+
vpn_uuid,
|
|
214
|
+
vpn_subparcel_type,
|
|
215
|
+
vpn_subparcel_uuid,
|
|
216
|
+
tracker_type,
|
|
217
|
+
ParcelAssociationPayload(parcel_id=tracker_uuid),
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
for routing_parcel in self._dependent_routing_items_on_vpns[vpn_tag]:
|
|
221
|
+
if vpn_uuid is None:
|
|
222
|
+
hande_failed_sub_parcel(self.build_report, vpn_parcel, routing_parcel)
|
|
223
|
+
else:
|
|
224
|
+
routing_uuid = self._create_parcel(profile_uuid, routing_parcel)
|
|
225
|
+
if not routing_uuid:
|
|
226
|
+
continue
|
|
227
|
+
with handle_association_request(self.build_report, routing_parcel):
|
|
228
|
+
self._endpoints.associate_with_vpn(
|
|
229
|
+
profile_uuid,
|
|
230
|
+
vpn_uuid,
|
|
231
|
+
routing_parcel._get_parcel_type(),
|
|
232
|
+
payload=ParcelAssociationPayload(parcel_id=routing_uuid),
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
for cellular_controller_tag, cellular_controller_parcel in self._independent_items_cellular_controllers.items():
|
|
236
|
+
controller_uuid = self._create_parcel(profile_uuid, cellular_controller_parcel)
|
|
237
|
+
for cellular_subparcel in self._dependent_items_on_cellular_controllers[cellular_controller_tag]:
|
|
238
|
+
if controller_uuid is None:
|
|
239
|
+
hande_failed_sub_parcel(self.build_report, cellular_controller_parcel, cellular_subparcel)
|
|
240
|
+
else:
|
|
241
|
+
parcel_uuid = self._create_parcel(profile_uuid, cellular_subparcel)
|
|
242
|
+
if not parcel_uuid:
|
|
243
|
+
continue
|
|
244
|
+
with handle_association_request(self.build_report, cellular_subparcel):
|
|
245
|
+
self._endpoints.associate_with_cellular_controller(
|
|
246
|
+
profile_uuid,
|
|
247
|
+
controller_uuid,
|
|
248
|
+
cellular_subparcel._get_parcel_type(),
|
|
249
|
+
ParcelAssociationPayload(parcel_id=parcel_uuid),
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
return self.build_report
|
|
253
|
+
|
|
254
|
+
@handle_create_parcel
|
|
255
|
+
def _create_parcel(self, profile_uuid: UUID, parcel: AnyTransportParcel, vpn_uuid: Optional[None] = None) -> UUID:
|
|
256
|
+
return self._api.create_parcel(profile_uuid, parcel, vpn_uuid).id
|