diff -pruN 3.7.1-2/.gitignore 3.9.0-0ubuntu1/.gitignore
--- 3.7.1-2/.gitignore	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/.gitignore	1970-01-01 00:00:00.000000000 +0000
@@ -1,58 +0,0 @@
-*.py[cod]
-
-# C extensions
-*.so
-
-# Packages
-*.egg
-*.egg-info
-dist
-build
-.eggs
-eggs
-parts
-bin
-var
-sdist
-develop-eggs
-.installed.cfg
-lib
-lib64
-
-# Installer logs
-pip-log.txt
-
-# Unit test / coverage reports
-.coverage
-.tox
-nosetests.xml
-.stestr/
-.venv
-
-# Translations
-*.mo
-
-# Mr Developer
-.mr.developer.cfg
-.project
-.pydevproject
-
-# Complexity
-output/*.html
-output/*/index.html
-
-# Sphinx
-doc/build
-releasenotes/build
-
-# pbr generates these
-AUTHORS
-ChangeLog
-
-# Editors
-*~
-.*.swp
-.*sw?
-
-# generated docs
-doc/source/ref/
diff -pruN 3.7.1-2/.gitreview 3.9.0-0ubuntu1/.gitreview
--- 3.7.1-2/.gitreview	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/.gitreview	1970-01-01 00:00:00.000000000 +0000
@@ -1,4 +0,0 @@
-[gerrit]
-host=review.opendev.org
-port=29418
-project=openstack/python-aodhclient.git
diff -pruN 3.7.1-2/.pre-commit-config.yaml 3.9.0-0ubuntu1/.pre-commit-config.yaml
--- 3.7.1-2/.pre-commit-config.yaml	1970-01-01 00:00:00.000000000 +0000
+++ 3.9.0-0ubuntu1/.pre-commit-config.yaml	2025-07-10 09:20:01.000000000 +0000
@@ -0,0 +1,30 @@
+repos:
+  - repo: https://github.com/pre-commit/pre-commit-hooks
+    rev: v5.0.0
+    hooks:
+      - id: trailing-whitespace
+      # Replaces or checks mixed line ending
+      - id: mixed-line-ending
+        args: ['--fix', 'lf']
+        exclude: '.*\.(svg)$'
+      # Forbid files which have a UTF-8 byte-order marker
+      - id: check-byte-order-marker
+      # Checks that non-binary executables have a proper shebang
+      - id: check-executables-have-shebangs
+      # Check for files that contain merge conflict strings.
+      - id: check-merge-conflict
+      # Check for debugger imports and py37+ breakpoint()
+      # calls in python source
+      - id: debug-statements
+      - id: check-yaml
+        files: .*\.(yaml|yml)$
+  - repo: https://opendev.org/openstack/hacking
+    rev: 7.0.0
+    hooks:
+      - id: hacking
+        additional_dependencies: []
+  - repo: https://github.com/asottile/pyupgrade
+    rev: v3.18.0
+    hooks:
+      - id: pyupgrade
+        args: [--py3-only]
diff -pruN 3.7.1-2/.zuul.yaml 3.9.0-0ubuntu1/.zuul.yaml
--- 3.7.1-2/.zuul.yaml	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/.zuul.yaml	2025-07-10 09:20:01.000000000 +0000
@@ -10,17 +10,28 @@
       - openstack/ceilometer
       - gnocchixyz/gnocchi
       - openstack-k8s-operators/sg-core
+      - openstack/devstack-plugin-prometheus
     timeout: 4200
     vars:
       devstack_localrc:
-        AODH_SERVICE_HOST: localhost
-        AODH_DEPLOY: uwsgi
         CEILOMETER_BACKENDS: "gnocchi,sg-core"
         PROMETHEUS_SERVICE_SCRAPE_TARGETS: prometheus,sg-core
+        PROMETHEUS_CUSTOM_SCRAPE_TARGETS: "localhost:3000,localhost:9090"
       devstack_plugins:
         aodh: https://opendev.org/openstack/aodh
         ceilometer: https://opendev.org/openstack/ceilometer
         sg-core: https://github.com/openstack-k8s-operators/sg-core
+        devstack-plugin-prometheus: https://opendev.org/openstack/devstack-plugin-prometheus
+      devstack_services:
+        node_exporter: false
+      zuul_copy_output:
+        /etc/prometheus/prometheus.yml: logs
+        /etc/openstack/prometheus.yaml: logs
+      devstack_local_conf:
+        post-config:
+          $AODH_CONF:
+            DEFAULT:
+              enable_evaluation_results_metrics: True
 
 - project:
     queue: telemetry
@@ -34,8 +45,10 @@
       jobs:
         - aodhclient-dsvm-functional:
             irrelevant-files: &ac-irrelevant-files
+              - ^\.gitreview$
               - ^(test-|)requirements.txt$
               - ^setup.cfg$
+              - ^doc/.*$
               - ^.*\.rst$
               - ^releasenotes/.*$
     gate:
diff -pruN 3.7.1-2/AUTHORS 3.9.0-0ubuntu1/AUTHORS
--- 3.7.1-2/AUTHORS	1970-01-01 00:00:00.000000000 +0000
+++ 3.9.0-0ubuntu1/AUTHORS	2025-07-10 09:21:10.000000000 +0000
@@ -0,0 +1,73 @@
+98k <18552437190@163.com>
+Andreas Jaeger <aj@suse.com>
+Bhujay Kumar Bhatta <bhujay.bhatta@yahoo.com>
+Cao Xuan Hoang <hoangcx@vn.fujitsu.com>
+Chaozhe.Chen <chaozhe.chen@easystack.cn>
+Corey Bryant <corey.bryant@canonical.com>
+Dan Radez <dradez@redhat.com>
+David Rabel <rabel@b1-systems.de>
+Doug Hellmann <doug@doughellmann.com>
+Dr. Jens Harbott <harbott@osism.tech>
+Emma Foley <efoley@redhat.com>
+Eyal <eyal.bar-ilan@nokia.com>
+Ghanshyam Mann <gmann@ghanshyammann.com>
+Ha Manh Dong <donghm@vn.fujitsu.com>
+Hanxi Liu <hanxi.liu@easystack.cn>
+Hemanth Nakkina <hemanth.nakkina@canonical.com>
+Hervé Beraud <hberaud@redhat.com>
+Jake Yip <jake.yip@unimelb.edu.au>
+Jaromir Wysoglad <jwysogla@redhat.com>
+Jaromír Wysoglad <jwysogla@redhat.com>
+Jon Schlueter <jschluet@redhat.com>
+Julien Danjou <julien@danjou.info>
+KATO Tomoyuki <kato.tomoyuki@jp.fujitsu.com>
+Kevin_Zheng <zhengzhenyu@huawei.com>
+Lingxian Kong <anlin.kong@gmail.com>
+Martin Mágr <mmagr@redhat.com>
+Matthias Bastian <bastian@strato.de>
+Mehdi ABAAKOUK <sileht@sileht.net>
+Mehdi Abaakouk <sileht@redhat.com>
+Mehdi Abaakouk <sileht@sileht.net>
+Monty Taylor <mordred@inaugust.com>
+Nguyen Hai <nguyentrihai93@gmail.com>
+OpenStack Release Bot <infra-root@openstack.org>
+PanFengyun <fengyun.pan@easystack.cn>
+Pradeep Kilambi <pkilambi@redhat.com>
+Rui Yuan Dou <rydou@fiberhome.com>
+Sean McGinnis <sean.mcginnis@gmail.com>
+Simon Merrick <simonmerrick@catalyst.net.nz>
+Stephen Finucane <stephenfin@redhat.com>
+Stéphane Albert <stephane.albert@objectif-libre.com>
+Swapnil Kulkarni (coolsvap) <me@coolsvap.net>
+Takashi Kajinami <kajinamit@oss.nttdata.com>
+Takashi Kajinami <tkajinam@redhat.com>
+Thomas Bechtold <tbechtold@suse.com>
+Tony Breeds <tony@bakeyournoodle.com>
+Tovin Seven <vinhnt@vn.fujitsu.com>
+Vieri <15050873171@163.com>
+Yadnesh Kulkarni <ykulkarn@redhat.com>
+Zhao Lei <zhaolei@cn.fujitsu.com>
+ZhiQiang Fan <aji.zqfan@gmail.com>
+ZhongShengping <chdzsp@163.com>
+Zi Lian Ji <jizilian@cn.ibm.com>
+caoyuan <cao.yuan@99cloud.net>
+gord chung <gord@live.ca>
+gordon chung <gord@live.ca>
+houweichao <houwch@gohighsec.com>
+jacky06 <zhang.min@99cloud.net>
+kangyufei <kangyf@inspur.com>
+lipan <lipan7195@fiberhome.com>
+liusheng <liusheng@huawei.com>
+liyuanzhen <li.yuanzhen@zte.com.cn>
+pengyuesheng <pengyuesheng@gohighsec.com>
+qingszhao <zhao.daqing@99cloud.net>
+rabi <ramishra@redhat.com>
+rajat29 <rajat.sharma@nectechnologies.in>
+venkatamahesh <venkatamaheshkotha@gmail.com>
+wangzihao <wangzihao@yovole.com>
+whoami-rajat <rajatdhasmana@gmail.com>
+wu.chunyang <wuchunyang@yovole.com>
+xialinjuan <ljxiash@cn.ibm.com>
+xiaozhuangqing <zhuangqing.xiao@easystack.cn>
+zhangguoqing <zhang.guoqing@99cloud.net>
+zhangyangyang <zhangyangyang@unionpay.com>
diff -pruN 3.7.1-2/ChangeLog 3.9.0-0ubuntu1/ChangeLog
--- 3.7.1-2/ChangeLog	1970-01-01 00:00:00.000000000 +0000
+++ 3.9.0-0ubuntu1/ChangeLog	2025-07-10 09:21:10.000000000 +0000
@@ -0,0 +1,460 @@
+CHANGES
+=======
+
+3.9.0
+-----
+
+* Fix a typo in release note
+* Remove Python 3.9 support
+* Run pyupgrade to clean up Python 2 syntaxes
+* Use PROMETHEUS\_CUSTOM\_SCRAPE\_TARGETS to pass sg\_core scrape endpoint
+* add pyproject.toml to support pip 23.1
+
+3.8.0
+-----
+
+* Add openstack alarm metrics command
+* Use pre-commit to run pep8 checks
+* Adjust endpoint url according to devstack plugin update
+* Skip functional tests for .gitreview and documentation files
+* Make capabilities API test more robust
+* Update master for stable/2025.1
+
+3.7.1
+-----
+
+* Switch to openstack-k8s-operators/sg-core
+* reno: Update master for unmaintained/2023.1
+
+3.7.0
+-----
+
+* Bump pbr
+* Add note about requirements lower bounds
+* zuul: Use telemetry queue
+* Publish release notes
+* Remove Python 3.8 support
+* Avoid overriding the base url template
+* Add requirements check job
+* Enable GLOBAL\_VENV
+* Update master for stable/2024.2
+
+3.6.0
+-----
+
+* Use global upper-constraints
+* Remove old excludes
+* reno: Update master for unmaintained/zed
+* reno: Update master for unmaintained/xena
+* reno: Update master for unmaintained/wallaby
+* reno: Update master for unmaintained/victoria
+* Update master for stable/2024.1
+
+3.5.1
+-----
+
+* Remove oslo.db test cap
+* Add functional tests for prometheus type alarms
+
+3.5.0
+-----
+
+* Fix releasenotes build of yoga moved to unmaintained
+* Bump hacking
+* Exclude tests directory from coverage calculation
+* Move functional test to dsvm and remove pifpaf
+* Update python classifier in setup.cfg
+* Bump upper version of db libraries in test requirements
+
+3.4.0
+-----
+
+* Prometheus alarms
+* Fix gate
+* Update master for stable/2023.2
+* Fix bindep.txt for python 3.11 job(Debian Bookworm)
+
+3.3.0
+-----
+
+* Move test requirements to tox.ini
+* Update master for stable/2023.1
+
+3.2.0
+-----
+
+* Fix CI jobs(py38, py310) and upload of wheels package to PyPi
+
+3.1.0
+-----
+
+* Make tox.ini tox 4.0 compatible
+* Switch to 2023.1 Python3 unit tests and generic template name
+* Update master for stable/zed
+
+3.0.0
+-----
+
+* Unblock the gate and update python testing
+* Remove six
+* Update master for stable/yoga
+
+2.4.1
+-----
+
+* Add Python 3 only classifier
+* setup.cfg: Replace dashes by underscores
+* Add Python3 yoga unit tests
+
+2.4.0
+-----
+
+* Fix aodhclient for pyparse 3.0.6
+* Update master for stable/xena
+* Add Python3 xena unit tests
+
+2.3.0
+-----
+
+* Update master for stable/wallaby
+
+2.2.0
+-----
+
+* Add Python3 wallaby unit tests
+* Update master for stable/victoria
+
+2.1.1
+-----
+
+* Don't use \*/\* in accept header
+* Remove translation sections from setup.cfg
+
+2.1.0
+-----
+
+* Stop to use the \_\_future\_\_ module
+* Switch to newer openstackdocstheme and reno versions
+* Bump default tox env from py37 to py38
+* Add py38 package metadata
+* Use unittest.mock instead of third party mock
+* Add Python3 victoria unit tests
+* Update master for stable/ussuri
+
+2.0.1
+-----
+
+* Cleanup py27 support
+* Update hacking for Python3
+
+2.0.0
+-----
+
+* Support quota CLI
+* tox: Keeping going with docs
+* Drop python 2.7 support and testing
+
+1.5.0
+-----
+
+* Support threshold type alarm again
+* Switch to Ussuri jobs
+
+1.4.0
+-----
+
+* Add support for loadbalancer\_member\_health alarms
+* Update master for stable/train
+* Bump the openstackdocstheme extension to 1.20
+
+1.3.0
+-----
+
+* Blacklist sphinx 2.1.0 (autodoc bug)
+* Add Python 3 Train unit tests
+* Sync Sphinx requirement
+* Updating alarm for different alarm types
+* Remove telemetry-tox-py37
+* allow an empty string to unset options
+* Replace git.openstack.org URLs with opendev.org URLs
+* OpenDev Migration Patch
+* Dropping the py35 testing
+* missing result of the alarm show by name
+* Add OSprofiler support for Aodh client
+* add python 3.6 unit test job
+* Update master for stable/stein
+* add python 3.7 unit test job
+
+1.2.0
+-----
+
+* Change openstack-dev to openstack-discuss
+* Add Python 3.6 classifier to setup.cfg
+* Add metavar for alarm\_id in alarm-history show
+* add python 3.6 unit test job
+* switch documentation job to new PTI
+* import zuul job settings from project-config
+* Update reno for stable/rocky
+* Add gating on py37
+* Switch to use stestr for unit test
+
+1.1.1
+-----
+
+* Consider interface and region options with OSC
+
+1.1.0
+-----
+
+* Fixup README
+* fix tox python3 overrides
+* fix warnings in documentation build
+* cli: replace metrics by metric
+* Follow the new PTI for document build
+* Not able to set threshold value to ‘0’ in aodh alarm creation
+* Update reno for stable/queens
+
+1.0.0
+-----
+
+* remove threshold alarms
+* Set the Cliff namespace
+* Fix doc builds
+* delete --debug in a shell command
+* Remove setting of version/release from releasenotes
+* doc: remove mention of combination alarms
+* Cleanup setup.cfg
+* Update reno for stable/pike
+* Docs: switch to openstackdocstheme
+* Fix gnocchi/pifpaf requirements
+* Update documentation URLs
+* Fix Gnocchi tarball URL
+* block sphinx 1.6.1
+* cleanup coveragerc
+* tests: stop using Ceilometer legacy resource types
+* Remove log translations
+
+0.9.0
+-----
+
+* Remove upper cap on pbr
+* Clean deprecated "query" paremeter in alarm.list()
+* Correct the port number of gnocchi endpoint
+* Trivial-fix: make the capabilities help message more specific in OSC
+* Remove the duplicated \_\_version\_\_ definition
+* Trivial: remove support for py34
+* Update reno for stable/ocata
+* Remove unused test dependency
+
+0.8.0
+-----
+
+* Extras usage for test requirements + basic auth against Gnocch
+* Modified the help info
+* Enable coverage report in console output
+* [doc] Note lack of constraints is a choice
+* Replaces uuid.uuid4 with uuidutils.generate\_uuid()
+* Bump hacking to 0.12
+* Add plug-in summary for osc doc
+* Enable release notes translation
+* Add missing pyparsing to requirements.txt
+* Clean imports in code
+* Update reno for stable/newton
+* Remove 'MANIFEST.in'
+
+0.7.0
+-----
+
+* Use osc-lib instead of openstackclient
+* Trival: Remove unused logging import
+* Fix incorrect string format mapping
+* Remove discover from test-requirements
+
+0.6.0
+-----
+
+* Add Python 3.5 classifier and venv
+* Add event\_id for alarm-history display
+* Add pagination support in Aodhclient
+* Split alarm query and alarm list in SDK layer
+* Support get/set alarm state interfaces
+* Add releasenotes for Newton updates
+* add default value for http\_status in ClientException
+* fix help text for option --composite-rule
+* improve threshold & event alarm query formatting
+* Add explanation for how to get meter name
+* Add unit test to validate composite alarm args
+* exceptions: make error code be implicit
+* Update the home-page with developer documentation
+* remove tempest test for alarm name unique constraint
+* Only install hacking in pep8
+* shell: treat alarm id as name if it is not uuid like
+* Bump hacking to 0.11
+
+0.5.0
+-----
+
+* add valid choice for alarm type help text
+* shell: fix meter help string
+* Allow to start Aodh command with OSC
+* Prepare compatibility with OSC
+* fix KeyError when credential is invalid
+* remove unnecessary slashes
+* Enable releasenotes documentation
+* [Trivial] Remove executable privilege of doc/source/conf.py
+* add mock to test requirement list
+* refactor code of adding alarm id and name arguments
+* Switch from deprecated tempest-lib to tempest
+
+0.4.0
+-----
+
+* Remove keystonemiddleware dependency
+* Use pifpaf to setup tests
+* Remove Babel dependency
+* format the output of time\_constraints
+* Add --filter to "alarm list"
+* Remove unused mailmap file
+* Support easier query usage for alarm history search
+* Add name support for show, update and delete
+* Correct and add examples in docs of CLI
+* Add --query to alarm list
+* Clean flake8 paths and unused config options
+* Don't support "alarm search" and mandatory --type in "alarm list"
+* tox: remove useless install\_command
+* Use overtest to run Gnocchi in tests
+* Trival fix a typo
+* Fix aodh client fails when command with the arg --time-constraint
+* Fix the -q/--query in threshold alarm creation
+* Use assert\_called\_once\_with() in test\_alarm\_cli.py
+* Fix the wrong error info of parameter resource-type
+* Fix a minor doc error
+* Remove unused package requirement of "futurist"
+
+0.3.0
+-----
+
+* Use cli.base.execute of tempest-lib
+* Add composite rule alarm support in aodhclient
+* Make the alarm list output more concise
+
+0.2.0
+-----
+
+* Skip the version 1.16.0 of cliff
+* Remove unused method
+* Add abbreviation of --meter-name hint in threshold alarm creation
+* Return the error message of API request failure
+* Add some unit test cases
+* Add gnocchi alarm rules
+* cleanup existing tests
+* add alarm history unit test
+* check the alarm type when list alarm
+
+0.1.0
+-----
+
+* add alarm-history interface
+* clean up docs
+* add event alarm support
+* Clean flake8 ignore
+* support alarm type param
+* add alarm interface
+* fix test debug
+* fix functional tests
+* drop remaining gnocchi specific code and fix pep8
+* remove gnocchi specific tests
+* remove gnocchi specific commands and set to v2
+* more gnocchi to aodh rename cleanup
+* rename gnocchi to aodh
+* Make the wheel universal
+* Allow to set resource type for aggregation
+* Examples in doc should be workable
+* Handle rename from dbsync to upgrade
+* Fixed history parameter having no effect on search
+* tests: update setup script to use Paste
+* Add some help messages of Gnocchi commands
+* metric: fix measures --stop argument
+* Creates better exceptions for http code 409
+* resource: fix help string
+* tests: do not create a archive policy on setup
+* resource: define several option for all metric action
+* benchmark: Add more measurements stats
+* benchmark: add measures show
+* metric: rename metric get to show
+* Set x-roles when noauth is used
+* Convert keystoneauth exceptions by ours
+* Fix some spelling typo in manual and help output
+* Always make resource\_id positional
+* cli: make resource type non positional
+* benchmark: use processes rather than threads
+* benchmark: add support for measures add
+* metric: change all resource\_id options to -r
+* benchmark: add get metric
+* benchmark: rename argument to \`count'
+* benchmark: add metric create
+* get gnocchi api version from args/env
+* noauth: simplify class reference
+* Add support for /v1/status
+* shell: remove unused LOG
+* shell: remove dead code
+* shell: move command definition to the class using it
+* metric: change delete to allow deleting several metric at once
+* Add capabilities support to cli
+* Remove upper cap on Sphinx
+* Remove Python 3.3 support
+* Name the package \`gnocchiclient'
+* metric: allow to create metric with name and no resource\_id
+* shell: improve error info
+* Add six in requirements
+* shell: fix exception catching on cleanup
+* Replaces 'archive policy' by 'archive-policy'
+* Change ignore-errors to ignore\_errors
+* Remove entry\_points
+* Don't always load client
+* Remove now useless build\_url method
+* Replace keystoneclient by keystoneauth1
+* Fix help typo
+* tox: Allow to pass some OS\_\* variables
+* Support aggregation accross metrics and resources
+* Allow CRUD measurements
+* Allow CRUD metric with an resource\_id and an name
+* Support CRUD for metric
+* resource: remove -q for --query it conflicts with --quiet
+* Allow quoted string with ' in query parser
+* cli: fix archive policy create output
+* docs: fix archive policy rule name doc
+* docs: enhance reference title
+* docs: delete previous build
+* Use 'archive policy' instead of 'archivepolicy'
+* Fix archive policy rule list
+* ap rule: Use named attributes
+* Fix archivepolicy list
+* ap: allows multiple definition and name attributes
+* test: remove duplicated code
+* Add archive policy rule commands to cli
+* Add archive policy commands to cli
+* Fix py34 tests
+* doc: fix typo in shell.rst
+* functional tests: don't require devstack
+* fixes noauth
+* doc: fix typo
+* Allow to disable the authentification layer
+* doc: Fixing a shell parameter
+* Allow limit/sort/marker for resource listing
+* Fixes logging
+* Allow resource history
+* Write the base of the documentation
+* Allow to pass the gnocchi enpoint via cli
+* Update documentation
+* Allow search for resource
+* Allow add/delete metrics with resource
+* Add ssl/region/timeout/interface parameters
+* Add functional test for crud resource
+* Hide useless logging
+* Add 'delete resource'
+* Adding resource update
+* Allow to create resources
+* Fixes "resource show"
+* Initial client code
+* Initial Cookiecutter Commit
diff -pruN 3.7.1-2/PKG-INFO 3.9.0-0ubuntu1/PKG-INFO
--- 3.7.1-2/PKG-INFO	1970-01-01 00:00:00.000000000 +0000
+++ 3.9.0-0ubuntu1/PKG-INFO	2025-07-10 09:21:10.827641000 +0000
@@ -0,0 +1,48 @@
+Metadata-Version: 2.1
+Name: aodhclient
+Version: 3.9.0
+Summary: Python client library for Aodh
+Home-page: https://docs.openstack.org/python-aodhclient/latest/
+Author: OpenStack
+Author-email: openstack-discuss@lists.openstack.org
+Classifier: Environment :: OpenStack
+Classifier: Intended Audience :: Information Technology
+Classifier: Intended Audience :: System Administrators
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Operating System :: POSIX :: Linux
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3 :: Only
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Requires-Python: >=3.10
+License-File: LICENSE
+Requires-Dist: pbr>=2.0
+Requires-Dist: cliff>=1.17.0
+Requires-Dist: osc-lib>=1.0.1
+Requires-Dist: oslo.i18n>=1.5.0
+Requires-Dist: oslo.serialization>=1.4.0
+Requires-Dist: oslo.utils>=2.0.0
+Requires-Dist: osprofiler>=1.4.0
+Requires-Dist: keystoneauth1>=1.0.0
+Requires-Dist: pyparsing>2.1.0
+
+==========
+aodhclient
+==========
+
+Python bindings to the OpenStack Aodh API
+
+This is a client for OpenStack Aodh API. There's a `Python API
+<https://docs.openstack.org/python-aodhclient/latest/api.html>`_ (the
+aodhclient module), and a `command-line script
+<https://docs.openstack.org/python-aodhclient/latest/shell.html>`_ (installed
+as aodh). Each implements the entire OpenStack Aodh API.
+
+* Free software: Apache license
+* Release notes: https://releases.openstack.org/teams/telemetry.html
+* Documentation: https://docs.openstack.org/python-aodhclient/latest/
+* Source: https://opendev.org/openstack/python-aodhclient
+* Bugs: https://storyboard.openstack.org/#!/project/openstack/python-aodhclient
+
diff -pruN 3.7.1-2/aodhclient/__init__.py 3.9.0-0ubuntu1/aodhclient/__init__.py
--- 3.7.1-2/aodhclient/__init__.py	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/__init__.py	2025-07-10 09:20:01.000000000 +0000
@@ -1,5 +1,3 @@
-# -*- coding: utf-8 -*-
-
 # Licensed under the Apache License, Version 2.0 (the "License"); you may
 # not use this file except in compliance with the License. You may obtain
 # a copy of the License at
