
Monasca is deprecated for removal. This change makes the Monasca client an optional dependency and ensures it is only imported and instantiated when the Monasca datasource is explicitly selected. This reduces the default footprint while preserving functionality for deployments that still rely on Monasca. What changed ============ - requirements.txt: remove python-monascaclient from hard deps - setup.cfg: add [options.extras_require] monasca extra - watcher/common/clients.py: lazy import with clear UnsupportedError - watcher/decision_engine/datasources/monasca.py: lazy client property and deferred import of monascaclient.exc; reset on Unauthorized - watcher/decision_engine/datasources/manager.py: unconditionally import Monasca helper and include in metric_map; helper is lazy - tests: conditionally include Monasca based on availability; adjust expectations instead of skipping by default; avoid over-mocking - tox.ini: enable optional extras via WATCHER_EXTRAS env var - docs: datasources index notes Monasca is deprecated and optional - releasenotes: upgrade note with install example and behavior Why === - Allow deployments not using Monasca to run without the client - Keep Monasca functional when explicitly installed via extras - Provide clear operator guidance and smooth upgrades Compatibility ============= - No change for deployments that do not use Monasca - Deployments using Monasca must install the optional extra: pip install watcher[monasca] Testing ======= - Default: tox -e py3 - With Monasca: WATCHER_EXTRAS=monasca tox -e py3 Assisted-By: GPT-5 (Cursor) Closes-Bug: #2120192 Change-Id: I7c02b74e83d656083ce612727e6da58761200ae4 Signed-off-by: Sean Mooney <work@seanmooney.info>
121 lines
5.8 KiB
INI
121 lines
5.8 KiB
INI
[metadata]
|
|
name = python-watcher
|
|
summary = OpenStack Watcher provides a flexible and scalable resource optimization service for multi-tenant OpenStack-based clouds.
|
|
description_file =
|
|
README.rst
|
|
author = OpenStack
|
|
author_email = openstack-discuss@lists.openstack.org
|
|
home_page = https://docs.openstack.org/watcher/latest/
|
|
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 :: Implementation :: CPython
|
|
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 =
|
|
watcher
|
|
data_files =
|
|
etc/ = etc/*
|
|
|
|
[options.extras_require]
|
|
monasca =
|
|
python-monascaclient>=1.12.0
|
|
|
|
[entry_points]
|
|
oslo.config.opts =
|
|
watcher = watcher.conf.opts:list_opts
|
|
|
|
oslo.policy.policies =
|
|
watcher = watcher.common.policies:list_rules
|
|
|
|
oslo.policy.enforcer =
|
|
watcher = watcher.common.policy:get_enforcer
|
|
|
|
console_scripts =
|
|
watcher-api = watcher.cmd.eventlet.api:main
|
|
watcher-db-manage = watcher.cmd.dbmanage:main
|
|
watcher-decision-engine = watcher.cmd.eventlet.decisionengine:main
|
|
watcher-applier = watcher.cmd.eventlet.applier:main
|
|
watcher-sync = watcher.cmd.sync:main
|
|
watcher-status = watcher.cmd.status:main
|
|
|
|
wsgi_scripts =
|
|
watcher-api-wsgi = watcher.api.wsgi:initialize_wsgi_app
|
|
|
|
watcher.database.migration_backend =
|
|
sqlalchemy = watcher.db.sqlalchemy.migration
|
|
|
|
watcher_goals =
|
|
unclassified = watcher.decision_engine.goal.goals:Unclassified
|
|
dummy = watcher.decision_engine.goal.goals:Dummy
|
|
server_consolidation = watcher.decision_engine.goal.goals:ServerConsolidation
|
|
thermal_optimization = watcher.decision_engine.goal.goals:ThermalOptimization
|
|
workload_balancing = watcher.decision_engine.goal.goals:WorkloadBalancing
|
|
airflow_optimization = watcher.decision_engine.goal.goals:AirflowOptimization
|
|
noisy_neighbor = watcher.decision_engine.goal.goals:NoisyNeighborOptimization
|
|
saving_energy = watcher.decision_engine.goal.goals:SavingEnergy
|
|
hardware_maintenance = watcher.decision_engine.goal.goals:HardwareMaintenance
|
|
cluster_maintaining = watcher.decision_engine.goal.goals:ClusterMaintaining
|
|
|
|
watcher_scoring_engines =
|
|
dummy_scorer = watcher.decision_engine.scoring.dummy_scorer:DummyScorer
|
|
|
|
watcher_scoring_engine_containers =
|
|
dummy_scoring_container = watcher.decision_engine.scoring.dummy_scoring_container:DummyScoringContainer
|
|
|
|
watcher_strategies =
|
|
dummy = watcher.decision_engine.strategy.strategies.dummy_strategy:DummyStrategy
|
|
dummy_with_scorer = watcher.decision_engine.strategy.strategies.dummy_with_scorer:DummyWithScorer
|
|
dummy_with_resize = watcher.decision_engine.strategy.strategies.dummy_with_resize:DummyWithResize
|
|
actuator = watcher.decision_engine.strategy.strategies.actuation:Actuator
|
|
basic = watcher.decision_engine.strategy.strategies.basic_consolidation:BasicConsolidation
|
|
outlet_temperature = watcher.decision_engine.strategy.strategies.outlet_temp_control:OutletTempControl
|
|
saving_energy = watcher.decision_engine.strategy.strategies.saving_energy:SavingEnergy
|
|
vm_workload_consolidation = watcher.decision_engine.strategy.strategies.vm_workload_consolidation:VMWorkloadConsolidation
|
|
workload_stabilization = watcher.decision_engine.strategy.strategies.workload_stabilization:WorkloadStabilization
|
|
workload_balance = watcher.decision_engine.strategy.strategies.workload_balance:WorkloadBalance
|
|
uniform_airflow = watcher.decision_engine.strategy.strategies.uniform_airflow:UniformAirflow
|
|
noisy_neighbor = watcher.decision_engine.strategy.strategies.noisy_neighbor:NoisyNeighbor
|
|
storage_capacity_balance = watcher.decision_engine.strategy.strategies.storage_capacity_balance:StorageCapacityBalance
|
|
zone_migration = watcher.decision_engine.strategy.strategies.zone_migration:ZoneMigration
|
|
host_maintenance = watcher.decision_engine.strategy.strategies.host_maintenance:HostMaintenance
|
|
node_resource_consolidation = watcher.decision_engine.strategy.strategies.node_resource_consolidation:NodeResourceConsolidation
|
|
|
|
watcher_actions =
|
|
migrate = watcher.applier.actions.migration:Migrate
|
|
nop = watcher.applier.actions.nop:Nop
|
|
sleep = watcher.applier.actions.sleep:Sleep
|
|
change_nova_service_state = watcher.applier.actions.change_nova_service_state:ChangeNovaServiceState
|
|
resize = watcher.applier.actions.resize:Resize
|
|
change_node_power_state = watcher.applier.actions.change_node_power_state:ChangeNodePowerState
|
|
volume_migrate = watcher.applier.actions.volume_migration:VolumeMigrate
|
|
stop = watcher.applier.actions.stop:Stop
|
|
|
|
watcher_workflow_engines =
|
|
taskflow = watcher.applier.workflow_engine.default:DefaultWorkFlowEngine
|
|
|
|
watcher_planners =
|
|
weight = watcher.decision_engine.planner.weight:WeightPlanner
|
|
workload_stabilization = watcher.decision_engine.planner.workload_stabilization:WorkloadStabilizationPlanner
|
|
node_resource_consolidation = watcher.decision_engine.planner.node_resource_consolidation:NodeResourceConsolidationPlanner
|
|
|
|
watcher_cluster_data_model_collectors =
|
|
compute = watcher.decision_engine.model.collector.nova:NovaClusterDataModelCollector
|
|
storage = watcher.decision_engine.model.collector.cinder:CinderClusterDataModelCollector
|
|
baremetal = watcher.decision_engine.model.collector.ironic:BaremetalClusterDataModelCollector
|
|
|
|
[codespell]
|
|
skip = *.po,*.js,*.css,*.html,*.svg,HACKING.py,*hacking*,*build*,*_static*,doc/dictionary.txt,*.pyc,*.inv,*.gz,*.jpg,*.png,*.vsd,*.graffle,*.json
|
|
count =
|
|
quiet-level = 4
|