Base mypy support

Change-Id: Idf4283556dbc5a0af9a07d317d13cf20d9b496fb
Signed-off-by: Andriy Kurilin <andr.kurilin@gmail.com>
This commit is contained in:
Andriy Kurilin
2025-08-05 10:06:05 +02:00
parent 1d37beb78b
commit 14e494d197
23 changed files with 738 additions and 56 deletions

View File

@@ -2,6 +2,7 @@
check:
jobs:
- rally-tox-cover
- rally-tox-mypy
- rally-tox-pep8
- rally-tox-py310
- rally-tox-py311
@@ -75,6 +76,7 @@
gate:
jobs:
- rally-tox-cover
- rally-tox-mypy
- rally-tox-pep8
- rally-tox-py310
- rally-tox-py311

View File

@@ -53,3 +53,646 @@ options = "rally_openstack.common.cfg.opts:list_opts"
[project.entry-points."oslo.config.opts"]
rally_openstack = "rally_openstack.common.cfg.opts:list_opts"
[tool.mypy]
files = [
"rally_openstack",
]
python_version = "3.10"
disallow_untyped_defs = true
check_untyped_defs = true
allow_redefinition = true
strict_equality = true
# disable warnings on missing `return None` at the end of functions that
# declare optional result
no_warn_no_return = true
# Disable type failures for tests
[[tool.mypy.overrides]]
module = "tests.*"
ignore_errors = true
# temporary rally disable. wating for a new release
[[tool.mypy.overrides]]
module = "rally.*"
ignore_missing_imports = true
[[tool.mypy.overrides]]
module = [
"barbicanclient.*",
"cinderclient.*",
"designateclient.*",
"glanceclient.*",
"gnocchiclient.*",
"heatclient.*",
"ironicclient.*",
"keystoneauth1.*",
"keystoneclient.*",
"kubernetes.*",
"magnumclient.*",
"manilaclient.*",
"mistralclient.*",
"monascaclient.*",
"novaclient.*",
"neutronclient.*",
"octaviaclient.*",
"osc_lib.*",
"osprofiler.*",
"swiftclient.*",
"troveclient.*",
"watcherclient.*",
"zaqarclient.*"
]
ignore_missing_imports = true
# FIXME(andreykurilin): all the following should be fixed
[[tool.mypy.overrides]]
module = "rally_openstack._compat"
disable_error_code = ["arg-type", "no-untyped-def", "union-attr"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.cfg.opts"
disable_error_code = ["no-untyped-def", "var-annotated"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.consts"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.credential"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.osclients"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.services.gnocchi.metric"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.services.grafana.grafana"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.services.heat.main"
disable_error_code = ["has-type", "no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.services.identity.identity"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.services.identity.keystone_common"
disable_error_code = ["attr-defined", "no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.services.identity.keystone_v2"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.services.identity.keystone_v3"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.services.image.glance_common"
disable_error_code = ["attr-defined", "no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.services.image.glance_v1"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.services.image.glance_v2"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.services.image.image"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.services.key_manager.barbican"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.services.loadbalancer.octavia"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.services.network.net_utils"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.services.network.neutron"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.services.storage.block"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.services.storage.cinder_common"
disable_error_code = ["attr-defined", "no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.services.storage.cinder_v1"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.services.storage.cinder_v2"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.services.storage.cinder_v3"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.validators"
disable_error_code = ["attr-defined", "no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.common.wrappers.network"
disable_error_code = ["arg-type", "assignment", "call-overload", "no-untyped-def", "override"]
[[tool.mypy.overrides]]
module = "rally_openstack.environment.platforms.existing"
disable_error_code = ["no-untyped-def", "union-attr"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.cleanup.base"
disable_error_code = ["attr-defined", "no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.cleanup.manager"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.cleanup.resources"
disable_error_code = ["attr-defined", "no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.context"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.api_versions"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.cinder.volume_types"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.cinder.volumes"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.cleanup.admin"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.cleanup.base"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.cleanup.user"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.dataplane.heat"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.designate.zones"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.glance.images"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.heat.stacks"
disable_error_code = ["index", "no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.keystone.roles"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.keystone.users"
disable_error_code = ["no-untyped-def", "var-annotated"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.magnum.ca_certs"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.magnum.cluster_templates"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.magnum.clusters"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.manila.manila_security_services"
disable_error_code = ["no-untyped-def", "var-annotated"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.manila.manila_share_networks"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.manila.manila_shares"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.monasca.metrics"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.network.allow_ssh"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.network.existing_network"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.network.networking_agents"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.network.networks"
disable_error_code = ["assignment", "no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.network.routers"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.neutron.lbaas"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.nova.flavors"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.nova.keypairs"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.nova.servers"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.quotas.cinder_quotas"
disable_error_code = ["attr-defined", "no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.quotas.designate_quotas"
disable_error_code = ["attr-defined", "no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.quotas.manila_quotas"
disable_error_code = ["attr-defined", "no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.quotas.neutron_quotas"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.quotas.nova_quotas"
disable_error_code = ["attr-defined", "no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.quotas.quotas"
disable_error_code = ["attr-defined", "no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.swift.objects"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.swift.utils"
disable_error_code = ["attr-defined", "no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.vm.custom_image"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.vm.image_command_customizer"
disable_error_code = ["index", "no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.contexts.watcher.audit_templates"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.hooks.fault_injection"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenario"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.authenticate.authenticate"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.barbican.containers"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.barbican.orders"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.barbican.secrets"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.barbican.utils"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.cinder.qos_specs"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.cinder.utils"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.cinder.volume_backups"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.cinder.volume_types"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.cinder.volumes"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.designate.basic"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.designate.utils"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.elasticsearch.logging"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.glance.images"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.gnocchi.archive_policy"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.gnocchi.archive_policy_rule"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.gnocchi.capabilities"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.gnocchi.metric"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.gnocchi.resource"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.gnocchi.resource_type"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.gnocchi.status"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.gnocchi.utils"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.grafana.metrics"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.heat.stacks"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.heat.utils"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.ironic.nodes"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.ironic.utils"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.keystone.basic"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.magnum.cluster_templates"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.magnum.clusters"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.magnum.k8s_pods"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.magnum.utils"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.manila.shares"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.manila.utils"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.mistral.executions"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.mistral.utils"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.mistral.workbooks"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.monasca.metrics"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.monasca.utils"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.neutron.bgpvpn"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.neutron.loadbalancer_v1"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.neutron.loadbalancer_v2"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.neutron.network"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.neutron.security_groups"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.neutron.trunk"
disable_error_code = ["misc", "no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.neutron.utils"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.nova.aggregates"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.nova.availability_zones"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.nova.flavors"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.nova.hypervisors"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.nova.keypairs"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.nova.server_groups"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.nova.servers"
disable_error_code = ["misc", "no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.nova.services"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.nova.utils"
disable_error_code = ["no-untyped-def", "var-annotated"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.octavia.loadbalancers"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.octavia.pools"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.octavia.utils"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.quotas.quotas"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.quotas.utils"
disable_error_code = ["dict-item", "no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.swift.objects"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.swift.utils"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.vm.utils"
disable_error_code = ["assignment", "no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.vm.vmtasks"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.vm.workloads.siege"
disable_error_code = ["call-overload", "no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.watcher.basic"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.watcher.utils"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.zaqar.basic"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.scenarios.zaqar.utils"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.types"
disable_error_code = ["no-untyped-def", "union-attr"]
[[tool.mypy.overrides]]
module = "rally_openstack.task.ui.charts.osprofilerchart"
disable_error_code = ["no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.verification.tempest.config"
disable_error_code = ["assignment", "method-assign", "no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.verification.tempest.context"
disable_error_code = ["assignment", "method-assign", "no-untyped-def"]
[[tool.mypy.overrides]]
module = "rally_openstack.verification.tempest.manager"
disable_error_code = ["no-untyped-def"]

View File

@@ -14,16 +14,17 @@
from importlib.metadata import version as _version
from rally.common import version as __rally_version__
from rally.common import version as _rally_version
from rally_openstack import _compat
if hasattr(__rally_version__, "__version_tuple__"):
__rally_version__ = __rally_version__.__version_tuple__
if hasattr(_rally_version, "__version_tuple__"):
__rally_version__ = _rally_version.__version_tuple__
else:
__rally_version__ = __rally_version__.version_info.semantic_version()
__rally_version__ = __rally_version__.version_tuple()
__rally_version__ = (
_rally_version.version_info.semantic_version().version_tuple()
)
try:
# Try to get version from installed package metadata

View File

@@ -241,11 +241,17 @@ class OSClient(plugin.Plugin):
return self.cache[key]
@classmethod
def get(cls, name, **kwargs):
# NOTE(boris-42): Remove this after we finish rename refactoring.
kwargs.pop("platform", None)
kwargs.pop("namespace", None)
return super(OSClient, cls).get(name, platform="openstack", **kwargs)
def get(
cls,
name: str,
platform: str = "openstack", # type: ignore[override]
allow_hidden: bool = False
) -> type["OSClient"]:
return super(OSClient, cls).get(
name,
platform=platform,
allow_hidden=allow_hidden
)
@configure("keystone", supported_versions=("2", "3"))

View File

@@ -18,7 +18,7 @@ from rally_openstack.common import osclients
from rally_openstack.common.services.identity import identity
class UnifiedKeystoneMixin(object):
class UnifiedKeystoneMixin:
@staticmethod
def _unify_service(service):
return identity.Service(id=service.id, name=service.name)
@@ -90,7 +90,7 @@ class UnifiedKeystoneMixin(object):
return self._impl.validate_token(token)
class KeystoneMixin(object):
class KeystoneMixin(atomic.ActionTimerMixin):
def list_users(self):
aname = "keystone_v%s.list_users" % self.version

View File

@@ -18,7 +18,7 @@ from rally.task import atomic
from rally_openstack.common.services.image import image as image_service
class GlanceMixin(object):
class GlanceMixin(atomic.ActionTimerMixin):
def _get_client(self):
return self._clients.glance(self.version)

View File

@@ -25,7 +25,7 @@ from rally_openstack.common.services.storage import block
CONF = block.CONF
class CinderMixin(object):
class CinderMixin(atomic.ActionTimerMixin):
def _get_client(self):
return self._clients.cinder(self.version)

View File

@@ -321,7 +321,7 @@ class OpenStack(platform.Platform):
"""
from oslo_utils import strutils
from oslo_utils import strutils # type: ignore[import-untyped]
required_env_vars = ["OS_AUTH_URL", "OS_USERNAME", "OS_PASSWORD"]
missing_env_vars = [v for v in required_env_vars if

View File

@@ -13,10 +13,16 @@
# License for the specific language governing permissions and limitations
# under the License.
from __future__ import annotations
from rally.common import cfg
from rally.task import utils
import typing as t
if t.TYPE_CHECKING: # pragma: no cover
R = t.TypeVar("R", bound="ResourceManager")
CONF = cfg.CONF
cleanup_group = cfg.OptGroup(name="cleanup", title="Cleanup Options")
@@ -38,10 +44,18 @@ class NoName(object):
return "<NoName %s resource>" % self.resource_type
def resource(service, resource, order=0, admin_required=False,
perform_for_admin_only=False, tenant_resource=False,
max_attempts=3, timeout=CONF.openstack.resource_deletion_timeout,
interval=1, threads=CONF.openstack.cleanup_threads):
def resource(
service: str,
resource: str,
order: int = 0,
admin_required: bool = False,
perform_for_admin_only: bool = False,
tenant_resource: bool = False,
max_attempts: int = 3,
timeout: float = CONF.openstack.resource_deletion_timeout,
interval: int = 1,
threads: int = CONF.openstack.cleanup_threads
) -> t.Callable[[type[R]], type[R]]:
"""Decorator that overrides resource specification.
Just put it on top of your resource class and specify arguments that you
@@ -63,7 +77,7 @@ def resource(service, resource, order=0, admin_required=False,
simultaneously
"""
def inner(cls):
def inner(cls: type[R]) -> type[R]:
# TODO(boris-42): This can be written better I believe =)
cls._service = service
cls._resource = resource
@@ -81,7 +95,7 @@ def resource(service, resource, order=0, admin_required=False,
return inner
@resource(service=None, resource=None)
@resource(service="", resource="")
class ResourceManager(object):
"""Base class for cleanup plugins for specific resources.
@@ -92,6 +106,17 @@ class ResourceManager(object):
list() and is_deleted() methods to make them fit to your case.
"""
_service: str
_resource: str
_order: int
_admin_required: bool
_perform_for_admin_only: bool
_tenant_resource: bool
_max_attempts: int
_timeout: float
_interval: int
_threads: int
def __init__(self, resource=None, admin=None, user=None, tenant_uuid=None):
self.admin = admin
self.user = user

View File

@@ -14,6 +14,7 @@
# under the License.
import time
import typing as t
from rally.common import broker
from rally.common import logging
@@ -189,7 +190,9 @@ def list_resource_names(admin_required=None):
True -> returns only admin ResourceManagers
False -> returns only non admin ResourceManagers
"""
res_mgrs = discover.itersubclasses(base.ResourceManager)
res_mgrs: t.Iterable[type[base.ResourceManager]] = discover.itersubclasses(
base.ResourceManager
)
if admin_required is not None:
res_mgrs = filter(lambda cls: cls._admin_required == admin_required,
res_mgrs)

View File

@@ -60,7 +60,6 @@ class QuotaMixin(SynchronizedDeletion, base.ResourceManager):
_magnum_order = get_order(80)
@base.resource(service=None, resource=None)
class MagnumMixin(base.ResourceManager):
def id(self):
@@ -171,7 +170,6 @@ class NovaAggregate(SynchronizedDeletion, base.ResourceManager):
_neutron_order = get_order(300)
@base.resource(service=None, resource=None, admin_required=True)
class NeutronMixin(SynchronizedDeletion, base.ResourceManager):
@property

View File

@@ -10,6 +10,8 @@
# License for the specific language governing permissions and limitations
# under the License.
from __future__ import annotations
import random
from rally.common import validation
@@ -227,6 +229,8 @@ class OpenStackAPIVersions(context.OpenStackContext):
"additionalProperties": False
}
config: dict[str, dict[str, str | int]]
def setup(self):
# FIXME(andreykurilin): move all checks to validate method.

View File

@@ -12,6 +12,8 @@
# License for the specific language governing permissions and limitations
# under the License.
from __future__ import annotations
from rally.common import cfg
from rally.common import logging
from rally.common import utils as rutils
@@ -115,15 +117,19 @@ class ImageGenerator(context.OpenStackContext):
DEFAULT_CONFIG = {"images_per_tenant": 1}
config: dict
def setup(self):
image_url = self.config.get("image_url")
disk_format = self.config.get("disk_format")
container_format = self.config.get("container_format")
images_per_tenant = self.config.get("images_per_tenant")
images_per_tenant: int = self.config["images_per_tenant"]
visibility = self.config.get("visibility", "private")
min_disk = self.config.get("min_disk", 0)
min_ram = self.config.get("min_ram", 0)
image_args = self.config.get("image_args", {})
image_args: dict[str, str | int | bool] = self.config.get(
"image_args", {}
)
if "image_type" in self.config:
LOG.warning("The 'image_type' argument is deprecated since "

View File

@@ -13,13 +13,17 @@
# License for the specific language governing permissions and limitations
# under the License.
from __future__ import annotations
import collections
import copy
import typing as t
import uuid
from rally.common import broker
from rally.common import cfg
from rally.common import logging
from rally.common import utils
from rally.common import validation
from rally import exceptions
@@ -131,7 +135,7 @@ class UserGenerator(context.OpenStackContext):
or cfg.CONF.openstack.user_domain)
self.DEFAULT_FOR_NEW_USERS["project_domain"] = project_domain
self.DEFAULT_FOR_NEW_USERS["user_domain"] = user_domain
with self.config.unlocked():
with t.cast(utils.LockedDict, self.config).unlocked():
for key, value in self.DEFAULT_FOR_NEW_USERS.items():
self.config.setdefault(key, value)
@@ -156,8 +160,8 @@ class UserGenerator(context.OpenStackContext):
# NOTE(msdubov): consume() will fill the tenants list in the closure.
broker.run(publish, consume, threads)
tenants_dict = {}
for t in tenants:
tenants_dict[t["id"]] = t
for tenant in tenants:
tenants_dict[tenant["id"]] = tenant
return tenants_dict

View File

@@ -13,6 +13,8 @@
# License for the specific language governing permissions and limitations
# under the License.
from __future__ import annotations
from rally.common import logging
from rally.common import validation
@@ -57,7 +59,7 @@ def _rule_to_key(rule):
for x in comparison_keys])
_RULES_TO_ADD = [
_RULES_TO_ADD: list[dict[str, str | int]] = [
{
"ethertype": "IPv4",
"protocol": "tcp",

View File

@@ -98,6 +98,8 @@ class Network(context.OpenStackContext):
"dualstack": False
}
config: dict
def setup(self):
# NOTE(rkiran): Some clients are not thread-safe. Thus during
# multithreading/multiprocessing, it is likely the

View File

@@ -51,6 +51,8 @@ class Lbaas(context.OpenStackContext):
"lbaas_version": 1
}
config: dict
def setup(self):
net_wrapper = network_wrapper.wrap(
osclients.Clients(self.context["admin"]["credential"]),

View File

@@ -47,6 +47,8 @@ class Quotas(context.OpenStackContext):
}
}
config: dict[str, dict[str, int]]
def __init__(self, ctx):
super(Quotas, self).__init__(ctx)
self.clients = osclients.Clients(

View File

@@ -62,7 +62,7 @@ class FaultInjectionHook(hook.HookAction):
return extra_config.get("cloud_config")
def run(self):
import os_faults
import os_faults # type: ignore[import-untyped]
# get cloud configuration
cloud_config = self.get_cloud_config()

View File

@@ -521,21 +521,6 @@ def check_raises(logical_line, filename, noqa=False):
"in docstrings.")
@core.flake8ext
def check_old_type_class(logical_line, noqa=False):
"""Use new-style Python classes
N355
"""
if noqa:
return
if re_old_type_class.search(logical_line):
yield (0, "N355 This class does not inherit from anything and thus "
"will be an old-style class by default. Try to inherit from "
"``object`` or another new-style class.")
@core.flake8ext
def check_datetime_alias(logical_line, noqa=False):
"""Ensure using ``dt`` as alias for ``datetime``

View File

@@ -352,15 +352,6 @@ class HackingTestCase(test.TestCase):
checkres = checks.check_objects_imports_in_cli(line, "./filename")
self.assertRaises(StopIteration, next, checkres)
@ddt.data(
"class Oldstype():",
"class Oldstyle:"
)
def test_check_old_type_class(self, line):
checkres = checks.check_old_type_class(line)
self.assertIsNotNone(next(checkres))
self.assertEqual([], list(checkres))
def test_check_datetime_alias(self):
lines = ["import datetime as date",
"import datetime",

View File

@@ -116,7 +116,6 @@ extension =
N351 = checks:check_no_constructor_data_struct
N352 = checks:check_dict_formatting_in_string
N354 = checks:check_raises
N355 = checks:check_old_type_class
N356 = checks:check_datetime_alias
N360 = checks:check_db_imports_in_cli
N361 = checks:check_objects_imports_in_cli

7
types-requirements.txt Normal file
View File

@@ -0,0 +1,7 @@
mypy
# Type stubs for external packages
types-jsonschema
types-netaddr
types-PyYAML
types-requests
types-setuptools