diff -pruN 3.7.1-2/aodhclient/client.py 3.9.0-0ubuntu1/aodhclient/client.py
--- 3.7.1-2/aodhclient/client.py	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/client.py	2025-07-10 09:20:01.000000000 +0000
@@ -31,10 +31,7 @@ class SessionClient(adapter.Adapter):
         # keystoneauth, where we need to raise the aodhclient errors.
         raise_exc = kwargs.pop('raise_exc', True)
         kwargs['headers'].update(web.get_trace_id_headers())
-        resp = super(SessionClient, self).request(url,
-                                                  method,
-                                                  raise_exc=False,
-                                                  **kwargs)
+        resp = super().request(url, method, raise_exc=False, **kwargs)
 
         if raise_exc and resp.status_code >= 400:
             raise exceptions.from_response(resp, url, method)
diff -pruN 3.7.1-2/aodhclient/exceptions.py 3.9.0-0ubuntu1/aodhclient/exceptions.py
--- 3.7.1-2/aodhclient/exceptions.py	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/exceptions.py	2025-07-10 09:20:01.000000000 +0000
@@ -30,9 +30,10 @@ class ClientException(Exception):
         return self.http_status
 
     def __str__(self):
-        formatted_string = "%s (HTTP %s)" % (self.message, self.http_status)
+        formatted_string = "{} (HTTP {})".format(
+            self.message, self.http_status)
         if self.request_id:
-            formatted_string += " (Request-ID: %s)" % self.request_id
+            formatted_string += " (Request-ID: {})".format(self.request_id)
 
         return formatted_string
 
