%global pypi_name nebius-tray %global mod_name nebius_tray Name: nebius-tray Version: 0.2.0 Release: 1%{?dist} Summary: Qt6 system tray monitor for Nebius AI Cloud License: GPL-3.0-or-later URL: https://github.com/jboero/nebius-tools Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz BuildArch: noarch BuildRequires: python3-devel BuildRequires: desktop-file-utils # For %%check. The suite runs headless via QT_QPA_PLATFORM=offscreen and # makes no network calls; anything needing the API is exercised by hand. BuildRequires: python3-pyqt6 BuildRequires: python3-protobuf Requires: python3-pyqt6 Requires: python3-grpcio Requires: python3-protobuf Requires: python3-cryptography Requires: python3-pyyaml # Object Storage browsing needs boto3; mounting a bucket needs a FUSE client. # Both are Recommends rather than Requires: without boto3 the rest of the tray # is unaffected, and without a FUSE client buckets still browse in-app - only # "Mount and open" is offered as unavailable, with a message saying what to # install. A custom mount command in Settings covers anything else. Recommends: python3-boto3 Recommends: s3fs-fuse Suggests: rclone %description nebius-tray watches Nebius AI Cloud resources, in-flight operations and quotas from the system tray, and can create, edit and delete resources. Nothing in it is generated from the API's protocol buffer definitions, and nothing is coded per resource type: the whole API is driven at runtime from a compiled FileDescriptorSet, so the dialogs, the pickers and the watch list all come from the descriptors themselves. This is a community project and is not affiliated with, endorsed by or supported by Nebius. %prep %autosetup -n %{name}-%{version} %generate_buildrequires %pyproject_buildrequires %build %pyproject_wheel %install %pyproject_install %pyproject_save_files %{mod_name} install -Dm644 packaging/%{name}.desktop \ %{buildroot}%{_datadir}/applications/%{name}.desktop install -Dm644 packaging/%{name}-mime.xml \ %{buildroot}%{_datadir}/mime/packages/%{name}.xml for size in 16 22 24 32 48 64 128 256; do install -Dm644 resources/icons/hicolor/${size}x${size}/apps/%{name}.png \ %{buildroot}%{_datadir}/icons/hicolor/${size}x${size}/apps/%{name}.png done %check desktop-file-validate %{buildroot}%{_datadir}/applications/%{name}.desktop # The hermetic part of the suite: no network, no display, no credentials. # Deliberately not all of it - some tests read model files from the developer's # machine and would fail in a build root for reasons that say nothing about # the package. export QT_QPA_PLATFORM=offscreen export PYTHONPATH=%{buildroot}%{python3_sitelib} for t in test_version test_schema_parity test_capacity test_quotas test_storage \ test_tooltip test_signals test_responsive test_identity \ test_paths test_dispatch; do echo "--- $t" %{python3} tests/$t.py done %files -f %{pyproject_files} %license LICENSE %doc README.md %{_bindir}/%{name} %{_datadir}/applications/%{name}.desktop %{_datadir}/mime/packages/%{name}.xml %{_datadir}/icons/hicolor/*/apps/%{name}.png %changelog * Fri Sep 11 2026 John Boero - 0.2.0-1 - Object Storage browser: buckets in the tray menu, a lazy per-prefix browser window, and "Mount and open" via an S3 FUSE client (s3fs-fuse recommended, rclone/geesefs/mount-s3 also detected, or a custom command in Settings). - Access is checked over S3 before mounting, so credentials that cannot read a bucket report in under a second instead of leaving a wedged mountpoint that hangs the file manager and resists fusermount -u. - Unmounting is lazy and stops the mount helper, and helpers that exit are reaped rather than left as zombies. - Object Storage keys can be created from the app: Nebius issues them only to service accounts, and the secret is stored 0600 in ~/.nebius/s3-credentials. - GPU capacity from CapacityService is shown against each preset in the deploy wizard, so a platform with nothing free is flagged rather than silently queueing in PROVISIONING. - Quotas are read at tenant and project level and grouped with separators; a tenant whose quotas cannot be read says so instead of appearing empty. - Tenant switching: honours $NEBIUS_TENANT_ID, offers a menu when more than one is visible, and shows which identity and tenant are in use. - Federated logins work without a manual token, and automatic refresh can no longer open a browser window. - The tray tooltip lists resources with their state and age, and operations with progress and ETA. - The tray menu is built only when the desktop asks for it: rebuilding it on a timer could crash plasmashell. - Model names come from the filename rather than a GGUF's general.name. - Read-only catalogues are no longer watchable: compute/v1/platforms listed a region's machine types as if they were the user's resources, with no state to report. Watchability is derived from the descriptors - anything you can create or delete is yours - rather than from a list of names. - A resource with no status.state shows its name alone instead of "- ?". * Fri Aug 21 2026 John Boero - 0.1.0-1 - Initial release.