catalystwan 0.31.0.dev0__tar.gz → 0.31.0.dev2__tar.gz
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-0.31.0.dev0 → catalystwan-0.31.0.dev2}/PKG-INFO +1 -1
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/configuration_groups/parcel.py +3 -3
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/partition_manager_api.py +47 -32
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/policy_api.py +1 -13
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/software_action_api.py +56 -38
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/versions_utils.py +45 -75
- catalystwan-0.31.0.dev2/catalystwan/endpoints/configuration_device_actions.py +313 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration_device_inventory.py +2 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/exceptions.py +4 -0
- catalystwan-0.31.0.dev2/catalystwan/models/configuration/config_migration.py +34 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/data_prefix.py +6 -8
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/policy/centralized.py +2 -2
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/policy/lists.py +0 -13
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/policy/lists_entries.py +1 -3
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_partition_manager_api.py +23 -9
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_software_action_api.py +16 -7
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_version_utils.py +33 -19
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/pyproject.toml +1 -1
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/setup.py +1 -1
- catalystwan-0.31.0.dev0/catalystwan/endpoints/configuration_device_actions.py +0 -176
- catalystwan-0.31.0.dev0/catalystwan/models/configuration/config_migration.py +0 -61
- catalystwan-0.31.0.dev0/catalystwan/workflows/config_migration.py +0 -64
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/LICENSE +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/README.md +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/__init__.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/abstractions.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/__init__.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/admin_tech_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/administration.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/alarms_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/api_container.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/basic_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/config_device_inventory_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/config_group_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/configuration_groups/parcels/cellular_controller.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/dashboard_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/device_action_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/feature_profile_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/logs_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/monitoring_status_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/mtt_aaa_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/omp_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/packet_capture_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/parcel_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/resource_pool_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/speedtest_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/task_status_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/template_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/README.md +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/cli_template.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/device_template/device_template.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/device_template/device_template_payload.json.j2 +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/device_variable.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/feature_template.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/feature_template_field.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/feature_template_payload.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/models/cisco_aaa_model.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/models/cisco_banner_model.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/models/cisco_bfd_model.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/models/cisco_bgp_model.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/models/cisco_logging_model.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/models/cisco_ntp_model.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/models/cisco_omp_model.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/models/cisco_ospf.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/models/cisco_ospfv3.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/models/cisco_secure_internet_gateway.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/models/cisco_snmp_model.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/models/cisco_system.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/models/cisco_vpn_interface_model.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/models/cisco_vpn_model.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/models/cli_template.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/models/omp_vsmart_model.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/models/security_vsmart_model.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/models/supported.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/models/system_vsmart_model.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/payloads/aaa/aaa_model.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/payloads/aaa/feature/aaa.json.j2 +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/payloads/aaa/feature/accounting.json.j2 +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/payloads/aaa/feature/radius.json.j2 +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/payloads/aaa/feature/tacacs.json.j2 +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/payloads/aaa/feature/user.json.j2 +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/payloads/cisco_vpn/cisco_vpn_model.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/payloads/cisco_vpn/feature/cisco_vpn.json.j2 +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/payloads/cisco_vpn/feature/dns.json.j2 +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/payloads/cisco_vpn/feature/ipv4route.json.j2 +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/payloads/cisco_vpn/feature/ipv6route.json.j2 +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/payloads/cisco_vpn/feature/mapping.json.j2 +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/payloads/tenant/tenant.json.j2 +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/templates/payloads/tenant/tenant_model.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/tenant_backup_restore_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/tenant_management_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/tenant_migration_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/dataclasses.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/__init__.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/administration_user_and_group.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/certificate_management_device.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/certificate_management_vmanage.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/client.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/cluster_management.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/device/software_update.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/disaster_recovery.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/feature_profile/sdwan/policy_object.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/definition/access_control_list.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/definition/access_control_list_ipv6.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/definition/control.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/definition/device_access.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/definition/device_access_ipv6.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/definition/hub_and_spoke.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/definition/mesh.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/definition/qos_map.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/definition/rewrite.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/definition/rule_set.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/definition/security_group.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/definition/traffic_data.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/definition/vpn_membership.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/definition/zone_based_firewall.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/app.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/app_probe.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/as_path.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/class_map.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/color.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/community.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/data_ipv6_prefix.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/data_prefix.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/expanded_community.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/fqdn.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/geo_location.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/ips_signature.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/ipv6_prefix.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/local_app.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/local_domain.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/mirror.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/policer.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/port.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/preferred_color_group.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/prefix.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/protocol_name.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/region.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/site.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/sla.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/tloc.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/url_black_list.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/url_white_list.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/vpn.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/list/zone.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/security_template.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/vedge_template.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/policy/vsmart_template.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration/software_actions.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration_dashboard_status.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration_device_template.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration_feature_profile.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration_group.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/configuration_settings.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/endpoints_container.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/misc.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/monitoring_device_details.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/monitoring_status.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/real_time_monitoring/reboot_history.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/sdavc_cloud_connector.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/tenant_backup_restore.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/tenant_management.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/tenant_migration.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/endpoints/troubleshooting_tools/device_connectivity.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/logging.conf +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/common.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/common.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/README.md +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/builder.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/common.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/management/vpn.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/__init__.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/app_probe.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/application_list.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/color_list.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/expanded_community_list.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/fowarding_class.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_data_prefix.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_prefix_list.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/policier.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefered_group_color.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefix_list.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/sla_class.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/standard_community.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/tloc_list.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/application_list.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/data_prefix.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/fqdn.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/geolocation_list.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ips_signature.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/local_domain.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/protocol_list.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/security_port.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/zone.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/service/acl.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/service/appqoe.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/service/bgp.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/service/dhcp_server.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/service/eigrp.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/service/lan/common.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/service/lan/ethernet.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/service/lan/gre.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/service/lan/ipsec.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/service/lan/svi.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/service/lan/vpn.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/service/multicast.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/service/object_tracker.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/service/ospf.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/service/ospfv3.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/service/route_policy.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/service/service_insertion_attachment.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/service/switchport.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/service/tracker.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/service/wireless_lan.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/system/aaa.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_controller.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/configuration/profile_type.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/device_inventory.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/feature_profile_parcel.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/misc/application_protocols.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/policy/__init__.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/policy/definitions/access_control_list.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/policy/definitions/access_control_list_ipv6.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/policy/definitions/control.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/policy/definitions/device_access.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/policy/definitions/device_access_ipv6.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/policy/definitions/hub_and_spoke.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/policy/definitions/mesh.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/policy/definitions/qos_map.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/policy/definitions/rewrite.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/policy/definitions/rule_set.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/policy/definitions/security_group.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/policy/definitions/traffic_data.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/policy/definitions/vpn_membership.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/policy/definitions/zone_based_firewall.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/policy/localized.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/policy/policy.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/policy/policy_definition.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/policy/policy_list.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/policy/security.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/models/tenant.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/response.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/session.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/definitions/Basic_Cisco_VPN_Model.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/definitions/banner_1.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/definitions/basic/alias.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/definitions/basic/basic.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/definitions/basic/basic_no_value.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/definitions/basic/children.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/definitions/basic/children_nested.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/definitions/basic/children_nested_datapath.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/definitions/basic/data_path.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/definitions/cisco_bfd.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/definitions/complex_aaa.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/definitions/complex_cisco_vpn.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/definitions/default_cisco_system.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/definitions/iuo.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/definitions/omp_1.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/definitions/omp_2.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/definitions/omp_3.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/models/__init__.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/models/cisco_aaa.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/models/cisco_banner.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/models/cisco_bfd.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/models/cisco_system.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/models/cisco_vpn.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/models/omp_vsmart.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/schemas/basic/alias.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/schemas/basic/basic.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/schemas/basic/children.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/schemas/basic/children_nested.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/schemas/basic/children_nested_datapath.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/schemas/basic/data_path.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/schemas/cedge_aaa.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/schemas/cisco_banner.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/schemas/cisco_bfd.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/schemas/cisco_system.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/schemas/cisco_vpn.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/schemas/omp-vsmart.json +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/test_chose_model.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/test_deserialize_model.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/test_generate_payload.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/templates/test_serialize_model.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_admin_tech_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_administration.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_alarms_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_cli_template.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_creation_tools.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_device_action_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_devices_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_endpoints.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_feature_template_field.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_logs_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_monitoring_status_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_mtt_aaa_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_omp_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_packet_capture.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_response.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_session.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_speed_test_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_task_status_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_templates.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_tenant_backup_restore_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_tenant_management_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_tenant_migration_api.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_typed_list.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_version.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/tests/test_vmanage_auth.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/typed_list.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/utils/__init__.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/utils/alarm_status.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/utils/certificate_status.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/utils/colors.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/utils/config_status.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/utils/creation_tools.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/utils/dashboard.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/utils/device_model.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/utils/dict.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/utils/feature_template.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/utils/operation_status.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/utils/personality.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/utils/pydantic_field.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/utils/pydantic_validators.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/utils/reachability.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/utils/session_type.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/utils/template_type.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/utils/timezone.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/utils/upgrades_helper.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/utils/validate_status.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/version.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/vmanage_auth.py +0 -0
- {catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/workflows/tenant_migration.py +0 -0
{catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/configuration_groups/parcel.py
RENAMED
|
@@ -21,10 +21,10 @@ class _ParcelBase(BaseModel):
|
|
|
21
21
|
validation_alias="description",
|
|
22
22
|
description="Set the parcel description",
|
|
23
23
|
)
|
|
24
|
-
|
|
24
|
+
data: Optional[Any] = None
|
|
25
25
|
_parcel_data_key: str = PrivateAttr(default="data")
|
|
26
26
|
|
|
27
|
-
@model_serializer(mode="wrap"
|
|
27
|
+
@model_serializer(mode="wrap")
|
|
28
28
|
def envelope_parcel_data(self, handler) -> Dict[str, Any]:
|
|
29
29
|
model_dict = handler(self)
|
|
30
30
|
model_dict[self._parcel_data_key] = {}
|
|
@@ -49,7 +49,7 @@ class OptionType(str, Enum):
|
|
|
49
49
|
|
|
50
50
|
|
|
51
51
|
class ParcelAttribute(BaseModel):
|
|
52
|
-
model_config = ConfigDict(extra="forbid"
|
|
52
|
+
model_config = ConfigDict(extra="forbid")
|
|
53
53
|
option_type: OptionType = Field(serialization_alias="optionType", validation_alias="optionType")
|
|
54
54
|
|
|
55
55
|
|
{catalystwan-0.31.0.dev0 → catalystwan-0.31.0.dev2}/catalystwan/api/partition_manager_api.py
RENAMED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import TYPE_CHECKING,
|
|
4
|
+
from typing import TYPE_CHECKING, List, Optional, cast
|
|
5
5
|
|
|
6
6
|
from catalystwan.api.task_status_api import Task
|
|
7
|
-
from catalystwan.api.versions_utils import DeviceVersions,
|
|
7
|
+
from catalystwan.api.versions_utils import DeviceVersions, RepositoryAPI
|
|
8
8
|
from catalystwan.dataclasses import Device
|
|
9
|
+
from catalystwan.endpoints.configuration_device_actions import (
|
|
10
|
+
PartitionActionPayload,
|
|
11
|
+
RemovePartitionActionPayload,
|
|
12
|
+
RemovePartitionDevice,
|
|
13
|
+
)
|
|
14
|
+
from catalystwan.exceptions import EmptyVersionPayloadError
|
|
9
15
|
from catalystwan.typed_list import DataSequence
|
|
10
16
|
from catalystwan.utils.upgrades_helper import get_install_specification, validate_personality_homogeneity
|
|
11
17
|
|
|
@@ -60,14 +66,20 @@ class PartitionManagerAPI:
|
|
|
60
66
|
else:
|
|
61
67
|
payload_devices = self.device_version.get_devices_current_version(devices)
|
|
62
68
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
for device in payload_devices:
|
|
70
|
+
if not device.version:
|
|
71
|
+
raise EmptyVersionPayloadError("PartitionDevice payload contains entry with empty version field.")
|
|
72
|
+
|
|
73
|
+
device_type = get_install_specification(devices.first()).device_type.value
|
|
74
|
+
partition_payload = PartitionActionPayload(
|
|
75
|
+
action="defaultpartition", devices=[dev for dev in payload_devices], device_type=device_type
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
partition_action = self.session.endpoints.configuration_device_actions.process_mark_default_partition(
|
|
79
|
+
payload=partition_payload
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
return Task(self.session, partition_action.id)
|
|
71
83
|
|
|
72
84
|
def remove_partition(
|
|
73
85
|
self, devices: DataSequence[Device], partition: Optional[str] = None, force: bool = False
|
|
@@ -90,33 +102,36 @@ class PartitionManagerAPI:
|
|
|
90
102
|
else:
|
|
91
103
|
payload_devices = self.device_version.get_devices_available_versions(devices)
|
|
92
104
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
"deviceType": get_install_specification(devices.first()).device_type.value,
|
|
105
|
-
}
|
|
105
|
+
for device in payload_devices:
|
|
106
|
+
if not device.version:
|
|
107
|
+
raise EmptyVersionPayloadError("PartitionDevice payload contains entry with empty version field.")
|
|
108
|
+
|
|
109
|
+
device_type = get_install_specification(devices.first()).device_type.value
|
|
110
|
+
partition_payload = RemovePartitionActionPayload(
|
|
111
|
+
action="removepartition",
|
|
112
|
+
devices=[RemovePartitionDevice(**dev.model_dump()) for dev in payload_devices],
|
|
113
|
+
device_type=device_type,
|
|
114
|
+
)
|
|
115
|
+
|
|
106
116
|
if force is False:
|
|
107
|
-
self._check_remove_partition_possibility(cast(list,
|
|
108
|
-
|
|
109
|
-
|
|
117
|
+
self._check_remove_partition_possibility(cast(list, partition_payload.devices))
|
|
118
|
+
|
|
119
|
+
partition_action = self.session.endpoints.configuration_device_actions.process_remove_partition(
|
|
120
|
+
payload=partition_payload
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
return Task(self.session, partition_action.id)
|
|
110
124
|
|
|
111
|
-
def _check_remove_partition_possibility(self, payload_devices: List[
|
|
125
|
+
def _check_remove_partition_possibility(self, payload_devices: List[RemovePartitionDevice]) -> None:
|
|
112
126
|
devices_versions_repository = self.repository.get_devices_versions_repository()
|
|
113
127
|
invalid_devices = []
|
|
114
128
|
for device in payload_devices:
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
129
|
+
for version in device.version:
|
|
130
|
+
if version in (
|
|
131
|
+
devices_versions_repository[device.device_id].current_version,
|
|
132
|
+
devices_versions_repository[device.device_id].default_version,
|
|
133
|
+
):
|
|
134
|
+
invalid_devices.append((device.device_id))
|
|
120
135
|
if invalid_devices:
|
|
121
136
|
raise ValueError(
|
|
122
137
|
f"Current or default version of devices with ids {invalid_devices} \
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import TYPE_CHECKING, Any, Dict, List, Mapping, Optional,
|
|
3
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Mapping, Optional, Type, overload
|
|
4
4
|
from uuid import UUID
|
|
5
5
|
|
|
6
6
|
from catalystwan.api.task_status_api import Task
|
|
@@ -637,12 +637,6 @@ class PolicyListsAPI:
|
|
|
637
637
|
return endpoints.get_lists_by_id(id=id)
|
|
638
638
|
return endpoints.get_policy_lists()
|
|
639
639
|
|
|
640
|
-
def get_all(self) -> List[AnyPolicyList]:
|
|
641
|
-
infos: List[AnyPolicyList] = []
|
|
642
|
-
for list_type, _ in POLICY_LIST_ENDPOINTS_MAP.items():
|
|
643
|
-
infos.extend(self.get(list_type))
|
|
644
|
-
return infos
|
|
645
|
-
|
|
646
640
|
|
|
647
641
|
class PolicyDefinitionsAPI:
|
|
648
642
|
def __init__(self, session: ManagerSession):
|
|
@@ -786,12 +780,6 @@ class PolicyDefinitionsAPI:
|
|
|
786
780
|
return endpoints.get_policy_definition(id=id)
|
|
787
781
|
return endpoints.get_definitions()
|
|
788
782
|
|
|
789
|
-
def get_all(self) -> List[Tuple[type, PolicyDefinitionInfo]]:
|
|
790
|
-
all_items: List[Tuple[type, PolicyDefinitionInfo]] = []
|
|
791
|
-
for definition_type, _ in POLICY_DEFINITION_ENDPOINTS_MAP.items():
|
|
792
|
-
all_items.extend([(definition_type, info) for info in self.get(definition_type)])
|
|
793
|
-
return all_items
|
|
794
|
-
|
|
795
783
|
|
|
796
784
|
class PolicyAPI:
|
|
797
785
|
"""This is exposing so called 'UX 1.0' API"""
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import TYPE_CHECKING,
|
|
4
|
+
from typing import TYPE_CHECKING, List, Optional, cast
|
|
5
5
|
|
|
6
6
|
from catalystwan.api.task_status_api import Task
|
|
7
7
|
from catalystwan.api.versions_utils import DeviceVersions, RepositoryAPI
|
|
8
8
|
from catalystwan.dataclasses import Device
|
|
9
|
-
from catalystwan.
|
|
9
|
+
from catalystwan.endpoints.configuration_device_actions import (
|
|
10
|
+
InstallActionPayload,
|
|
11
|
+
InstallDevice,
|
|
12
|
+
InstallInput,
|
|
13
|
+
PartitionActionPayload,
|
|
14
|
+
)
|
|
15
|
+
from catalystwan.exceptions import EmptyVersionPayloadError, VersionDeclarationError # type: ignore
|
|
10
16
|
from catalystwan.typed_list import DataSequence
|
|
11
17
|
from catalystwan.utils.personality import Personality
|
|
12
18
|
from catalystwan.utils.upgrades_helper import get_install_specification, validate_personality_homogeneity
|
|
@@ -58,7 +64,7 @@ class SoftwareActionAPI:
|
|
|
58
64
|
Args:
|
|
59
65
|
devices (List[Device]): For those devices software will be activated
|
|
60
66
|
version_to_activate (Optional[str]): version to be set as current version
|
|
61
|
-
image (Optional[str]): path to software image
|
|
67
|
+
image (Optional[str]): path to software image or its name from available files
|
|
62
68
|
|
|
63
69
|
Notice: Have to pass one of those arguments (version_to_activate,
|
|
64
70
|
image)
|
|
@@ -74,14 +80,21 @@ class SoftwareActionAPI:
|
|
|
74
80
|
else:
|
|
75
81
|
raise VersionDeclarationError("You can not provide software_image and image version at the same time!")
|
|
76
82
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
83
|
+
payload_devices = self.device_versions.get_device_available(version, devices)
|
|
84
|
+
for device in payload_devices:
|
|
85
|
+
if not device.version:
|
|
86
|
+
raise EmptyVersionPayloadError("PartitionDevice payload contains entry with empty version field.")
|
|
87
|
+
|
|
88
|
+
device_type = get_install_specification(devices.first()).device_type.value
|
|
89
|
+
partition_payload = PartitionActionPayload(
|
|
90
|
+
action="changepartition", devices=[dev for dev in payload_devices], device_type=device_type
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
partition_action = self.session.endpoints.configuration_device_actions.process_mark_change_partition(
|
|
94
|
+
payload=partition_payload
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
return Task(self.session, partition_action.id)
|
|
85
98
|
|
|
86
99
|
def install(
|
|
87
100
|
self,
|
|
@@ -99,7 +112,7 @@ class SoftwareActionAPI:
|
|
|
99
112
|
devices (List[Device]): For those devices software will be activated
|
|
100
113
|
reboot (bool): reboot device after action end
|
|
101
114
|
sync (bool, optional): Synchronize settings. Defaults to True.
|
|
102
|
-
image (str): path to software image
|
|
115
|
+
image (str): path to software image or its name from available files
|
|
103
116
|
image_version (str): version of software image
|
|
104
117
|
downgrade_check (bool): perform a downgrade check when applicable
|
|
105
118
|
|
|
@@ -119,32 +132,38 @@ class SoftwareActionAPI:
|
|
|
119
132
|
version = cast(str, image_version)
|
|
120
133
|
else:
|
|
121
134
|
raise VersionDeclarationError("You can not provide image and image version at the same time")
|
|
135
|
+
|
|
122
136
|
install_specification = get_install_specification(devices.first())
|
|
137
|
+
install_devices = [
|
|
138
|
+
InstallDevice(**device.model_dump(by_alias=True))
|
|
139
|
+
for device in self.device_versions.get_device_list(devices)
|
|
140
|
+
]
|
|
141
|
+
input = InstallInput(
|
|
142
|
+
v_edge_vpn=0,
|
|
143
|
+
v_smart_vpn=0,
|
|
144
|
+
family=install_specification.family.value,
|
|
145
|
+
version=version,
|
|
146
|
+
version_type=install_specification.version_type.value,
|
|
147
|
+
reboot=reboot,
|
|
148
|
+
sync=sync,
|
|
149
|
+
)
|
|
150
|
+
device_type = install_specification.device_type.value
|
|
151
|
+
install_payload = InstallActionPayload(
|
|
152
|
+
action="install", input=input, devices=install_devices, device_type=device_type
|
|
153
|
+
)
|
|
123
154
|
|
|
124
|
-
url = "/dataservice/device/action/install"
|
|
125
|
-
payload: Dict[str, Any] = {
|
|
126
|
-
"action": "install",
|
|
127
|
-
"input": {
|
|
128
|
-
"vEdgeVPN": 0,
|
|
129
|
-
"vSmartVPN": 0,
|
|
130
|
-
"family": install_specification.family.value,
|
|
131
|
-
"version": version,
|
|
132
|
-
"versionType": install_specification.version_type.value,
|
|
133
|
-
"reboot": reboot,
|
|
134
|
-
"sync": sync,
|
|
135
|
-
},
|
|
136
|
-
"devices": [
|
|
137
|
-
{"deviceId": device.device_id, "deviceIP": device.device_ip}
|
|
138
|
-
for device in self.device_versions.get_device_list(devices)
|
|
139
|
-
], # type: ignore
|
|
140
|
-
"deviceType": install_specification.device_type.value,
|
|
141
|
-
}
|
|
142
155
|
if downgrade_check and devices.first().personality in (Personality.VMANAGE, Personality.EDGE):
|
|
143
|
-
self._downgrade_check(
|
|
144
|
-
|
|
145
|
-
|
|
156
|
+
self._downgrade_check(
|
|
157
|
+
install_payload.devices, install_payload.input.version, install_specification.family.value
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
install_action = self.session.endpoints.configuration_device_actions.process_install_operation(
|
|
161
|
+
payload=install_payload
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
return Task(self.session, install_action.id)
|
|
146
165
|
|
|
147
|
-
def _downgrade_check(self, payload_devices: List[
|
|
166
|
+
def _downgrade_check(self, payload_devices: List[InstallDevice], version_to_upgrade: str, family: str) -> None:
|
|
148
167
|
"""
|
|
149
168
|
Check if upgrade operation is not actually a downgrade opeartion.
|
|
150
169
|
If so, in some cases action is being blocked.
|
|
@@ -159,19 +178,18 @@ class SoftwareActionAPI:
|
|
|
159
178
|
incorrect_devices = []
|
|
160
179
|
devices_versions_repo = self.repository.get_devices_versions_repository()
|
|
161
180
|
for device in payload_devices:
|
|
162
|
-
|
|
163
|
-
current_version = parse_vmanage_version(devices_versions_repo[device_id].current_version)
|
|
181
|
+
current_version = parse_vmanage_version(devices_versions_repo[device.device_id].current_version)
|
|
164
182
|
upgrade_version = parse_vmanage_version(version_to_upgrade)
|
|
165
183
|
# check if downgrade
|
|
166
184
|
if current_version > upgrade_version:
|
|
167
185
|
logger.warning(
|
|
168
|
-
f"Requested to downgrade device: {device_id} from {current_version} to {upgrade_version}"
|
|
186
|
+
f"Requested to downgrade device: {device.device_id} from {current_version} to {upgrade_version}"
|
|
169
187
|
)
|
|
170
188
|
# allow vmanage downgrade only if major and minor version match, downgrade for other devices is allowed
|
|
171
189
|
if family == "vmanage":
|
|
172
190
|
if not current_version.release[:2] == upgrade_version.release[:2]:
|
|
173
191
|
logger.error(
|
|
174
|
-
f"Blocking downgrade of device: {device_id} "
|
|
192
|
+
f"Blocking downgrade of device: {device.device_id} "
|
|
175
193
|
f"from {current_version.release} to {upgrade_version.release}"
|
|
176
194
|
)
|
|
177
195
|
incorrect_devices.append(device)
|
|
@@ -4,15 +4,14 @@ import logging
|
|
|
4
4
|
from pathlib import PurePath
|
|
5
5
|
from typing import TYPE_CHECKING, Dict, List, Union
|
|
6
6
|
|
|
7
|
-
from clint.textui.progress import Bar as ProgressBar # type: ignore
|
|
8
7
|
from pydantic import BaseModel, ConfigDict, Field
|
|
9
|
-
from pydantic.functional_validators import BeforeValidator
|
|
10
|
-
from requests_toolbelt.multipart.encoder import MultipartEncoder, MultipartEncoderMonitor # type: ignore
|
|
11
|
-
from typing_extensions import Annotated
|
|
12
8
|
|
|
13
9
|
from catalystwan.dataclasses import Device
|
|
10
|
+
from catalystwan.endpoints.configuration.software_actions import SoftwareImageDetails
|
|
11
|
+
from catalystwan.endpoints.configuration_device_actions import PartitionDevice
|
|
14
12
|
from catalystwan.exceptions import ImageNotInRepositoryError
|
|
15
13
|
from catalystwan.typed_list import DataSequence
|
|
14
|
+
from catalystwan.utils.upgrades_helper import SoftwarePackageUploadPayload
|
|
16
15
|
|
|
17
16
|
if TYPE_CHECKING:
|
|
18
17
|
from catalystwan.session import ManagerSession
|
|
@@ -37,25 +36,6 @@ class DeviceSoftwareRepository(BaseModel):
|
|
|
37
36
|
device_id: str = Field(default="", serialization_alias="uuid", validation_alias="uuid")
|
|
38
37
|
|
|
39
38
|
|
|
40
|
-
class DeviceVersionPayload(BaseModel):
|
|
41
|
-
device_id: str = Field(serialization_alias="deviceId")
|
|
42
|
-
device_ip: str = Field(serialization_alias="deviceIP")
|
|
43
|
-
version: Union[str, List[str]] = Field(default="")
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
def convert_to_list(element: Union[str, List[str]]) -> List[str]:
|
|
47
|
-
return [element] if isinstance(element, str) else element
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
VersionList = Annotated[Union[str, List[str]], BeforeValidator(convert_to_list)]
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
class RemovePartitionPayload(BaseModel):
|
|
54
|
-
device_id: str = Field(serialization_alias="deviceId")
|
|
55
|
-
device_ip: str = Field(serialization_alias="deviceIP")
|
|
56
|
-
version: VersionList
|
|
57
|
-
|
|
58
|
-
|
|
59
39
|
class RepositoryAPI:
|
|
60
40
|
"""
|
|
61
41
|
API methods to get information about images and devices software versions
|
|
@@ -75,16 +55,14 @@ class RepositoryAPI:
|
|
|
75
55
|
):
|
|
76
56
|
self.session = session
|
|
77
57
|
|
|
78
|
-
def get_all_software_images(self) ->
|
|
58
|
+
def get_all_software_images(self) -> DataSequence[SoftwareImageDetails]:
|
|
79
59
|
"""
|
|
80
|
-
Get all info about all software images stored
|
|
81
|
-
in Vmanage repository
|
|
60
|
+
Get all info about all software images stored in Vmanage repository
|
|
82
61
|
|
|
83
62
|
Returns:
|
|
84
63
|
list: software images list
|
|
85
64
|
"""
|
|
86
|
-
|
|
87
|
-
software_images = list(self.session.get_data(url))
|
|
65
|
+
software_images = self.session.endpoints.configuration_software_actions.get_list_of_all_images()
|
|
88
66
|
return software_images
|
|
89
67
|
|
|
90
68
|
def get_devices_versions_repository(self) -> Dict[str, DeviceSoftwareRepository]:
|
|
@@ -97,13 +75,18 @@ class RepositoryAPI:
|
|
|
97
75
|
information
|
|
98
76
|
"""
|
|
99
77
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
edges_versions_info = self.session.
|
|
78
|
+
controllers_versions_info = self.session.endpoints.configuration_device_actions.get_list_of_installed_devices(
|
|
79
|
+
device_type="controller"
|
|
80
|
+
)
|
|
81
|
+
edges_versions_info = self.session.endpoints.configuration_device_actions.get_list_of_installed_devices(
|
|
82
|
+
device_type="vedge"
|
|
83
|
+
)
|
|
84
|
+
vmanages_versions_info = self.session.endpoints.configuration_device_actions.get_list_of_installed_devices(
|
|
85
|
+
device_type="vmanage"
|
|
86
|
+
)
|
|
104
87
|
devices_versions_repository = {}
|
|
105
|
-
for device in controllers_versions_info + edges_versions_info:
|
|
106
|
-
device_software_repository = DeviceSoftwareRepository(**device)
|
|
88
|
+
for device in controllers_versions_info + edges_versions_info + vmanages_versions_info:
|
|
89
|
+
device_software_repository = DeviceSoftwareRepository(**device.model_dump(by_alias=True))
|
|
107
90
|
device_software_repository.installed_versions = [a for a in device_software_repository.available_versions]
|
|
108
91
|
device_software_repository.installed_versions.append(device_software_repository.current_version)
|
|
109
92
|
devices_versions_repository[device_software_repository.device_id] = device_software_repository
|
|
@@ -111,7 +94,7 @@ class RepositoryAPI:
|
|
|
111
94
|
|
|
112
95
|
def get_image_version(self, software_image: str) -> Union[str, None]:
|
|
113
96
|
"""
|
|
114
|
-
Get proper software image version
|
|
97
|
+
Get proper software image version, based on name in available files
|
|
115
98
|
|
|
116
99
|
Args:
|
|
117
100
|
software_image (str): path to software image
|
|
@@ -122,25 +105,16 @@ class RepositoryAPI:
|
|
|
122
105
|
|
|
123
106
|
image_name = PurePath(software_image).name
|
|
124
107
|
software_images = self.get_all_software_images()
|
|
125
|
-
for
|
|
126
|
-
if image_name in
|
|
127
|
-
image_version =
|
|
108
|
+
for image in software_images:
|
|
109
|
+
if image.available_files and image_name in image.available_files:
|
|
110
|
+
image_version = image.version_name
|
|
128
111
|
return image_version
|
|
129
112
|
logger.error(f"Software image {image_name} is not in available images")
|
|
130
113
|
return None
|
|
131
114
|
|
|
132
|
-
def
|
|
133
|
-
bar = ProgressBar(expected_size=encoder._calculate_length(), filled_char="=")
|
|
134
|
-
|
|
135
|
-
def callback(monitor: MultipartEncoderMonitor):
|
|
136
|
-
bar.show(monitor.bytes_read)
|
|
137
|
-
|
|
138
|
-
return callback
|
|
139
|
-
|
|
140
|
-
def upload_image(self, image_path: str) -> int:
|
|
115
|
+
def upload_image(self, image_path: str) -> None:
|
|
141
116
|
"""
|
|
142
|
-
Upload software image 'tar.gz' to
|
|
143
|
-
software repository
|
|
117
|
+
Upload software image ('tar.gz' or 'SPA.bin') to vManage software repository
|
|
144
118
|
|
|
145
119
|
Args:
|
|
146
120
|
image_path (str): path to software image
|
|
@@ -148,21 +122,16 @@ class RepositoryAPI:
|
|
|
148
122
|
Returns:
|
|
149
123
|
str: Response status code
|
|
150
124
|
"""
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
fields={"file": (PurePath(image_path).name, open(image_path, "rb"), "application/x-gzip")}
|
|
125
|
+
self.session.endpoints.configuration_device_software_update.upload_software_to_manager(
|
|
126
|
+
payload=SoftwarePackageUploadPayload(image_path=image_path)
|
|
154
127
|
)
|
|
155
|
-
callback = self._create_callback(encoder)
|
|
156
|
-
monitor = MultipartEncoderMonitor(encoder, callback)
|
|
157
|
-
upload = self.session.post(url, data=monitor, headers={"content-type": monitor.content_type})
|
|
158
|
-
return upload.status_code
|
|
159
128
|
|
|
160
|
-
def delete_image(self, image_name: str) ->
|
|
129
|
+
def delete_image(self, image_name: str) -> None:
|
|
161
130
|
"""
|
|
162
131
|
Delete image from vManage software repository
|
|
163
132
|
|
|
164
133
|
Args:
|
|
165
|
-
image_name (str): image name
|
|
134
|
+
image_name (str): image name (in available files)
|
|
166
135
|
|
|
167
136
|
Raises:
|
|
168
137
|
ImageNotInRepositoryError: raise error if image not in repository
|
|
@@ -171,11 +140,12 @@ class RepositoryAPI:
|
|
|
171
140
|
int: Reponse status code
|
|
172
141
|
"""
|
|
173
142
|
for image in self.get_all_software_images():
|
|
174
|
-
if image_name in image
|
|
175
|
-
version_id = image
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
143
|
+
if image.available_files and image_name in image.available_files:
|
|
144
|
+
version_id = image.version_id
|
|
145
|
+
self.session.endpoints.configuration_software_actions.delete_software_from_software_repository(
|
|
146
|
+
version_id=version_id
|
|
147
|
+
)
|
|
148
|
+
return None
|
|
179
149
|
raise ImageNotInRepositoryError(f"Image: {image_name} is not the vManage software repository")
|
|
180
150
|
|
|
181
151
|
|
|
@@ -189,7 +159,7 @@ class DeviceVersions:
|
|
|
189
159
|
|
|
190
160
|
def _get_device_list_in(
|
|
191
161
|
self, version_to_set_up: str, devices: DataSequence[Device], version_type: str
|
|
192
|
-
) -> DataSequence[
|
|
162
|
+
) -> DataSequence[PartitionDevice]:
|
|
193
163
|
"""
|
|
194
164
|
Create devices payload list included requested version, if requested version
|
|
195
165
|
is in specified version type
|
|
@@ -203,8 +173,8 @@ class DeviceVersions:
|
|
|
203
173
|
list : list of devices
|
|
204
174
|
"""
|
|
205
175
|
devices_payload = DataSequence(
|
|
206
|
-
|
|
207
|
-
[
|
|
176
|
+
PartitionDevice,
|
|
177
|
+
[PartitionDevice(device_id=device.uuid, device_ip=device.id) for device in devices],
|
|
208
178
|
)
|
|
209
179
|
all_dev_versions = self.repository.get_devices_versions_repository()
|
|
210
180
|
for device in devices_payload:
|
|
@@ -223,7 +193,7 @@ class DeviceVersions:
|
|
|
223
193
|
|
|
224
194
|
def get_device_list_in_installed(
|
|
225
195
|
self, version_to_set_up: str, devices: DataSequence[Device]
|
|
226
|
-
) -> DataSequence[
|
|
196
|
+
) -> DataSequence[PartitionDevice]:
|
|
227
197
|
"""
|
|
228
198
|
Create devices payload list included requested version, if requested version
|
|
229
199
|
is in installed versions
|
|
@@ -239,7 +209,7 @@ class DeviceVersions:
|
|
|
239
209
|
|
|
240
210
|
def get_device_available(
|
|
241
211
|
self, version_to_set_up: str, devices: DataSequence[Device]
|
|
242
|
-
) -> DataSequence[
|
|
212
|
+
) -> DataSequence[PartitionDevice]:
|
|
243
213
|
"""
|
|
244
214
|
Create devices payload list included requested, if requested version
|
|
245
215
|
is in available versions
|
|
@@ -256,7 +226,7 @@ class DeviceVersions:
|
|
|
256
226
|
|
|
257
227
|
def _get_devices_chosen_version(
|
|
258
228
|
self, devices: DataSequence[Device], version_type: str
|
|
259
|
-
) -> DataSequence[
|
|
229
|
+
) -> DataSequence[PartitionDevice]:
|
|
260
230
|
"""
|
|
261
231
|
Create devices payload list included software version key
|
|
262
232
|
for every device in devices list
|
|
@@ -269,15 +239,15 @@ class DeviceVersions:
|
|
|
269
239
|
list : list of devices
|
|
270
240
|
"""
|
|
271
241
|
devices_payload = DataSequence(
|
|
272
|
-
|
|
273
|
-
[
|
|
242
|
+
PartitionDevice,
|
|
243
|
+
[PartitionDevice(device_id=device.uuid, device_ip=device.id) for device in devices],
|
|
274
244
|
)
|
|
275
245
|
all_dev_versions = self.repository.get_devices_versions_repository()
|
|
276
246
|
for device in devices_payload:
|
|
277
247
|
device.version = getattr(all_dev_versions[device.device_id], version_type)
|
|
278
248
|
return devices_payload
|
|
279
249
|
|
|
280
|
-
def get_devices_current_version(self, devices: DataSequence[Device]) -> DataSequence[
|
|
250
|
+
def get_devices_current_version(self, devices: DataSequence[Device]) -> DataSequence[PartitionDevice]:
|
|
281
251
|
"""
|
|
282
252
|
Create devices payload list included current software version key
|
|
283
253
|
for every device in devices list
|
|
@@ -292,7 +262,7 @@ class DeviceVersions:
|
|
|
292
262
|
|
|
293
263
|
return self._get_devices_chosen_version(devices, "current_version")
|
|
294
264
|
|
|
295
|
-
def get_devices_available_versions(self, devices: DataSequence[Device]) -> DataSequence[
|
|
265
|
+
def get_devices_available_versions(self, devices: DataSequence[Device]) -> DataSequence[PartitionDevice]:
|
|
296
266
|
"""
|
|
297
267
|
Create devices payload list included available software versions key
|
|
298
268
|
for every device in devices list
|
|
@@ -306,5 +276,5 @@ class DeviceVersions:
|
|
|
306
276
|
|
|
307
277
|
return self._get_devices_chosen_version(devices, "available_versions")
|
|
308
278
|
|
|
309
|
-
def get_device_list(self, devices: DataSequence[Device]) -> List[
|
|
310
|
-
return [
|
|
279
|
+
def get_device_list(self, devices: DataSequence[Device]) -> List[PartitionDevice]:
|
|
280
|
+
return [PartitionDevice(device_id=device.uuid, device_ip=device.id) for device in devices] # type: ignore
|