Files
grian-ui/pyproject.toml
Victoria Martinez de la CruzandClaude Sonnet 4.5 7590259f25 Add volume metrics dashboard
Implements a comprehensive admin dashboard for monitoring block storage

Features:
- Live metrics dashboard with HTMX auto-refresh
- Prometheus datasource integration via Aetos pattern
- Storage pool monitoring with capacity visualization
- Capacity forecast using predict_linear() to identify pools at risk
- Chart.js doughnut chart for volume/snapshot distribution
- Responsive UI with Bootstrap grid layout
- Configuration management via centralized config module
- Support for both fake (development) and Prometheus datasources

The capacity prediction feature analyzes 7 days of historical data to
forecast when storage pools will run out of space within 30 days,
helping administrators proactively manage storage resources.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Change-Id: I3dc2676d0d247df242a16df5f32c219ee0d29f53
Signed-off-by: Victoria Martinez de la Cruz <victoria@redhat.com>
2026-06-29 17:32:44 +02:00

86 lines
2.5 KiB
TOML

[build-system]
requires = ["pbr>=6.0.0", "setuptools>=64.0.0"]
build-backend = "pbr.build"
[project]
name = "grian-ui"
description = "A horizon dashboard plugin for telemetry visualization"
readme = "README.rst"
authors = [
{name = "OpenStack", email = "openstack-discuss@lists.openstack.org"},
]
requires-python = ">=3.11"
license = "Apache-2.0"
classifiers = [
"Environment :: OpenStack",
"Intended Audience :: Information Technology",
"Intended Audience :: System Administrators",
"Operating System :: POSIX :: Linux",
"Development Status :: 2 - Pre-Alpha",
"Programming Language :: Python",
"Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
]
dynamic = ["version"]
keywords = ["openstack", "horizon", "telemetry"]
[project.urls]
Homepage = "https://opendev.org/openstack/grian-ui"
Documentation = "https://docs.openstack.org/grian-ui/latest/"
Repository = "https://opendev.org/openstack/grian-ui"
Issues = "https://bugs.launchpad.net/grian-ui"
Changelog = "https://docs.openstack.org/releasenotes/grian-ui/"
[tool.stestr]
test_path = "./tests/grian_ui_tests/unit"
top_dir = "./"
[tool.ruff]
line-length = 79
target-version = "py310"
[tool.ruff.lint]
select = ["E4", "E7", "E9", "F", "G", "I", "LOG", "S", "UP", "W", "C90"]
external = ["H"]
ignore = [
# asserts used for type narrowing only
"S101",
# S104 Possible binding to all interfaces
"S104",
# S105/S106 Possible hardcoded password
"S105",
"S106",
# S110 try-except-pass — logged elsewhere
"S110",
# UP031 % format — defer f-string migration to a later pass
"UP031",
# UP032 f-string — defer migration to a later pass
"UP032",
]
[tool.ruff.lint.per-file-ignores]
"tests/grian_ui_tests/*" = ["S"]
"src/grian_ui/datasource/fake.py" = ["S311"]
[tool.ruff.lint.isort]
known-first-party = ["grian_ui"]
force-single-line = true
lines-after-imports = 2
lines-between-types = 1
section-order = ["future", "standard-library", "third-party", "first-party"]
# this is the default but just being explicit about the behavior
# in case that ever changes.
force-sort-within-sections = false
[tool.ruff.lint.mccabe]
max-complexity = 20
[tool.ruff.format]
quote-style = "preserve"
docstring-code-format = true