@@ -45,10 +46,10 @@ class RetryAfterException(ClientExceptio
         except (KeyError, ValueError):
             self.retry_after = 0
 
-        super(RetryAfterException, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
 
 
-class MutipleMeaningException(object):
+class MutipleMeaningException:
     """An mixin for exception that can be enhanced by reading the details"""
 
 
@@ -136,9 +137,9 @@ _error_classes = [BadRequest, Unauthoriz
                   MethodNotAllowed, NotAcceptable, Conflict, OverLimit,
                   RateLimit, NotImplemented]
 _error_classes_enhanced = {}
-_code_map = dict(
-    (c.http_status, (c, _error_classes_enhanced.get(c, [])))
-    for c in _error_classes)
+_code_map = {
+    c.http_status: (c, _error_classes_enhanced.get(c, []))
+    for c in _error_classes}
 
 
 def from_response(response, url, method=None):
diff -pruN 3.7.1-2/aodhclient/noauth.py 3.9.0-0ubuntu1/aodhclient/noauth.py
--- 3.7.1-2/aodhclient/noauth.py	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/noauth.py	2025-07-10 09:20:01.000000000 +0000
@@ -67,7 +67,7 @@ class AodhNoAuthLoader(loading.BaseLoade
     plugin_class = AodhNoAuthPlugin
 
     def get_options(self):
-        options = super(AodhNoAuthLoader, self).get_options()
+        options = super().get_options()
         options.extend([
             AodhOpt('user-id', help='User ID', required=True),
             AodhOpt('project-id', help='Project ID', required=True),
diff -pruN 3.7.1-2/aodhclient/shell.py 3.9.0-0ubuntu1/aodhclient/shell.py
--- 3.7.1-2/aodhclient/shell.py	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/shell.py	2025-07-10 09:20:01.000000000 +0000
@@ -29,6 +29,7 @@ from aodhclient import noauth
 from aodhclient.v2 import alarm_cli
 from aodhclient.v2 import alarm_history_cli
 from aodhclient.v2 import capabilities_cli
+from aodhclient.v2 import metrics_cli
 
 
 class AodhCommandManager(commandmanager.CommandManager):
@@ -43,6 +44,7 @@ class AodhCommandManager(commandmanager.
         "alarm-history show": alarm_history_cli.CliAlarmHistoryShow,
         "alarm-history search": alarm_history_cli.CliAlarmHistorySearch,
         "capabilities list": capabilities_cli.CliCapabilitiesList,
+        "alarm metrics": metrics_cli.CliMetrics,
     }
 
     def load_commands(self, namespace):
@@ -52,7 +54,7 @@ class AodhCommandManager(commandmanager.
 
 class AodhShell(app.App):
     def __init__(self):
-        super(AodhShell, self).__init__(
+        super().__init__(
             description='Aodh command line client',
             version=__version__,
             command_manager=AodhCommandManager('aodhclient'),
@@ -72,7 +74,7 @@ class AodhShell(app.App):
         :param version: version number for the application
         :paramtype version: str
         """
-        parser = super(AodhShell, self).build_option_parser(
+        parser = super().build_option_parser(
             description, version, argparse_kwargs={'allow_abbrev': False})
         # Global arguments, one day this should go to keystoneauth1
         parser.add_argument(
@@ -139,7 +141,7 @@ class AodhShell(app.App):
             # Set this here so cliff.app.configure_logging() can work
             self.options.verbose_level = 3
 
-        super(AodhShell, self).configure_logging()
+        super().configure_logging()
         root_logger = logging.getLogger('')
 
         # Set logging to the requested level
diff -pruN 3.7.1-2/aodhclient/tests/functional/base.py 3.9.0-0ubuntu1/aodhclient/tests/functional/base.py
--- 3.7.1-2/aodhclient/tests/functional/base.py	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/tests/functional/base.py	2025-07-10 09:20:01.000000000 +0000
@@ -19,7 +19,7 @@ from tempest.lib.cli import base
 from tempest.lib import exceptions
 
 
-class AodhClient(object):
+class AodhClient:
     """Aodh Client for tempest-lib
 
     This client doesn't use any authentication system
diff -pruN 3.7.1-2/aodhclient/tests/functional/test_alarm.py 3.9.0-0ubuntu1/aodhclient/tests/functional/test_alarm.py
--- 3.7.1-2/aodhclient/tests/functional/test_alarm.py	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/tests/functional/test_alarm.py	2025-07-10 09:20:01.000000000 +0000
@@ -28,6 +28,7 @@ class AodhClientTest(base.ClientTestBase
         self.aodh("help", params="alarm list")
         self.aodh("help", params="alarm show")
         self.aodh("help", params="alarm update")
+        self.aodh("help", params="alarm metrics")
 
     def test_alarm_id_or_name_scenario(self):
         def _test(name):
@@ -59,13 +60,13 @@ class AodhClientTest(base.ClientTestBase
             self.assertEqual("another-name",
                              self.details_multiple(result)[0]['name'])
 
-            params = "update --name %s %s" % (name, alarm_id)
+            params = "update --name {} {}".format(name, alarm_id)
             result = self.aodh('alarm', params=params)
             self.assertEqual(name,
                              self.details_multiple(result)[0]['name'])
 
             # Check update with no change is allowed
-            params = "update --name %s %s" % (name, name)
+            params = "update --name {} {}".format(name, name)
             result = self.aodh('alarm', params=params)
             self.assertEqual(name,
                              self.details_multiple(result)[0]['name'])
@@ -98,8 +99,8 @@ class AodhClientTest(base.ClientTestBase
         PROJECT_ID = uuidutils.generate_uuid()
 
         # CREATE
-        result = self.aodh(u'alarm',
-                           params=(u"create --type event --name ev_alarm1 "
+        result = self.aodh('alarm',
+                           params=("create --type event --name ev_alarm1 "
                                    "--project-id %s" % PROJECT_ID))
         alarm = self.details_multiple(result)[0]
         ALARM_ID = alarm['alarm_id']
@@ -141,8 +142,8 @@ class AodhClientTest(base.ClientTestBase
 
         # GET BY NAME AND ID ERROR
         self.assertRaises(exceptions.CommandFailed,
-                          self.aodh, u'alarm',
-                          params=(u"show %s --name ev_alarm1" %
+                          self.aodh, 'alarm',
+                          params=("show %s --name ev_alarm1" %
                                   ALARM_ID))
 
         # LIST
@@ -189,8 +190,8 @@ class AodhClientTest(base.ClientTestBase
         res_id = uuidutils.generate_uuid()
         # CREATE
         result = self.aodh(
-            u'alarm',
-            params=(u'create --type composite --name calarm1 --composite-rule '
+            'alarm',
+            params=('create --type composite --name calarm1 --composite-rule '
                     '\'{"or":[{"threshold": 0.8, "metric": "cpu_util", '
                     '"type": "gnocchi_resources_threshold", "resource_type": '
                     '"generic", "resource_id": "%s", '
@@ -212,8 +213,8 @@ class AodhClientTest(base.ClientTestBase
 
         # CREATE FAIL MISSING PARAM
         self.assertRaises(exceptions.CommandFailed,
-                          self.aodh, u'alarm',
-                          params=(u"create --type composite --name calarm1 "
+                          self.aodh, 'alarm',
+                          params=("create --type composite --name calarm1 "
                                   "--project-id %s" % project_id))
 
         # UPDATE
@@ -241,8 +242,8 @@ class AodhClientTest(base.ClientTestBase
 
         # GET BY NAME AND ID ERROR
         self.assertRaises(exceptions.CommandFailed,
-                          self.aodh, u'alarm',
-                          params=(u"show %s --name calarm1" %
+                          self.aodh, 'alarm',
+                          params=("show %s --name calarm1" %
                                   alarm_id))
 
         # LIST
@@ -339,8 +340,8 @@ class AodhClientTest(base.ClientTestBase
 
         res_id = uuidutils.generate_uuid()
         # CREATE
-        result = self.aodh(u'alarm',
-                           params=(u"create --type event --name ev_alarm123"))
+        result = self.aodh('alarm',
+                           params=("create --type event --name ev_alarm123"))
         alarm = self.details_multiple(result)[0]
         ALARM_ID = alarm['alarm_id']
         self.assertEqual('ev_alarm123', alarm['name'])
@@ -398,8 +399,8 @@ class AodhClientGnocchiRulesTest(base.Cl
         self.assertEqual(201, req.status_code)
 
         # CREATE
-        result = self.aodh(u'alarm',
-                           params=(u"create "
+        result = self.aodh('alarm',
+                           params=("create "
                                    "--type gnocchi_resources_threshold "
                                    "--name alarm_gn1 --metric cpu_util "
                                    "--threshold 80 "
@@ -419,8 +420,8 @@ class AodhClientGnocchiRulesTest(base.Cl
 
         # CREATE WITH --TIME-CONSTRAINT
         result = self.aodh(
-            u'alarm',
-            params=(u"create --type gnocchi_resources_threshold "
+            'alarm',
+            params=("create --type gnocchi_resources_threshold "
                     "--name alarm_tc --metric cpu_util --threshold 80 "
                     "--resource-id %s --resource-type generic "
                     "--aggregation-method last --project-id %s "
@@ -436,8 +437,8 @@ class AodhClientGnocchiRulesTest(base.Cl
 
         # CREATE FAIL MISSING PARAM
         self.assertRaises(exceptions.CommandFailed,
-                          self.aodh, u'alarm',
-                          params=(u"create "
+                          self.aodh, 'alarm',
+                          params=("create "
                                   "--type gnocchi_resources_threshold "
                                   "--name alarm1 --metric cpu_util "
                                   "--resource-id %s --resource-type generic "
@@ -482,8 +483,8 @@ class AodhClientGnocchiRulesTest(base.Cl
 
         # GET BY NAME AND ID ERROR
         self.assertRaises(exceptions.CommandFailed,
-                          self.aodh, u'alarm',
-                          params=(u"show %s --name alarm_gn1" %
+                          self.aodh, 'alarm',
+                          params=("show %s --name alarm_gn1" %
                                   ALARM_ID))
 
         # LIST
@@ -512,8 +513,8 @@ class AodhClientGnocchiRulesTest(base.Cl
         self.assertEqual(sorted_name, names)
         # list with sort with key=name dir=asc and key=alarm_id dir=asc
         result = self.aodh(
-            u'alarm',
-            params=(u"create --type gnocchi_resources_threshold "
+            'alarm',
+            params=("create --type gnocchi_resources_threshold "
                     "--name alarm_th --metric cpu_util --threshold 80 "
                     "--resource-id %s --resource-type generic "
                     "--aggregation-method last --project-id %s "
@@ -575,8 +576,8 @@ class AodhClientGnocchiRulesTest(base.Cl
 
         # CREATE
         result = self.aodh(
-            u'alarm',
-            params=(u"create "
+            'alarm',
+            params=("create "
                     "--type "
                     "gnocchi_aggregation_by_resources_threshold "
                     "--name alarm1 --metric cpu --threshold 80 "
@@ -597,8 +598,8 @@ class AodhClientGnocchiRulesTest(base.Cl
         # CREATE FAIL MISSING PARAM
         self.assertRaises(
             exceptions.CommandFailed,
-            self.aodh, u'alarm',
-            params=(u"create "
+            self.aodh, 'alarm',
+            params=("create "
                     "--type "
                     "gnocchi_aggregation_by_resources_threshold "
                     "--name alarm1 --metric cpu "
@@ -667,8 +668,8 @@ class AodhClientGnocchiRulesTest(base.Cl
 
         # CREATE
         result = self.aodh(
-            u'alarm',
-            params=(u"create "
+            'alarm',
+            params=("create "
                     "--type gnocchi_aggregation_by_metrics_threshold "
                     "--name alarm1 "
                     "--metrics %s "
@@ -688,8 +689,8 @@ class AodhClientGnocchiRulesTest(base.Cl
         # CREATE FAIL MISSING PARAM
         self.assertRaises(
             exceptions.CommandFailed,
-            self.aodh, u'alarm',
-            params=(u"create "
+            self.aodh, 'alarm',
+            params=("create "
                     "--type gnocchi_aggregation_by_metrics_threshold "
                     "--name alarm1 "
                     "--metrics %s "
@@ -763,8 +764,8 @@ class AodhClientGnocchiRulesTest(base.Cl
 
         RESOURCE_ID = uuidutils.generate_uuid()
         # CREATE
-        result = self.aodh(u'alarm',
-                           params=(u"create "
+        result = self.aodh('alarm',
+                           params=("create "
                                    "--type gnocchi_resources_threshold "
                                    "--name alarm_gn123 --metric cpu_util "
                                    "--resource-id %s --threshold 80 "
@@ -829,8 +830,8 @@ class AodhClientGnocchiRulesTest(base.Cl
 
         # CREATE
         result = self.aodh(
-            u'alarm',
-            params=(u"create "
+            'alarm',
+            params=("create "
                     "--type "
                     "gnocchi_aggregation_by_resources_threshold "
                     "--name alarm123 --metric cpu --threshold 80 "
@@ -905,8 +906,8 @@ class AodhClientPrometheusRulesTest(base
         self.assertEqual(200, req.status_code)
 
         # CREATE
-        result = self.aodh(u'alarm',
-                           params=(u"create "
+        result = self.aodh('alarm',
+                           params=("create "
                                    "--type prometheus "
                                    "--name alarm_p1 "
                                    "--threshold 80 "
@@ -920,8 +921,8 @@ class AodhClientPrometheusRulesTest(base
 
         # CREATE WITH --TIME-CONSTRAINT
         result = self.aodh(
-            u'alarm',
-            params=(u"create --type prometheus "
+            'alarm',
+            params=("create --type prometheus "
                     "--name alarm_ptc --threshold 80 "
                     "--time-constraint "
                     "name=cons1;start='0 11 * * *';duration=300 "
@@ -937,8 +938,8 @@ class AodhClientPrometheusRulesTest(base
 
         # CREATE FAIL MISSING PARAM
         self.assertRaises(exceptions.CommandFailed,
-                          self.aodh, u'alarm',
-                          params=(u"create "
+                          self.aodh, 'alarm',
+                          params=("create "
                                   "--type prometheus "
                                   "--name alarm1 "
                                   "--query %s "
@@ -975,8 +976,8 @@ class AodhClientPrometheusRulesTest(base
 
         # GET BY NAME AND ID ERROR
         self.assertRaises(exceptions.CommandFailed,
-                          self.aodh, u'alarm',
-                          params=(u"show %s --name alarm_p1" %
+                          self.aodh, 'alarm',
+                          params=("show %s --name alarm_p1" %
                                   ALARM_ID))
 
         # LIST
@@ -1005,8 +1006,8 @@ class AodhClientPrometheusRulesTest(base
         self.assertEqual(sorted_name, names)
         # list with sort with key=name dir=asc and key=alarm_id dir=asc
         result = self.aodh(
-            u'alarm',
-            params=(u"create --type prometheus "
+            'alarm',
+            params=("create --type prometheus "
                     "--name alarm_p2 --threshold 80 "
                     "--query %s"
                     % QUERY))
diff -pruN 3.7.1-2/aodhclient/tests/functional/test_alarm_history.py 3.9.0-0ubuntu1/aodhclient/tests/functional/test_alarm_history.py
--- 3.7.1-2/aodhclient/tests/functional/test_alarm_history.py	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/tests/functional/test_alarm_history.py	2025-07-10 09:20:01.000000000 +0000
@@ -27,8 +27,8 @@ class AlarmHistoryTest(base.ClientTestBa
         PROJECT_ID = uuidutils.generate_uuid()
         RESOURCE_ID = uuidutils.generate_uuid()
 
-        result = self.aodh(u'alarm',
-                           params=(u"create "
+        result = self.aodh('alarm',
+                           params=("create "
                                    "--type gnocchi_resources_threshold "
                                    "--name history1 --metric cpu_util "
                                    "--threshold 5 "
@@ -38,8 +38,8 @@ class AlarmHistoryTest(base.ClientTestBa
                                    % (RESOURCE_ID, PROJECT_ID)))
         alarm = self.details_multiple(result)[0]
         ALARM_ID = alarm['alarm_id']
-        result = self.aodh(u'alarm',
-                           params=(u"create "
+        result = self.aodh('alarm',
+                           params=("create "
                                    "--type gnocchi_resources_threshold "
                                    "--name history2 --metric cpu_util "
                                    "--threshold 10 "
diff -pruN 3.7.1-2/aodhclient/tests/functional/test_capabilities.py 3.9.0-0ubuntu1/aodhclient/tests/functional/test_capabilities.py
--- 3.7.1-2/aodhclient/tests/functional/test_capabilities.py	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/tests/functional/test_capabilities.py	2025-07-10 09:20:01.000000000 +0000
@@ -17,6 +17,8 @@ class CapabilitiesClientTest(base.Client
     def test_capabilities_scenario(self):
         # GET
         result = self.aodh('capabilities', params="list")
-        caps = self.parser.listing(result)[0]
-        self.assertIsNotNone(caps)
-        self.assertEqual('alarm_storage', caps['Field'])
+        caps = self.parser.listing(result)
+        self.assertEqual(2, len(caps))
+        caps_list = sorted([cap['Field'] for cap in caps])
+        self.assertEqual('alarm_storage', caps_list[0])
+        self.assertEqual('api', caps_list[1])
diff -pruN 3.7.1-2/aodhclient/tests/functional/test_metrics.py 3.9.0-0ubuntu1/aodhclient/tests/functional/test_metrics.py
--- 3.7.1-2/aodhclient/tests/functional/test_metrics.py	1970-01-01 00:00:00.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/tests/functional/test_metrics.py	2025-07-10 09:20:01.000000000 +0000
@@ -0,0 +1,21 @@
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from aodhclient.tests.functional import base
+
+
+class MetricsTest(base.ClientTestBase):
+
+    def test_metrics_scenario(self):
+        # Test that the metrics command doesn't return errors
+        params = "metrics"
+        self.aodh('alarm', params=params)
diff -pruN 3.7.1-2/aodhclient/tests/unit/test_alarm_cli.py 3.9.0-0ubuntu1/aodhclient/tests/unit/test_alarm_cli.py
--- 3.7.1-2/aodhclient/tests/unit/test_alarm_cli.py	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/tests/unit/test_alarm_cli.py	2025-07-10 09:20:01.000000000 +0000
@@ -24,7 +24,7 @@ from aodhclient.v2 import alarm_cli
 class CliAlarmCreateTest(testtools.TestCase):
 
     def setUp(self):
-        super(CliAlarmCreateTest, self).setUp()
+        super().setUp()
         self.app = mock.Mock()
         self.parser = mock.Mock()
         self.cli_alarm_create = (
diff -pruN 3.7.1-2/aodhclient/tests/unit/test_alarm_history.py 3.9.0-0ubuntu1/aodhclient/tests/unit/test_alarm_history.py
--- 3.7.1-2/aodhclient/tests/unit/test_alarm_history.py	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/tests/unit/test_alarm_history.py	2025-07-10 09:20:01.000000000 +0000
@@ -24,7 +24,7 @@ from aodhclient.v2 import alarm_history
 class AlarmHistoryManagerTest(testtools.TestCase):
 
     def setUp(self):
-        super(AlarmHistoryManagerTest, self).setUp()
+        super().setUp()
         self.client = mock.Mock()
 
     @mock.patch.object(alarm_history.AlarmHistoryManager, '_get')
diff -pruN 3.7.1-2/aodhclient/tests/unit/test_alarm_manager.py 3.9.0-0ubuntu1/aodhclient/tests/unit/test_alarm_manager.py
--- 3.7.1-2/aodhclient/tests/unit/test_alarm_manager.py	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/tests/unit/test_alarm_manager.py	2025-07-10 09:20:01.000000000 +0000
@@ -22,7 +22,7 @@ from aodhclient.v2 import alarm
 class AlarmManagerTest(testtools.TestCase):
 
     def setUp(self):
-        super(AlarmManagerTest, self).setUp()
+        super().setUp()
         self.client = mock.Mock()
         self.alarms = {
             'event_alarm': {
diff -pruN 3.7.1-2/aodhclient/tests/unit/test_metrics.py 3.9.0-0ubuntu1/aodhclient/tests/unit/test_metrics.py
--- 3.7.1-2/aodhclient/tests/unit/test_metrics.py	1970-01-01 00:00:00.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/tests/unit/test_metrics.py	2025-07-10 09:20:01.000000000 +0000
@@ -0,0 +1,65 @@
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+import testtools
+from unittest import mock
+
+from aodhclient.v2 import metrics_cli
+
+
+class MetricsTest(testtools.TestCase):
+    def setUp(self):
+        super().setUp()
+        self.app = mock.Mock()
+        self.metrics_mgr_mock = self.app.client_manager.alarming.metrics
+        self.parser = mock.Mock()
+        self.metrics = (
+            metrics_cli.CliMetrics(self.app, self.parser))
+
+    def test_metrics(self):
+        self.metrics_mgr_mock.get.return_value = {
+            "evaluation_results": [
+                {
+                    "alarm_id": "b8e17f58-089a-43fc-a96b-e9bcac4d4b53",
+                    "project_id": "2dd8edd6c8c24f49bf04670534f6b357",
+                    "state_counters": {
+                        "insufficient data": 1646,
+                        "ok": 0,
+                        "alarm": 0
+                    }
+                },
+                {
+                    "alarm_id": "fa386719-67e3-42ff-aec8-17e547dac77a",
+                    "project_id": "2dd8edd6c8c24f49bf04670534f6b357",
+                    "state_counters": {
+                        "insufficient data": 4,
+                        "ok": 923,
+                        "alarm": 0
+                    }
+                },
+                {
+                    "alarm_id": "0788bf8b-fc1f-4889-b5fd-5acd4d287bc3",
+                    "project_id": "d45b070bcce04ca99546128a40854e7c",
+                    "state_counters": {
+                        "insufficient data": 1646,
+                        "ok": 0,
+                        "alarm": 0
+                    }
+                }
+            ]
+        }
+        ret = self.metrics.take_action([])
+
+        self.metrics_mgr_mock.get.assert_called_once_with()
+        self.assertIn('name', ret[0])
+        self.assertIn('evaluation_result', ret[1][0])
diff -pruN 3.7.1-2/aodhclient/tests/unit/test_quota.py 3.9.0-0ubuntu1/aodhclient/tests/unit/test_quota.py
--- 3.7.1-2/aodhclient/tests/unit/test_quota.py	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/tests/unit/test_quota.py	2025-07-10 09:20:01.000000000 +0000
@@ -20,7 +20,7 @@ from aodhclient.v2 import quota_cli
 
 class QuotaShowTest(testtools.TestCase):
     def setUp(self):
-        super(QuotaShowTest, self).setUp()
+        super().setUp()
         self.app = mock.Mock()
         self.quota_mgr_mock = self.app.client_manager.alarming.quota
         self.parser = mock.Mock()
@@ -50,7 +50,7 @@ class QuotaShowTest(testtools.TestCase):
 
 class QuotaSetTest(testtools.TestCase):
     def setUp(self):
-        super(QuotaSetTest, self).setUp()
+        super().setUp()
         self.app = mock.Mock()
         self.quota_mgr_mock = self.app.client_manager.alarming.quota
         self.parser = mock.Mock()
diff -pruN 3.7.1-2/aodhclient/tests/unit/test_utils.py 3.9.0-0ubuntu1/aodhclient/tests/unit/test_utils.py
--- 3.7.1-2/aodhclient/tests/unit/test_utils.py	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/tests/unit/test_utils.py	2025-07-10 09:20:01.000000000 +0000
@@ -1,4 +1,3 @@
-# -*- encoding: utf-8 -*-
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
 #    not use this file except in compliance with the License. You may obtain
diff -pruN 3.7.1-2/aodhclient/utils.py 3.9.0-0ubuntu1/aodhclient/utils.py
--- 3.7.1-2/aodhclient/utils.py	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/utils.py	2025-07-10 09:20:01.000000000 +0000
@@ -1,4 +1,3 @@
-# -*- encoding: utf-8 -*-
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
 #    not use this file except in compliance with the License. You may obtain
@@ -17,11 +16,11 @@ from urllib import parse as urllib_parse
 import pyparsing as pp
 
 uninary_operators = ("not", )
-binary_operator = (u">=", u"<=", u"!=", u">", u"<", u"=", u"==", u"eq", u"ne",
-                   u"lt", u"gt", u"ge", u"le")
-multiple_operators = (u"and", u"or")
+binary_operator = (">=", "<=", "!=", ">", "<", "=", "==", "eq", "ne",
+                   "lt", "gt", "ge", "le")
+multiple_operators = ("and", "or")
 
-operator = pp.Regex(u"|".join(binary_operator))
+operator = pp.Regex("|".join(binary_operator))
 null = pp.Regex("None|none|null").setParseAction(pp.replaceWith(None))
 boolean = "False|True|false|true"
 boolean = pp.Regex(boolean).setParseAction(lambda t: t[0].lower() == "true")
@@ -104,14 +103,14 @@ def format_string_list(objs, field):
 
 def format_dict_list(objs, field):
     objs[field] = "\n".join(
-        "- " + ", ".join("%s: %s" % (k, v)
+        "- " + ", ".join("{}: {}".format(k, v)
                          for k, v in elem.items())
         for elem in objs[field])
 
 
 def format_move_dict_to_root(obj, field):
     for attr in obj[field]:
-        obj["%s/%s" % (field, attr)] = obj[field][attr]
+        obj["{}/{}".format(field, attr)] = obj[field][attr]
     del obj[field]
 
 
@@ -143,7 +142,7 @@ def dict_from_parsed_args(parsed_args, a
 
 
 def dict_to_querystring(objs):
-    return "&".join(["%s=%s" % (k, v)
+    return "&".join(["{}={}".format(k, v)
                      for k, v in objs.items()
                      if v is not None])
 
diff -pruN 3.7.1-2/aodhclient/v2/alarm.py 3.9.0-0ubuntu1/aodhclient/v2/alarm.py
--- 3.7.1-2/aodhclient/v2/alarm.py	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/v2/alarm.py	2025-07-10 09:20:01.000000000 +0000
@@ -26,7 +26,7 @@ class AlarmManager(base.Manager):
     def _filtersdict_to_url(filters):
         urls = []
         for k, v in sorted(filters.items()):
-            url = "q.field=%s&q.op=eq&q.value=%s" % (k, v)
+            url = "q.field={}&q.op=eq&q.value={}".format(k, v)
             urls.append(url)
         return '&'.join(urls)
 
diff -pruN 3.7.1-2/aodhclient/v2/alarm_cli.py 3.9.0-0ubuntu1/aodhclient/v2/alarm_cli.py
--- 3.7.1-2/aodhclient/v2/alarm_cli.py	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/v2/alarm_cli.py	2025-07-10 09:20:01.000000000 +0000
@@ -49,7 +49,7 @@ class CliAlarmList(lister.Lister):
         return key, value
 
     def get_parser(self, prog_name):
-        parser = super(CliAlarmList, self).get_parser(prog_name)
+        parser = super().get_parser(prog_name)
         exclusive_group = parser.add_mutually_exclusive_group()
         exclusive_group.add_argument("--query",
                                      help="Rich query supported by aodh, "
@@ -108,7 +108,7 @@ def _format_alarm(alarm):
         query_rows = []
         for q in alarm['query']:
             op = ALARM_OP_MAP.get(q['op'], q['op'])
-            query_rows.append('%s %s %s' % (q['field'], op, q['value']))
+            query_rows.append('{} {} {}'.format(q['field'], op, q['value']))
         alarm['query'] = ' AND\n'.join(query_rows)
     return alarm
 
@@ -174,7 +174,7 @@ class CliAlarmShow(show.ShowOne):
     def get_parser(self, prog_name):
         return _add_name_to_parser(
             _add_id_to_parser(
-                super(CliAlarmShow, self).get_parser(prog_name)))
+                super().get_parser(prog_name)))
 
     def take_action(self, parsed_args):
         _check_name_and_id(parsed_args, 'query')
@@ -201,7 +201,7 @@ class CliAlarmCreate(show.ShowOne):
 
     def get_parser(self, prog_name):
         parser = _add_name_to_parser(
-            super(CliAlarmCreate, self).get_parser(prog_name),
+            super().get_parser(prog_name),
             required=self.create)
 
         parser.add_argument('-t', '--type', metavar='<TYPE>',
@@ -491,7 +491,7 @@ class CliAlarmUpdate(CliAlarmCreate):
 
     def get_parser(self, prog_name):
         return _add_id_to_parser(
-            super(CliAlarmUpdate, self).get_parser(prog_name))
+            super().get_parser(prog_name))
 
     def take_action(self, parsed_args):
         attributes = self._alarm_from_args(parsed_args)
@@ -522,7 +522,7 @@ class CliAlarmDelete(command.Command):
     def get_parser(self, prog_name):
         return _add_name_to_parser(
             _add_id_to_parser(
-                super(CliAlarmDelete, self).get_parser(prog_name)))
+                super().get_parser(prog_name)))
 
     def take_action(self, parsed_args):
         _check_name_and_id(parsed_args, 'delete')
@@ -548,7 +548,7 @@ class CliAlarmStateGet(show.ShowOne):
     def get_parser(self, prog_name):
         return _add_name_to_parser(
             _add_id_to_parser(
-                super(CliAlarmStateGet, self).get_parser(prog_name)))
+                super().get_parser(prog_name)))
 
     def take_action(self, parsed_args):
         _check_name_and_id(parsed_args, 'get state of')
@@ -577,7 +577,7 @@ class CliAlarmStateSet(show.ShowOne):
     def get_parser(self, prog_name):
         parser = _add_name_to_parser(
             _add_id_to_parser(
-                super(CliAlarmStateSet, self).get_parser(prog_name)))
+                super().get_parser(prog_name)))
         parser.add_argument('--state', metavar='<STATE>',
                             required=True,
                             choices=ALARM_STATES,
diff -pruN 3.7.1-2/aodhclient/v2/alarm_history.py 3.9.0-0ubuntu1/aodhclient/v2/alarm_history.py
--- 3.7.1-2/aodhclient/v2/alarm_history.py	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/v2/alarm_history.py	2025-07-10 09:20:01.000000000 +0000
@@ -37,7 +37,7 @@ class AlarmHistoryManager(base.Manager):
         pagination = utils.get_pagination_options(limit, marker, sorts)
         url = self.url % alarm_id
         if pagination:
-            url = "%s?%s" % (url, pagination)
+            url = "{}?{}".format(url, pagination)
         return self._get(url).json()
 
     def search(self, query=None):
diff -pruN 3.7.1-2/aodhclient/v2/alarm_history_cli.py 3.9.0-0ubuntu1/aodhclient/v2/alarm_history_cli.py
--- 3.7.1-2/aodhclient/v2/alarm_history_cli.py	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/v2/alarm_history_cli.py	2025-07-10 09:20:01.000000000 +0000
@@ -22,7 +22,7 @@ class CliAlarmHistorySearch(lister.Liste
     COLS = ('alarm_id', 'timestamp', 'type', 'detail')
 
     def get_parser(self, prog_name):
-        parser = super(CliAlarmHistorySearch, self).get_parser(prog_name)
+        parser = super().get_parser(prog_name)
         parser.add_argument("--query",
                             help="Rich query supported by aodh, "
                                  "e.g. project_id!=my-id "
@@ -45,7 +45,7 @@ class CliAlarmHistoryShow(lister.Lister)
     COLS = ('timestamp', 'type', 'detail', 'event_id')
 
     def get_parser(self, prog_name):
-        parser = super(CliAlarmHistoryShow, self).get_parser(prog_name)
+        parser = super().get_parser(prog_name)
         parser.add_argument("alarm_id", metavar="<alarm-id>",
                             help="ID of an alarm")
         parser.add_argument("--limit", type=int, metavar="<LIMIT>",
diff -pruN 3.7.1-2/aodhclient/v2/base.py 3.9.0-0ubuntu1/aodhclient/v2/base.py
--- 3.7.1-2/aodhclient/v2/base.py	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/v2/base.py	2025-07-10 09:20:01.000000000 +0000
@@ -14,7 +14,7 @@
 #    under the License.
 
 
-class Manager(object):
+class Manager:
     DEFAULT_HEADERS = {
         "Accept": "application/json",
     }
diff -pruN 3.7.1-2/aodhclient/v2/client.py 3.9.0-0ubuntu1/aodhclient/v2/client.py
--- 3.7.1-2/aodhclient/v2/client.py	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/v2/client.py	2025-07-10 09:20:01.000000000 +0000
@@ -17,10 +17,11 @@ from aodhclient import client
 from aodhclient.v2 import alarm
 from aodhclient.v2 import alarm_history
 from aodhclient.v2 import capabilities
+from aodhclient.v2 import metrics
 from aodhclient.v2 import quota
 
 
-class Client(object):
+class Client:
     """Client for the Aodh v2 API.
 
     :param string session: session
@@ -35,3 +36,4 @@ class Client(object):
         self.alarm_history = alarm_history.AlarmHistoryManager(self)
         self.capabilities = capabilities.CapabilitiesManager(self)
         self.quota = quota.QuotasManager(self)
+        self.metrics = metrics.MetricsManager(self)
diff -pruN 3.7.1-2/aodhclient/v2/metrics.py 3.9.0-0ubuntu1/aodhclient/v2/metrics.py
--- 3.7.1-2/aodhclient/v2/metrics.py	1970-01-01 00:00:00.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/v2/metrics.py	2025-07-10 09:20:01.000000000 +0000
@@ -0,0 +1,26 @@
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from aodhclient.v2 import base
+
+
+class MetricsManager(base.Manager):
+
+    url = "v2/metrics"
+
+    def get(self, all_projects=False):
+        """Get metrics"""
+        if all_projects:
+            return self._get(self.url + "?all_projects=true").json()
+        else:
+            return self._get(self.url).json()
diff -pruN 3.7.1-2/aodhclient/v2/metrics_cli.py 3.9.0-0ubuntu1/aodhclient/v2/metrics_cli.py
--- 3.7.1-2/aodhclient/v2/metrics_cli.py	1970-01-01 00:00:00.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/v2/metrics_cli.py	2025-07-10 09:20:01.000000000 +0000
@@ -0,0 +1,45 @@
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from cliff import lister
+
+from aodhclient import utils
+
+METRIC_COLS = ["name", "labels", "value"]
+
+
+class CliMetrics(lister.Lister):
+    """Get Metrics"""
+
+    @staticmethod
+    def metrics2cols(metrics):
+        cols_data = []
+        if "evaluation_results" in metrics:
+            for alarm in metrics["evaluation_results"]:
+                for state, count in alarm["state_counters"].items():
+                    # prometheus style labels
+                    labels = ('alarm_id="{{{}}}", project_id="{{{}}}", '
+                              'state="{{{}}}"').format(alarm['alarm_id'],
+                                                       alarm['project_id'],
+                                                       state)
+                    cols_data.append(["evaluation_result", labels, count])
+        # Extend for other types of metrics here
+        return METRIC_COLS, cols_data
+
+    def get_parser(self, prog_name):
+        parser = super().get_parser(prog_name)
+        return parser
+
+    def take_action(self, parsed_args):
+        metrics = utils.get_client(self).metrics.get()
+        return self.metrics2cols(metrics)
diff -pruN 3.7.1-2/aodhclient/v2/quota.py 3.9.0-0ubuntu1/aodhclient/v2/quota.py
--- 3.7.1-2/aodhclient/v2/quota.py	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/v2/quota.py	2025-07-10 09:20:01.000000000 +0000
@@ -21,7 +21,7 @@ class QuotasManager(base.Manager):
     def list(self, project=None):
         url = self.base_url
         if project:
-            url = "%s?project_id=%s" % (url, project)
+            url = "{}?project_id={}".format(url, project)
 
         return self._get(url).json()
 
diff -pruN 3.7.1-2/aodhclient/v2/quota_cli.py 3.9.0-0ubuntu1/aodhclient/v2/quota_cli.py
--- 3.7.1-2/aodhclient/v2/quota_cli.py	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient/v2/quota_cli.py	2025-07-10 09:20:01.000000000 +0000
@@ -20,7 +20,7 @@ class QuotaShow(show.ShowOne):
     """Show quota for a project"""
 
     def get_parser(self, prog_name):
-        parser = super(QuotaShow, self).get_parser(prog_name)
+        parser = super().get_parser(prog_name)
         parser.add_argument(
             "--project",
             help="Project ID. If not specified, get quota for the current "
@@ -41,7 +41,7 @@ class QuotaShow(show.ShowOne):
 
 class QuotaSet(show.ShowOne):
     def get_parser(self, prog_name):
-        parser = super(QuotaSet, self).get_parser(prog_name)
+        parser = super().get_parser(prog_name)
         parser.add_argument(
             "project",
             help="Project ID."
diff -pruN 3.7.1-2/aodhclient.egg-info/PKG-INFO 3.9.0-0ubuntu1/aodhclient.egg-info/PKG-INFO
--- 3.7.1-2/aodhclient.egg-info/PKG-INFO	1970-01-01 00:00:00.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient.egg-info/PKG-INFO	2025-07-10 09:21:10.000000000 +0000
@@ -0,0 +1,48 @@
+Metadata-Version: 2.1
+Name: aodhclient
+Version: 3.9.0
+Summary: Python client library for Aodh
+Home-page: https://docs.openstack.org/python-aodhclient/latest/
+Author: OpenStack
+Author-email: openstack-discuss@lists.openstack.org
+Classifier: Environment :: OpenStack
+Classifier: Intended Audience :: Information Technology
+Classifier: Intended Audience :: System Administrators
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Operating System :: POSIX :: Linux
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3 :: Only
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Requires-Python: >=3.10
+License-File: LICENSE
+Requires-Dist: pbr>=2.0
+Requires-Dist: cliff>=1.17.0
+Requires-Dist: osc-lib>=1.0.1
+Requires-Dist: oslo.i18n>=1.5.0
+Requires-Dist: oslo.serialization>=1.4.0
+Requires-Dist: oslo.utils>=2.0.0
+Requires-Dist: osprofiler>=1.4.0
+Requires-Dist: keystoneauth1>=1.0.0
+Requires-Dist: pyparsing>2.1.0
+
+==========
+aodhclient
+==========
+
+Python bindings to the OpenStack Aodh API
+
+This is a client for OpenStack Aodh API. There's a `Python API
+<https://docs.openstack.org/python-aodhclient/latest/api.html>`_ (the
+aodhclient module), and a `command-line script
+<https://docs.openstack.org/python-aodhclient/latest/shell.html>`_ (installed
+as aodh). Each implements the entire OpenStack Aodh API.
+
+* Free software: Apache license
+* Release notes: https://releases.openstack.org/teams/telemetry.html
+* Documentation: https://docs.openstack.org/python-aodhclient/latest/
+* Source: https://opendev.org/openstack/python-aodhclient
+* Bugs: https://storyboard.openstack.org/#!/project/openstack/python-aodhclient
+
diff -pruN 3.7.1-2/aodhclient.egg-info/SOURCES.txt 3.9.0-0ubuntu1/aodhclient.egg-info/SOURCES.txt
--- 3.7.1-2/aodhclient.egg-info/SOURCES.txt	1970-01-01 00:00:00.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient.egg-info/SOURCES.txt	2025-07-10 09:21:10.000000000 +0000
@@ -0,0 +1,107 @@
+.coveragerc
+.pre-commit-config.yaml
+.stestr.conf
+.zuul.yaml
+AUTHORS
+CONTRIBUTING.rst
+ChangeLog
+HACKING.rst
+LICENSE
+README.rst
+bindep.txt
+pyproject.toml
+requirements.txt
+setup.cfg
+setup.py
+test-requirements.txt
+tox.ini
+aodhclient/__init__.py
+aodhclient/client.py
+aodhclient/exceptions.py
+aodhclient/i18n.py
+aodhclient/noauth.py
+aodhclient/osc.py
+aodhclient/shell.py
+aodhclient/utils.py
+aodhclient.egg-info/PKG-INFO
+aodhclient.egg-info/SOURCES.txt
+aodhclient.egg-info/dependency_links.txt
+aodhclient.egg-info/entry_points.txt
+aodhclient.egg-info/not-zip-safe
+aodhclient.egg-info/pbr.json
+aodhclient.egg-info/requires.txt
+aodhclient.egg-info/top_level.txt
+aodhclient/tests/__init__.py
+aodhclient/tests/functional/__init__.py
+aodhclient/tests/functional/base.py
+aodhclient/tests/functional/test_alarm.py
+aodhclient/tests/functional/test_alarm_history.py
+aodhclient/tests/functional/test_capabilities.py
+aodhclient/tests/functional/test_metrics.py
+aodhclient/tests/unit/__init__.py
+aodhclient/tests/unit/test_alarm_cli.py
+aodhclient/tests/unit/test_alarm_history.py
+aodhclient/tests/unit/test_alarm_manager.py
+aodhclient/tests/unit/test_exceptions.py
+aodhclient/tests/unit/test_metrics.py
+aodhclient/tests/unit/test_quota.py
+aodhclient/tests/unit/test_shell.py
+aodhclient/tests/unit/test_utils.py
+aodhclient/v2/__init__.py
+aodhclient/v2/alarm.py
+aodhclient/v2/alarm_cli.py
+aodhclient/v2/alarm_history.py
+aodhclient/v2/alarm_history_cli.py
+aodhclient/v2/base.py
+aodhclient/v2/capabilities.py
+aodhclient/v2/capabilities_cli.py
+aodhclient/v2/client.py
+aodhclient/v2/metrics.py
+aodhclient/v2/metrics_cli.py
+aodhclient/v2/quota.py
+aodhclient/v2/quota_cli.py
+doc/requirements.txt
+doc/source/api.rst
+doc/source/conf.py
+doc/source/contributing.rst
+doc/source/index.rst
+doc/source/installation.rst
+doc/source/shell.rst
+releasenotes/notes/.placeholder
+releasenotes/notes/add-alarm-metrics-command-349e75fbf26171d5.yaml
+releasenotes/notes/add-pagination-support-fcdf1cef0cfa5ca9.yaml
+releasenotes/notes/drop-py-2-7-8f26d7e1e8dc83c2.yaml
+releasenotes/notes/drop-python-3-6-and-3-7-c70234384bc69b1d.yaml
+releasenotes/notes/merge-search-to-list-d44cd65ede348c3e.yaml
+releasenotes/notes/osc-support-9f9dae2d2203f307.yaml
+releasenotes/notes/remove-ceilometer-alarms-02049eef189c2812.yaml
+releasenotes/notes/remove-py38-39f51350ec165758.yaml
+releasenotes/notes/remove-py39-6f2b0e8ce492ef8d.yaml
+releasenotes/notes/split-alarm-query-and-list-5998020b88ddc9f5.yaml
+releasenotes/notes/support-get-set-state-interfaces-67419b925ffd6877.yaml
+releasenotes/notes/ussuri-add-threshold-alarm-47e012620fd611ea.yaml
+releasenotes/source/2023.1.rst
+releasenotes/source/2023.2.rst
+releasenotes/source/2024.1.rst
+releasenotes/source/2024.2.rst
+releasenotes/source/2025.1.rst
+releasenotes/source/conf.py
+releasenotes/source/index.rst
+releasenotes/source/mitaka.rst
+releasenotes/source/newton.rst
+releasenotes/source/ocata.rst
+releasenotes/source/pike.rst
+releasenotes/source/queens.rst
+releasenotes/source/rocky.rst
+releasenotes/source/stein.rst
+releasenotes/source/train.rst
+releasenotes/source/unreleased.rst
+releasenotes/source/ussuri.rst
+releasenotes/source/victoria.rst
+releasenotes/source/wallaby.rst
+releasenotes/source/xena.rst
+releasenotes/source/yoga.rst
+releasenotes/source/zed.rst
+releasenotes/source/_static/.placeholder
+releasenotes/source/_templates/.placeholder
+tools/fix_ca_bundle.sh
\ No newline at end of file
diff -pruN 3.7.1-2/aodhclient.egg-info/dependency_links.txt 3.9.0-0ubuntu1/aodhclient.egg-info/dependency_links.txt
--- 3.7.1-2/aodhclient.egg-info/dependency_links.txt	1970-01-01 00:00:00.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient.egg-info/dependency_links.txt	2025-07-10 09:21:10.000000000 +0000
@@ -0,0 +1 @@
+
diff -pruN 3.7.1-2/aodhclient.egg-info/entry_points.txt 3.9.0-0ubuntu1/aodhclient.egg-info/entry_points.txt
--- 3.7.1-2/aodhclient.egg-info/entry_points.txt	1970-01-01 00:00:00.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient.egg-info/entry_points.txt	2025-07-10 09:21:10.000000000 +0000
@@ -0,0 +1,23 @@
+[console_scripts]
+aodh = aodhclient.shell:main
+
+[keystoneauth1.plugin]
+aodh-noauth = aodhclient.noauth:AodhNoAuthLoader
+
+[openstack.alarming.v2]
+alarm create = aodhclient.v2.alarm_cli:CliAlarmCreate
+alarm delete = aodhclient.v2.alarm_cli:CliAlarmDelete
+alarm list = aodhclient.v2.alarm_cli:CliAlarmList
+alarm metrics = aodhclient.v2.metrics_cli:CliMetrics
+alarm quota set = aodhclient.v2.quota_cli:QuotaSet
+alarm quota show = aodhclient.v2.quota_cli:QuotaShow
+alarm show = aodhclient.v2.alarm_cli:CliAlarmShow
+alarm state get = aodhclient.v2.alarm_cli:CliAlarmStateGet
+alarm state set = aodhclient.v2.alarm_cli:CliAlarmStateSet
+alarm update = aodhclient.v2.alarm_cli:CliAlarmUpdate
+alarm-history search = aodhclient.v2.alarm_history_cli:CliAlarmHistorySearch
+alarm-history show = aodhclient.v2.alarm_history_cli:CliAlarmHistoryShow
+alarming capabilities list = aodhclient.v2.capabilities_cli:CliCapabilitiesList
+
+[openstack.cli.extension]
+metric = aodhclient.osc
diff -pruN 3.7.1-2/aodhclient.egg-info/not-zip-safe 3.9.0-0ubuntu1/aodhclient.egg-info/not-zip-safe
--- 3.7.1-2/aodhclient.egg-info/not-zip-safe	1970-01-01 00:00:00.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient.egg-info/not-zip-safe	2025-07-10 09:21:10.000000000 +0000
@@ -0,0 +1 @@
+
diff -pruN 3.7.1-2/aodhclient.egg-info/pbr.json 3.9.0-0ubuntu1/aodhclient.egg-info/pbr.json
--- 3.7.1-2/aodhclient.egg-info/pbr.json	1970-01-01 00:00:00.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient.egg-info/pbr.json	2025-07-10 09:21:10.000000000 +0000
@@ -0,0 +1 @@
+{"git_version": "678790a", "is_release": true}
\ No newline at end of file
diff -pruN 3.7.1-2/aodhclient.egg-info/requires.txt 3.9.0-0ubuntu1/aodhclient.egg-info/requires.txt
--- 3.7.1-2/aodhclient.egg-info/requires.txt	1970-01-01 00:00:00.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient.egg-info/requires.txt	2025-07-10 09:21:10.000000000 +0000
@@ -0,0 +1,9 @@
+pbr>=2.0
+cliff>=1.17.0
+osc-lib>=1.0.1
+oslo.i18n>=1.5.0
+oslo.serialization>=1.4.0
+oslo.utils>=2.0.0
+osprofiler>=1.4.0
+keystoneauth1>=1.0.0
+pyparsing>2.1.0
diff -pruN 3.7.1-2/aodhclient.egg-info/top_level.txt 3.9.0-0ubuntu1/aodhclient.egg-info/top_level.txt
--- 3.7.1-2/aodhclient.egg-info/top_level.txt	1970-01-01 00:00:00.000000000 +0000
+++ 3.9.0-0ubuntu1/aodhclient.egg-info/top_level.txt	2025-07-10 09:21:10.000000000 +0000
@@ -0,0 +1 @@
+aodhclient
diff -pruN 3.7.1-2/debian/changelog 3.9.0-0ubuntu1/debian/changelog
--- 3.7.1-2/debian/changelog	2025-03-28 09:42:30.000000000 +0000
+++ 3.9.0-0ubuntu1/debian/changelog	2025-07-14 21:24:18.000000000 +0000
@@ -1,243 +1,188 @@
-python-aodhclient (3.7.1-2) unstable; urgency=medium
+python-aodhclient (3.9.0-0ubuntu1) questing; urgency=medium
 
-  * Uploading to unstable.
-
- -- Thomas Goirand <zigo@debian.org>  Fri, 28 Mar 2025 10:42:30 +0100
-
-python-aodhclient (3.7.1-1) experimental; urgency=medium
-
-  * New upstream release.
-
- -- Thomas Goirand <zigo@debian.org>  Mon, 10 Mar 2025 16:20:44 +0100
-
-python-aodhclient (3.7.0-1) experimental; urgency=medium
-
-  * New upstream release.
-  * d/watch: switch to version=4 and mode=git.
-  * Remove fix-dev-reqs.patch.
-
- -- Thomas Goirand <zigo@debian.org>  Mon, 03 Mar 2025 13:50:37 +0100
-
-python-aodhclient (3.6.0-4) unstable; urgency=medium
-
-  * Switch to pybuild (Closes: #1090461).
-
- -- Thomas Goirand <zigo@debian.org>  Thu, 19 Dec 2024 12:06:06 +0100
-
-python-aodhclient (3.6.0-3) unstable; urgency=medium
-
-  * d/watch: use mode=git.
-
- -- Thomas Goirand <zigo@debian.org>  Fri, 01 Nov 2024 14:01:00 +0100
-
-python-aodhclient (3.6.0-2) unstable; urgency=medium
-
-  * Uploading to unstable.
-
- -- Thomas Goirand <zigo@debian.org>  Fri, 20 Sep 2024 09:30:40 +0200
-
-python-aodhclient (3.6.0-1) experimental; urgency=medium
-
-  * New upstream release.
-
- -- Thomas Goirand <zigo@debian.org>  Fri, 06 Sep 2024 14:09:10 +0200
-
-python-aodhclient (3.5.1-3) unstable; urgency=medium
-
-  * Removed python3-migrate build-depends.
+  [ Guillaume Boutry ]
+  * d/gbp.conf, .launchpad.yaml: Sync from cloud-archive-tools for
+    flamingo.
 
- -- Thomas Goirand <zigo@debian.org>  Fri, 12 Jul 2024 07:55:24 +0200
+  [ Myles Penner ]
+  * New upstream release for OpenStack Flamingo. (LP: #2116155)
+  * d/control: Align (Build-)Depends with upstream. 
+  * d/watch: Add validation of Flamingo signing key.
+  * d/u/signing-key.asc: Add Flamingo public key.
 
-python-aodhclient (3.5.1-2) unstable; urgency=medium
+ -- Myles Penner <myles.penner@canonical.com>  Mon, 14 Jul 2025 14:24:18 -0700
 
-  * Uploading to unstable.
-
- -- Thomas Goirand <zigo@debian.org>  Thu, 04 Apr 2024 08:00:21 +0200
-
-python-aodhclient (3.5.1-1) experimental; urgency=medium
-
-  * New upstream release.
-  * Rebased fix-dev-reqs.patch.
-
- -- Thomas Goirand <zigo@debian.org>  Fri, 08 Mar 2024 19:33:29 +0100
-
-python-aodhclient (3.5.0-1) experimental; urgency=medium
-
-  * New upstream release.
-  * Rebased fix-dev-reqs.patch.
-
- -- Thomas Goirand <zigo@debian.org>  Fri, 01 Mar 2024 21:15:12 +0100
-
-python-aodhclient (3.3.0-2) unstable; urgency=medium
-
-  * Uploading to unstable.
+python-aodhclient (3.7.1-0ubuntu1) plucky; urgency=medium
 
- -- Thomas Goirand <zigo@debian.org>  Wed, 04 Oct 2023 14:25:49 +0200
+  * New upstream release for OpenStack Epoxy.
 
-python-aodhclient (3.3.0-1) experimental; urgency=medium
+ -- James Page <james.page@ubuntu.com>  Thu, 06 Mar 2025 14:54:23 +0000
 
-  * New upstream release.
-  * Removed 4 runtimes depends as per upstream.
-  * Fix patches, removing allow-any-version-of-sqlalchemy.patch and adding
-    fix-dev-reqs.patch.
+python-aodhclient (3.7.0-0ubuntu1) plucky; urgency=medium
 
- -- Thomas Goirand <zigo@debian.org>  Thu, 31 Aug 2023 12:53:32 +0200
+  * d/gbp.conf, .launchpad.yaml: Sync from cloud-archive-tools for
+    epoxy.
+  * New upstream release for OpenStack Epoxy.
 
-python-aodhclient (3.2.0-5) unstable; urgency=medium
+ -- James Page <james.page@ubuntu.com>  Fri, 17 Jan 2025 09:26:02 +0000
 
-  * Cleans better (Closes: #1048995).
+python-aodhclient (3.6.0-0ubuntu1) oracular; urgency=medium
 
- -- Thomas Goirand <zigo@debian.org>  Tue, 22 Aug 2023 13:46:09 +0200
+  * d/gbp.conf: upstream-branch -> upstream-dalmatian.
+  * New upstream release for OpenStack Dalmatian.
 
-python-aodhclient (3.2.0-4) unstable; urgency=medium
+ -- James Page <james.page@ubuntu.com>  Tue, 24 Sep 2024 16:27:46 +0100
 
-  * Uploading to unstable.
+python-aodhclient (3.5.1-0ubuntu2) oracular; urgency=medium
 
- -- Thomas Goirand <zigo@debian.org>  Mon, 19 Jun 2023 11:52:57 +0200
+  * d/control: Tidy build and runtime dependencies inline with actual
+    upstream requirements.
 
-python-aodhclient (3.2.0-3) experimental; urgency=medium
+ -- James Page <james.page@ubuntu.com>  Wed, 21 Aug 2024 12:00:10 +0100
 
-  * Also lift other dependency limits.
+python-aodhclient (3.5.1-0ubuntu1) noble; urgency=medium
 
- -- Thomas Goirand <zigo@debian.org>  Wed, 08 Mar 2023 14:49:18 +0100
+  * New upstream point release for OpenStack Caracal. 
 
-python-aodhclient (3.2.0-2) experimental; urgency=medium
+ -- James Page <james.page@canonical.com>  Mon, 11 Mar 2024 10:10:24 +0000
 
-  * Add allow-any-version-of-sqlalchemy.patch.
+python-aodhclient (3.5.0-0ubuntu1) noble; urgency=medium
 
- -- Thomas Goirand <zigo@debian.org>  Wed, 08 Mar 2023 14:42:06 +0100
+  * New upstream point release for OpenStack Caracal. 
+  * d/control: Add os-client-config to BD's.
 
-python-aodhclient (3.2.0-1) experimental; urgency=medium
+ -- James Page <james.page@canonical.com>  Fri, 08 Mar 2024 09:45:44 +0000
 
-  * New upstream release.
-  * Fixed (build-)depends for this release.
+python-aodhclient (3.4.0-0ubuntu1) noble; urgency=medium
 
- -- Thomas Goirand <zigo@debian.org>  Mon, 06 Mar 2023 09:14:55 +0100
-
-python-aodhclient (3.1.0-1) experimental; urgency=medium
-
-  * New upstream release.
-
- -- Thomas Goirand <zigo@debian.org>  Wed, 22 Feb 2023 13:31:37 +0100
-
-python-aodhclient (3.0.0-2) unstable; urgency=medium
-
-  * Uploading to unstable.
-
- -- Thomas Goirand <zigo@debian.org>  Fri, 23 Sep 2022 14:05:13 +0200
+  [ Corey Bryant ]
+  * d/gbp.conf, .launchpad.yaml: Sync from cloud-archive-tools for
+    caracal.
 
-python-aodhclient (3.0.0-1) experimental; urgency=medium
+  [ James Page ]
+  * New upstream release for OpenStack Caracal.
 
-  * New upstream release.
-  * Removed python3-six from (build-)depends.
+ -- James Page <james.page@ubuntu.com>  Wed, 17 Jan 2024 10:35:14 +0000
 
- -- Thomas Goirand <zigo@debian.org>  Wed, 31 Aug 2022 13:20:31 +0200
+python-aodhclient (3.3.0-0ubuntu1) mantic; urgency=medium
 
-python-aodhclient (2.4.1-2) unstable; urgency=medium
+  * d/gbp.conf, .launchpad.yaml: Sync from cloud-archive-tools for
+    bobcat.
+  * New upstream release for OpenStack Bobcat.
+  * d/p/drop-upper-constraints-requirements.patch: Dropped. No longer needed.
 
-  * Uploading to unstable.
-  * Add autopkgtest.
+ -- Corey Bryant <corey.bryant@canonical.com>  Thu, 08 Jun 2023 16:51:55 -0400
 
- -- Thomas Goirand <zigo@debian.org>  Fri, 25 Mar 2022 09:46:52 +0100
+python-aodhclient (3.2.0-0ubuntu2) lunar; urgency=medium
 
-python-aodhclient (2.4.1-1) experimental; urgency=medium
+  * d/p/drop-upper-constraints-requirements.patch: Drop upper-constraint
+    pinning from requirements.txt to fix package installs.
 
-  * New upstream release.
+ -- Corey Bryant <corey.bryant@canonical.com>  Fri, 24 Mar 2023 09:54:52 -0400
 
- -- Thomas Goirand <zigo@debian.org>  Tue, 22 Feb 2022 15:57:18 +0100
+python-aodhclient (3.2.0-0ubuntu1) lunar; urgency=medium
 
-python-aodhclient (2.3.1-1) unstable; urgency=medium
+  * New upstream release for OpenStack Antelope.
+  * d/control: Align (Build-)Depends with upstream.
 
-  * New upstream release.
+ -- Corey Bryant <corey.bryant@canonical.com>  Thu, 23 Mar 2023 13:40:58 -0400
 
- -- Thomas Goirand <zigo@debian.org>  Tue, 11 Jan 2022 11:42:44 +0100
+python-aodhclient (3.0.0-0ubuntu1) kinetic; urgency=medium
 
-python-aodhclient (2.3.0-2) unstable; urgency=medium
+  * New upstream release for OpenStack Zed.
+  * d/control: Update standards version to 4.6.1.
+  * d/control: Align (Build-)Depends with upstream.
 
-  * Uploading to unstable.
+ -- Corey Bryant <corey.bryant@canonical.com>  Wed, 07 Sep 2022 16:36:58 -0400
 
- -- Thomas Goirand <zigo@debian.org>  Wed, 29 Sep 2021 17:09:30 +0200
+python-aodhclient (2.4.1-0ubuntu1) jammy; urgency=medium
 
-python-aodhclient (2.3.0-1) experimental; urgency=medium
+  * New upstream release for OpenStack Yoga.
 
-  * New upstream release.
+ -- Corey Bryant <corey.bryant@canonical.com>  Tue, 01 Mar 2022 13:32:38 -0500
 
- -- Thomas Goirand <zigo@debian.org>  Mon, 20 Sep 2021 16:35:01 +0200
+python-aodhclient (2.4.0-0ubuntu1) jammy; urgency=medium
 
-python-aodhclient (2.2.0-2) unstable; urgency=medium
+  * New upstream release for OpenStack Yoga.
 
-  * Upload to unstable.
+ -- Corey Bryant <corey.bryant@canonical.com>  Tue, 11 Jan 2022 16:57:39 -0500
 
- -- Thomas Goirand <zigo@debian.org>  Mon, 16 Aug 2021 10:10:22 +0200
+python-aodhclient (2.3.1-0ubuntu1) jammy; urgency=medium
 
-python-aodhclient (2.2.0-1) experimental; urgency=medium
+  * New upstream release for OpenStack Yoga.
+  * d/control: Bump debhelper compat to 13.
 
-  * New upstream release.
+ -- Corey Bryant <corey.bryant@canonical.com>  Tue, 11 Jan 2022 16:30:48 -0500
 
- -- Thomas Goirand <zigo@debian.org>  Fri, 12 Mar 2021 15:31:42 +0100
+python-aodhclient (2.3.0-0ubuntu1) impish; urgency=medium
 
-python-aodhclient (2.1.1-1) unstable; urgency=medium
+  * New upstream release for OpenStack Xena.
 
-  * New upstream release.
-  * Fixed debian/watch.
-  * Add a debian/salsa-ci.yml.
-  * Removed python3-mock from build-depends.
+ -- Chris MacNaughton <chris.macnaughton@ubuntu.com>  Wed, 06 Oct 2021 12:34:23 +0000
 
- -- Thomas Goirand <zigo@debian.org>  Fri, 16 Oct 2020 11:46:19 +0200
+python-aodhclient (2.1.1-0ubuntu2) impish; urgency=medium
 
-python-aodhclient (2.0.1-2) unstable; urgency=medium
+  * d/control: Update VCS paths for move to lp:~ubuntu-openstack-dev.
+  * d/control: Drop python-pbr, python2 build depends.
 
-  * Uploading to unstable.
+ -- Chris MacNaughton <chris.macnaughton@ubuntu.com>  Wed, 23 Jun 2021 08:04:26 +0000
 
- -- Thomas Goirand <zigo@debian.org>  Fri, 08 May 2020 22:47:38 +0200
+python-aodhclient (2.1.1-0ubuntu1) groovy; urgency=medium
 
-python-aodhclient (2.0.1-1) experimental; urgency=medium
+  * New upstream release for OpenStack Victoria.
 
-  * New upstream release.
+ -- Corey Bryant <corey.bryant@canonical.com>  Fri, 11 Sep 2020 15:23:51 -0400
 
- -- Thomas Goirand <zigo@debian.org>  Wed, 08 Apr 2020 17:29:47 +0200
+python-aodhclient (2.1.0-0ubuntu1) groovy; urgency=medium
 
-python-aodhclient (1.3.0-2) unstable; urgency=medium
+  * New upstream release for OpenStack Victoria.
+  * d/control: Align (Build-)Depends with upstream.
 
-  * Switched autopkg test to Python 3 (Closes: #943219).
+ -- Chris MacNaughton <chris.macnaughton@canonical.com>  Fri, 24 Jul 2020 07:42:20 +0000
 
- -- Thomas Goirand <zigo@debian.org>  Wed, 23 Oct 2019 12:05:50 +0200
+python-aodhclient (2.0.1-0ubuntu1) groovy; urgency=medium
 
-python-aodhclient (1.3.0-1) unstable; urgency=medium
+  * New upstream release for OpenStack Victoria.
+  * d/control: Align (Build-)Depends with upstream.
+  * d/control: Update Standards-Version to 4.5.0.
+  * d/rules: Switch to pybuild.
 
-  [ Ondřej Nový ]
-  * Use debhelper-compat instead of debian/compat.
-  * Bump Standards-Version to 4.4.1.
+ -- Chris MacNaughton <chris.macnaughton@canonical.com>  Fri, 12 Jun 2020 06:12:24 +0000
 
-  [ Thomas Goirand ]
-  * New upstream release.
-  * Fixed (build-)depends for this release.
+python-aodhclient (1.1.1-0ubuntu3) eoan; urgency=medium
 
- -- Thomas Goirand <zigo@debian.org>  Mon, 21 Oct 2019 01:04:21 +0200
+  * d/tests/control: Drop test dependency for python-aodhclient.
 
-python-aodhclient (1.2.0-2) unstable; urgency=medium
+ -- James Page <james.page@ubuntu.com>  Tue, 01 Oct 2019 09:13:17 +0100
 
-  * Uploading to unstable.
+python-aodhclient (1.1.1-0ubuntu2) eoan; urgency=medium
 
- -- Thomas Goirand <zigo@debian.org>  Wed, 17 Jul 2019 04:30:21 +0200
+  * Drop Python 2 support:
+    - d/control: Drop python-aodhclient binary package
+    - d/control: Drop BDI's on python-* packages.
+    - d/rules: Tweak to stop build and install of Python 2 parts.
+    - d/*.postinst,prerm,postrm: Drop, alternatives no longer needed.
 
-python-aodhclient (1.2.0-1) experimental; urgency=medium
+ -- James Page <james.page@ubuntu.com>  Wed, 10 Jul 2019 15:29:24 +0100
 
-  * New upstream release.
-  * Removed Python 2 support.
-  * Using Python 3 for buildng the doc.
+python-aodhclient (1.1.1-0ubuntu1) disco; urgency=medium
 
- -- Thomas Goirand <zigo@debian.org>  Fri, 22 Mar 2019 11:07:57 +0100
+  * New upstream release for OpenStack Stein.
+  * d/control: Align (Build-)Depends with upstream.
 
-python-aodhclient (1.1.0-1) experimental; urgency=medium
+ -- Corey Bryant <corey.bryant@canonical.com>  Wed, 30 Jan 2019 10:16:44 -0500
 
-  [ Ondřej Nový ]
-  * d/control: Use team+openstack@tracker.debian.org as maintainer
+python-aodhclient (1.1.0-0ubuntu1) cosmic; urgency=low
 
-  [ Thomas Goirand ]
-  * New upstream release.
+  * Merge from Debian unstable.  Remaining changes:
+    - d/control: Enable autopkgtest-pkg-python testsuite.
+    - d/gbp.conf: Retain for gbp and pristine-tar config.
+    - d/watch: Get orig tarball from tarballs.openstack.org.
+    - d/tests/*: Test python2/3 clients.
+  * New upstream release for OpenStack Rocky.
+  * d/control: Align (Build-)Depends with upstream.
 
- -- Thomas Goirand <zigo@debian.org>  Mon, 20 Aug 2018 17:29:22 +0200
+ -- Corey Bryant <corey.bryant@canonical.com>  Tue, 31 Jul 2018 14:42:26 -0400
 
 python-aodhclient (1.0.0-3) unstable; urgency=medium
 
@@ -264,6 +209,16 @@ python-aodhclient (1.0.0-1) experimental
 
  -- Thomas Goirand <zigo@debian.org>  Mon, 12 Feb 2018 07:55:07 +0000
 
+python-aodhclient (1.0.0-0ubuntu1) bionic; urgency=medium
+
+  * New upstream release.
+  * d/*: wrap-and-sort -bast.
+  * d/control: Update Standards-Version to 4.1.2.
+  * d/control: Bump debhelper compat to 10.
+  * d/control: Align (Build-)Depends with upstream.
+
+ -- Corey Bryant <corey.bryant@canonical.com>  Mon, 12 Feb 2018 09:22:29 -0500
+
 python-aodhclient (0.9.0-2) unstable; urgency=medium
 
   * Uploading to unstable.
@@ -296,6 +251,42 @@ python-aodhclient (0.9.0-1) experimental
 
  -- Thomas Goirand <zigo@debian.org>  Tue, 03 Oct 2017 16:41:11 +0200
 
+python-aodhclient (0.9.0-0ubuntu1) artful; urgency=medium
+
+  [ Chuck Short ]
+  * New upstream release.
+
+  [ James Page ]
+  * d/watch: Use tarballs.openstack.org.
+
+ -- James Page <james.page@ubuntu.com>  Fri, 21 Apr 2017 09:51:29 +0100
+
+python-aodhclient (0.8.0-0ubuntu1) zesty; urgency=medium
+
+  [ Corey Bryant ]
+  * d/gbp.conf: Update gbp configuration file.
+  * d/control: Update Vcs-* links and maintainers.
+
+  [ Chuck Short ]
+  * New upstream version.
+  * d/control: Align (Build-)Depends with upstream.
+
+ -- Chuck Short <zulcss@ubuntu.com>  Mon, 30 Jan 2017 12:57:51 -0500
+
+python-aodhclient (0.7.0-0ubuntu1) yakkety; urgency=medium
+
+  [ Ondřej Nový ]
+  * Standards-Version is 3.9.8 now (no change)
+  * d/copyright: Changed source URL to https protocol
+
+  [ Corey Bryant ]
+  * New upstream release.
+  * d/control: Align (Build-)Depends with upstream.
+  * d/gbp.conf: Update debian-branch for Newton.
+  * d/tests/*: Test python2-aodh and python3-aodh clients and exit on error.
+
+ -- Corey Bryant <corey.bryant@canonical.com>  Fri, 02 Sep 2016 15:49:29 +0100
+
 python-aodhclient (0.3.0-2) unstable; urgency=medium
 
   * Uploading to unstable.
@@ -321,3 +312,4 @@ python-aodhclient (0.1.0-1) experimental
   * Initial release. (Closes: #813198)
 
  -- Thomas Goirand <zigo@debian.org>  Sat, 30 Jan 2016 20:59:16 +0800
+
diff -pruN 3.7.1-2/debian/control 3.9.0-0ubuntu1/debian/control
--- 3.7.1-2/debian/control	2025-03-28 09:42:30.000000000 +0000
+++ 3.9.0-0ubuntu1/debian/control	2025-07-14 21:24:18.000000000 +0000
@@ -1,43 +1,43 @@
 Source: python-aodhclient
 Section: python
 Priority: optional
-Maintainer: Debian OpenStack <team+openstack@tracker.debian.org>
+Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
+XSBC-Original-Maintainer: Debian OpenStack <openstack-devel@lists.alioth.debian.org>
 Uploaders:
  Thomas Goirand <zigo@debian.org>,
 Build-Depends:
- debhelper-compat (= 10),
+ debhelper-compat (= 13),
  dh-python,
  openstack-pkg-tools,
  python3-all,
- python3-pbr,
+ python3-pbr (>= 2.0),
  python3-setuptools,
- python3-sphinx (>= 1.6.2),
+ python3-sphinx (>= 2.1.1),
 Build-Depends-Indep:
- python3-cliff,
- python3-coverage,
- python3-hacking,
- python3-keystoneauth1,
+ python3-cliff (>= 1.17.0),
+ python3-keystoneauth1 (>= 1.0.0),
  python3-keystonemiddleware,
- python3-openstackdocstheme,
- python3-osc-lib,
- python3-oslo.db (>= 12.3.1),
- python3-oslo.i18n,
- python3-oslo.serialization,
- python3-oslo.utils,
- python3-oslotest,
- python3-osprofiler,
+ python3-openstackdocstheme (>= 2.2.1),
+ python3-os-client-config (>= 1.28.0),
+ python3-osc-lib (>= 1.0.1),
+ python3-oslo.i18n (>= 1.5.0),
+ python3-oslo.serialization (>= 1.4.0),
+ python3-oslo.utils (>= 2.0.0),
+ python3-oslotest (>= 1:1.10.0),
+ python3-osprofiler (>= 1.4.0),
  python3-pyparsing,
  python3-sqlalchemy,
  python3-sqlalchemy-utils,
- python3-stestr,
- python3-tempest,
+ python3-stestr (>= 2.0.0),
+ python3-subunit,
+ python3-tempest (>= 1:10),
+ python3-testrepository,
  python3-testscenarios,
- python3-testtools,
- subunit,
-Standards-Version: 4.4.1
-Vcs-Browser: https://salsa.debian.org/openstack-team/clients/python-aodhclient
-Vcs-Git: https://salsa.debian.org/openstack-team/clients/python-aodhclient.git
-Homepage: http://www.openstack.org
+ python3-testtools (>= 1.4.0),
+Standards-Version: 4.6.1
+Vcs-Git: https://git.launchpad.net/~ubuntu-openstack-dev/ubuntu/+source/python-aodhclient
+Homepage: https://www.openstack.org
+Testsuite: autopkgtest-pkg-python
 
 Package: python-aodhclient-doc
 Section: doc
@@ -58,14 +58,15 @@ Description: OpenStack Alarming as a Ser
 Package: python3-aodhclient
 Architecture: all
 Depends:
- python3-cliff,
- python3-keystoneauth1,
- python3-osc-lib,
- python3-oslo.i18n,
- python3-oslo.serialization,
- python3-oslo.utils,
- python3-osprofiler,
- python3-pbr,
+ python3-cliff (>= 1.17.0),
+ python3-keystoneauth1 (>= 1.0.0),
+ python3-osc-lib (>= 1.0.1),
+ python3-oslo.i18n (>= 1.5.0),
+ python3-oslo.serialization (>= 1.4.0),
+ python3-oslo.utils (>= 2.0.0),
+ python3-osprofiler (>= 1.4.0),
+ python3-pbr (>= 2.0),
+ python3-pyparsing,
  ${misc:Depends},
  ${python3:Depends},
 Suggests:
diff -pruN 3.7.1-2/debian/gbp.conf 3.9.0-0ubuntu1/debian/gbp.conf
--- 3.7.1-2/debian/gbp.conf	1970-01-01 00:00:00.000000000 +0000
+++ 3.9.0-0ubuntu1/debian/gbp.conf	2025-07-14 21:24:18.000000000 +0000
@@ -0,0 +1,9 @@
+[DEFAULT]
+debian-branch = master
+upstream-tag = %(version)s
+pristine-tar = True
+upstream-branch = upstream-flamingo
+
+[buildpackage]
+export-dir = ../build-area
+prebuild = [ ! -f .launchpad.yaml ] || rm .launchpad.yaml
diff -pruN 3.7.1-2/debian/python3-aodhclient.postrm 3.9.0-0ubuntu1/debian/python3-aodhclient.postrm
--- 3.7.1-2/debian/python3-aodhclient.postrm	2025-03-28 09:42:30.000000000 +0000
+++ 3.9.0-0ubuntu1/debian/python3-aodhclient.postrm	1970-01-01 00:00:00.000000000 +0000
@@ -1,11 +0,0 @@
-#!/bin/sh
-
-set -e
-
-if [ "$1" = "remove" ] || [ "$1" = "disappear" ] ; then
-	update-alternatives --remove aodh /usr/bin/python3-aodh
-fi
-
-#DEBHELPER#
-
-exit 0
diff -pruN 3.7.1-2/debian/python3-aodhclient.prerm 3.9.0-0ubuntu1/debian/python3-aodhclient.prerm
--- 3.7.1-2/debian/python3-aodhclient.prerm	2025-03-28 09:42:30.000000000 +0000
+++ 3.9.0-0ubuntu1/debian/python3-aodhclient.prerm	1970-01-01 00:00:00.000000000 +0000
@@ -1,11 +0,0 @@
-#!/bin/sh
-
-set -e
-
-if [ "$1" = "remove" ] ; then
-	update-alternatives --remove aodh /usr/bin/python3-aodh
-fi
-
-#DEBHELPER#
-
-exit 0
diff -pruN 3.7.1-2/debian/rules 3.9.0-0ubuntu1/debian/rules
--- 3.7.1-2/debian/rules	2025-03-28 09:42:30.000000000 +0000
+++ 3.9.0-0ubuntu1/debian/rules	2025-07-14 21:24:18.000000000 +0000
@@ -1,22 +1,20 @@
 #!/usr/bin/make -f
 
 MANIFEST_EXCLUDE_STANDARD := aodhclient
+
+export PYBUILD_NAME=aodhclient
+
 include /usr/share/openstack-pkg-tools/pkgos.make
 
 %:
 	dh $@ --buildsystem=pybuild --with python3,sphinxdoc
 
-override_dh_auto_clean:
-	rm -rf doc/man build .stestr *.egg-info doc/source/ref
-	find . -iname '*.pyc' -delete
-	for i in $$(find . -type d -iname __pycache__) ; do rm -rf $$i ; done
-
-override_dh_auto_build:
-	echo "Do nothing..."
-
 override_dh_auto_install:
 	pkgos-dh_auto_install --no-py2
 
+override_dh_python3:
+	dh_python3 --shebang=/usr/bin/python3
+
 override_dh_auto_test:
 ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
 	pkgos-dh_auto_test --no-py2 'aodhclient\.tests\.unit\.(?!.*test_client.ClientAuthTest\.test_discover_auth_versions.*)'
@@ -24,17 +22,19 @@ endif
 
 override_dh_sphinxdoc:
 ifeq (,$(findstring nodoc, $(DEB_BUILD_OPTIONS)))
-	python3 -m sphinx -b html doc/source $(CURDIR)/debian/python-aodhclient-doc/usr/share/doc/python-aodhclient-doc/html
-	dh_sphinxdoc
+	sphinx-build -b html doc/source $(CURDIR)/debian/python-aodhclient-doc/usr/share/doc/python-aodhclient-doc/html
+	dh_sphinxdoc -O--buildsystem=pybuild
 endif
 
+override_dh_clean:
+	dh_clean -O--buildsystem=pybuild
+	rm -rf .testrepository
+	rm -rf doc/man
+
 override_dh_installman:
 #ifeq (,$(findstring nodocs, $(DEB_BUILD_OPTIONS)))
 #	sphinx-build -b man doc/source doc/man
 #	mv doc/man/python-aodhclient.1 doc/man/aodh.1
 #	sed -i s/python-aodhclient/python-aodhclient/ doc/man/aodh.1
-#	dh_installman
+#	dh_installman -O--buildsystem=python_distutils
 #endif
-
-override_dh_python3:
-	dh_python3 --shebang=/usr/bin/python3
diff -pruN 3.7.1-2/debian/salsa-ci.yml 3.9.0-0ubuntu1/debian/salsa-ci.yml
--- 3.7.1-2/debian/salsa-ci.yml	2025-03-28 09:42:30.000000000 +0000
+++ 3.9.0-0ubuntu1/debian/salsa-ci.yml	1970-01-01 00:00:00.000000000 +0000
@@ -1,3 +0,0 @@
-include:
-  - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml
-  - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml
diff -pruN 3.7.1-2/debian/source/options 3.9.0-0ubuntu1/debian/source/options
--- 3.7.1-2/debian/source/options	2025-03-28 09:42:30.000000000 +0000
+++ 3.9.0-0ubuntu1/debian/source/options	2025-07-14 21:24:18.000000000 +0000
@@ -1 +1,2 @@
 extend-diff-ignore = "^[^/]*[.]egg-info/"
+extend-diff-ignore = "^.launchpad.yaml"
diff -pruN 3.7.1-2/debian/tests/client 3.9.0-0ubuntu1/debian/tests/client
--- 3.7.1-2/debian/tests/client	1970-01-01 00:00:00.000000000 +0000
+++ 3.9.0-0ubuntu1/debian/tests/client	2025-07-14 21:24:18.000000000 +0000
@@ -0,0 +1,17 @@
+#!/bin/bash
+#-------------------------
+# Testing client utilities
+#-------------------------
+set -e
+
+HELP_CLIENTS=('aodh')
+for client in "${HELP_CLIENTS[@]}"; do
+    RET=$($client -h 2>&1 > /dev/null)
+
+    if [[ $RET ]]; then
+        echo "ERROR, ${client} is not running" >&2
+        exit 1
+    else
+        echo "OK: ${client} ran"
+    fi
+done
diff -pruN 3.7.1-2/debian/tests/control 3.9.0-0ubuntu1/debian/tests/control
--- 3.7.1-2/debian/tests/control	2025-03-28 09:42:30.000000000 +0000
+++ 3.9.0-0ubuntu1/debian/tests/control	2025-07-14 21:24:18.000000000 +0000
@@ -1,5 +1,3 @@
-Tests: unittests
+Tests: client
 Depends:
- @,
- @builddeps@,
-Restrictions: allow-stderr needs-root
+ python3-aodhclient,
diff -pruN 3.7.1-2/debian/tests/unittests 3.9.0-0ubuntu1/debian/tests/unittests
--- 3.7.1-2/debian/tests/unittests	2025-03-28 09:42:30.000000000 +0000
+++ 3.9.0-0ubuntu1/debian/tests/unittests	1970-01-01 00:00:00.000000000 +0000
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-set -e
-
-pkgos-dh_auto_test --no-py2 'aodhclient\.tests\.unit\.(?!.*test_client.ClientAuthTest\.test_discover_auth_versions.*)'
diff -pruN 3.7.1-2/debian/upstream/signing-key.asc 3.9.0-0ubuntu1/debian/upstream/signing-key.asc
--- 3.7.1-2/debian/upstream/signing-key.asc	1970-01-01 00:00:00.000000000 +0000
+++ 3.9.0-0ubuntu1/debian/upstream/signing-key.asc	2025-07-14 21:24:18.000000000 +0000
@@ -0,0 +1,34 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mDMEZ92jlhYJKwYBBAHaRw8BAQdAnSMr01EpuQHlcTQ8c0ENVDFs9mi/TdWB0IlG
+ZF1eC2S0Qk9wZW5TdGFjayBJbmZyYSAoMjAyNS4yL0ZsYW1pbmdvIEN5Y2xlKSA8
+aW5mcmEtcm9vdEBvcGVuc3RhY2sub3JnPoiWBBMWCAA+FiEExxsAfvl4h/2PtjZc
+60/W1hjmIYEFAmfdo5YCGwMFCQFj9QAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AA
+CgkQ60/W1hjmIYElLAEAkMjANVr+kVjZGp8KtliT+ySFAqoCQceuscYt7WmeD4wA
+/2gHNfFDJwkWn9JY9mCR2y7gwf6skTWl3ssPogTa84wDiHUEEBYIAB0WIQQiKE9p
+2ezN8994GXkccRrxk/+OVAUCZ92k6wAKCRAccRrxk/+OVMQGAQD0X/Eow2mK/YzZ
+rMO60g2KI767/rnKJWKFUTCZCfswxwD/WxuGjGRB98RZ9IbCcmaUvRqHf9812h60
+/RCoB4AtiwSJAjMEEAEKAB0WIQSXrklvwC3sn8NTsudI+ZYRQ0lYKQUCZ92vKwAK
+CRBI+ZYRQ0lYKdthD/wJh0uxw05WsmFwjuds82JdnH9ow3OdG/0bhds8eEvgYuQe
+ZEQ9/RC5hJ+SiV+/zclIaG+xYHW3VkZUgOmmLxRzmqFbWbDm5yKp7jTqM2zYB4Jx
+EiLB4dWHZFmrcqfkJ06nXVMjGkj73N+DqHWQ6hleaiE7tcbI++w1AN7niL0rW008
+iP8IHoWLh2dJxQlcheVdjCe0jEU3qO8KxhUTeARPD/Vp1CpJWlq9vWs9/bweMrtj
+FsQwxBiZcQ/0zXDnQFUKpbNDFjQZnjmmwTqhopquL5e5mZWr0NussI20JXyZHj7T
+N5ikDAFPf9iM1Apb+/g9njGUgYFEOgEJuDr1oLolZ+9+7uZrKGD1gmdY7pVG12Xn
+2QJ3rft/Wy8Obac+TdA+UoEYQu4LOUpUOmPOcXE/8/fTxybkQGOZm1Ufaddz+6ee
+uHBbIaxI1kh5MrxH5cIaEkvdjOGg+bMyq7C8CE8WgSEN/JiupEZYgDduOSuqGHDp
++9ydEkanNjGN+K4rXJ7ABBv9freINx5kmCAaDzXeIAL8n1/Rzd6Z/acOlC9omDM0
+mYKKIfLMp6Rp7SKnB37Tp0dKGP4r/SJsx5Sxn7XrktVJ1ht5ByipDD6VBN3+OQPx
+56pRLDCk9EFDjbOW0iKzyPx+Nya5G9CN9AqQXe1MlHsFn+q7DEUSmlGZfvtjN7g4
+BGfdo5YSCisGAQQBl1UBBQEBB0DHSvmmZUEZ94olzKZSHa2HBCWhrhOVNFn/0ag8
+KyY5fQMBCAeIfgQYFggAJhYhBMcbAH75eIf9j7Y2XOtP1tYY5iGBBQJn3aOWAhsM
+BQkBY/UAAAoJEOtP1tYY5iGB6XcA+wY0JUi2ZUqH0CRs4EfS6VML/7u08g8ZByN4
+DZ2htqOGAQDmGHHjpMhKz04eDXLpNO6UZ/Q6LnqEXztW8eBXVtiZALgzBGfdpHYW
+CSsGAQQB2kcPAQEHQKH/4Td8MRK/9UxGyPqWWaZl88m4xE48XM4kP6w3asRViO8E
+GBYIACAWIQTHGwB++XiH/Y+2NlzrT9bWGOYhgQUCZ92kdgIbAgCBCRDrT9bWGOYh
+gXYgBBkWCAAdFiEE3cFPzrMpT3Q4I7HG9zFcLOa3NF0FAmfdpHYACgkQ9zFcLOa3
+NF1xqwEA3muioM6tJtSbiCUCDau2QnalBkfov/A2FFIxvnyHbH0A/051M0O09Tcl
+E7tAieH8W63Jhg3n/GzKl36hXqh3ANML8kIA/0eu6JgK+F0s8iiy+sQecTD7W38B
+A8CSZ29ANdlMwzf7AP9araqMvKRpTMAzhQ+1Eluh8FmXQhzeZDhlIZ8DQDQ/CQ==
+=FVKc
+-----END PGP PUBLIC KEY BLOCK-----
diff -pruN 3.7.1-2/debian/watch 3.9.0-0ubuntu1/debian/watch
--- 3.7.1-2/debian/watch	2025-03-28 09:42:30.000000000 +0000
+++ 3.9.0-0ubuntu1/debian/watch	2025-07-14 21:24:18.000000000 +0000
@@ -1,3 +1,3 @@
-version=4
-opts="mode=git,uversionmangle=s/\.0rc/~rc/;s/\.0b1/~b1/;s/\.0b2/~b2/;s/\.0b3/~b3/" \
-https://github.com/openstack/python-aodhclient refs/tags/(\d[brc\d\.]+)
+version=3
+opts=uversionmangle=s/\.(b|rc)/~$1/,pgpsigurlmangle=s/$/.asc/ \
+    http://tarballs.openstack.org/python-aodhclient/ aodhclient-(\d.*)\.tar\.gz
diff -pruN 3.7.1-2/doc/source/conf.py 3.9.0-0ubuntu1/doc/source/conf.py
--- 3.7.1-2/doc/source/conf.py	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/doc/source/conf.py	2025-07-10 09:20:01.000000000 +0000
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
@@ -26,7 +25,7 @@ def gen_ref(ver, title, names):
     refdir = os.path.join(BASE_DIR, "ref")
     pkg = "aodhclient"
     if ver:
-        pkg = "%s.%s" % (pkg, ver)
+        pkg = "{}.{}".format(pkg, ver)
         refdir = os.path.join(refdir, ver)
     if not os.path.exists(refdir):
         os.makedirs(refdir)
@@ -55,6 +54,7 @@ def gen_ref(ver, title, names):
                              "signs": "=" * len(name),
                              "pkg": pkg, "name": name})
 
+
 gen_ref("v2", "Version 2 API", ["client"])
 
 # -- General configuration ----------------------------------------------------
@@ -64,7 +64,7 @@ gen_ref("v2", "Version 2 API", ["client"
 extensions = [
     'sphinx.ext.autodoc',
     'openstackdocstheme',
-    #'sphinx.ext.intersphinx',
+    # 'sphinx.ext.intersphinx',
 ]
 
 # autodoc generation is a bit aggressive and a nuisance when doing heavy
@@ -81,7 +81,7 @@ master_doc = 'index'
 openstackdocs_repo_name = 'openstack/python-aodhclient'
 openstackdocs_bug_project = 'python-aodhclient'
 openstackdocs_bug_tag = ''
-copyright = u'2015, OpenStack Foundation'
+copyright = '2015, OpenStack Foundation'
 
 # If true, '()' will be appended to :func: etc. cross-reference text.
 add_function_parentheses = True
@@ -103,7 +103,7 @@ pygments_style = 'native'
 html_theme = 'openstackdocs'
 
 # Add any paths that contain custom themes here, relative to this directory.
-#html_theme_path = ['_theme']
+# html_theme_path = ['_theme']
 
 # Output file base name for HTML help builder.
 htmlhelp_basename = 'aodhclientdoc'
@@ -114,9 +114,9 @@ htmlhelp_basename = 'aodhclientdoc'
 latex_documents = [
     ('index',
      'aodhclient.tex',
-     u'aodhclient Documentation',
-     u'OpenStack Foundation', 'manual'),
+     'aodhclient Documentation',
+     'OpenStack Foundation', 'manual'),
 ]
 
 # Example configuration for intersphinx: refer to the Python standard library.
-#intersphinx_mapping = {'http://docs.python.org/': None}
+# intersphinx_mapping = {'http://docs.python.org/': None}
diff -pruN 3.7.1-2/pyproject.toml 3.9.0-0ubuntu1/pyproject.toml
--- 3.7.1-2/pyproject.toml	1970-01-01 00:00:00.000000000 +0000
+++ 3.9.0-0ubuntu1/pyproject.toml	2025-07-10 09:20:01.000000000 +0000
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["pbr>=6.0.0", "setuptools>=64.0.0"]
+build-backend = "pbr.build"
diff -pruN 3.7.1-2/releasenotes/notes/add-alarm-metrics-command-349e75fbf26171d5.yaml 3.9.0-0ubuntu1/releasenotes/notes/add-alarm-metrics-command-349e75fbf26171d5.yaml
--- 3.7.1-2/releasenotes/notes/add-alarm-metrics-command-349e75fbf26171d5.yaml	1970-01-01 00:00:00.000000000 +0000
+++ 3.9.0-0ubuntu1/releasenotes/notes/add-alarm-metrics-command-349e75fbf26171d5.yaml	2025-07-10 09:20:01.000000000 +0000
@@ -0,0 +1,4 @@
+---
+features:
+  - |
+    Added a ``alarm metrics`` command to retrieve alarming metrics from the aodh /v2/metrics API endpoint.
diff -pruN 3.7.1-2/releasenotes/notes/remove-py39-6f2b0e8ce492ef8d.yaml 3.9.0-0ubuntu1/releasenotes/notes/remove-py39-6f2b0e8ce492ef8d.yaml
--- 3.7.1-2/releasenotes/notes/remove-py39-6f2b0e8ce492ef8d.yaml	1970-01-01 00:00:00.000000000 +0000
+++ 3.9.0-0ubuntu1/releasenotes/notes/remove-py39-6f2b0e8ce492ef8d.yaml	2025-07-10 09:20:01.000000000 +0000
@@ -0,0 +1,5 @@
+---
+upgrade:
+  - |
+    Support for Python 3.9 has been removed. Now Python 3.10 is the minimum
+    version supported.
diff -pruN 3.7.1-2/releasenotes/source/2025.1.rst 3.9.0-0ubuntu1/releasenotes/source/2025.1.rst
--- 3.7.1-2/releasenotes/source/2025.1.rst	1970-01-01 00:00:00.000000000 +0000
+++ 3.9.0-0ubuntu1/releasenotes/source/2025.1.rst	2025-07-10 09:20:01.000000000 +0000
@@ -0,0 +1,6 @@
+===========================
+2025.1 Series Release Notes
+===========================
+
+.. release-notes::
+   :branch: stable/2025.1
diff -pruN 3.7.1-2/releasenotes/source/conf.py 3.9.0-0ubuntu1/releasenotes/source/conf.py
--- 3.7.1-2/releasenotes/source/conf.py	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/releasenotes/source/conf.py	2025-07-10 09:20:01.000000000 +0000
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
@@ -55,7 +54,7 @@ master_doc = 'index'
 openstackdocs_repo_name = 'openstack/python-aodhclient'
 openstackdocs_bug_project = 'python-aodhclient'
 openstackdocs_bug_tag = ''
-copyright = u'2015-present, Aodh developers'
+copyright = '2015-present, Aodh developers'
 
 # Release notes are version independent.
 # The short X.Y version.
@@ -190,8 +189,8 @@ htmlhelp_basename = 'AodhClientReleaseNo
 #  author, documentclass [howto, manual, or own class]).
 latex_documents = [
     ('index', 'PythonAodhClient.tex',
-     u'Aodh Client Release Notes Documentation',
-     u'Aodh developers', 'manual'),
+     'Aodh Client Release Notes Documentation',
+     'Aodh developers', 'manual'),
 ]
 
 # The name of an image file (relative to this directory) to place at the top of
@@ -220,8 +219,8 @@ latex_documents = [
 # One entry per manual page. List of tuples
 # (source start file, name, description, authors, manual section).
 man_pages = [
-    ('index', 'pythonaodhclient', u'Aodh Client Release Notes Documentation',
-     [u'Aodh developers'], 1)
+    ('index', 'pythonaodhclient', 'Aodh Client Release Notes Documentation',
+     ['Aodh developers'], 1)
 ]
 
 # If true, show URL addresses after external links.
@@ -234,8 +233,8 @@ man_pages = [
 # (source start file, target name, title, author,
 #  dir menu entry, description, category)
 texinfo_documents = [
-    ('index', 'PythonAodhClient', u'Aodh Client Release Notes Documentation',
-     u'Aodh developers', 'PythonAodhClient',
+    ('index', 'PythonAodhClient', 'Aodh Client Release Notes Documentation',
+     'Aodh developers', 'PythonAodhClient',
      'One line description of project.', 'Miscellaneous'),
 ]
 
diff -pruN 3.7.1-2/releasenotes/source/index.rst 3.9.0-0ubuntu1/releasenotes/source/index.rst
--- 3.7.1-2/releasenotes/source/index.rst	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/releasenotes/source/index.rst	2025-07-10 09:20:01.000000000 +0000
@@ -8,6 +8,7 @@ Contents
    :maxdepth: 2
 
    unreleased
+   2025.1
    2024.2
    2024.1
    2023.2
diff -pruN 3.7.1-2/setup.cfg 3.9.0-0ubuntu1/setup.cfg
--- 3.7.1-2/setup.cfg	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/setup.cfg	2025-07-10 09:21:10.827641000 +0000
@@ -1,51 +1,52 @@
 [metadata]
 name = aodhclient
 summary = Python client library for Aodh
-description_file =
-    README.rst
+description_file = 
+	README.rst
 author = OpenStack
 author_email = openstack-discuss@lists.openstack.org
 home_page = https://docs.openstack.org/python-aodhclient/latest/
-python_requires = >=3.9
-classifier =
-    Environment :: OpenStack
-    Intended Audience :: Information Technology
-    Intended Audience :: System Administrators
-    License :: OSI Approved :: Apache Software License
-    Operating System :: POSIX :: Linux
-    Programming Language :: Python
-    Programming Language :: Python :: 3 :: Only
-    Programming Language :: Python :: 3
-    Programming Language :: Python :: 3.9
-    Programming Language :: Python :: 3.10
-    Programming Language :: Python :: 3.11
-    Programming Language :: Python :: 3.12
+python_requires = >=3.10
+classifier = 
+	Environment :: OpenStack
+	Intended Audience :: Information Technology
+	Intended Audience :: System Administrators
+	License :: OSI Approved :: Apache Software License
+	Operating System :: POSIX :: Linux
+	Programming Language :: Python
+	Programming Language :: Python :: 3 :: Only
+	Programming Language :: Python :: 3
+	Programming Language :: Python :: 3.10
+	Programming Language :: Python :: 3.11
+	Programming Language :: Python :: 3.12
 
 [files]
-packages =
-    aodhclient
+packages = 
+	aodhclient
 
 [entry_points]
-console_scripts =
-    aodh = aodhclient.shell:main
-
-keystoneauth1.plugin =
-    aodh-noauth = aodhclient.noauth:AodhNoAuthLoader
-
-openstack.cli.extension =
-    metric = aodhclient.osc
-
-openstack.alarming.v2 =
-    alarm create = aodhclient.v2.alarm_cli:CliAlarmCreate
-    alarm list = aodhclient.v2.alarm_cli:CliAlarmList
-    alarm show = aodhclient.v2.alarm_cli:CliAlarmShow
-    alarm delete = aodhclient.v2.alarm_cli:CliAlarmDelete
-    alarm update = aodhclient.v2.alarm_cli:CliAlarmUpdate
-    alarm state get = aodhclient.v2.alarm_cli:CliAlarmStateGet
-    alarm state set = aodhclient.v2.alarm_cli:CliAlarmStateSet
-    alarm-history search = aodhclient.v2.alarm_history_cli:CliAlarmHistorySearch
-    alarm-history show = aodhclient.v2.alarm_history_cli:CliAlarmHistoryShow
-    alarming capabilities list = aodhclient.v2.capabilities_cli:CliCapabilitiesList
-    alarm quota show = aodhclient.v2.quota_cli:QuotaShow
-    alarm quota set = aodhclient.v2.quota_cli:QuotaSet
+console_scripts = 
+	aodh = aodhclient.shell:main
+keystoneauth1.plugin = 
+	aodh-noauth = aodhclient.noauth:AodhNoAuthLoader
+openstack.cli.extension = 
+	metric = aodhclient.osc
+openstack.alarming.v2 = 
+	alarm create = aodhclient.v2.alarm_cli:CliAlarmCreate
+	alarm list = aodhclient.v2.alarm_cli:CliAlarmList
+	alarm show = aodhclient.v2.alarm_cli:CliAlarmShow
+	alarm delete = aodhclient.v2.alarm_cli:CliAlarmDelete
+	alarm update = aodhclient.v2.alarm_cli:CliAlarmUpdate
+	alarm state get = aodhclient.v2.alarm_cli:CliAlarmStateGet
+	alarm state set = aodhclient.v2.alarm_cli:CliAlarmStateSet
+	alarm-history search = aodhclient.v2.alarm_history_cli:CliAlarmHistorySearch
+	alarm-history show = aodhclient.v2.alarm_history_cli:CliAlarmHistoryShow
+	alarming capabilities list = aodhclient.v2.capabilities_cli:CliCapabilitiesList
+	alarm quota show = aodhclient.v2.quota_cli:QuotaShow
+	alarm quota set = aodhclient.v2.quota_cli:QuotaSet
+	alarm metrics = aodhclient.v2.metrics_cli:CliMetrics
+
+[egg_info]
+tag_build = 
+tag_date = 0
 
diff -pruN 3.7.1-2/tox.ini 3.9.0-0ubuntu1/tox.ini
--- 3.7.1-2/tox.ini	2025-01-27 13:45:28.000000000 +0000
+++ 3.9.0-0ubuntu1/tox.ini	2025-07-10 09:20:01.000000000 +0000
@@ -31,7 +31,7 @@ setenv =
        OS_TEST_PATH = ./aodhclient/tests/functional
        OS_TESTENV_NAME = {envname}
        AODH_CLIENT_EXEC_DIR={envdir}/bin
-       AODH_ENDPOINT=http://localhost:8042
+       AODH_ENDPOINT=http://localhost/alarming/
        GNOCCHI_ENDPOINT=http://localhost/metric/
        PROMETHEUS_ENDPOINT=http://localhost:9090
 allowlist_externals =
@@ -41,8 +41,11 @@ commands =
        stestr --test-path {env:OS_TEST_PATH} run --slowest {posargs}
 
 [testenv:pep8]
-deps = hacking>=6.1.0,<6.2.0
-commands = flake8
+skip_install = true
+deps =
+  pre-commit
+commands =
+  pre-commit run -a
 
 [testenv:venv]
 # Used by openstack-infra to build the doc
